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.
This commit is contained in:
Carlos Garnacho 2013-12-23 19:05:33 +01:00
parent ace25368b1
commit db9e1d36d0

View File

@ -131,6 +131,7 @@ struct _GtkWindowPopover
GdkWindow *window; GdkWindow *window;
GtkPositionType pos; GtkPositionType pos;
cairo_rectangle_int_t rect; cairo_rectangle_int_t rect;
gulong unmap_id;
}; };
struct _GtkWindowPrivate struct _GtkWindowPrivate
@ -1332,6 +1333,12 @@ gtk_window_close (GtkWindow *window)
static void static void
popover_destroy (GtkWindowPopover *popover) 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)) if (popover->widget && gtk_widget_get_parent (popover->widget))
gtk_widget_unparent (popover->widget); gtk_widget_unparent (popover->widget);
@ -5425,6 +5432,24 @@ gtk_window_hide (GtkWidget *widget)
gtk_grab_remove (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 static void
popover_map (GtkWidget *widget, popover_map (GtkWidget *widget,
GtkWindowPopover *popover) GtkWindowPopover *popover)
@ -5434,7 +5459,11 @@ popover_map (GtkWidget *widget,
gdk_window_show (popover->window); gdk_window_show (popover->window);
if (gtk_widget_get_visible (popover->widget)) 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; 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 static void
gtk_window_unmap (GtkWidget *widget) gtk_window_unmap (GtkWidget *widget)
{ {