mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
Fix crash when meta_display_close() is called with attached modal dialogs
When meta_display_unmanage_window_for_screen() is called, it gets a list of windows and iterates over them and unmanages them, but unmanaging a window with attached modal dialogs also unmanages those attached modal dialogs (in the normal case, temporarily), so we need to guard against such cases by ref'ing the windows in the list and checking if they have already been unmanaged. https://bugzilla.gnome.org/show_bug.cgi?id=668299 https://bugzilla.redhat.com/show_bug.cgi?id=760918
This commit is contained in:
parent
1772a2a59c
commit
c0a440b852
@ -5025,12 +5025,21 @@ meta_display_unmanage_windows_for_screen (MetaDisplay *display,
|
|||||||
winlist = meta_display_list_windows (display,
|
winlist = meta_display_list_windows (display,
|
||||||
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
|
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
|
||||||
winlist = g_slist_sort (winlist, meta_display_stack_cmp);
|
winlist = g_slist_sort (winlist, meta_display_stack_cmp);
|
||||||
|
g_slist_foreach (winlist, (GFunc)g_object_ref, NULL);
|
||||||
|
|
||||||
/* Unmanage all windows */
|
/* Unmanage all windows */
|
||||||
tmp = winlist;
|
tmp = winlist;
|
||||||
while (tmp != NULL)
|
while (tmp != NULL)
|
||||||
{
|
{
|
||||||
meta_window_unmanage (tmp->data, timestamp);
|
MetaWindow *window = tmp->data;
|
||||||
|
|
||||||
|
/* Check if already unmanaged for safety - in particular, catch
|
||||||
|
* the case where unmanaging a parent window can cause attached
|
||||||
|
* dialogs to be (temporarily) unmanaged.
|
||||||
|
*/
|
||||||
|
if (!window->unmanaging)
|
||||||
|
meta_window_unmanage (window, timestamp);
|
||||||
|
g_object_unref (window);
|
||||||
|
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user