diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/display-private.h | 3 | ||||
| -rw-r--r-- | src/core/display.c | 12 | ||||
| -rw-r--r-- | src/core/edge-resistance.c | 18 | ||||
| -rw-r--r-- | src/core/workspace.c | 9 | 
4 files changed, 24 insertions, 18 deletions
| diff --git a/src/core/display-private.h b/src/core/display-private.h index dc270a96..f204af0f 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -420,8 +420,7 @@ void meta_display_ungrab_focus_window_button (MetaDisplay *display,                                                MetaWindow  *window);  /* Next two functions are defined in edge-resistance.c */ -void meta_display_compute_resistance_and_snapping_edges (MetaDisplay *display); -void meta_display_cleanup_edges                         (MetaDisplay *display); +void meta_display_cleanup_edges              (MetaDisplay *display);  /* make a request to ensure the event serial has changed */  void     meta_display_increment_event_serial (MetaDisplay *display); diff --git a/src/core/display.c b/src/core/display.c index 6a4831fb..bcb262af 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -3662,18 +3662,6 @@ meta_display_begin_grab_op (MetaDisplay *display,    g_assert (display->grab_window != NULL || display->grab_screen != NULL);    g_assert (display->grab_op != META_GRAB_OP_NONE); -  /* If this is a move or resize, cache the window edges for -   * resistance/snapping -   */ -  if (meta_grab_op_is_resizing (display->grab_op) || -      meta_grab_op_is_moving (display->grab_op)) -    { -      meta_topic (META_DEBUG_WINDOW_OPS, -                  "Computing edges to resist-movement or snap-to for %s.\n", -                  window->desc); -      meta_display_compute_resistance_and_snapping_edges (display); -    } -    /* Save the old stacking */    if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))      { diff --git a/src/core/edge-resistance.c b/src/core/edge-resistance.c index 51e77d54..aa4fcb6a 100644 --- a/src/core/edge-resistance.c +++ b/src/core/edge-resistance.c @@ -63,6 +63,8 @@ struct MetaEdgeResistanceData    ResistanceDataForAnEdge bottom_data;  }; +static void compute_resistance_and_snapping_edges (MetaDisplay *display); +  /* !WARNING!: this function can return invalid indices (namely, either -1 or   * edges->len); this is by design, but you need to remember this.   */ @@ -550,7 +552,9 @@ apply_edge_resistance_to_each_side (MetaDisplay         *display,    gboolean                modified;    int new_left, new_right, new_top, new_bottom; -  g_assert (display->grab_edge_resistance_data != NULL); +  if (display->grab_edge_resistance_data == NULL) +    compute_resistance_and_snapping_edges (display); +    edge_data = display->grab_edge_resistance_data;    if (auto_snap) @@ -671,7 +675,8 @@ meta_display_cleanup_edges (MetaDisplay *display)    MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;    GHashTable *edges_to_be_freed; -  g_assert (edge_data != NULL); +  if (edge_data == NULL) /* Not currently cached */ +    return;    /* We first need to clean out any window edges */    edges_to_be_freed = g_hash_table_new_full (g_direct_hash, g_direct_equal, @@ -938,8 +943,8 @@ initialize_grab_edge_resistance_data (MetaDisplay *display)    edge_data->bottom_data.keyboard_buildup = 0;  } -void -meta_display_compute_resistance_and_snapping_edges (MetaDisplay *display) +static void +compute_resistance_and_snapping_edges (MetaDisplay *display)  {    GList *stacked_windows;    GList *cur_window_iter; @@ -952,6 +957,11 @@ meta_display_compute_resistance_and_snapping_edges (MetaDisplay *display)     */    GSList *rem_windows, *rem_win_stacking; +  g_assert (display->grab_window != NULL); +  meta_topic (META_DEBUG_WINDOW_OPS, +              "Computing edges to resist-movement or snap-to for %s.\n", +              display->grab_window->desc); +    /*     * 1st: Get the list of relevant windows, from bottom to top     */ diff --git a/src/core/workspace.c b/src/core/workspace.c index b85ab53c..928f3de6 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -382,6 +382,10 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,    if (workspace->screen->active_workspace)      workspace_switch_sound(workspace->screen->active_workspace, workspace); +  /* Free any cached pointers to the workspaces's edges from +   * a current resize or move operation */ +  meta_display_cleanup_edges (workspace->screen->display); +    /* Note that old can be NULL; e.g. when starting up */    old = workspace->screen->active_workspace; @@ -542,6 +546,11 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace)                "Invalidating work area for workspace %d\n",                meta_workspace_index (workspace)); +  /* If we are in the middle of a resize or move operation, we +   * might have cached pointers to the workspace's edges */ +  if (workspace == workspace->screen->active_workspace) +    meta_display_cleanup_edges (workspace->screen->display); +    g_free (workspace->work_area_xinerama);    workspace->work_area_xinerama = NULL; | 
