OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ | |
6 #define VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ | |
7 #pragma once | |
8 | |
9 #include <atlbase.h> | |
10 #include <atlapp.h> | |
11 #include <atlcrack.h> | |
12 #include <atlmisc.h> | |
13 | |
14 #include <string> | |
15 #include <vector> | |
16 | |
17 #include "base/memory/ref_counted.h" | |
18 #include "base/memory/scoped_ptr.h" | |
19 #include "base/memory/scoped_vector.h" | |
20 #include "base/memory/weak_ptr.h" | |
21 #include "base/message_loop.h" | |
22 #include "base/win/scoped_comptr.h" | |
23 #include "base/win/win_util.h" | |
24 #include "ui/base/win/window_impl.h" | |
25 #include "ui/gfx/compositor/compositor.h" | |
26 #include "ui/views/focus/focus_manager.h" | |
27 #include "ui/views/layout/layout_manager.h" | |
28 #include "views/widget/native_widget_private.h" | |
29 | |
30 namespace ui { | |
31 class Compositor; | |
32 class ViewProp; | |
33 } | |
34 | |
35 namespace gfx { | |
36 class CanvasSkia; | |
37 class Font; | |
38 class Rect; | |
39 } | |
40 | |
41 namespace views { | |
42 | |
43 class DropTargetWin; | |
44 class RootView; | |
45 class TooltipManagerWin; | |
46 | |
47 // These two messages aren't defined in winuser.h, but they are sent to windows | |
48 // with captions. They appear to paint the window caption and frame. | |
49 // Unfortunately if you override the standard non-client rendering as we do | |
50 // with CustomFrameWindow, sometimes Windows (not deterministically | |
51 // reproducibly but definitely frequently) will send these messages to the | |
52 // window and paint the standard caption/title over the top of the custom one. | |
53 // So we need to handle these messages in CustomFrameWindow to prevent this | |
54 // from happening. | |
55 const int WM_NCUAHDRAWCAPTION = 0xAE; | |
56 const int WM_NCUAHDRAWFRAME = 0xAF; | |
57 | |
58 /////////////////////////////////////////////////////////////////////////////// | |
59 // | |
60 // NativeWidgetWin | |
61 // A Widget for a views hierarchy used to represent anything that can be | |
62 // contained within an HWND, e.g. a control, a window, etc. Specializations | |
63 // suitable for specific tasks, e.g. top level window, are derived from this. | |
64 // | |
65 // This Widget contains a RootView which owns the hierarchy of views within it. | |
66 // As long as views are part of this tree, they will be deleted automatically | |
67 // when the RootView is destroyed. If you remove a view from the tree, you are | |
68 // then responsible for cleaning up after it. | |
69 // | |
70 /////////////////////////////////////////////////////////////////////////////// | |
71 class VIEWS_EXPORT NativeWidgetWin : public ui::WindowImpl, | |
72 public MessageLoopForUI::Observer, | |
73 public ui::CompositorDelegate, | |
74 public internal::NativeWidgetPrivate { | |
75 public: | |
76 explicit NativeWidgetWin(internal::NativeWidgetDelegate* delegate); | |
77 virtual ~NativeWidgetWin(); | |
78 | |
79 // Returns true if we are on Windows Vista or greater and composition is | |
80 // enabled. | |
81 static bool IsAeroGlassEnabled(); | |
82 | |
83 // Returns the system set window title font. | |
84 static gfx::Font GetWindowTitleFont(); | |
85 | |
86 // Show the window with the specified show command. | |
87 void Show(int show_state); | |
88 | |
89 // Disable Layered Window updates by setting to false. | |
90 void set_can_update_layered_window(bool can_update_layered_window) { | |
91 can_update_layered_window_ = can_update_layered_window; | |
92 } | |
93 | |
94 // Obtain the view event with the given MSAA child id. Used in | |
95 // NativeViewAccessibilityWin::get_accChild to support requests for | |
96 // children of windowless controls. May return NULL | |
97 // (see ViewHierarchyChanged). | |
98 View* GetAccessibilityViewEventAt(int id); | |
99 | |
100 // Add a view that has recently fired an accessibility event. Returns a MSAA | |
101 // child id which is generated by: -(index of view in vector + 1) which | |
102 // guarantees a negative child id. This distinguishes the view from | |
103 // positive MSAA child id's which are direct leaf children of views that have | |
104 // associated hWnd's (e.g. NativeWidgetWin). | |
105 int AddAccessibilityViewEvent(View* view); | |
106 | |
107 // Clear a view that has recently been removed on a hierarchy change. | |
108 void ClearAccessibilityViewEvent(View* view); | |
109 | |
110 // Hides the window if it hasn't already been force-hidden. The force hidden | |
111 // count is tracked, so calling multiple times is allowed, you just have to | |
112 // be sure to call PopForceHidden the same number of times. | |
113 void PushForceHidden(); | |
114 | |
115 // Decrements the force hidden count, showing the window if we have reached | |
116 // the top of the stack. See PushForceHidden. | |
117 void PopForceHidden(); | |
118 | |
119 BOOL IsWindow() const { | |
120 return ::IsWindow(GetNativeView()); | |
121 } | |
122 | |
123 BOOL ShowWindow(int command) { | |
124 DCHECK(::IsWindow(GetNativeView())); | |
125 return ::ShowWindow(GetNativeView(), command); | |
126 } | |
127 | |
128 HWND GetParent() const { | |
129 return ::GetParent(GetNativeView()); | |
130 } | |
131 | |
132 LONG GetWindowLong(int index) { | |
133 DCHECK(::IsWindow(GetNativeView())); | |
134 return ::GetWindowLong(GetNativeView(), index); | |
135 } | |
136 | |
137 BOOL GetWindowRect(RECT* rect) const { | |
138 return ::GetWindowRect(GetNativeView(), rect); | |
139 } | |
140 | |
141 LONG SetWindowLong(int index, LONG new_long) { | |
142 DCHECK(::IsWindow(GetNativeView())); | |
143 return ::SetWindowLong(GetNativeView(), index, new_long); | |
144 } | |
145 | |
146 BOOL SetWindowPos(HWND hwnd_after, int x, int y, int cx, int cy, UINT flags) { | |
147 DCHECK(::IsWindow(GetNativeView())); | |
148 return ::SetWindowPos(GetNativeView(), hwnd_after, x, y, cx, cy, flags); | |
149 } | |
150 | |
151 BOOL IsZoomed() const { | |
152 DCHECK(::IsWindow(GetNativeView())); | |
153 return ::IsZoomed(GetNativeView()); | |
154 } | |
155 | |
156 BOOL MoveWindow(int x, int y, int width, int height) { | |
157 return MoveWindow(x, y, width, height, TRUE); | |
158 } | |
159 | |
160 BOOL MoveWindow(int x, int y, int width, int height, BOOL repaint) { | |
161 DCHECK(::IsWindow(GetNativeView())); | |
162 return ::MoveWindow(GetNativeView(), x, y, width, height, repaint); | |
163 } | |
164 | |
165 int SetWindowRgn(HRGN region, BOOL redraw) { | |
166 DCHECK(::IsWindow(GetNativeView())); | |
167 return ::SetWindowRgn(GetNativeView(), region, redraw); | |
168 } | |
169 | |
170 BOOL GetClientRect(RECT* rect) const { | |
171 DCHECK(::IsWindow(GetNativeView())); | |
172 return ::GetClientRect(GetNativeView(), rect); | |
173 } | |
174 | |
175 // Overridden from ui::CompositorDelegate: | |
176 virtual void ScheduleDraw(); | |
177 | |
178 // Overridden from internal::NativeWidgetPrivate: | |
179 virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE; | |
180 virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE; | |
181 virtual void UpdateFrameAfterFrameChange() OVERRIDE; | |
182 virtual bool ShouldUseNativeFrame() const OVERRIDE; | |
183 virtual void FrameTypeChanged() OVERRIDE; | |
184 virtual Widget* GetWidget() OVERRIDE; | |
185 virtual const Widget* GetWidget() const OVERRIDE; | |
186 virtual gfx::NativeView GetNativeView() const OVERRIDE; | |
187 virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE; | |
188 virtual Widget* GetTopLevelWidget() OVERRIDE; | |
189 virtual const ui::Compositor* GetCompositor() const OVERRIDE; | |
190 virtual ui::Compositor* GetCompositor() OVERRIDE; | |
191 virtual void CalculateOffsetToAncestorWithLayer( | |
192 gfx::Point* offset, | |
193 ui::Layer** layer_parent) OVERRIDE; | |
194 virtual void ReorderLayers() OVERRIDE; | |
195 virtual void ViewRemoved(View* view) OVERRIDE; | |
196 virtual void SetNativeWindowProperty(const char* name, void* value) OVERRIDE; | |
197 virtual void* GetNativeWindowProperty(const char* name) const OVERRIDE; | |
198 virtual TooltipManager* GetTooltipManager() const OVERRIDE; | |
199 virtual bool IsScreenReaderActive() const OVERRIDE; | |
200 virtual void SendNativeAccessibilityEvent( | |
201 View* view, | |
202 ui::AccessibilityTypes::Event event_type) OVERRIDE; | |
203 virtual void SetMouseCapture() OVERRIDE; | |
204 virtual void ReleaseMouseCapture() OVERRIDE; | |
205 virtual bool HasMouseCapture() const OVERRIDE; | |
206 virtual InputMethod* CreateInputMethod() OVERRIDE; | |
207 virtual void CenterWindow(const gfx::Size& size) OVERRIDE; | |
208 virtual void GetWindowPlacement( | |
209 gfx::Rect* bounds, | |
210 ui::WindowShowState* show_state) const OVERRIDE; | |
211 virtual void SetWindowTitle(const string16& title) OVERRIDE; | |
212 virtual void SetWindowIcons(const SkBitmap& window_icon, | |
213 const SkBitmap& app_icon) OVERRIDE; | |
214 virtual void SetAccessibleName(const string16& name) OVERRIDE; | |
215 virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE; | |
216 virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE; | |
217 virtual void BecomeModal() OVERRIDE; | |
218 virtual gfx::Rect GetWindowScreenBounds() const OVERRIDE; | |
219 virtual gfx::Rect GetClientAreaScreenBounds() const OVERRIDE; | |
220 virtual gfx::Rect GetRestoredBounds() const OVERRIDE; | |
221 virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; | |
222 virtual void SetSize(const gfx::Size& size) OVERRIDE; | |
223 virtual void MoveAbove(gfx::NativeView native_view) OVERRIDE; | |
224 virtual void MoveToTop() OVERRIDE; | |
225 virtual void SetShape(gfx::NativeRegion shape) OVERRIDE; | |
226 virtual void Close() OVERRIDE; | |
227 virtual void CloseNow() OVERRIDE; | |
228 virtual void EnableClose(bool enable) OVERRIDE; | |
229 virtual void Show() OVERRIDE; | |
230 virtual void Hide() OVERRIDE; | |
231 virtual void ShowMaximizedWithBounds( | |
232 const gfx::Rect& restored_bounds) OVERRIDE; | |
233 virtual void ShowWithWindowState(ui::WindowShowState show_state) OVERRIDE; | |
234 virtual bool IsVisible() const OVERRIDE; | |
235 virtual void Activate() OVERRIDE; | |
236 virtual void Deactivate() OVERRIDE; | |
237 virtual bool IsActive() const OVERRIDE; | |
238 virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; | |
239 virtual void Maximize() OVERRIDE; | |
240 virtual void Minimize() OVERRIDE; | |
241 virtual bool IsMaximized() const OVERRIDE; | |
242 virtual bool IsMinimized() const OVERRIDE; | |
243 virtual void Restore() OVERRIDE; | |
244 virtual void SetFullscreen(bool fullscreen) OVERRIDE; | |
245 virtual bool IsFullscreen() const OVERRIDE; | |
246 virtual void SetOpacity(unsigned char opacity) OVERRIDE; | |
247 virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE; | |
248 virtual bool IsAccessibleWidget() const OVERRIDE; | |
249 virtual void RunShellDrag(View* view, | |
250 const ui::OSExchangeData& data, | |
251 int operation) OVERRIDE; | |
252 virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; | |
253 virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE; | |
254 virtual void ClearNativeFocus() OVERRIDE; | |
255 virtual void FocusNativeView(gfx::NativeView native_view) OVERRIDE; | |
256 virtual bool ConvertPointFromAncestor( | |
257 const Widget* ancestor, gfx::Point* point) const OVERRIDE; | |
258 virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE; | |
259 virtual void SetInactiveRenderingDisabled(bool value) OVERRIDE; | |
260 | |
261 protected: | |
262 // Information saved before going into fullscreen mode, used to restore the | |
263 // window afterwards. | |
264 struct SavedWindowInfo { | |
265 bool maximized; | |
266 LONG style; | |
267 LONG ex_style; | |
268 RECT window_rect; | |
269 }; | |
270 | |
271 // Overridden from MessageLoop::Observer: | |
272 virtual base::EventStatus WillProcessEvent( | |
273 const base::NativeEvent& event) OVERRIDE; | |
274 virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; | |
275 | |
276 // Overridden from WindowImpl: | |
277 virtual HICON GetDefaultWindowIcon() const OVERRIDE; | |
278 virtual LRESULT OnWndProc(UINT message, | |
279 WPARAM w_param, | |
280 LPARAM l_param) OVERRIDE; | |
281 | |
282 // Message Handlers ---------------------------------------------------------- | |
283 | |
284 BEGIN_MSG_MAP_EX(NativeWidgetWin) | |
285 // Range handlers must go first! | |
286 MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) | |
287 MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE, WM_NCXBUTTONDBLCLK, OnMouseRange) | |
288 | |
289 // Reflected message handler | |
290 MESSAGE_HANDLER_EX(base::win::kReflectedMessage, OnReflectedMessage) | |
291 | |
292 // CustomFrameWindow hacks | |
293 MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption) | |
294 MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame) | |
295 | |
296 // Vista and newer | |
297 MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED, OnDwmCompositionChanged) | |
298 | |
299 // Non-atlcrack.h handlers | |
300 MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject) | |
301 | |
302 // Mouse events. | |
303 MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE, OnMouseActivate) | |
304 MESSAGE_HANDLER_EX(WM_MOUSELEAVE, OnMouseRange) | |
305 MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseRange) | |
306 MESSAGE_HANDLER_EX(WM_SETCURSOR, OnSetCursor); | |
307 | |
308 // Key events. | |
309 MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyEvent) | |
310 MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyEvent) | |
311 MESSAGE_HANDLER_EX(WM_SYSKEYDOWN, OnKeyEvent) | |
312 MESSAGE_HANDLER_EX(WM_SYSKEYUP, OnKeyEvent) | |
313 | |
314 // IME Events. | |
315 MESSAGE_HANDLER_EX(WM_IME_SETCONTEXT, OnImeMessages) | |
316 MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION, OnImeMessages) | |
317 MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeMessages) | |
318 MESSAGE_HANDLER_EX(WM_IME_ENDCOMPOSITION, OnImeMessages) | |
319 MESSAGE_HANDLER_EX(WM_IME_REQUEST, OnImeMessages) | |
320 MESSAGE_HANDLER_EX(WM_CHAR, OnImeMessages) | |
321 MESSAGE_HANDLER_EX(WM_SYSCHAR, OnImeMessages) | |
322 MESSAGE_HANDLER_EX(WM_DEADCHAR, OnImeMessages) | |
323 MESSAGE_HANDLER_EX(WM_SYSDEADCHAR, OnImeMessages) | |
324 | |
325 // This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU. | |
326 MSG_WM_ACTIVATE(OnActivate) | |
327 MSG_WM_ACTIVATEAPP(OnActivateApp) | |
328 MSG_WM_APPCOMMAND(OnAppCommand) | |
329 MSG_WM_CANCELMODE(OnCancelMode) | |
330 MSG_WM_CAPTURECHANGED(OnCaptureChanged) | |
331 MSG_WM_CLOSE(OnClose) | |
332 MSG_WM_COMMAND(OnCommand) | |
333 MSG_WM_CREATE(OnCreate) | |
334 MSG_WM_DESTROY(OnDestroy) | |
335 MSG_WM_DISPLAYCHANGE(OnDisplayChange) | |
336 MSG_WM_ERASEBKGND(OnEraseBkgnd) | |
337 MSG_WM_ENDSESSION(OnEndSession) | |
338 MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove) | |
339 MSG_WM_EXITMENULOOP(OnExitMenuLoop) | |
340 MSG_WM_EXITSIZEMOVE(OnExitSizeMove) | |
341 MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo) | |
342 MSG_WM_HSCROLL(OnHScroll) | |
343 MSG_WM_INITMENU(OnInitMenu) | |
344 MSG_WM_INITMENUPOPUP(OnInitMenuPopup) | |
345 MSG_WM_INPUTLANGCHANGE(OnInputLangChange) | |
346 MSG_WM_KILLFOCUS(OnKillFocus) | |
347 MSG_WM_MOVE(OnMove) | |
348 MSG_WM_MOVING(OnMoving) | |
349 MSG_WM_NCACTIVATE(OnNCActivate) | |
350 MSG_WM_NCCALCSIZE(OnNCCalcSize) | |
351 MSG_WM_NCHITTEST(OnNCHitTest) | |
352 MSG_WM_NCPAINT(OnNCPaint) | |
353 MSG_WM_NOTIFY(OnNotify) | |
354 MSG_WM_PAINT(OnPaint) | |
355 MSG_WM_POWERBROADCAST(OnPowerBroadcast) | |
356 MSG_WM_SETFOCUS(OnSetFocus) | |
357 MSG_WM_SETICON(OnSetIcon) | |
358 MSG_WM_SETTEXT(OnSetText) | |
359 MSG_WM_SETTINGCHANGE(OnSettingChange) | |
360 MSG_WM_SIZE(OnSize) | |
361 MSG_WM_SYSCOMMAND(OnSysCommand) | |
362 MSG_WM_THEMECHANGED(OnThemeChanged) | |
363 MSG_WM_VSCROLL(OnVScroll) | |
364 MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging) | |
365 MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged) | |
366 END_MSG_MAP() | |
367 | |
368 // These are all virtual so that specialized Widgets can modify or augment | |
369 // processing. | |
370 // This list is in _ALPHABETICAL_ order! | |
371 // Note: in the base class these functions must do nothing but convert point | |
372 // coordinates to client coordinates (if necessary) and forward the | |
373 // handling to the appropriate Process* function. This is so that | |
374 // subclasses can easily override these methods to do different things | |
375 // and have a convenient function to call to get the default behavior. | |
376 virtual void OnActivate(UINT action, BOOL minimized, HWND window); | |
377 virtual void OnActivateApp(BOOL active, DWORD thread_id); | |
378 virtual LRESULT OnAppCommand(HWND window, short app_command, WORD device, | |
379 int keystate); | |
380 virtual void OnCancelMode(); | |
381 virtual void OnCaptureChanged(HWND hwnd); | |
382 virtual void OnClose(); | |
383 virtual void OnCommand(UINT notification_code, int command_id, HWND window); | |
384 virtual LRESULT OnCreate(CREATESTRUCT* create_struct); | |
385 // WARNING: If you override this be sure and invoke super, otherwise we'll | |
386 // leak a few things. | |
387 virtual void OnDestroy(); | |
388 virtual void OnDisplayChange(UINT bits_per_pixel, CSize screen_size); | |
389 virtual LRESULT OnDwmCompositionChanged(UINT msg, | |
390 WPARAM w_param, | |
391 LPARAM l_param); | |
392 virtual void OnEndSession(BOOL ending, UINT logoff); | |
393 virtual void OnEnterSizeMove(); | |
394 virtual LRESULT OnEraseBkgnd(HDC dc); | |
395 virtual void OnExitMenuLoop(BOOL is_track_popup_menu); | |
396 virtual void OnExitSizeMove(); | |
397 virtual LRESULT OnGetObject(UINT uMsg, WPARAM w_param, LPARAM l_param); | |
398 virtual void OnGetMinMaxInfo(MINMAXINFO* minmax_info); | |
399 virtual void OnHScroll(int scroll_type, short position, HWND scrollbar); | |
400 virtual LRESULT OnImeMessages(UINT message, WPARAM w_param, LPARAM l_param); | |
401 virtual void OnInitMenu(HMENU menu); | |
402 virtual void OnInitMenuPopup(HMENU menu, UINT position, BOOL is_system_menu); | |
403 virtual void OnInputLangChange(DWORD character_set, HKL input_language_id); | |
404 virtual LRESULT OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param); | |
405 virtual void OnKillFocus(HWND focused_window); | |
406 virtual LRESULT OnMouseActivate(UINT message, WPARAM w_param, LPARAM l_param); | |
407 virtual LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param); | |
408 virtual void OnMove(const CPoint& point); | |
409 virtual void OnMoving(UINT param, LPRECT new_bounds); | |
410 virtual LRESULT OnNCActivate(BOOL active); | |
411 virtual LRESULT OnNCCalcSize(BOOL w_param, LPARAM l_param); | |
412 virtual LRESULT OnNCHitTest(const CPoint& pt); | |
413 virtual void OnNCPaint(HRGN rgn); | |
414 virtual LRESULT OnNCUAHDrawCaption(UINT msg, | |
415 WPARAM w_param, | |
416 LPARAM l_param); | |
417 virtual LRESULT OnNCUAHDrawFrame(UINT msg, WPARAM w_param, LPARAM l_param); | |
418 virtual LRESULT OnNotify(int w_param, NMHDR* l_param); | |
419 virtual void OnPaint(HDC dc); | |
420 virtual LRESULT OnPowerBroadcast(DWORD power_event, DWORD data); | |
421 virtual LRESULT OnReflectedMessage(UINT msg, WPARAM w_param, LPARAM l_param); | |
422 virtual LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param); | |
423 virtual void OnSetFocus(HWND focused_window); | |
424 virtual LRESULT OnSetIcon(UINT size_type, HICON new_icon); | |
425 virtual LRESULT OnSetText(const wchar_t* text); | |
426 virtual void OnSettingChange(UINT flags, const wchar_t* section); | |
427 virtual void OnSize(UINT param, const CSize& size); | |
428 virtual void OnSysCommand(UINT notification_code, CPoint click); | |
429 virtual void OnThemeChanged(); | |
430 virtual void OnVScroll(int scroll_type, short position, HWND scrollbar); | |
431 virtual void OnWindowPosChanging(WINDOWPOS* window_pos); | |
432 virtual void OnWindowPosChanged(WINDOWPOS* window_pos); | |
433 | |
434 // Deletes this window as it is destroyed, override to provide different | |
435 // behavior. | |
436 virtual void OnFinalMessage(HWND window); | |
437 | |
438 // Retrieve the show state of the window. This is one of the SW_SHOW* flags | |
439 // passed into Windows' ShowWindow method. For normal windows this defaults | |
440 // to SW_SHOWNORMAL, however windows (e.g. the main window) can override this | |
441 // method to provide different values (e.g. retrieve the user's specified | |
442 // show state from the shortcut starutp info). | |
443 virtual int GetShowState() const; | |
444 | |
445 // Returns the insets of the client area relative to the non-client area of | |
446 // the window. Override this function instead of OnNCCalcSize, which is | |
447 // crazily complicated. | |
448 virtual gfx::Insets GetClientAreaInsets() const; | |
449 | |
450 // Start tracking all mouse events so that this window gets sent mouse leave | |
451 // messages too. | |
452 void TrackMouseEvents(DWORD mouse_tracking_flags); | |
453 | |
454 // Called when a MSAA screen reader client is detected. | |
455 virtual void OnScreenReaderDetected(); | |
456 | |
457 // Executes the specified SC_command. | |
458 void ExecuteSystemMenuCommand(int command); | |
459 | |
460 // The TooltipManager. This is NULL if there is a problem creating the | |
461 // underlying tooltip window. | |
462 // WARNING: RootView's destructor calls into the TooltipManager. As such, this | |
463 // must be destroyed AFTER root_view_. | |
464 scoped_ptr<TooltipManagerWin> tooltip_manager_; | |
465 | |
466 scoped_refptr<DropTargetWin> drop_target_; | |
467 | |
468 const gfx::Rect& invalid_rect() const { return invalid_rect_; } | |
469 | |
470 // Saved window information from before entering fullscreen mode. | |
471 // TODO(beng): move to private once GetRestoredBounds() moves onto Widget. | |
472 SavedWindowInfo saved_window_info_; | |
473 | |
474 private: | |
475 typedef ScopedVector<ui::ViewProp> ViewProps; | |
476 | |
477 // Called after the WM_ACTIVATE message has been processed by the default | |
478 // windows procedure. | |
479 static void PostProcessActivateMessage(NativeWidgetWin* widget, | |
480 int activation_state); | |
481 | |
482 void SetInitParams(const Widget::InitParams& params); | |
483 | |
484 // Synchronously paints the invalid contents of the Widget. | |
485 void RedrawInvalidRect(); | |
486 | |
487 // Synchronously updates the invalid contents of the Widget. Valid for | |
488 // layered windows only. | |
489 void RedrawLayeredWindowContents(); | |
490 | |
491 // Lock or unlock the window from being able to redraw itself in response to | |
492 // updates to its invalid region. | |
493 class ScopedRedrawLock; | |
494 void LockUpdates(); | |
495 void UnlockUpdates(); | |
496 | |
497 // Determines whether the delegate expects the client size or the window size. | |
498 bool WidgetSizeIsClientSize() const; | |
499 | |
500 // Responds to the client area changing size, either at window creation time | |
501 // or subsequently. | |
502 void ClientAreaSizeChanged(); | |
503 | |
504 // Resets the window region for the current widget bounds if necessary. | |
505 // If |force| is true, the window region is reset to NULL even for native | |
506 // frame windows. | |
507 void ResetWindowRegion(bool force); | |
508 | |
509 // Calls DefWindowProc, safely wrapping the call in a ScopedRedrawLock to | |
510 // prevent frame flicker. DefWindowProc handling can otherwise render the | |
511 // classic-look window title bar directly. | |
512 LRESULT DefWindowProcWithRedrawLock(UINT message, | |
513 WPARAM w_param, | |
514 LPARAM l_param); | |
515 | |
516 // Stops ignoring SetWindowPos() requests (see below). | |
517 void StopIgnoringPosChanges() { ignore_window_pos_changes_ = false; } | |
518 | |
519 void RestoreEnabledIfNecessary(); | |
520 | |
521 void SetInitialFocus(); | |
522 | |
523 // Overridden from internal::InputMethodDelegate | |
524 virtual void DispatchKeyEventPostIME(const KeyEvent& key) OVERRIDE; | |
525 | |
526 // A delegate implementation that handles events received here. | |
527 // See class documentation for Widget in widget.h for a note about ownership. | |
528 internal::NativeWidgetDelegate* delegate_; | |
529 | |
530 // The following factory is used for calls to close the NativeWidgetWin | |
531 // instance. | |
532 base::WeakPtrFactory<NativeWidgetWin> close_widget_factory_; | |
533 | |
534 // The flags currently being used with TrackMouseEvent to track mouse | |
535 // messages. 0 if there is no active tracking. The value of this member is | |
536 // used when tracking is canceled. | |
537 DWORD active_mouse_tracking_flags_; | |
538 | |
539 // Should we keep an off-screen buffer? This is false by default, set to true | |
540 // when WS_EX_LAYERED is specified before the native window is created. | |
541 // | |
542 // NOTE: this is intended to be used with a layered window (a window with an | |
543 // extended window style of WS_EX_LAYERED). If you are using a layered window | |
544 // and NOT changing the layered alpha or anything else, then leave this value | |
545 // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll | |
546 // most likely want to set this to false, or after changing the alpha toggle | |
547 // the extended style bit to false than back to true. See MSDN for more | |
548 // details. | |
549 bool use_layered_buffer_; | |
550 | |
551 // The default alpha to be applied to the layered window. | |
552 BYTE layered_alpha_; | |
553 | |
554 // A canvas that contains the window contents in the case of a layered | |
555 // window. | |
556 scoped_ptr<gfx::CanvasSkia> layered_window_contents_; | |
557 | |
558 // We must track the invalid rect ourselves, for two reasons: | |
559 // For layered windows, Windows will not do this properly with | |
560 // InvalidateRect()/GetUpdateRect(). (In fact, it'll return misleading | |
561 // information from GetUpdateRect()). | |
562 // We also need to keep track of the invalid rectangle for the RootView should | |
563 // we need to paint the non-client area. The data supplied to WM_NCPAINT seems | |
564 // to be insufficient. | |
565 gfx::Rect invalid_rect_; | |
566 | |
567 // A factory that allows us to schedule a redraw for layered windows. | |
568 base::WeakPtrFactory<NativeWidgetWin> paint_layered_window_factory_; | |
569 | |
570 // See class documentation for Widget in widget.h for a note about ownership. | |
571 Widget::InitParams::Ownership ownership_; | |
572 | |
573 // True if we are allowed to update the layered window from the DIB backing | |
574 // store if necessary. | |
575 bool can_update_layered_window_; | |
576 | |
577 // Whether the focus should be restored next time we get enabled. Needed to | |
578 // restore focus correctly when Windows modal dialogs are displayed. | |
579 bool restore_focus_when_enabled_; | |
580 | |
581 // Instance of accessibility information and handling for MSAA root | |
582 base::win::ScopedComPtr<IAccessible> accessibility_root_; | |
583 | |
584 // Value determines whether the Widget is customized for accessibility. | |
585 static bool screen_reader_active_; | |
586 | |
587 // The maximum number of view events in our vector below. | |
588 static const int kMaxAccessibilityViewEvents = 20; | |
589 | |
590 // A vector used to access views for which we have sent notifications to | |
591 // accessibility clients. It is used as a circular queue. | |
592 std::vector<View*> accessibility_view_events_; | |
593 | |
594 // The current position of the view events vector. When incrementing, | |
595 // we always mod this value with the max view events above . | |
596 int accessibility_view_events_index_; | |
597 | |
598 // The last cursor that was active before the current one was selected. Saved | |
599 // so that we can restore it. | |
600 gfx::NativeCursor previous_cursor_; | |
601 | |
602 ViewProps props_; | |
603 | |
604 // True if we're in fullscreen mode. | |
605 bool fullscreen_; | |
606 | |
607 // If this is greater than zero, we should prevent attempts to make the window | |
608 // visible when we handle WM_WINDOWPOSCHANGING. Some calls like | |
609 // ShowWindow(SW_RESTORE) make the window visible in addition to restoring it, | |
610 // when all we want to do is restore it. | |
611 int force_hidden_count_; | |
612 | |
613 // The window styles before we modified them for the drag frame appearance. | |
614 DWORD drag_frame_saved_window_style_; | |
615 DWORD drag_frame_saved_window_ex_style_; | |
616 | |
617 // Represents the number of ScopedRedrawLocks active against this widget. | |
618 // If this is greater than zero, the widget should be locked against updates. | |
619 int lock_updates_count_; | |
620 | |
621 // The window styles of the window before updates were locked. | |
622 DWORD saved_window_style_; | |
623 | |
624 // When true, this flag makes us discard incoming SetWindowPos() requests that | |
625 // only change our position/size. (We still allow changes to Z-order, | |
626 // activation, etc.) | |
627 bool ignore_window_pos_changes_; | |
628 | |
629 // The following factory is used to ignore SetWindowPos() calls for short time | |
630 // periods. | |
631 base::WeakPtrFactory<NativeWidgetWin> ignore_pos_changes_factory_; | |
632 | |
633 // The last-seen monitor containing us, and its rect and work area. These are | |
634 // used to catch updates to the rect and work area and react accordingly. | |
635 HMONITOR last_monitor_; | |
636 gfx::Rect last_monitor_rect_, last_work_area_; | |
637 | |
638 // Set to true when the user presses the right mouse button on the caption | |
639 // area. We need this so we can correctly show the context menu on mouse-up. | |
640 bool is_right_mouse_pressed_on_caption_; | |
641 | |
642 // Whether all ancestors have been enabled. This is only used if is_modal_ is | |
643 // true. | |
644 bool restored_enabled_; | |
645 | |
646 // The compositor for accelerated drawing. | |
647 scoped_refptr<ui::Compositor> compositor_; | |
648 | |
649 // This flag can be initialized and checked after certain operations (such as | |
650 // DefWindowProc) to avoid stack-controlled NativeWidgetWin operations (such | |
651 // as unlocking the Window with a ScopedRedrawLock) after Widget destruction. | |
652 bool* destroyed_; | |
653 | |
654 // True if the widget is going to have a non_client_view. We cache this value | |
655 // rather than asking the Widget for the non_client_view so that we know at | |
656 // Init time, before the Widget has created the NonClientView. | |
657 bool has_non_client_view_; | |
658 | |
659 DISALLOW_COPY_AND_ASSIGN(NativeWidgetWin); | |
660 }; | |
661 | |
662 } // namespace views | |
663 | |
664 #endif // VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_ | |
OLD | NEW |