Transfer the Mac SDK bockbuild profiles & resources inside the Mono repository.
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0001-Add-invariant-that-a-child-is-unmapped-if-parent-is-.patch
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
5  unmapped
6
7 Requires fixes to GtkContainer and GtkWindow to unmap their
8 children, rather than just withdrawing or hiding the container
9 window.
10
11 Requires fix to GtkHandleBox to chain up to GtkContainer unmap.
12
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
16 become unmapped.
17 (cherry picked from commit b67c5af55bf611c013b2c43e6878281abd773530)
18 ---
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(-)
24
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
30
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)
35
36  Note:, the definition
37
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)
43  {
44    gtk_widget_set_mapped (widget, FALSE);
45
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)
50 +   */
51    if (gtk_widget_get_has_window (widget))
52 -    gdk_window_hide (widget->window);
53 -  else
54 -    gtk_container_forall (GTK_CONTAINER (widget),
55 -                         (GtkCallback)gtk_widget_unmap,
56 -                         NULL);
57 +    gdk_window_hide (gtk_widget_get_window (widget));
58 +
59 +  gtk_container_forall (GTK_CONTAINER (widget),
60 +                        (GtkCallback)gtk_widget_unmap,
61 +                        NULL);
62  }
63
64  /**
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;
72      }
73 +
74 +  GTK_WIDGET_CLASS (gtk_handle_box_parent_class)->unmap (widget);
75  }
76
77  static void
78 diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
79 index 4de3215..8f174c6 100644
80 --- a/gtk/gtkwindow.c
81 +++ b/gtk/gtkwindow.c
82 @@ -4690,7 +4690,8 @@ gtk_window_unmap (GtkWidget *widget)
83  {
84    GtkWindow *window = GTK_WINDOW (widget);
85    GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (widget);
86 -  GtkWindowGeometryInfo *info;
87 +  GtkWindowGeometryInfo *info;
88 +  GtkWidget *child;
89    GdkWindowState state;
90
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;
96 +
97 +  child = gtk_bin_get_child (&(window->bin));
98 +  if (child)
99 +    gtk_widget_unmap (child);
100  }
101
102  static void
103 --
104 1.7.10.2 (Apple Git-33)