Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Side by Side Diff: gfx/gtk_preserve_window.cc

Issue 5105006: Resize synchronization for Linux. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: make -j17 all is my friend (fix the test build). Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gfx/gtk_preserve_window.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "gfx/gtk_preserve_window.h" 5 #include "gfx/gtk_preserve_window.h"
6 6
7 #include <gdk/gdkwindow.h> 7 #include <gdk/gdkwindow.h>
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #include <gtk/gtkwidget.h> 9 #include <gtk/gtkwidget.h>
10 #include <gtk/gtkfixed.h> 10 #include <gtk/gtkfixed.h>
11 11
12 G_BEGIN_DECLS 12 G_BEGIN_DECLS
13 13
14 #define GTK_PRESERVE_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ 14 #define GTK_PRESERVE_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
15 GTK_TYPE_PRESERVE_WINDOW, \ 15 GTK_TYPE_PRESERVE_WINDOW, \
16 GtkPreserveWindowPrivate)) 16 GtkPreserveWindowPrivate))
17 17
18 typedef struct _GtkPreserveWindowPrivate GtkPreserveWindowPrivate; 18 typedef struct _GtkPreserveWindowPrivate GtkPreserveWindowPrivate;
19 19
20 struct _GtkPreserveWindowPrivate { 20 struct _GtkPreserveWindowPrivate {
21 // If true, don't create/destroy windows on realize/unrealize. 21 // If true, don't create/destroy windows on realize/unrealize.
22 gboolean preserve_window; 22 gboolean preserve_window;
23
24 // Whether or not we delegate the resize of the GdkWindow
25 // to someone else.
26 gboolean delegate_resize;
23 }; 27 };
24 28
25 G_DEFINE_TYPE(GtkPreserveWindow, gtk_preserve_window, GTK_TYPE_FIXED) 29 G_DEFINE_TYPE(GtkPreserveWindow, gtk_preserve_window, GTK_TYPE_FIXED)
26 30
27 static void gtk_preserve_window_destroy(GtkObject* object); 31 static void gtk_preserve_window_destroy(GtkObject* object);
28 static void gtk_preserve_window_realize(GtkWidget* widget); 32 static void gtk_preserve_window_realize(GtkWidget* widget);
29 static void gtk_preserve_window_unrealize(GtkWidget* widget); 33 static void gtk_preserve_window_unrealize(GtkWidget* widget);
34 static void gtk_preserve_window_size_allocate(GtkWidget* widget,
35 GtkAllocation* allocation);
30 36
31 static void gtk_preserve_window_class_init(GtkPreserveWindowClass *klass) { 37 static void gtk_preserve_window_class_init(GtkPreserveWindowClass *klass) {
32 GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(klass); 38 GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(klass);
33 widget_class->realize = gtk_preserve_window_realize; 39 widget_class->realize = gtk_preserve_window_realize;
34 widget_class->unrealize = gtk_preserve_window_unrealize; 40 widget_class->unrealize = gtk_preserve_window_unrealize;
41 widget_class->size_allocate = gtk_preserve_window_size_allocate;
35 42
36 GtkObjectClass* object_class = reinterpret_cast<GtkObjectClass*>(klass); 43 GtkObjectClass* object_class = reinterpret_cast<GtkObjectClass*>(klass);
37 object_class->destroy = gtk_preserve_window_destroy; 44 object_class->destroy = gtk_preserve_window_destroy;
38 45
39 GObjectClass* gobject_class = G_OBJECT_CLASS(klass); 46 GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
40 g_type_class_add_private(gobject_class, sizeof(GtkPreserveWindowPrivate)); 47 g_type_class_add_private(gobject_class, sizeof(GtkPreserveWindowPrivate));
41 } 48 }
42 49
43 static void gtk_preserve_window_init(GtkPreserveWindow* widget) { 50 static void gtk_preserve_window_init(GtkPreserveWindow* widget) {
44 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); 51 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget);
(...skipping 21 matching lines...) Expand all
66 73
67 static void gtk_preserve_window_realize(GtkWidget* widget) { 74 static void gtk_preserve_window_realize(GtkWidget* widget) {
68 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); 75 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget));
69 76
70 if (widget->window) { 77 if (widget->window) {
71 gdk_window_reparent(widget->window, 78 gdk_window_reparent(widget->window,
72 gtk_widget_get_parent_window(widget), 79 gtk_widget_get_parent_window(widget),
73 widget->allocation.x, 80 widget->allocation.x,
74 widget->allocation.y); 81 widget->allocation.y);
75 widget->style = gtk_style_attach(widget->style, widget->window); 82 widget->style = gtk_style_attach(widget->style, widget->window);
83 gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
84
85 gint event_mask = gtk_widget_get_events(widget);
86 event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK;
87 gdk_window_set_events(widget->window, (GdkEventMask) event_mask);
76 gdk_window_set_user_data(widget->window, widget); 88 gdk_window_set_user_data(widget->window, widget);
77 89
78 // Deprecated as of GTK 2.22. Used for compatibility. 90 // Deprecated as of GTK 2.22. Used for compatibility.
79 // It should be: gtk_widget_set_realized(widget, TRUE) 91 // It should be: gtk_widget_set_realized(widget, TRUE)
80 GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); 92 GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
81 } else { 93 } else {
82 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->realize(widget); 94 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->realize(widget);
83 } 95 }
84 } 96 }
85 97
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 // that a size-allocation will resize it later. 157 // that a size-allocation will resize it later.
146 attributes.width = 1; 158 attributes.width = 1;
147 attributes.height = 1; 159 attributes.height = 1;
148 160
149 attributes.window_type = GDK_WINDOW_CHILD; 161 attributes.window_type = GDK_WINDOW_CHILD;
150 attributes.wclass = GDK_INPUT_OUTPUT; 162 attributes.wclass = GDK_INPUT_OUTPUT;
151 163
152 attributes.visual = gtk_widget_get_visual(widget); 164 attributes.visual = gtk_widget_get_visual(widget);
153 attributes.colormap = gtk_widget_get_colormap(widget); 165 attributes.colormap = gtk_widget_get_colormap(widget);
154 166
155 attributes.event_mask = gtk_widget_get_events(widget);
156 attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK;
157
158 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; 167 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP;
159 widget->window = gdk_window_new( 168 widget->window = gdk_window_new(
160 gdk_get_default_root_window(), &attributes, attributes_mask); 169 gdk_get_default_root_window(), &attributes, attributes_mask);
161 } 170 }
162 } 171 }
163 172
173 void gtk_preserve_window_size_allocate(GtkWidget* widget,
174 GtkAllocation* allocation) {
175 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget));
176 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget);
177
178 if (priv->delegate_resize) {
179 // Just update the state. Someone else will gdk_window_resize the
180 // associated GdkWindow.
181 widget->allocation = *allocation;
182 } else {
183 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->size_allocate(
184 widget, allocation);
185 }
186 }
187
188 void gtk_preserve_window_delegate_resize(GtkPreserveWindow* widget,
189 gboolean delegate) {
190 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget);
191 priv->delegate_resize = delegate;
192 }
193
164 G_END_DECLS 194 G_END_DECLS
OLDNEW
« no previous file with comments | « gfx/gtk_preserve_window.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698