summaryrefslogtreecommitdiffstats
path: root/views/widget
diff options
context:
space:
mode:
authorglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-31 11:58:49 +0000
committerglotov@google.com <glotov@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-31 11:58:49 +0000
commit7e83ae2b7e7782f91479bb8d1a609bda113bf36b (patch)
tree69f2477b937bb8ae30902367e124451197dd39e9 /views/widget
parent7ae883344b5869ca83ad6612211a6bdf4ca5092b (diff)
downloadchromium_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.cc36
-rw-r--r--views/widget/native_widget_gtk.h7
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();