diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-06 23:23:11 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-06 23:23:11 +0000 |
commit | 50ddd8b885c03fe4fba19130918939026ae6ef24 (patch) | |
tree | 4df5857465cbded5c559c917320d2ee09f13eb97 /chrome/views/widget | |
parent | efb5ccb4aa5aa111a1e894f8ad22cf6a8f053aba (diff) | |
download | chromium_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.h | 24 | ||||
-rw-r--r-- | chrome/views/widget/root_view.cc | 25 | ||||
-rw-r--r-- | chrome/views/widget/widget_win.cc | 8 |
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(); } |