From db9e1d36d0f1f188c484d6cb25fcd4b8be8b94e5 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 23 Dec 2013 19:05:33 +0100 Subject: [PATCH] window: Keep track of popover children mapped status In order to maintain visibility of the GdkWindow that's the parent window of the popover widget. --- gtk/gtkwindow.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 8e5916961a..6f7ce0fb29 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -131,6 +131,7 @@ struct _GtkWindowPopover GdkWindow *window; GtkPositionType pos; cairo_rectangle_int_t rect; + gulong unmap_id; }; struct _GtkWindowPrivate @@ -1332,6 +1333,12 @@ gtk_window_close (GtkWindow *window) static void popover_destroy (GtkWindowPopover *popover) { + if (popover->unmap_id) + { + g_signal_handler_disconnect (popover->widget, popover->unmap_id); + popover->unmap_id = 0; + } + if (popover->widget && gtk_widget_get_parent (popover->widget)) gtk_widget_unparent (popover->widget); @@ -5425,6 +5432,24 @@ gtk_window_hide (GtkWidget *widget) gtk_grab_remove (widget); } +static void +popover_unmap (GtkWidget *widget, + GtkWindowPopover *popover) +{ + if (popover->window) + { + if (gtk_widget_is_visible (popover->widget)) + gtk_widget_unmap (popover->widget); + gdk_window_hide (popover->window); + } + + if (popover->unmap_id) + { + g_signal_handler_disconnect (widget, popover->unmap_id); + popover->unmap_id = 0; + } +} + static void popover_map (GtkWidget *widget, GtkWindowPopover *popover) @@ -5434,7 +5459,11 @@ popover_map (GtkWidget *widget, gdk_window_show (popover->window); if (gtk_widget_get_visible (popover->widget)) - gtk_widget_map (popover->widget); + { + gtk_widget_map (popover->widget); + popover->unmap_id = g_signal_connect (popover->widget, "unmap", + G_CALLBACK (popover_unmap), popover); + } } } @@ -5573,18 +5602,6 @@ gtk_window_map_event (GtkWidget *widget, return FALSE; } -static void -popover_unmap (GtkWidget *widget, - GtkWindowPopover *popover) -{ - if (popover->window) - { - if (gtk_widget_is_visible (popover->widget)) - gtk_widget_unmap (popover->widget); - gdk_window_hide (popover->window); - } -} - static void gtk_window_unmap (GtkWidget *widget) {