summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-11 03:31:44 +0000
committerpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-11 03:31:44 +0000
commitdc484904b1424c2b59bfed60f30b678e1c4b5988 (patch)
treec1fff456adae0c5a5cdce1143e686db5b7a32149 /app
parentd19c0a84f266ba9f63e8130e81232f4ef8b53a4d (diff)
downloadchromium_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.cc14
-rw-r--r--app/win/window_impl.h4
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;