Chromium Code Reviews| 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* window = gtk_widget_get_window(widget); |
|
tony
2012/01/04 19:08:01
Nit: Maybe call this gdk_window too?
| |
| 67 gdk_window_set_user_data(widget->window, NULL); | 67 if (window) { |
| 68 gdk_window_set_user_data(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(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 |