OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/win/singleton_hwnd.h" | 5 #include "ui/gfx/win/singleton_hwnd.h" |
6 | 6 |
7 #include "base/memory/singleton.h" | 7 #include "base/memory/singleton.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 | 9 |
10 namespace gfx { | 10 namespace gfx { |
11 | 11 |
12 // SingletonHwnd::Observer | |
13 SingletonHwnd::Observer::Observer() {} | |
14 | |
15 SingletonHwnd::Observer::~Observer() { | |
16 ClearWndProc(); | |
17 } | |
18 | |
19 void SingletonHwnd::Observer::SetWndProc(const WndProc& wndProc) { | |
20 if (wndProc_.is_null()) | |
sky
2015/04/24 20:58:23
Is there a reason you can't add observer in the co
robliao
2015/04/24 21:49:03
A critical part of SingletonHwndObserver is that i
sky
2015/04/27 15:11:28
I would prefer a scoped_ptr. It's make the observe
robliao
2015/04/27 22:45:46
Done.
| |
21 SingletonHwnd::GetInstance()->AddObserver(this); | |
22 | |
23 wndProc_ = wndProc; | |
24 | |
25 if (wndProc_.is_null()) | |
26 SingletonHwnd::GetInstance()->RemoveObserver(this); | |
27 } | |
28 | |
29 void SingletonHwnd::Observer::ClearWndProc() { | |
30 SetWndProc(WndProc()); | |
31 } | |
32 | |
33 void SingletonHwnd::Observer::OnWndProc(HWND hwnd, | |
34 UINT message, | |
35 WPARAM wparam, | |
36 LPARAM lparam) { | |
37 if (wndProc_.is_null()) | |
38 return; | |
39 | |
40 wndProc_.Run(hwnd, message, wparam, lparam); | |
41 | |
42 if (message == WM_NCDESTROY) { | |
43 ClearWndProc(); | |
44 } | |
45 } | |
46 | |
12 // static | 47 // static |
13 SingletonHwnd* SingletonHwnd::GetInstance() { | 48 SingletonHwnd* SingletonHwnd::GetInstance() { |
14 return Singleton<SingletonHwnd>::get(); | 49 return Singleton<SingletonHwnd>::get(); |
15 } | 50 } |
16 | 51 |
17 void SingletonHwnd::AddObserver(Observer* observer) { | |
18 observer_list_.AddObserver(observer); | |
19 } | |
20 | |
21 void SingletonHwnd::RemoveObserver(Observer* observer) { | |
22 if (!hwnd()) | |
23 return; | |
24 observer_list_.RemoveObserver(observer); | |
25 } | |
26 | |
27 BOOL SingletonHwnd::ProcessWindowMessage(HWND window, | 52 BOOL SingletonHwnd::ProcessWindowMessage(HWND window, |
28 UINT message, | 53 UINT message, |
29 WPARAM wparam, | 54 WPARAM wparam, |
30 LPARAM lparam, | 55 LPARAM lparam, |
31 LRESULT& result, | 56 LRESULT& result, |
32 DWORD msg_map_id) { | 57 DWORD msg_map_id) { |
33 FOR_EACH_OBSERVER(Observer, | 58 FOR_EACH_OBSERVER(Observer, |
34 observer_list_, | 59 observer_list_, |
35 OnWndProc(window, message, wparam, lparam)); | 60 OnWndProc(window, message, wparam, lparam)); |
36 return false; | 61 return false; |
37 } | 62 } |
38 | 63 |
39 SingletonHwnd::SingletonHwnd() { | 64 SingletonHwnd::SingletonHwnd() { |
40 if (!base::MessageLoopForUI::IsCurrent()) { | 65 if (!base::MessageLoopForUI::IsCurrent()) { |
41 // Creating this window in (e.g.) a renderer inhibits shutdown on | 66 // Creating this window in (e.g.) a renderer inhibits shutdown on |
42 // Windows. See http://crbug.com/230122 and http://crbug.com/236039. | 67 // Windows. See http://crbug.com/230122 and http://crbug.com/236039. |
43 DLOG(ERROR) << "Cannot create windows on non-UI thread!"; | 68 DLOG(ERROR) << "Cannot create windows on non-UI thread!"; |
44 return; | 69 return; |
45 } | 70 } |
46 WindowImpl::Init(NULL, Rect()); | 71 WindowImpl::Init(NULL, Rect()); |
47 } | 72 } |
48 | 73 |
49 SingletonHwnd::~SingletonHwnd() { | 74 SingletonHwnd::~SingletonHwnd() { |
75 // WindowImpl will clean up the hwnd value on WM_NCDESTROY. | |
76 DestroyWindow(hwnd()); | |
77 DCHECK(!observer_list_.might_have_observers()); | |
78 } | |
79 | |
80 void SingletonHwnd::AddObserver(Observer* observer) { | |
81 DCHECK(hwnd()); | |
82 observer_list_.AddObserver(observer); | |
83 } | |
84 | |
85 void SingletonHwnd::RemoveObserver(Observer* observer) { | |
86 observer_list_.RemoveObserver(observer); | |
50 } | 87 } |
51 | 88 |
52 } // namespace gfx | 89 } // namespace gfx |
OLD | NEW |