diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-11 03:31:44 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-11 03:31:44 +0000 |
commit | dc484904b1424c2b59bfed60f30b678e1c4b5988 (patch) | |
tree | c1fff456adae0c5a5cdce1143e686db5b7a32149 /app | |
parent | d19c0a84f266ba9f63e8130e81232f4ef8b53a4d (diff) | |
download | chromium_src-dc484904b1424c2b59bfed60f30b678e1c4b5988.zip chromium_src-dc484904b1424c2b59bfed60f30b678e1c4b5988.tar.gz chromium_src-dc484904b1424c2b59bfed60f30b678e1c4b5988.tar.bz2 |
Try to make widgets clean up after themselves a bit better:
* When they get "destroy" window manager messages, clean up internal state so nothing will call into them and in theory someone could re-Init() successfully
* When they're deleted, ensure they're also "destroyed" from the window manager point of view
BUG=27347
TEST=none
Review URL: http://codereview.chromium.org/391010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31646 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app')
-rw-r--r-- | app/win/window_impl.cc | 14 | ||||
-rw-r--r-- | app/win/window_impl.h | 4 |
2 files changed, 17 insertions, 1 deletions
diff --git a/app/win/window_impl.cc b/app/win/window_impl.cc index b28eab5..8ddd2bc 100644 --- a/app/win/window_impl.cc +++ b/app/win/window_impl.cc @@ -180,7 +180,15 @@ LRESULT CALLBACK WindowImpl::WndProc(HWND hwnd, if (!window) return 0; - return window->OnWndProc(message, w_param, l_param); + LRESULT return_code = window->OnWndProc(message, w_param, l_param); + + // Clean up state. Do this after the above call so subclasses still have a + // valid hwnd(). Can't wait until WM_NCDESTROY because by then |hwnd| is not + // guaranteed to be reported to us. + if (message == WM_DESTROY) + window->OnDestroy(); + + return return_code; } std::wstring WindowImpl::GetWindowClassName() { @@ -211,4 +219,8 @@ std::wstring WindowImpl::GetWindowClassName() { return name; } +void WindowImpl::OnDestroy() { + hwnd_ = 0; +} + } // namespace app diff --git a/app/win/window_impl.h b/app/win/window_impl.h index fb5d512..dd7ef5a 100644 --- a/app/win/window_impl.h +++ b/app/win/window_impl.h @@ -87,6 +87,10 @@ class WindowImpl : public MessageMapInterface { // If necessary, this registers the window class. std::wstring GetWindowClassName(); + // Called when the HWND gets a WM_DESTROY message; should cause us to clean + // up any state. + void OnDestroy(); + // All classes registered by WidgetWin start with this name. static const wchar_t* const kBaseClassName; |