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

Side by Side Diff: gfx/gtk_preserve_window.cc

Issue 5275009: Defer window destruction until GPU finished drawing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Now with reference counting. 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_native_view_id_manager.cc ('k') | no next file » | 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>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 // These widgets always have their own window. 54 // These widgets always have their own window.
55 gtk_fixed_set_has_window(GTK_FIXED(widget), TRUE); 55 gtk_fixed_set_has_window(GTK_FIXED(widget), TRUE);
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 65
65 if (widget->window) { 66 if (widget->window) {
66 gdk_window_set_user_data(widget->window, NULL); 67 gdk_window_set_user_data(widget->window, NULL);
67 gdk_window_destroy(widget->window); 68 // If the window is preserved, someone else must destroy it.
69 if (!priv->preserve_window)
70 gdk_window_destroy(widget->window);
68 widget->window = NULL; 71 widget->window = NULL;
69 } 72 }
70 73
71 GTK_OBJECT_CLASS(gtk_preserve_window_parent_class)->destroy(object); 74 GTK_OBJECT_CLASS(gtk_preserve_window_parent_class)->destroy(object);
72 } 75 }
73 76
74 static void gtk_preserve_window_realize(GtkWidget* widget) { 77 static void gtk_preserve_window_realize(GtkWidget* widget) {
75 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); 78 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget));
76 79
77 if (widget->window) { 80 if (widget->window) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 163
161 attributes.window_type = GDK_WINDOW_CHILD; 164 attributes.window_type = GDK_WINDOW_CHILD;
162 attributes.wclass = GDK_INPUT_OUTPUT; 165 attributes.wclass = GDK_INPUT_OUTPUT;
163 166
164 attributes.visual = gtk_widget_get_visual(widget); 167 attributes.visual = gtk_widget_get_visual(widget);
165 attributes.colormap = gtk_widget_get_colormap(widget); 168 attributes.colormap = gtk_widget_get_colormap(widget);
166 169
167 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP; 170 attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP;
168 widget->window = gdk_window_new( 171 widget->window = gdk_window_new(
169 gdk_get_default_root_window(), &attributes, attributes_mask); 172 gdk_get_default_root_window(), &attributes, attributes_mask);
173 } else if (!value && widget->window && !GTK_WIDGET_REALIZED(widget)) {
174 gdk_window_destroy(widget->window);
175 widget->window = NULL;
170 } 176 }
171 } 177 }
172 178
173 void gtk_preserve_window_size_allocate(GtkWidget* widget, 179 void gtk_preserve_window_size_allocate(GtkWidget* widget,
174 GtkAllocation* allocation) { 180 GtkAllocation* allocation) {
175 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget)); 181 g_return_if_fail(GTK_IS_PRESERVE_WINDOW(widget));
176 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); 182 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget);
177 183
178 if (priv->delegate_resize) { 184 if (priv->delegate_resize) {
179 // Just update the state. Someone else will gdk_window_resize the 185 // Just update the state. Someone else will gdk_window_resize the
180 // associated GdkWindow. 186 // associated GdkWindow.
181 widget->allocation = *allocation; 187 widget->allocation = *allocation;
182 } else { 188 } else {
183 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->size_allocate( 189 GTK_WIDGET_CLASS(gtk_preserve_window_parent_class)->size_allocate(
184 widget, allocation); 190 widget, allocation);
185 } 191 }
186 } 192 }
187 193
188 void gtk_preserve_window_delegate_resize(GtkPreserveWindow* widget, 194 void gtk_preserve_window_delegate_resize(GtkPreserveWindow* widget,
189 gboolean delegate) { 195 gboolean delegate) {
190 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget); 196 GtkPreserveWindowPrivate* priv = GTK_PRESERVE_WINDOW_GET_PRIVATE(widget);
191 priv->delegate_resize = delegate; 197 priv->delegate_resize = delegate;
192 } 198 }
193 199
194 G_END_DECLS 200 G_END_DECLS
OLDNEW
« no previous file with comments | « gfx/gtk_native_view_id_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698