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
3// found in the LICENSE file.
4
5#ifndef UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
6#define UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
7
8#include <windows.h>
9
10#include <set>
11#include <vector>
12
13#include "base/basictypes.h"
14#include "base/compiler_specific.h"
15#include "base/memory/scoped_ptr.h"
16#include "base/memory/weak_ptr.h"
17#include "base/strings/string16.h"
18#include "base/win/scoped_gdi_object.h"
19#include "base/win/win_util.h"
20#include "ui/accessibility/ax_enums.h"
21#include "ui/base/ui_base_types.h"
22#include "ui/base/win/window_event_target.h"
23#include "ui/events/event.h"
24#include "ui/gfx/rect.h"
25#include "ui/gfx/sequential_id_generator.h"
26#include "ui/gfx/win/window_impl.h"
27#include "ui/views/ime/input_method_delegate.h"
28#include "ui/views/views_export.h"
29
30namespace gfx {
31class Canvas;
32class ImageSkia;
33class Insets;
34}
35
36namespace ui  {
37class ViewProp;
38}
39
40namespace views {
41
42class FullscreenHandler;
43class HWNDMessageHandlerDelegate;
44class InputMethod;
45
46// These two messages aren't defined in winuser.h, but they are sent to windows
47// with captions. They appear to paint the window caption and frame.
48// Unfortunately if you override the standard non-client rendering as we do
49// with CustomFrameWindow, sometimes Windows (not deterministically
50// reproducibly but definitely frequently) will send these messages to the
51// window and paint the standard caption/title over the top of the custom one.
52// So we need to handle these messages in CustomFrameWindow to prevent this
53// from happening.
54const int WM_NCUAHDRAWCAPTION = 0xAE;
55const int WM_NCUAHDRAWFRAME = 0xAF;
56
57// IsMsgHandled() and BEGIN_SAFE_MSG_MAP_EX are a modified version of
58// BEGIN_MSG_MAP_EX. The main difference is it adds a WeakPtrFactory member
59// (|weak_factory_|) that is used in _ProcessWindowMessage() and changing
60// IsMsgHandled() from a member function to a define that checks if the weak
61// factory is still valid in addition to the member. Together these allow for
62// |this| to be deleted during dispatch.
63#define IsMsgHandled() !ref.get() || msg_handled_
64
65#define BEGIN_SAFE_MSG_MAP_EX(the_class) \
66 private: \
67  base::WeakPtrFactory<the_class> weak_factory_; \
68  BOOL msg_handled_; \
69\
70 public: \
71  /* "handled" management for cracked handlers */ \
72  void SetMsgHandled(BOOL handled) { \
73    msg_handled_ = handled; \
74  } \
75  BOOL ProcessWindowMessage(HWND hwnd, \
76                            UINT msg, \
77                            WPARAM w_param, \
78                            LPARAM l_param, \
79                            LRESULT& l_result, \
80                            DWORD msg_map_id = 0) { \
81    base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); \
82    BOOL old_msg_handled = msg_handled_; \
83    BOOL ret = _ProcessWindowMessage(hwnd, msg, w_param, l_param, l_result, \
84                                     msg_map_id); \
85    if (ref.get()) \
86      msg_handled_ = old_msg_handled; \
87    return ret; \
88  } \
89  BOOL _ProcessWindowMessage(HWND hWnd, \
90                             UINT uMsg, \
91                             WPARAM wParam, \
92                             LPARAM lParam, \
93                             LRESULT& lResult, \
94                             DWORD dwMsgMapID) { \
95    base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); \
96    BOOL bHandled = TRUE; \
97    hWnd; \
98    uMsg; \
99    wParam; \
100    lParam; \
101    lResult; \
102    bHandled; \
103    switch(dwMsgMapID) { \
104      case 0:
105
106// An object that handles messages for a HWND that implements the views
107// "Custom Frame" look. The purpose of this class is to isolate the windows-
108// specific message handling from the code that wraps it. It is intended to be
109// used by both a views::NativeWidget and an aura::WindowTreeHost
110// implementation.
111// TODO(beng): This object should eventually *become* the WindowImpl.
112class VIEWS_EXPORT HWNDMessageHandler :
113    public gfx::WindowImpl,
114    public internal::InputMethodDelegate,
115    public ui::WindowEventTarget {
116 public:
117  explicit HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate);
118  ~HWNDMessageHandler();
119
120  void Init(HWND parent, const gfx::Rect& bounds);
121  void InitModalType(ui::ModalType modal_type);
122
123  void Close();
124  void CloseNow();
125
126  gfx::Rect GetWindowBoundsInScreen() const;
127  gfx::Rect GetClientAreaBoundsInScreen() const;
128  gfx::Rect GetRestoredBounds() const;
129  // This accounts for the case where the widget size is the client size.
130  gfx::Rect GetClientAreaBounds() const;
131
132  void GetWindowPlacement(gfx::Rect* bounds,
133                          ui::WindowShowState* show_state) const;
134
135  // Sets the bounds of the HWND to |bounds_in_pixels|. If the HWND size is not
136  // changed, |force_size_changed| determines if we should pretend it is.
137  void SetBounds(const gfx::Rect& bounds_in_pixels, bool force_size_changed);
138
139  void SetSize(const gfx::Size& size);
140  void CenterWindow(const gfx::Size& size);
141
142  void SetRegion(HRGN rgn);
143
144  void StackAbove(HWND other_hwnd);
145  void StackAtTop();
146
147  void Show();
148  void ShowWindowWithState(ui::WindowShowState show_state);
149  void ShowMaximizedWithBounds(const gfx::Rect& bounds);
150  void Hide();
151
152  void Maximize();
153  void Minimize();
154  void Restore();
155
156  void Activate();
157  void Deactivate();
158
159  void SetAlwaysOnTop(bool on_top);
160
161  bool IsVisible() const;
162  bool IsActive() const;
163  bool IsMinimized() const;
164  bool IsMaximized() const;
165  bool IsAlwaysOnTop() const;
166
167  bool RunMoveLoop(const gfx::Vector2d& drag_offset, bool hide_on_escape);
168  void EndMoveLoop();
169
170  // Tells the HWND its client area has changed.
171  void SendFrameChanged();
172
173  void FlashFrame(bool flash);
174
175  void ClearNativeFocus();
176
177  void SetCapture();
178  void ReleaseCapture();
179  bool HasCapture() const;
180
181  FullscreenHandler* fullscreen_handler() { return fullscreen_handler_.get(); }
182
183  void SetVisibilityChangedAnimationsEnabled(bool enabled);
184
185  // Returns true if the title changed.
186  bool SetTitle(const base::string16& title);
187
188  void SetCursor(HCURSOR cursor);
189
190  void FrameTypeChanged();
191
192  void SchedulePaintInRect(const gfx::Rect& rect);
193  void SetOpacity(BYTE opacity);
194
195  void SetWindowIcons(const gfx::ImageSkia& window_icon,
196                      const gfx::ImageSkia& app_icon);
197
198  void set_remove_standard_frame(bool remove_standard_frame) {
199    remove_standard_frame_ = remove_standard_frame;
200  }
201
202  void set_use_system_default_icon(bool use_system_default_icon) {
203    use_system_default_icon_ = use_system_default_icon;
204  }
205
206  void SetFullscreen(bool fullscreen);
207
208  // Updates the window style to reflect whether it can be resized or maximized.
209  void SizeConstraintsChanged();
210
211 private:
212  typedef std::set<DWORD> TouchIDs;
213
214  // Overridden from internal::InputMethodDelegate:
215  virtual void DispatchKeyEventPostIME(const ui::KeyEvent& key) OVERRIDE;
216
217  // Overridden from WindowImpl:
218  virtual HICON GetDefaultWindowIcon() const OVERRIDE;
219  virtual LRESULT OnWndProc(UINT message,
220                            WPARAM w_param,
221                            LPARAM l_param) OVERRIDE;
222
223  // Overridden from WindowEventTarget
224  virtual LRESULT HandleMouseMessage(unsigned int message,
225                                     WPARAM w_param,
226                                     LPARAM l_param,
227                                     bool* handled) OVERRIDE;
228  virtual LRESULT HandleKeyboardMessage(unsigned int message,
229                                        WPARAM w_param,
230                                        LPARAM l_param,
231                                        bool* handled) OVERRIDE;
232  virtual LRESULT HandleTouchMessage(unsigned int message,
233                                     WPARAM w_param,
234                                     LPARAM l_param,
235                                     bool* handled) OVERRIDE;
236
237  virtual LRESULT HandleScrollMessage(unsigned int message,
238                                      WPARAM w_param,
239                                      LPARAM l_param,
240                                      bool* handled) OVERRIDE;
241
242  virtual LRESULT HandleNcHitTestMessage(unsigned int message,
243                                         WPARAM w_param,
244                                         LPARAM l_param,
245                                         bool* handled) OVERRIDE;
246
247  // Returns the auto-hide edges of the appbar. See
248  // ViewsDelegate::GetAppbarAutohideEdges() for details. If the edges change,
249  // OnAppbarAutohideEdgesChanged() is called.
250  int GetAppbarAutohideEdges(HMONITOR monitor);
251
252  // Callback if the autohide edges have changed. See
253  // ViewsDelegate::GetAppbarAutohideEdges() for details.
254  void OnAppbarAutohideEdgesChanged();
255
256  // Can be called after the delegate has had the opportunity to set focus and
257  // did not do so.
258  void SetInitialFocus();
259
260  // Called after the WM_ACTIVATE message has been processed by the default
261  // windows procedure.
262  void PostProcessActivateMessage(int activation_state, bool minimized);
263
264  // Enables disabled owner windows that may have been disabled due to this
265  // window's modality.
266  void RestoreEnabledIfNecessary();
267
268  // Executes the specified SC_command.
269  void ExecuteSystemMenuCommand(int command);
270
271  // Start tracking all mouse events so that this window gets sent mouse leave
272  // messages too.
273  void TrackMouseEvents(DWORD mouse_tracking_flags);
274
275  // Responds to the client area changing size, either at window creation time
276  // or subsequently.
277  void ClientAreaSizeChanged();
278
279  // Returns the insets of the client area relative to the non-client area of
280  // the window.
281  bool GetClientAreaInsets(gfx::Insets* insets) const;
282
283  // Resets the window region for the current widget bounds if necessary.
284  // If |force| is true, the window region is reset to NULL even for native
285  // frame windows.
286  void ResetWindowRegion(bool force, bool redraw);
287
288  // Enables or disables rendering of the non-client (glass) area by DWM,
289  // under Vista and above, depending on whether the caller has requested a
290  // custom frame.
291  void UpdateDwmNcRenderingPolicy();
292
293  // Calls DefWindowProc, safely wrapping the call in a ScopedRedrawLock to
294  // prevent frame flicker. DefWindowProc handling can otherwise render the
295  // classic-look window title bar directly.
296  LRESULT DefWindowProcWithRedrawLock(UINT message,
297                                      WPARAM w_param,
298                                      LPARAM l_param);
299
300  // Lock or unlock the window from being able to redraw itself in response to
301  // updates to its invalid region.
302  class ScopedRedrawLock;
303  void LockUpdates(bool force);
304  void UnlockUpdates(bool force);
305
306  // Stops ignoring SetWindowPos() requests (see below).
307  void StopIgnoringPosChanges() { ignore_window_pos_changes_ = false; }
308
309  // Synchronously updates the invalid contents of the Widget. Valid for
310  // layered windows only.
311  void RedrawLayeredWindowContents();
312
313  // Attempts to force the window to be redrawn, ensuring that it gets
314  // onscreen.
315  void ForceRedrawWindow(int attempts);
316
317  // Message Handlers ----------------------------------------------------------
318
319  BEGIN_SAFE_MSG_MAP_EX(HWNDMessageHandler)
320    // Range handlers must go first!
321    CR_MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
322    CR_MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE,
323                                WM_NCXBUTTONDBLCLK,
324                                OnMouseRange)
325
326    // CustomFrameWindow hacks
327    CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption)
328    CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame)
329
330    // Vista and newer
331    CR_MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED, OnDwmCompositionChanged)
332
333    // Non-atlcrack.h handlers
334    CR_MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject)
335
336    // Mouse events.
337    CR_MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE, OnMouseActivate)
338    CR_MESSAGE_HANDLER_EX(WM_MOUSELEAVE, OnMouseRange)
339    CR_MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseRange)
340    CR_MESSAGE_HANDLER_EX(WM_SETCURSOR, OnSetCursor);
341
342    // Key events.
343    CR_MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyEvent)
344    CR_MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyEvent)
345    CR_MESSAGE_HANDLER_EX(WM_SYSKEYDOWN, OnKeyEvent)
346    CR_MESSAGE_HANDLER_EX(WM_SYSKEYUP, OnKeyEvent)
347
348    // IME Events.
349    CR_MESSAGE_HANDLER_EX(WM_IME_SETCONTEXT, OnImeMessages)
350    CR_MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION, OnImeMessages)
351    CR_MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeMessages)
352    CR_MESSAGE_HANDLER_EX(WM_IME_ENDCOMPOSITION, OnImeMessages)
353    CR_MESSAGE_HANDLER_EX(WM_IME_REQUEST, OnImeMessages)
354    CR_MESSAGE_HANDLER_EX(WM_IME_NOTIFY, OnImeMessages)
355    CR_MESSAGE_HANDLER_EX(WM_CHAR, OnImeMessages)
356    CR_MESSAGE_HANDLER_EX(WM_SYSCHAR, OnImeMessages)
357
358    // Scroll events
359    CR_MESSAGE_HANDLER_EX(WM_VSCROLL, OnScrollMessage)
360    CR_MESSAGE_HANDLER_EX(WM_HSCROLL, OnScrollMessage)
361
362    // Touch Events.
363    CR_MESSAGE_HANDLER_EX(WM_TOUCH, OnTouchEvent)
364
365    // Uses the general handler macro since the specific handler macro
366    // MSG_WM_NCACTIVATE would convert WPARAM type to BOOL type. The high
367    // word of WPARAM could be set when the window is minimized or restored.
368    CR_MESSAGE_HANDLER_EX(WM_NCACTIVATE, OnNCActivate)
369
370    // This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU.
371    CR_MSG_WM_ACTIVATEAPP(OnActivateApp)
372    CR_MSG_WM_APPCOMMAND(OnAppCommand)
373    CR_MSG_WM_CANCELMODE(OnCancelMode)
374    CR_MSG_WM_CAPTURECHANGED(OnCaptureChanged)
375    CR_MSG_WM_CLOSE(OnClose)
376    CR_MSG_WM_COMMAND(OnCommand)
377    CR_MSG_WM_CREATE(OnCreate)
378    CR_MSG_WM_DESTROY(OnDestroy)
379    CR_MSG_WM_DISPLAYCHANGE(OnDisplayChange)
380    CR_MSG_WM_ENTERMENULOOP(OnEnterMenuLoop)
381    CR_MSG_WM_EXITMENULOOP(OnExitMenuLoop)
382    CR_MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove)
383    CR_MSG_WM_ERASEBKGND(OnEraseBkgnd)
384    CR_MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
385    CR_MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo)
386    CR_MSG_WM_INITMENU(OnInitMenu)
387    CR_MSG_WM_INPUTLANGCHANGE(OnInputLangChange)
388    CR_MSG_WM_KILLFOCUS(OnKillFocus)
389    CR_MSG_WM_MOVE(OnMove)
390    CR_MSG_WM_MOVING(OnMoving)
391    CR_MSG_WM_NCCALCSIZE(OnNCCalcSize)
392    CR_MSG_WM_NCHITTEST(OnNCHitTest)
393    CR_MSG_WM_NCPAINT(OnNCPaint)
394    CR_MSG_WM_NOTIFY(OnNotify)
395    CR_MSG_WM_PAINT(OnPaint)
396    CR_MSG_WM_SETFOCUS(OnSetFocus)
397    CR_MSG_WM_SETICON(OnSetIcon)
398    CR_MSG_WM_SETTEXT(OnSetText)
399    CR_MSG_WM_SETTINGCHANGE(OnSettingChange)
400    CR_MSG_WM_SIZE(OnSize)
401    CR_MSG_WM_SYSCOMMAND(OnSysCommand)
402    CR_MSG_WM_THEMECHANGED(OnThemeChanged)
403    CR_MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged)
404    CR_MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging)
405    CR_MSG_WM_WTSSESSION_CHANGE(OnSessionChange)
406  CR_END_MSG_MAP()
407
408  // Message Handlers.
409  // This list is in _ALPHABETICAL_ order!
410  // TODO(beng): Once this object becomes the WindowImpl, these methods can
411  //             be made private.
412  void OnActivateApp(BOOL active, DWORD thread_id);
413  // TODO(beng): return BOOL is temporary until this object becomes a
414  //             WindowImpl.
415  BOOL OnAppCommand(HWND window, short command, WORD device, int keystate);
416  void OnCancelMode();
417  void OnCaptureChanged(HWND window);
418  void OnClose();
419  void OnCommand(UINT notification_code, int command, HWND window);
420  LRESULT OnCreate(CREATESTRUCT* create_struct);
421  void OnDestroy();
422  void OnDisplayChange(UINT bits_per_pixel, const gfx::Size& screen_size);
423  LRESULT OnDwmCompositionChanged(UINT msg, WPARAM w_param, LPARAM l_param);
424  void OnEnterMenuLoop(BOOL from_track_popup_menu);
425  void OnEnterSizeMove();
426  LRESULT OnEraseBkgnd(HDC dc);
427  void OnExitMenuLoop(BOOL is_shortcut_menu);
428  void OnExitSizeMove();
429  void OnGetMinMaxInfo(MINMAXINFO* minmax_info);
430  LRESULT OnGetObject(UINT message, WPARAM w_param, LPARAM l_param);
431  LRESULT OnImeMessages(UINT message, WPARAM w_param, LPARAM l_param);
432  void OnInitMenu(HMENU menu);
433  void OnInputLangChange(DWORD character_set, HKL input_language_id);
434  LRESULT OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param);
435  void OnKillFocus(HWND focused_window);
436  LRESULT OnMouseActivate(UINT message, WPARAM w_param, LPARAM l_param);
437  LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param);
438  void OnMove(const gfx::Point& point);
439  void OnMoving(UINT param, const RECT* new_bounds);
440  LRESULT OnNCActivate(UINT message, WPARAM w_param, LPARAM l_param);
441  LRESULT OnNCCalcSize(BOOL mode, LPARAM l_param);
442  LRESULT OnNCHitTest(const gfx::Point& point);
443  void OnNCPaint(HRGN rgn);
444  LRESULT OnNCUAHDrawCaption(UINT message, WPARAM w_param, LPARAM l_param);
445  LRESULT OnNCUAHDrawFrame(UINT message, WPARAM w_param, LPARAM l_param);
446  LRESULT OnNotify(int w_param, NMHDR* l_param);
447  void OnPaint(HDC dc);
448  LRESULT OnReflectedMessage(UINT message, WPARAM w_param, LPARAM l_param);
449  LRESULT OnScrollMessage(UINT message, WPARAM w_param, LPARAM l_param);
450  void OnSessionChange(WPARAM status_code, PWTSSESSION_NOTIFICATION session_id);
451  LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param);
452  void OnSetFocus(HWND last_focused_window);
453  LRESULT OnSetIcon(UINT size_type, HICON new_icon);
454  LRESULT OnSetText(const wchar_t* text);
455  void OnSettingChange(UINT flags, const wchar_t* section);
456  void OnSize(UINT param, const gfx::Size& size);
457  void OnSysCommand(UINT notification_code, const gfx::Point& point);
458  void OnThemeChanged();
459  LRESULT OnTouchEvent(UINT message, WPARAM w_param, LPARAM l_param);
460  void OnWindowPosChanging(WINDOWPOS* window_pos);
461  void OnWindowPosChanged(WINDOWPOS* window_pos);
462
463  typedef std::vector<ui::TouchEvent> TouchEvents;
464  // Helper to handle the list of touch events passed in. We need this because
465  // touch events on windows don't fire if we enter a modal loop in the context
466  // of a touch event.
467  void HandleTouchEvents(const TouchEvents& touch_events);
468
469  // Resets the flag which indicates that we are in the context of a touch down
470  // event.
471  void ResetTouchDownContext();
472
473  // Helper to handle mouse events.
474  // The |message|, |w_param|, |l_param| parameters identify the Windows mouse
475  // message and its parameters respectively.
476  // The |track_mouse| parameter indicates if we should track the mouse.
477  LRESULT HandleMouseEventInternal(UINT message,
478                                   WPARAM w_param,
479                                   LPARAM l_param,
480                                   bool track_mouse);
481
482  // Returns true if the mouse message passed in is an OS synthesized mouse
483  // message.
484  // |message| identifies the mouse message.
485  // |message_time| is the time when the message occurred.
486  // |l_param| indicates the location of the mouse message.
487  bool IsSynthesizedMouseMessage(unsigned int message,
488                                 int message_time,
489                                 LPARAM l_param);
490
491  // Provides functionality to transition a frame to DWM.
492  void PerformDwmTransition();
493
494  HWNDMessageHandlerDelegate* delegate_;
495
496  scoped_ptr<FullscreenHandler> fullscreen_handler_;
497
498  // Set to true in Close() and false is CloseNow().
499  bool waiting_for_close_now_;
500
501  bool remove_standard_frame_;
502
503  bool use_system_default_icon_;
504
505  // Whether all ancestors have been enabled. This is only used if is_modal_ is
506  // true.
507  bool restored_enabled_;
508
509  // The current cursor.
510  HCURSOR current_cursor_;
511
512  // The last cursor that was active before the current one was selected. Saved
513  // so that we can restore it.
514  HCURSOR previous_cursor_;
515
516  // Event handling ------------------------------------------------------------
517
518  // The flags currently being used with TrackMouseEvent to track mouse
519  // messages. 0 if there is no active tracking. The value of this member is
520  // used when tracking is canceled.
521  DWORD active_mouse_tracking_flags_;
522
523  // Set to true when the user presses the right mouse button on the caption
524  // area. We need this so we can correctly show the context menu on mouse-up.
525  bool is_right_mouse_pressed_on_caption_;
526
527  // The set of touch devices currently down.
528  TouchIDs touch_ids_;
529
530  // ScopedRedrawLock ----------------------------------------------------------
531
532  // Represents the number of ScopedRedrawLocks active against this widget.
533  // If this is greater than zero, the widget should be locked against updates.
534  int lock_updates_count_;
535
536  // Window resizing -----------------------------------------------------------
537
538  // When true, this flag makes us discard incoming SetWindowPos() requests that
539  // only change our position/size.  (We still allow changes to Z-order,
540  // activation, etc.)
541  bool ignore_window_pos_changes_;
542
543  // The last-seen monitor containing us, and its rect and work area.  These are
544  // used to catch updates to the rect and work area and react accordingly.
545  HMONITOR last_monitor_;
546  gfx::Rect last_monitor_rect_, last_work_area_;
547
548  // Layered windows -----------------------------------------------------------
549
550  // Should we keep an off-screen buffer? This is false by default, set to true
551  // when WS_EX_LAYERED is specified before the native window is created.
552  //
553  // NOTE: this is intended to be used with a layered window (a window with an
554  // extended window style of WS_EX_LAYERED). If you are using a layered window
555  // and NOT changing the layered alpha or anything else, then leave this value
556  // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll
557  // most likely want to set this to false, or after changing the alpha toggle
558  // the extended style bit to false than back to true. See MSDN for more
559  // details.
560  bool use_layered_buffer_;
561
562  // The default alpha to be applied to the layered window.
563  BYTE layered_alpha_;
564
565  // A canvas that contains the window contents in the case of a layered
566  // window.
567  scoped_ptr<gfx::Canvas> layered_window_contents_;
568
569  // We must track the invalid rect ourselves, for two reasons:
570  // For layered windows, Windows will not do this properly with
571  // InvalidateRect()/GetUpdateRect(). (In fact, it'll return misleading
572  // information from GetUpdateRect()).
573  // We also need to keep track of the invalid rectangle for the RootView should
574  // we need to paint the non-client area. The data supplied to WM_NCPAINT seems
575  // to be insufficient.
576  gfx::Rect invalid_rect_;
577
578  // Set to true when waiting for RedrawLayeredWindowContents().
579  bool waiting_for_redraw_layered_window_contents_;
580
581  // True the first time nccalc is called on a sizable widget
582  bool is_first_nccalc_;
583
584  // Copy of custom window region specified via SetRegion(), if any.
585  base::win::ScopedRegion custom_window_region_;
586
587  // If > 0 indicates a menu is running (we're showing a native menu).
588  int menu_depth_;
589
590  // A factory used to lookup appbar autohide edges.
591  base::WeakPtrFactory<HWNDMessageHandler> autohide_factory_;
592
593  // Generates touch-ids for touch-events.
594  ui::SequentialIDGenerator id_generator_;
595
596  // Indicates if the window needs the WS_VSCROLL and WS_HSCROLL styles.
597  bool needs_scroll_styles_;
598
599  // Set to true if we are in the context of a sizing operation.
600  bool in_size_loop_;
601
602  // Stores a pointer to the WindowEventTarget interface implemented by this
603  // class. Allows callers to retrieve the interface pointer.
604  scoped_ptr<ui::ViewProp> prop_window_target_;
605
606  // Number of active touch down contexts. This is incremented on touch down
607  // events and decremented later using a delayed task.
608  // We need this to ignore WM_MOUSEACTIVATE messages generated in response to
609  // touch input. This is fine because activation still works correctly via
610  // native SetFocus calls invoked in the views code.
611  int touch_down_contexts_;
612
613  // Time the last touch message was received. Used to flag mouse messages
614  // synthesized by Windows for touch which are not flagged by the OS as
615  // synthesized mouse messages. For more information please refer to
616  // the IsMouseEventFromTouch function.
617  static long last_touch_message_time_;
618
619  // Time the last WM_MOUSEHWHEEL message is received. Please refer to the
620  // HandleMouseEventInternal function as to why this is needed.
621  long last_mouse_hwheel_time_;
622
623  // On Windows Vista and beyond, if we are transitioning from custom frame
624  // to Aero(glass) we delay setting the DWM related properties in full
625  // screen mode as DWM is not supported in full screen windows. We perform
626  // the DWM related operations when the window comes out of fullscreen mode.
627  // This member variable is set to true if the window is transitioning to
628  // glass. Defaults to false.
629  bool dwm_transition_desired_;
630
631  DISALLOW_COPY_AND_ASSIGN(HWNDMessageHandler);
632};
633
634}  // namespace views
635
636#endif  // UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
637