diff options
Diffstat (limited to 'src/core')
-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; |