1 From fdbef10f94b9e16618b75e7e12184befcd178852 Mon Sep 17 00:00:00 2001
2 From: Havoc Pennington <hp@pobox.com>
3 Date: Mon, 20 Dec 2010 12:58:04 -0500
4 Subject: [PATCH 01/68] Add invariant that a child is unmapped if parent is
7 Requires fixes to GtkContainer and GtkWindow to unmap their
8 children, rather than just withdrawing or hiding the container
11 Requires fix to GtkHandleBox to chain up to GtkContainer unmap.
13 Historically we avoided these unmaps for efficiency reasons,
14 but these days it's a bigger problem that there's no way
15 for child widgets to know that one of their ancestors has
17 (cherry picked from commit b67c5af55bf611c013b2c43e6878281abd773530)
19 docs/widget_system.txt | 2 +-
20 gtk/gtkcontainer.c | 15 ++++++++++-----
21 gtk/gtkhandlebox.c | 2 ++
22 gtk/gtkwindow.c | 7 ++++++-
23 4 files changed, 19 insertions(+), 7 deletions(-)
25 diff --git a/docs/widget_system.txt b/docs/widget_system.txt
26 index 1c2867c..9463f10 100644
27 --- a/docs/widget_system.txt
28 +++ b/docs/widget_system.txt
29 @@ -255,7 +255,7 @@ In the following
31 widget->parent && GTK_WIDGET_MAPPED (widget->parent) &&
32 GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_CHILD_VISIBLE
33 - => GTK_WIDGET_MAPPED (widget)
34 + <=> GTK_WIDGET_MAPPED (widget)
38 diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
39 index 9aaa7d9..7105724 100644
40 --- a/gtk/gtkcontainer.c
41 +++ b/gtk/gtkcontainer.c
42 @@ -2694,12 +2694,17 @@ gtk_container_unmap (GtkWidget *widget)
44 gtk_widget_set_mapped (widget, FALSE);
46 + /* hide our window first so user doesn't see all the child windows
47 + * vanishing one by one. (only matters these days if one of the
48 + * children has an actual native window instead of client-side
49 + * window, e.g. a GtkSocket would)
51 if (gtk_widget_get_has_window (widget))
52 - gdk_window_hide (widget->window);
54 - gtk_container_forall (GTK_CONTAINER (widget),
55 - (GtkCallback)gtk_widget_unmap,
57 + gdk_window_hide (gtk_widget_get_window (widget));
59 + gtk_container_forall (GTK_CONTAINER (widget),
60 + (GtkCallback)gtk_widget_unmap,
65 diff --git a/gtk/gtkhandlebox.c b/gtk/gtkhandlebox.c
66 index 667371f..557d2de 100644
67 --- a/gtk/gtkhandlebox.c
68 +++ b/gtk/gtkhandlebox.c
69 @@ -383,6 +383,8 @@ gtk_handle_box_unmap (GtkWidget *widget)
70 gdk_window_hide (hb->float_window);
71 hb->float_window_mapped = FALSE;
74 + GTK_WIDGET_CLASS (gtk_handle_box_parent_class)->unmap (widget);
78 diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
79 index 4de3215..8f174c6 100644
82 @@ -4690,7 +4690,8 @@ gtk_window_unmap (GtkWidget *widget)
84 GtkWindow *window = GTK_WINDOW (widget);
85 GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (widget);
86 - GtkWindowGeometryInfo *info;
87 + GtkWindowGeometryInfo *info;
91 gtk_widget_set_mapped (widget, FALSE);
92 @@ -4721,6 +4722,10 @@ gtk_window_unmap (GtkWidget *widget)
93 window->stick_initially = (state & GDK_WINDOW_STATE_STICKY) != 0;
94 priv->above_initially = (state & GDK_WINDOW_STATE_ABOVE) != 0;
95 priv->below_initially = (state & GDK_WINDOW_STATE_BELOW) != 0;
97 + child = gtk_bin_get_child (&(window->bin));
99 + gtk_widget_unmap (child);
104 1.7.10.2 (Apple Git-33)