diff options
author | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-31 11:58:49 +0000 |
---|---|---|
committer | glotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-31 11:58:49 +0000 |
commit | 7e83ae2b7e7782f91479bb8d1a609bda113bf36b (patch) | |
tree | 69f2477b937bb8ae30902367e124451197dd39e9 /views/widget | |
parent | 7ae883344b5869ca83ad6612211a6bdf4ca5092b (diff) | |
download | chromium_src-7e83ae2b7e7782f91479bb8d1a609bda113bf36b.zip chromium_src-7e83ae2b7e7782f91479bb8d1a609bda113bf36b.tar.gz chromium_src-7e83ae2b7e7782f91479bb8d1a609bda113bf36b.tar.bz2 |
Removing DeleteSoon() from WigetGtk so it behaves like WidgetWin
This is a retry of http://codereview.chromium.org/7002029/ after it has been reverted because of the failing test BrowserTest.CloseWithAppMenuOpen (failed only on buildbot)
BUG=chromium-os:15129
TEST=tests
Review URL: http://codereview.chromium.org/7082042
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87294 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/widget')
-rw-r--r-- | views/widget/native_widget_gtk.cc | 36 | ||||
-rw-r--r-- | views/widget/native_widget_gtk.h | 7 |
2 files changed, 30 insertions, 13 deletions
diff --git a/views/widget/native_widget_gtk.cc b/views/widget/native_widget_gtk.cc index d4295d5..186f8ef 100644 --- a/views/widget/native_widget_gtk.cc +++ b/views/widget/native_widget_gtk.cc @@ -20,15 +20,16 @@ #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/dragdrop/os_exchange_data_provider_gtk.h" +#include "ui/base/gtk/g_object_destructor_filo.h" #include "ui/base/gtk/gtk_windowing.h" #include "ui/base/gtk/scoped_handle_gtk.h" #include "ui/base/x/x11_util.h" #include "ui/gfx/canvas_skia_paint.h" #include "ui/gfx/path.h" -#include "views/views_delegate.h" #include "views/controls/textfield/native_textfield_views.h" #include "views/focus/view_storage.h" #include "views/ime/input_method_gtk.h" +#include "views/views_delegate.h" #include "views/widget/drop_target_gtk.h" #include "views/widget/gtk_views_fixed.h" #include "views/widget/gtk_views_window.h" @@ -321,11 +322,17 @@ NativeWidgetGtk::NativeWidgetGtk(internal::NativeWidgetDelegate* delegate) } NativeWidgetGtk::~NativeWidgetGtk() { + if (widget_) { + ui::GObjectDestructorFILO::GetInstance()->Disconnect( + G_OBJECT(widget_), &OnDestroyedThunk, this); + if (ownership_ != Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) + CloseNow(); + } + DCHECK(ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET || + widget_ == NULL); // We need to delete the input method before calling DestroyRootView(), // because it'll set focus_manager_ to NULL. input_method_.reset(); - DCHECK(ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET || - widget_ == NULL); if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) delete delegate_; // TODO(altimofeev): investigate why OnDestroy could not be called. @@ -720,6 +727,9 @@ void NativeWidgetGtk::InitNativeWidget(const Widget::InitParams& params) { g_signal_connect(G_OBJECT(widget_), "window-state-event", G_CALLBACK(&OnWindowStateEventThunk), this); + ui::GObjectDestructorFILO::GetInstance()->Connect( + G_OBJECT(widget_), &OnDestroyedThunk, this); + tooltip_manager_.reset(new TooltipManagerGtk(this)); // Register for tooltips. @@ -923,10 +933,10 @@ void NativeWidgetGtk::MoveAbove(gfx::NativeView native_view) { } void NativeWidgetGtk::SetShape(gfx::NativeRegion region) { - DCHECK(widget_); - DCHECK(widget_->window); - gdk_window_shape_combine_region(widget_->window, region, 0, 0); - gdk_region_destroy(region); + if (widget_ && widget_->window) { + gdk_window_shape_combine_region(widget_->window, region, 0, 0); + gdk_region_destroy(region); + } } void NativeWidgetGtk::Close() { @@ -1373,13 +1383,13 @@ void NativeWidgetGtk::OnDestroy(GtkWidget* object) { ActiveWindowWatcherX::RemoveObserver(this); // Note that this handler is hooked to GtkObject::destroy. // NULL out pointers here since we might still be in an observer list - // until delstion happens. + // until deletion happens. widget_ = window_contents_ = NULL; - if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) { - // Delays the deletion of this NativeWidgetGtk as we want its children to - // have access to it when destroyed. - MessageLoop::current()->DeleteSoon(FROM_HERE, this); - } +} + +void NativeWidgetGtk::OnDestroyed(GObject *where_the_object_was) { + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) + delete this; } void NativeWidgetGtk::OnShow(GtkWidget* widget) { diff --git a/views/widget/native_widget_gtk.h b/views/widget/native_widget_gtk.h index 5ab27c9..7dca06f 100644 --- a/views/widget/native_widget_gtk.h +++ b/views/widget/native_widget_gtk.h @@ -257,6 +257,13 @@ class NativeWidgetGtk : public NativeWidget, CHROMEGTK_CALLBACK_1(NativeWidgetGtk, gboolean, OnWindowStateEvent, GdkEventWindowState*); + // Invoked when the widget is destroyed and right before the object + // destruction. Useful for overriding. + virtual void OnDestroyed(GObject *where_the_object_was); + static void OnDestroyedThunk(gpointer data, GObject *where_the_object_was) { + reinterpret_cast<NativeWidgetGtk*>(data)->OnDestroyed(where_the_object_was); + } + // Invoked when gtk grab is stolen by other GtkWidget in the same // application. virtual void HandleGtkGrabBroke(); |