From 82dce6758ace64116b6d89d59c2486cf96913c81 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 8 Jul 2014 12:16:11 -0400 Subject: [PATCH] window: Remove pending pings in unmanage This makes sure that we see them for Wayland clients as well, and don't time out and crash when we're accessing an invalid window / surface. Spotted-by: Rui Matos --- src/core/display-private.h | 3 +++ src/core/display.c | 18 ++++-------------- src/core/window.c | 2 ++ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/core/display-private.h b/src/core/display-private.h index 03450d3a0..a847d9bb3 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -445,6 +445,9 @@ void meta_display_sanity_check_timestamps (MetaDisplay *display, gboolean meta_display_timestamp_too_old (MetaDisplay *display, guint32 *timestamp); +void meta_display_remove_pending_pings_for_window (MetaDisplay *display, + MetaWindow *window); + MetaGestureTracker * meta_display_get_gesture_tracker (MetaDisplay *display); #endif diff --git a/src/core/display.c b/src/core/display.c index 3d9d8ee24..ac5120e0c 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -296,16 +296,9 @@ ping_data_free (MetaPingData *ping_data) g_free (ping_data); } -/** - * remove_pending_pings_for_window: - * @display: The display the window appears on - * @xwindow: The X ID of the window whose pings we should remove - * - * Frees every pending ping structure for the given X window on the - * given display. This means that we also destroy the timeouts. - */ -static void -remove_pending_pings_for_window (MetaDisplay *display, Window xwindow) +void +meta_display_remove_pending_pings_for_window (MetaDisplay *display, + MetaWindow *window) { GSList *tmp; GSList *dead; @@ -318,7 +311,7 @@ remove_pending_pings_for_window (MetaDisplay *display, Window xwindow) { MetaPingData *ping_data = tmp->data; - if (ping_data->window->xwindow == xwindow) + if (ping_data->window == window) dead = g_slist_prepend (dead, ping_data); } @@ -1613,9 +1606,6 @@ meta_display_unregister_x_window (MetaDisplay *display, g_return_if_fail (g_hash_table_lookup (display->xids, &xwindow) != NULL); g_hash_table_remove (display->xids, &xwindow); - - /* Remove any pending pings */ - remove_pending_pings_for_window (display, xwindow); } void diff --git a/src/core/window.c b/src/core/window.c index d09e8d6e3..11f6fc840 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1272,6 +1272,8 @@ meta_window_unmanage (MetaWindow *window, meta_stack_thaw (window->screen->stack); } + meta_display_remove_pending_pings_for_window (window->display, window); + meta_window_shutdown_group (window); /* safe to do this early as * group.c won't re-add to the * group if window->unmanaging