1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
|
// Copyright (c) 2011 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 UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
#define UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
#include "ui/base/win/window_impl.h"
#include "base/logging.h"
#include "base/message_loop.h"
#include "base/scoped_ptr.h"
#include "base/scoped_vector.h"
#include "ui/views/widget/native_widget.h"
namespace gfx {
class CanvasSkia;
}
namespace ui {
class ViewProp;
class Widget;
namespace internal {
// A Windows message reflected from other windows. This message is sent with the
// following arguments:
// HWND - Target window
// MSG - kReflectedMessage
// WPARAM - Should be 0
// LPARAM - Pointer to MSG struct containing the original message.
const int kReflectedMessage = WM_APP + 3;
// These two messages aren't defined in winuser.h, but they are sent to windows
// with captions. They appear to paint the window caption and frame.
// Unfortunately if you override the standard non-client rendering as we do
// with CustomFrameWindow, sometimes Windows (not deterministically
// reproducibly but definitely frequently) will send these messages to the
// window and paint the standard caption/title over the top of the custom one.
// So we need to handle these messages in CustomFrameWindow to prevent this
// from happening.
const int WM_NCUAHDRAWCAPTION = 0xAE;
const int WM_NCUAHDRAWFRAME = 0xAF;
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetWin class
//
// A NativeWidget implementation that wraps a Win32 HWND.
//
class NativeWidgetWin : public NativeWidget,
public ui::WindowImpl,
public MessageLoopForUI::Observer {
public:
explicit NativeWidgetWin(NativeWidgetListener* listener);
virtual ~NativeWidgetWin();
private:
typedef ScopedVector<ViewProp> ViewProps;
// Overridden from NativeWidget:
virtual void InitWithNativeViewParent(gfx::NativeView parent,
const gfx::Rect& bounds);
virtual void InitWithWidgetParent(Widget* parent,
const gfx::Rect& bounds);
virtual void InitWithViewParent(View* parent, const gfx::Rect& bounds);
virtual void SetNativeWindowProperty(const char* name, void* value);
virtual void* GetNativeWindowProperty(const char* name) const;
virtual gfx::Rect GetWindowScreenBounds() const;
virtual gfx::Rect GetClientAreaScreenBounds() const;
virtual void SetBounds(const gfx::Rect& bounds);
virtual void SetShape(const gfx::Path& shape);
virtual gfx::NativeView GetNativeView() const;
virtual void Show();
virtual void Hide();
virtual void Close();
virtual void MoveAbove(NativeWidget* other);
virtual void SetAlwaysOnTop(bool always_on_top);
virtual bool IsVisible() const;
virtual bool IsActive() const;
virtual void SetMouseCapture();
virtual void ReleaseMouseCapture();
virtual bool HasMouseCapture() const;
virtual bool ShouldReleaseCaptureOnMouseReleased() const;
virtual void Invalidate();
virtual void InvalidateRect(const gfx::Rect& invalid_rect);
virtual void Paint();
virtual void FocusNativeView(gfx::NativeView native_view);
virtual Widget* GetWidget() const;
// Overridden from MessageLoop::Observer:
void WillProcessMessage(const MSG& msg);
virtual void DidProcessMessage(const MSG& msg);
// Message handlers
BEGIN_MSG_MAP_EX(NativeWidgetWin)
// Range handlers must go first!
MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE, WM_NCMBUTTONDBLCLK, OnNCMouseRange)
// Reflected message handler
MESSAGE_HANDLER_EX(kReflectedMessage, OnReflectedMessage)
// CustomFrameWindow hacks
MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption)
MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame)
// Vista and newer
MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED, OnDwmCompositionChanged)
// Non-atlcrack.h handlers
MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject)
MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseLeave)
MESSAGE_HANDLER_EX(WM_MOUSELEAVE, OnMouseLeave)
// Key events.
MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyUp)
MESSAGE_HANDLER_EX(WM_SYSKEYDOWN, OnKeyDown);
MESSAGE_HANDLER_EX(WM_SYSKEYUP, OnKeyUp);
// This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU.
MSG_WM_ACTIVATE(OnActivate)
MSG_WM_ACTIVATEAPP(OnActivateApp)
MSG_WM_APPCOMMAND(OnAppCommand)
MSG_WM_CANCELMODE(OnCancelMode)
MSG_WM_CAPTURECHANGED(OnCaptureChanged)
MSG_WM_CLOSE(OnClose)
MSG_WM_COMMAND(OnCommand)
MSG_WM_CREATE(OnCreate)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_DISPLAYCHANGE(OnDisplayChange)
MSG_WM_ERASEBKGND(OnEraseBkgnd)
MSG_WM_ENDSESSION(OnEndSession)
MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove)
MSG_WM_EXITMENULOOP(OnExitMenuLoop)
MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo)
MSG_WM_HSCROLL(OnHScroll)
MSG_WM_INITMENU(OnInitMenu)
MSG_WM_INITMENUPOPUP(OnInitMenuPopup)
MSG_WM_KILLFOCUS(OnKillFocus)
MSG_WM_MOUSEACTIVATE(OnMouseActivate)
MSG_WM_MOVE(OnMove)
MSG_WM_MOVING(OnMoving)
MSG_WM_NCACTIVATE(OnNCActivate)
MSG_WM_NCCALCSIZE(OnNCCalcSize)
MESSAGE_HANDLER_EX(WM_NCHITTEST, OnNCHitTest)
MSG_WM_NCPAINT(OnNCPaint)
MSG_WM_NOTIFY(OnNotify)
MSG_WM_PAINT(OnPaint)
MSG_WM_POWERBROADCAST(OnPowerBroadcast)
MSG_WM_SETFOCUS(OnSetFocus)
MSG_WM_SETICON(OnSetIcon)
MSG_WM_SETTEXT(OnSetText)
MSG_WM_SETTINGCHANGE(OnSettingChange)
MSG_WM_SIZE(OnSize)
MSG_WM_SYSCOMMAND(OnSysCommand)
MSG_WM_THEMECHANGED(OnThemeChanged)
MSG_WM_VSCROLL(OnVScroll)
MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging)
MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged)
END_MSG_MAP()
virtual void OnActivate(UINT action, BOOL minimized, HWND window);
virtual void OnActivateApp(BOOL active, DWORD thread_id);
virtual LRESULT OnAppCommand(HWND window, short app_command, WORD device,
int keystate);
virtual void OnCancelMode();
virtual void OnCaptureChanged(HWND hwnd);
virtual void OnClose();
virtual void OnCommand(UINT notification_code, int command_id, HWND window);
virtual LRESULT OnCreate(CREATESTRUCT* create_struct);
// WARNING: If you override this be sure and invoke super, otherwise we'll
// leak a few things.
virtual void OnDestroy();
virtual void OnDisplayChange(UINT bits_per_pixel, CSize screen_size);
virtual LRESULT OnDwmCompositionChanged(UINT message,
WPARAM w_param,
LPARAM l_param);
virtual void OnEndSession(BOOL ending, UINT logoff);
virtual void OnEnterSizeMove();
virtual LRESULT OnEraseBkgnd(HDC dc);
virtual void OnExitMenuLoop(BOOL is_track_popup_menu);
virtual void OnExitSizeMove();
virtual LRESULT OnGetObject(UINT message, WPARAM w_param, LPARAM l_param);
virtual void OnGetMinMaxInfo(MINMAXINFO* minmax_info);
virtual void OnHScroll(int scroll_type, short position, HWND scrollbar);
virtual void OnInitMenu(HMENU menu);
virtual void OnInitMenuPopup(HMENU menu, UINT position, BOOL is_system_menu);
virtual LRESULT OnKeyDown(UINT message, WPARAM w_param, LPARAM l_param);
virtual LRESULT OnKeyUp(UINT message, WPARAM w_param, LPARAM l_param);
virtual void OnKillFocus(HWND focused_window);
virtual LRESULT OnMouseActivate(HWND window, UINT hittest_code, UINT message);
virtual LRESULT OnMouseLeave(UINT message, WPARAM w_param, LPARAM l_param);
virtual void OnMove(const CPoint& point);
virtual void OnMoving(UINT param, LPRECT new_bounds);
virtual LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param);
virtual LRESULT OnNCActivate(BOOL active);
virtual LRESULT OnNCCalcSize(BOOL w_param, LPARAM l_param);
virtual LRESULT OnNCHitTest(UINT message, WPARAM w_param, LPARAM l_param);
virtual LRESULT OnNCMouseRange(UINT message, WPARAM w_param, LPARAM l_param);
virtual void OnNCPaint(HRGN rgn);
virtual LRESULT OnNCUAHDrawCaption(UINT message,
WPARAM w_param,
LPARAM l_param);
virtual LRESULT OnNCUAHDrawFrame(UINT message, WPARAM w_param,
LPARAM l_param);
virtual LRESULT OnNotify(int w_param, NMHDR* l_param);
virtual void OnPaint(HDC dc);
virtual LRESULT OnPowerBroadcast(DWORD power_event, DWORD data);
virtual LRESULT OnReflectedMessage(UINT message, WPARAM w_param,
LPARAM l_param);
virtual void OnSetFocus(HWND focused_window);
virtual LRESULT OnSetIcon(UINT size_type, HICON new_icon);
virtual LRESULT OnSetText(const wchar_t* text);
virtual void OnSettingChange(UINT flags, const wchar_t* section);
virtual void OnSize(UINT param, const CSize& size);
virtual void OnSysCommand(UINT notification_code, CPoint click);
virtual void OnThemeChanged();
virtual void OnVScroll(int scroll_type, short position, HWND scrollbar);
virtual void OnWindowPosChanging(WINDOWPOS* window_pos);
virtual void OnWindowPosChanged(WINDOWPOS* window_pos);
// Deletes this window as it is destroyed, override to provide different
// behavior.
virtual void OnFinalMessage(HWND window);
// Overridden from WindowImpl:
virtual HICON GetDefaultWindowIcon() const;
virtual LRESULT OnWndProc(UINT message, WPARAM w_param, LPARAM l_param);
// Start tracking all mouse events so that this window gets sent mouse leave
// messages too.
void TrackMouseEvents(DWORD mouse_tracking_flags);
bool ProcessMouseRange(UINT message, WPARAM w_param, LPARAM l_param,
bool non_client);
void ProcessMouseMoved(const CPoint& point, UINT flags, bool is_nonclient);
void ProcessMouseExited();
// Fills out a MSG struct with the supplied values.
void MakeMSG(MSG* msg, UINT message, WPARAM w_param, LPARAM l_param) const;
void CloseNow();
bool IsLayeredWindow() const;
// A listener implementation that handles events received here.
NativeWidgetListener* listener_;
// The flags currently being used with TrackMouseEvent to track mouse
// messages. 0 if there is no active tracking. The value of this member is
// used when tracking is canceled.
DWORD active_mouse_tracking_flags_;
// True when the HWND has event capture.
bool has_capture_;
// A canvas that contains the window contents in the case of a layered
// window.
scoped_ptr<gfx::CanvasSkia> window_contents_;
// Properties associated with this NativeWidget implementation.
// TODO(beng): move to Widget.
ViewProps props_;
DISALLOW_COPY_AND_ASSIGN(NativeWidgetWin);
};
} // namespace internal
} // namespace ui
#endif // UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
|