OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/gtk_preserve_window.h" | 5 #include "ui/gfx/gtk_preserve_window.h" |
6 | 6 |
7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
9 | 9 |
10 #include "ui/base/gtk/gtk_compat.h" | 10 #include "ui/base/gtk/gtk_compat.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 } | 56 } |
57 | 57 |
58 GtkWidget* gtk_preserve_window_new() { | 58 GtkWidget* gtk_preserve_window_new() { |
59 return GTK_WIDGET(g_object_new(GTK_TYPE_PRESERVE_WINDOW, NULL)); | 59 return GTK_WIDGET(g_object_new(GTK_TYPE_PRESERVE_WINDOW, NULL)); |
60 } | 60 } |
61 | 61 |
62 static void gtk_preserve_window_destroy(GtkObject* object) { | 62 static void gtk_preserve_window_destroy(GtkObject* object) { |
63 GtkWidget* widget = reinterpret_cast<GtkWidget*>(object); | 63 GtkWidget* widget = reinterpret_cast<GtkWidget*>(object); |
64 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); | 64 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); |
65 | 65 |
66 if (widget->window) { | 66 GdkWindow* gdk_window = gtk_widget_get_window(widget); |
67 gdk_window_set_user_data(widget->window, NULL); | 67 if (gdk_window) { |
| 68 gdk_window_set_user_data(gdk_window, NULL); |
68 // If the window is preserved, someone else must destroy it. | 69 // If the window is preserved, someone else must destroy it. |
69 if (!priv->preserve_window) | 70 if (!priv->preserve_window) |
70 gdk_window_destroy(widget->window); | 71 gdk_window_destroy(gdk_window); |
71 widget->window = NULL; | 72 gtk_widget_set_window(widget, NULL); |
72 } | 73 } |
73 | 74 |
74 GTK_OBJECT_CLASS(gtk_preserve_window_parent_class)->destroy(object); | 75 GTK_OBJECT_CLASS(gtk_preserve_window_parent_class)->destroy(object); |
75 } | 76 } |
76 | 77 |
77 static void gtk_preserve_window_realize(GtkWidget* widget) { | 78 static void gtk_preserve_window_realize(GtkWidget* widget) { |
78 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); | 79 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); |
79 | 80 |
80 if (widget->window) { | 81 GdkWindow* gdk_window = gtk_widget_get_window(widget); |
| 82 if (gdk_window) { |
81 GtkAllocation allocation; | 83 GtkAllocation allocation; |
82 gtk_widget_get_allocation(widget, &allocation); | 84 gtk_widget_get_allocation(widget, &allocation); |
83 | 85 |
84 gdk_window_reparent(widget->window, | 86 gdk_window_reparent(gdk_window, |
85 gtk_widget_get_parent_window(widget), | 87 gtk_widget_get_parent_window(widget), |
86 allocation.x, | 88 allocation.x, |
87 allocation.y); | 89 allocation.y); |
88 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); | 90 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); |
89 if (!priv->delegate_resize) { | 91 if (!priv->delegate_resize) { |
90 gdk_window_resize(gtk_widget_get_window(widget), | 92 gdk_window_resize(gdk_window, |
91 allocation.width, | 93 allocation.width, |
92 allocation.height); | 94 allocation.height); |
93 } | 95 } |
94 widget->style = gtk_style_attach(widget->style, widget->window); | 96 widget->style = gtk_style_attach(widget->style, widget->window); |
95 gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL); | 97 gtk_style_set_background(gtk_widget_get_style(widget), |
| 98 gdk_window, GTK_STATE_NORMAL); |
96 | 99 |
97 gint event_mask = gtk_widget_get_events(widget); | 100 gint event_mask = gtk_widget_get_events(widget); |
98 event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; | 101 event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; |
99 gdk_window_set_events(widget->window, (GdkEventMask) event_mask); | 102 gdk_window_set_events(gdk_window, (GdkEventMask) event_mask); |
100 gdk_window_set_user_data(widget->window, widget); | 103 gdk_window_set_user_data(gdk_window, widget); |
101 | 104 |
102 // Deprecated as of GTK 2.22. Used for compatibility. | 105 // Deprecated as of GTK 2.22. Used for compatibility. |
103 // It should be: gtk_widget_set_realized(widget, TRUE) | 106 // It should be: gtk_widget_set_realized(widget, TRUE) |
104 GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); | 107 GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); |
105 } else { | 108 } else { |
106 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->realize(widget); | 109 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->realize(widget); |
107 } | 110 } |
108 } | 111 } |
109 | 112 |
110 static void gtk_preserve_window_unrealize(GtkWidget* widget) { | 113 static void gtk_preserve_window_unrealize(GtkWidget* widget) { |
(...skipping 12 matching lines...) Expand all Loading... |
123 gtk_widget_set_mapped(widget, FALSE); | 126 gtk_widget_set_mapped(widget, FALSE); |
124 } | 127 } |
125 | 128 |
126 // This is the behavior from GtkWidget, inherited by GtkFixed. | 129 // This is the behavior from GtkWidget, inherited by GtkFixed. |
127 // It is unclear why we should not call the potentially overridden | 130 // It is unclear why we should not call the potentially overridden |
128 // unrealize method (via the callback), but doing so causes errors. | 131 // unrealize method (via the callback), but doing so causes errors. |
129 container_class->forall( | 132 container_class->forall( |
130 GTK_CONTAINER(widget), FALSE, | 133 GTK_CONTAINER(widget), FALSE, |
131 reinterpret_cast<GtkCallback>(gtk_widget_unrealize), NULL); | 134 reinterpret_cast<GtkCallback>(gtk_widget_unrealize), NULL); |
132 | 135 |
| 136 GdkWindow* gdk_window = gtk_widget_get_window(widget); |
| 137 |
133 gtk_style_detach(widget->style); | 138 gtk_style_detach(widget->style); |
134 gdk_window_reparent(widget->window, gdk_get_default_root_window(), 0, 0); | 139 gdk_window_reparent(gdk_window, gdk_get_default_root_window(), 0, 0); |
135 gtk_selection_remove_all(widget); | 140 gtk_selection_remove_all(widget); |
136 gdk_window_set_user_data(widget->window, NULL); | 141 gdk_window_set_user_data(gdk_window, NULL); |
137 | 142 |
138 gtk_widget_set_realized(widget, FALSE); | 143 gtk_widget_set_realized(widget, FALSE); |
139 } else { | 144 } else { |
140 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->unrealize(widget); | 145 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->unrealize(widget); |
141 } | 146 } |
142 } | 147 } |
143 | 148 |
144 gboolean gtk_preserve_window_get_preserve(GtkPreserveWindow* window) { | 149 gboolean gtk_preserve_window_get_preserve(GtkPreserveWindow* window) { |
145 g_return_val_if_fail(GTK_IS_PRESERVE_WINDOW(window), FALSE); | 150 g_return_val_if_fail(GTK_IS_PRESERVE_WINDOW(window), FALSE); |
146 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(window); | 151 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(window); |
147 | 152 |
148 return priv->preserve_window; | 153 return priv->preserve_window; |
149 } | 154 } |
150 | 155 |
151 void gtk_preserve_window_set_preserve(GtkPreserveWindow* window, | 156 void gtk_preserve_window_set_preserve(GtkPreserveWindow* window, |
152 gboolean value) { | 157 gboolean value) { |
153 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(window)); | 158 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(window)); |
154 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(window); | 159 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(window); |
155 priv->preserve_window = value; | 160 priv->preserve_window = value; |
156 | 161 |
157 GtkWidget* widget = GTK_WIDGET(window); | 162 GtkWidget* widget = GTK_WIDGET(window); |
158 if (value && !widget->window) { | 163 GdkWindow* gdk_window = gtk_widget_get_window(widget); |
| 164 if (value && !gdk_window) { |
159 GdkWindowAttr attributes; | 165 GdkWindowAttr attributes; |
160 gint attributes_mask; | 166 gint attributes_mask; |
161 | 167 |
162 // We may not know the width and height, so we rely on the fact | 168 // We may not know the width and height, so we rely on the fact |
163 // that a size-allocation will resize it later. | 169 // that a size-allocation will resize it later. |
164 attributes.width = 1; | 170 attributes.width = 1; |
165 attributes.height = 1; | 171 attributes.height = 1; |
166 | 172 |
167 attributes.window_type = GDK_WINDOW_CHILD; | 173 attributes.window_type = GDK_WINDOW_CHILD; |
168 attributes.wclass = GDK_INPUT_OUTPUT; | 174 attributes.wclass = GDK_INPUT_OUTPUT; |
169 attributes.override_redirect = TRUE; | 175 attributes.override_redirect = TRUE; |
170 | 176 |
171 attributes.visual = gtk_widget_get_visual(widget); | 177 attributes.visual = gtk_widget_get_visual(widget); |
172 attributes.colormap = gtk_widget_get_colormap(widget); | 178 attributes.colormap = gtk_widget_get_colormap(widget); |
173 | 179 |
174 attributes.event_mask = gtk_widget_get_events(widget); | 180 attributes.event_mask = gtk_widget_get_events(widget); |
175 attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; | 181 attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; |
176 | 182 |
177 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_NOREDIR; | 183 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_NOREDIR; |
178 widget->window = gdk_window_new( | 184 gdk_window = gdk_window_new( |
179 gdk_get_default_root_window(), &attributes, attributes_mask); | 185 gdk_get_default_root_window(), &attributes, attributes_mask); |
180 } else if (!value && widget->window && !gtk_widget_get_realized(widget)) { | 186 gtk_widget_set_window(widget, gdk_window); |
181 gdk_window_destroy(widget->window); | 187 } else if (!value && gdk_window && !gtk_widget_get_realized(widget)) { |
182 widget->window = NULL; | 188 gdk_window_destroy(gdk_window); |
| 189 gtk_widget_set_window(widget, NULL); |
183 } | 190 } |
184 } | 191 } |
185 | 192 |
186 void gtk_preserve_window_size_allocate(GtkWidget* widget, | 193 void gtk_preserve_window_size_allocate(GtkWidget* widget, |
187 GtkAllocation* allocation) { | 194 GtkAllocation* allocation) { |
188 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); | 195 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); |
189 | 196 |
190 widget->allocation = *allocation; | 197 gtk_widget_set_allocation(widget, allocation); |
191 | 198 |
192 if (gtk_widget_get_realized(widget)) { | 199 if (gtk_widget_get_realized(widget)) { |
193 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); | 200 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); |
| 201 GdkWindow* gdk_window = gtk_widget_get_window(widget); |
194 if (priv->delegate_resize) { | 202 if (priv->delegate_resize) { |
195 gdk_window_move(widget->window, allocation->x, allocation->y); | 203 gdk_window_move(gdk_window, allocation->x, allocation->y); |
196 } else { | 204 } else { |
197 gdk_window_move_resize( | 205 gdk_window_move_resize( |
198 widget->window, allocation->x, allocation->y, | 206 gdk_window, allocation->x, allocation->y, |
199 allocation->width, allocation->height); | 207 allocation->width, allocation->height); |
200 } | 208 } |
201 } | 209 } |
202 | 210 |
203 // Propagate resize to children | 211 // Propagate resize to children |
204 guint16 border_width = GTK_CONTAINER(widget)->border_width; | 212 guint16 border_width = GTK_CONTAINER(widget)->border_width; |
205 GList *children = GTK_FIXED(widget)->children; | 213 GList *children = GTK_FIXED(widget)->children; |
206 while (children) { | 214 while (children) { |
207 GtkFixedChild *child = reinterpret_cast<GtkFixedChild*>(children->data); | 215 GtkFixedChild *child = reinterpret_cast<GtkFixedChild*>(children->data); |
208 if (gtk_widget_get_visible(child->widget)) { | 216 if (gtk_widget_get_visible(child->widget)) { |
(...skipping 12 matching lines...) Expand all Loading... |
221 } | 229 } |
222 } | 230 } |
223 | 231 |
224 void gtk_preserve_window_delegate_resize(GtkPreserveWindow* widget, | 232 void gtk_preserve_window_delegate_resize(GtkPreserveWindow* widget, |
225 gboolean delegate) { | 233 gboolean delegate) { |
226 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); | 234 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); |
227 priv->delegate_resize = delegate; | 235 priv->delegate_resize = delegate; |
228 } | 236 } |
229 | 237 |
230 G_END_DECLS | 238 G_END_DECLS |
OLD | NEW |