summaryrefslogtreecommitdiffstats
path: root/chrome/views/widget
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 23:23:11 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 23:23:11 +0000
commit50ddd8b885c03fe4fba19130918939026ae6ef24 (patch)
tree4df5857465cbded5c559c917320d2ee09f13eb97 /chrome/views/widget
parentefb5ccb4aa5aa111a1e894f8ad22cf6a8f053aba (diff)
downloadchromium_src-50ddd8b885c03fe4fba19130918939026ae6ef24.zip
chromium_src-50ddd8b885c03fe4fba19130918939026ae6ef24.tar.gz
chromium_src-50ddd8b885c03fe4fba19130918939026ae6ef24.tar.bz2
Reverting 15468.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15470 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/views/widget')
-rw-r--r--chrome/views/widget/hwnd_notification_source.h24
-rw-r--r--chrome/views/widget/root_view.cc25
-rw-r--r--chrome/views/widget/widget_win.cc8
3 files changed, 37 insertions, 20 deletions
diff --git a/chrome/views/widget/hwnd_notification_source.h b/chrome/views/widget/hwnd_notification_source.h
new file mode 100644
index 0000000..602ae44
--- /dev/null
+++ b/chrome/views/widget/hwnd_notification_source.h
@@ -0,0 +1,24 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_VIEWS_WIDGET_HWND_NOTIFICATION_SOURCE_H_
+#define CHROME_VIEWS_WIDGET_HWND_NOTIFICATION_SOURCE_H_
+
+#include "chrome/common/notification_source.h"
+
+// Specialization of the Source class for HWND. This is needed as the Source
+// class expects a pointer type.
+template<>
+class Source<HWND> : public NotificationSource {
+ public:
+ explicit Source(HWND hwnd) : NotificationSource(hwnd) {}
+
+ explicit Source(const NotificationSource& other)
+ : NotificationSource(other) {}
+
+ HWND operator->() const { return ptr(); }
+ HWND ptr() const { return static_cast<HWND>(ptr_); }
+};
+
+#endif // #define CHROME_VIEWS_WIDGET_HWND_NOTIFICATION_SOURCE_H_
diff --git a/chrome/views/widget/root_view.cc b/chrome/views/widget/root_view.cc
index e674aac..bd57fe4 100644
--- a/chrome/views/widget/root_view.cc
+++ b/chrome/views/widget/root_view.cc
@@ -13,12 +13,11 @@
#endif
#include "base/logging.h"
#include "base/message_loop.h"
+#include "chrome/common/notification_service.h"
#if defined(OS_WIN)
-#include "chrome/views/focus/view_storage.h"
#include "chrome/views/widget/root_view_drop_target.h"
#endif
#include "chrome/views/widget/widget.h"
-#include "chrome/views/window/window.h"
namespace views {
@@ -262,24 +261,10 @@ void RootView::ViewHierarchyChanged(bool is_add, View* parent, View* child) {
if (default_keyboard_handler_ == child) {
default_keyboard_handler_ = NULL;
}
-
- // For a given widget hierarchy, focus is tracked by a FocusManager attached
- // to our nearest enclosing Window. <-- Important Assumption!
- // We may not have access to our window if this function is called as a
- // result of teardown during the deletion of the RootView and its hierarchy,
- // so we don't bother notifying the FocusManager in that case because it
- // will have already been destroyed (the Widget that contains us is
- // NCDESTROY'ed which in turn destroys the focus manager _before_ the
- // RootView is deleted.)
- Window* window = GetWindow();
- if (window) {
- FocusManager* focus_manager =
- FocusManager::GetFocusManager(window->GetNativeWindow());
- focus_manager->ViewRemoved(parent, child);
- }
-#if defined(OS_WIN)
- ViewStorage::GetSharedInstance()->ViewRemoved(parent, child);
-#endif
+ NotificationService::current()->Notify(
+ NotificationType::VIEW_REMOVED,
+ Source<View>(child),
+ Details<View>(parent));
}
}
diff --git a/chrome/views/widget/widget_win.cc b/chrome/views/widget/widget_win.cc
index 5ee065a..0bb3e78 100644
--- a/chrome/views/widget/widget_win.cc
+++ b/chrome/views/widget/widget_win.cc
@@ -9,12 +9,14 @@
#include "base/string_util.h"
#include "base/win_util.h"
#include "chrome/app/chrome_dll_resource.h"
+#include "chrome/common/notification_service.h"
#include "chrome/common/win_util.h"
#include "chrome/views/accessibility/view_accessibility.h"
#include "chrome/views/controls/native_control_win.h"
#include "chrome/views/fill_layout.h"
#include "chrome/views/focus/focus_util_win.h"
#include "chrome/views/widget/aero_tooltip_manager.h"
+#include "chrome/views/widget/hwnd_notification_source.h"
#include "chrome/views/widget/root_view.h"
#include "chrome/views/window/window_win.h"
@@ -465,6 +467,12 @@ void WidgetWin::OnCaptureChanged(HWND hwnd) {
}
void WidgetWin::OnClose() {
+ // WARNING: this method is NOT called for all WidgetWins. If you need to do
+ // cleanup code before WidgetWin is destroyed, put it in OnDestroy.
+ NotificationService::current()->Notify(
+ NotificationType::WINDOW_CLOSED, Source<HWND>(hwnd_),
+ NotificationService::NoDetails());
+
Close();
}