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 #ifndef BASE_MESSAGE_PUMP_WIN_H_ | 5 #ifndef BASE_MESSAGE_PUMP_WIN_H_ |
6 #define BASE_MESSAGE_PUMP_WIN_H_ | 6 #define BASE_MESSAGE_PUMP_WIN_H_ |
7 | 7 |
8 #include <windows.h> | 8 #include <windows.h> |
9 | 9 |
10 #include <list> | 10 #include <list> |
11 | 11 |
12 #include "base/base_export.h" | 12 #include "base/base_export.h" |
13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
14 #include "base/memory/scoped_ptr.h" | |
14 #include "base/message_pump.h" | 15 #include "base/message_pump.h" |
15 #include "base/message_pump_dispatcher.h" | 16 #include "base/message_pump_dispatcher.h" |
16 #include "base/message_pump_observer.h" | 17 #include "base/message_pump_observer.h" |
17 #include "base/observer_list.h" | 18 #include "base/observer_list.h" |
18 #include "base/time.h" | 19 #include "base/time.h" |
19 #include "base/win/scoped_handle.h" | 20 #include "base/win/scoped_handle.h" |
20 | 21 |
21 namespace base { | 22 namespace base { |
22 | 23 |
23 // MessagePumpWin serves as the base for specialized versions of the MessagePump | 24 // MessagePumpWin serves as the base for specialized versions of the MessagePump |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 // is peeked, and before a replacement kMsgHaveWork is posted). | 120 // is peeked, and before a replacement kMsgHaveWork is posted). |
120 // | 121 // |
121 // NOTE: Although it may seem odd that messages are used to start and stop this | 122 // NOTE: Although it may seem odd that messages are used to start and stop this |
122 // flow (as opposed to signaling objects, etc.), it should be understood that | 123 // flow (as opposed to signaling objects, etc.), it should be understood that |
123 // the native message pump will *only* respond to messages. As a result, it is | 124 // the native message pump will *only* respond to messages. As a result, it is |
124 // an excellent choice. It is also helpful that the starter messages that are | 125 // an excellent choice. It is also helpful that the starter messages that are |
125 // placed in the queue when new task arrive also awakens DoRunLoop. | 126 // placed in the queue when new task arrive also awakens DoRunLoop. |
126 // | 127 // |
127 class BASE_EXPORT MessagePumpForUI : public MessagePumpWin { | 128 class BASE_EXPORT MessagePumpForUI : public MessagePumpWin { |
128 public: | 129 public: |
130 // A MessageFilter implements the common Peek/Translate/Dispatch code to deal | |
131 // with windows messages. | |
132 class BASE_EXPORT MessageFilter { | |
133 public: | |
134 virtual ~MessageFilter() {} | |
135 virtual bool Init() = 0; | |
darin (slow to review)
2012/09/06 03:56:55
nit: This "Init" method doesn't seem to be necessa
yoichio
2012/09/06 09:40:37
Done.
| |
136 // Implements the functionality exposed by the OS through PeekMessage. | |
137 virtual BOOL DoPeekMessage(MSG* messge, | |
138 HWND window_handle, | |
139 UINT msg_filter_min, | |
140 UINT msg_filter_max, | |
141 UINT remove_msg) = 0; | |
142 // Returns true if |message| was consumed by the filter and no extra | |
143 // processing is required. If this method returns false, it is the | |
144 // responsibility of the caller to ensure that normal processing takes | |
145 // place. | |
146 // The priority to consume messages is the following: | |
147 // - Native Windows' message filter (CallMsgFilter). | |
148 // - MessageFilter::ProcessMessage. | |
149 // - MessagePumpDispatcher. | |
150 // - TranslateMessage / DispatchMessage. | |
151 virtual bool ProcessMessage(const MSG& message) = 0; | |
152 }; | |
129 // The application-defined code passed to the hook procedure. | 153 // The application-defined code passed to the hook procedure. |
130 static const int kMessageFilterCode = 0x5001; | 154 static const int kMessageFilterCode = 0x5001; |
131 | 155 |
132 MessagePumpForUI(); | 156 MessagePumpForUI(); |
133 virtual ~MessagePumpForUI(); | 157 virtual ~MessagePumpForUI(); |
134 | 158 |
159 // Sets a new MessageFilter. MessagePumpForUI takes ownership of | |
160 // |message_filter|. When SetMessageFilter is called, old MessageFilter is | |
161 // deleted. | |
162 void SetMessageFilter(MessageFilter* message_filter); | |
darin (slow to review)
2012/09/06 03:56:55
nit: argument type should be "scoped_ptr<MessageFi
yoichio
2012/09/06 09:40:37
Done.
| |
163 | |
135 // MessagePump methods: | 164 // MessagePump methods: |
136 virtual void ScheduleWork(); | 165 virtual void ScheduleWork(); |
137 virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time); | 166 virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time); |
138 | 167 |
139 // Applications can call this to encourage us to process all pending WM_PAINT | 168 // Applications can call this to encourage us to process all pending WM_PAINT |
140 // messages. This method will process all paint messages the Windows Message | 169 // messages. This method will process all paint messages the Windows Message |
141 // queue can provide, up to some fixed number (to avoid any infinite loops). | 170 // queue can provide, up to some fixed number (to avoid any infinite loops). |
142 void PumpOutPendingPaintMessages(); | 171 void PumpOutPendingPaintMessages(); |
143 | 172 |
144 private: | 173 private: |
145 static LRESULT CALLBACK WndProcThunk( | 174 static LRESULT CALLBACK WndProcThunk(HWND window_handle, |
146 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); | 175 UINT message, |
176 WPARAM wparam, | |
177 LPARAM lparam); | |
147 virtual void DoRunLoop(); | 178 virtual void DoRunLoop(); |
148 void InitMessageWnd(); | 179 void InitMessageWnd(); |
149 void WaitForWork(); | 180 void WaitForWork(); |
150 void HandleWorkMessage(); | 181 void HandleWorkMessage(); |
151 void HandleTimerMessage(); | 182 void HandleTimerMessage(); |
152 bool ProcessNextWindowsMessage(); | 183 bool ProcessNextWindowsMessage(); |
153 bool ProcessMessageHelper(const MSG& msg); | 184 bool ProcessMessageHelper(const MSG& message); |
154 bool ProcessPumpReplacementMessage(); | 185 bool ProcessPumpReplacementMessage(); |
155 | 186 |
156 // Instance of the module containing the window procedure. | 187 // Instance of the module containing the window procedure. |
157 HMODULE instance_; | 188 HMODULE instance_; |
158 | 189 |
159 // A hidden message-only window. | 190 // A hidden message-only window. |
160 HWND message_hwnd_; | 191 HWND message_hwnd_; |
192 | |
193 scoped_ptr<MessageFilter> message_filter_; | |
161 }; | 194 }; |
162 | 195 |
163 //----------------------------------------------------------------------------- | 196 //----------------------------------------------------------------------------- |
164 // MessagePumpForIO extends MessagePumpWin with methods that are particular to a | 197 // MessagePumpForIO extends MessagePumpWin with methods that are particular to a |
165 // MessageLoop instantiated with TYPE_IO. This version of MessagePump does not | 198 // MessageLoop instantiated with TYPE_IO. This version of MessagePump does not |
166 // deal with Windows mesagges, and instead has a Run loop based on Completion | 199 // deal with Windows mesagges, and instead has a Run loop based on Completion |
167 // Ports so it is better suited for IO operations. | 200 // Ports so it is better suited for IO operations. |
168 // | 201 // |
169 class BASE_EXPORT MessagePumpForIO : public MessagePumpWin { | 202 class BASE_EXPORT MessagePumpForIO : public MessagePumpWin { |
170 public: | 203 public: |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 // This list will be empty almost always. It stores IO completions that have | 383 // This list will be empty almost always. It stores IO completions that have |
351 // not been delivered yet because somebody was doing cleanup. | 384 // not been delivered yet because somebody was doing cleanup. |
352 std::list<IOItem> completed_io_; | 385 std::list<IOItem> completed_io_; |
353 | 386 |
354 ObserverList<IOObserver> io_observers_; | 387 ObserverList<IOObserver> io_observers_; |
355 }; | 388 }; |
356 | 389 |
357 } // namespace base | 390 } // namespace base |
358 | 391 |
359 #endif // BASE_MESSAGE_PUMP_WIN_H_ | 392 #endif // BASE_MESSAGE_PUMP_WIN_H_ |
OLD | NEW |