diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-21 22:17:19 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-21 22:17:19 +0000 |
commit | 3593695e937262f1ec11dbace007dd4d771e7756 (patch) | |
tree | 6387f13d05c0a1cb48fea6287dcc51632f63f1cf | |
parent | d9bdcbf9df5a5f03190084192559a9572d0222b8 (diff) | |
download | chromium_src-3593695e937262f1ec11dbace007dd4d771e7756.zip chromium_src-3593695e937262f1ec11dbace007dd4d771e7756.tar.gz chromium_src-3593695e937262f1ec11dbace007dd4d771e7756.tar.bz2 |
Add EnableDoubleBuffer to WidgetGtk
This will be used to eliminate flicker issue in notification panel (and probably in settings when settings is moved to views).
NativeViewHostGtk was creating Fixed with gdk window everytime it is repositioned with clipping.
This was causing a lot of creation/deletion of fixed when moving a native control in scroll bar.
BUG=23445
TEST=none
Review URL: http://codereview.chromium.org/1725005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45252 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | views/controls/native/native_view_host_gtk.cc | 16 | ||||
-rw-r--r-- | views/widget/widget_gtk.cc | 19 | ||||
-rw-r--r-- | views/widget/widget_gtk.h | 10 |
3 files changed, 35 insertions, 10 deletions
diff --git a/views/controls/native/native_view_host_gtk.cc b/views/controls/native/native_view_host_gtk.cc index 533683e..36aa82b 100644 --- a/views/controls/native/native_view_host_gtk.cc +++ b/views/controls/native/native_view_host_gtk.cc @@ -188,13 +188,15 @@ void NativeViewHostGtk::RemovedFromWidget() { void NativeViewHostGtk::InstallClip(int x, int y, int w, int h) { DCHECK(w > 0 && h > 0); installed_clip_bounds_.SetRect(x, y, w, h); - installed_clip_ = true; - - // We only re-create the fixed with a window when a cliprect is installed. - // Because the presence of a X Window will prevent transparency from working - // properly, we only want it to be active for the duration of a clip - // (typically during animations and scrolling.) - CreateFixed(true); + if (!installed_clip_) { + installed_clip_ = true; + + // We only re-create the fixed with a window when a cliprect is installed. + // Because the presence of a X Window will prevent transparency from working + // properly, we only want it to be active for the duration of a clip + // (typically during animations and scrolling.) + CreateFixed(true); + } } bool NativeViewHostGtk::HasInstalledClip() { diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc index 6e78a71..cb54356 100644 --- a/views/widget/widget_gtk.cc +++ b/views/widget/widget_gtk.cc @@ -153,7 +153,8 @@ WidgetGtk::WidgetGtk(Type type) got_initial_focus_in_(false), has_focus_(false), delegate_(NULL), - always_on_top_(false) { + always_on_top_(false), + is_double_buffered_(false) { static bool installed_message_loop_observer = false; if (!installed_message_loop_observer) { installed_message_loop_observer = true; @@ -210,6 +211,16 @@ bool WidgetGtk::MakeTransparent() { return true; } +void WidgetGtk::EnableDoubleBuffer(bool enabled) { + is_double_buffered_ = enabled; + if (window_contents_) { + if (is_double_buffered_) + GTK_WIDGET_SET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); + else + GTK_WIDGET_UNSET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); + } +} + bool WidgetGtk::MakeIgnoreEvents() { // Transparency can only be enabled for windows/popups and only if we haven't // realized the widget. @@ -1186,7 +1197,8 @@ void WidgetGtk::CreateGtkWidget(GtkWidget* parent, const gfx::Rect& bounds) { if (type_ == TYPE_CHILD) { window_contents_ = widget_ = gtk_views_fixed_new(); gtk_widget_set_name(widget_, "views-gtkwidget-child-fixed"); - GTK_WIDGET_UNSET_FLAGS(widget_, GTK_DOUBLE_BUFFERED); + if (!is_double_buffered_) + GTK_WIDGET_UNSET_FLAGS(widget_, GTK_DOUBLE_BUFFERED); gtk_fixed_set_has_window(GTK_FIXED(widget_), true); if (!parent && !null_parent_) { GtkWidget* popup = gtk_window_new(GTK_WINDOW_POPUP); @@ -1221,7 +1233,8 @@ void WidgetGtk::CreateGtkWidget(GtkWidget* parent, const gfx::Rect& bounds) { window_contents_ = gtk_views_fixed_new(); gtk_widget_set_name(window_contents_, "views-gtkwidget-window-fixed"); - GTK_WIDGET_UNSET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); + if (!is_double_buffered_) + GTK_WIDGET_UNSET_FLAGS(window_contents_, GTK_DOUBLE_BUFFERED); gtk_fixed_set_has_window(GTK_FIXED(window_contents_), true); gtk_container_add(GTK_CONTAINER(widget_), window_contents_); gtk_widget_show(window_contents_); diff --git a/views/widget/widget_gtk.h b/views/widget/widget_gtk.h index b86820a..5ce37e6 100644 --- a/views/widget/widget_gtk.h +++ b/views/widget/widget_gtk.h @@ -79,6 +79,12 @@ class WidgetGtk bool MakeTransparent(); bool is_transparent() const { return transparent_; } + // Enable/Disable double buffering.This is neccessary to prevent + // flickering in ScrollView, which has both native and view + // controls. + void EnableDoubleBuffer(bool enabled); + bool is_double_buffered() const { return is_double_buffered_; } + // Makes the window pass all events through to any windows behind it. // This must be invoked before Init. This does a couple of checks and returns // true if the window can be made to ignore events. The actual work of making @@ -431,6 +437,10 @@ class WidgetGtk // for types other than TYPE_CHILD. bool always_on_top_; + // If true, we enable the content widget's double buffering. + // This is false by default. + bool is_double_buffered_; + DISALLOW_COPY_AND_ASSIGN(WidgetGtk); }; |