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.
5 #ifndef UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
6 #define UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
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/geometry/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"
42 class FullscreenHandler
;
43 class HWNDMessageHandlerDelegate
;
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
54 const int WM_NCUAHDRAWCAPTION
= 0xAE;
55 const int WM_NCUAHDRAWFRAME
= 0xAF;
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_
65 #define BEGIN_SAFE_MSG_MAP_EX(the_class) \
67 base::WeakPtrFactory<the_class> weak_factory_; \
71 /* "handled" management for cracked handlers */ \
72 void SetMsgHandled(BOOL handled) { \
73 msg_handled_ = handled; \
75 BOOL ProcessWindowMessage(HWND hwnd, \
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, \
86 msg_handled_ = old_msg_handled; \
89 BOOL _ProcessWindowMessage(HWND hWnd, \
95 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); \
96 BOOL bHandled = TRUE; \
103 switch(dwMsgMapID) { \
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
111 // TODO(beng): This object should eventually *become* the WindowImpl.
112 class VIEWS_EXPORT HWNDMessageHandler
:
113 public gfx::WindowImpl
,
114 public internal::InputMethodDelegate
,
115 public ui::WindowEventTarget
{
117 explicit HWNDMessageHandler(HWNDMessageHandlerDelegate
* delegate
);
118 ~HWNDMessageHandler() override
;
120 void Init(HWND parent
, const gfx::Rect
& bounds
);
121 void InitModalType(ui::ModalType modal_type
);
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;
132 void GetWindowPlacement(gfx::Rect
* bounds
,
133 ui::WindowShowState
* show_state
) const;
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
);
139 void SetSize(const gfx::Size
& size
);
140 void CenterWindow(const gfx::Size
& size
);
142 void SetRegion(HRGN rgn
);
144 void StackAbove(HWND other_hwnd
);
148 void ShowWindowWithState(ui::WindowShowState show_state
);
149 void ShowMaximizedWithBounds(const gfx::Rect
& bounds
);
159 void SetAlwaysOnTop(bool on_top
);
161 bool IsVisible() const;
162 bool IsActive() const;
163 bool IsMinimized() const;
164 bool IsMaximized() const;
165 bool IsAlwaysOnTop() const;
167 bool RunMoveLoop(const gfx::Vector2d
& drag_offset
, bool hide_on_escape
);
170 // Tells the HWND its client area has changed.
171 void SendFrameChanged();
173 void FlashFrame(bool flash
);
175 void ClearNativeFocus();
178 void ReleaseCapture();
179 bool HasCapture() const;
181 FullscreenHandler
* fullscreen_handler() { return fullscreen_handler_
.get(); }
183 void SetVisibilityChangedAnimationsEnabled(bool enabled
);
185 // Returns true if the title changed.
186 bool SetTitle(const base::string16
& title
);
188 void SetCursor(HCURSOR cursor
);
190 void FrameTypeChanged();
192 void SchedulePaintInRect(const gfx::Rect
& rect
);
193 void SetOpacity(BYTE opacity
);
195 void SetWindowIcons(const gfx::ImageSkia
& window_icon
,
196 const gfx::ImageSkia
& app_icon
);
198 void set_remove_standard_frame(bool remove_standard_frame
) {
199 remove_standard_frame_
= remove_standard_frame
;
202 void set_use_system_default_icon(bool use_system_default_icon
) {
203 use_system_default_icon_
= use_system_default_icon
;
206 void SetFullscreen(bool fullscreen
);
208 // Updates the window style to reflect whether it can be resized or maximized.
209 void SizeConstraintsChanged();
212 typedef std::set
<DWORD
> TouchIDs
;
214 // Overridden from internal::InputMethodDelegate:
215 void DispatchKeyEventPostIME(const ui::KeyEvent
& key
) override
;
217 // Overridden from WindowImpl:
218 HICON
GetDefaultWindowIcon() const override
;
219 HICON
GetSmallWindowIcon() const override
;
220 LRESULT
OnWndProc(UINT message
, WPARAM w_param
, LPARAM l_param
) override
;
222 // Overridden from WindowEventTarget
223 LRESULT
HandleMouseMessage(unsigned int message
,
226 bool* handled
) override
;
227 LRESULT
HandleKeyboardMessage(unsigned int message
,
230 bool* handled
) override
;
231 LRESULT
HandleTouchMessage(unsigned int message
,
234 bool* handled
) override
;
236 LRESULT
HandleScrollMessage(unsigned int message
,
239 bool* handled
) override
;
241 LRESULT
HandleNcHitTestMessage(unsigned int message
,
244 bool* handled
) override
;
246 // Returns the auto-hide edges of the appbar. See
247 // ViewsDelegate::GetAppbarAutohideEdges() for details. If the edges change,
248 // OnAppbarAutohideEdgesChanged() is called.
249 int GetAppbarAutohideEdges(HMONITOR monitor
);
251 // Callback if the autohide edges have changed. See
252 // ViewsDelegate::GetAppbarAutohideEdges() for details.
253 void OnAppbarAutohideEdgesChanged();
255 // Can be called after the delegate has had the opportunity to set focus and
257 void SetInitialFocus();
259 // Called after the WM_ACTIVATE message has been processed by the default
260 // windows procedure.
261 void PostProcessActivateMessage(int activation_state
, bool minimized
);
263 // Enables disabled owner windows that may have been disabled due to this
264 // window's modality.
265 void RestoreEnabledIfNecessary();
267 // Executes the specified SC_command.
268 void ExecuteSystemMenuCommand(int command
);
270 // Start tracking all mouse events so that this window gets sent mouse leave
272 void TrackMouseEvents(DWORD mouse_tracking_flags
);
274 // Responds to the client area changing size, either at window creation time
276 void ClientAreaSizeChanged();
278 // Returns the insets of the client area relative to the non-client area of
280 bool GetClientAreaInsets(gfx::Insets
* insets
) const;
282 // Resets the window region for the current widget bounds if necessary.
283 // If |force| is true, the window region is reset to NULL even for native
285 void ResetWindowRegion(bool force
, bool redraw
);
287 // Enables or disables rendering of the non-client (glass) area by DWM,
288 // under Vista and above, depending on whether the caller has requested a
290 void UpdateDwmNcRenderingPolicy();
292 // Calls DefWindowProc, safely wrapping the call in a ScopedRedrawLock to
293 // prevent frame flicker. DefWindowProc handling can otherwise render the
294 // classic-look window title bar directly.
295 LRESULT
DefWindowProcWithRedrawLock(UINT message
,
299 // Lock or unlock the window from being able to redraw itself in response to
300 // updates to its invalid region.
301 class ScopedRedrawLock
;
302 void LockUpdates(bool force
);
303 void UnlockUpdates(bool force
);
305 // Stops ignoring SetWindowPos() requests (see below).
306 void StopIgnoringPosChanges() { ignore_window_pos_changes_
= false; }
308 // Synchronously updates the invalid contents of the Widget. Valid for
309 // layered windows only.
310 void RedrawLayeredWindowContents();
312 // Attempts to force the window to be redrawn, ensuring that it gets
314 void ForceRedrawWindow(int attempts
);
316 // Message Handlers ----------------------------------------------------------
318 BEGIN_SAFE_MSG_MAP_EX(HWNDMessageHandler
)
319 // Range handlers must go first!
320 CR_MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST
, WM_MOUSELAST
, OnMouseRange
)
321 CR_MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE
,
325 // CustomFrameWindow hacks
326 CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION
, OnNCUAHDrawCaption
)
327 CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME
, OnNCUAHDrawFrame
)
330 CR_MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED
, OnDwmCompositionChanged
)
332 // Non-atlcrack.h handlers
333 CR_MESSAGE_HANDLER_EX(WM_GETOBJECT
, OnGetObject
)
336 CR_MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE
, OnMouseActivate
)
337 CR_MESSAGE_HANDLER_EX(WM_MOUSELEAVE
, OnMouseRange
)
338 CR_MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE
, OnMouseRange
)
339 CR_MESSAGE_HANDLER_EX(WM_SETCURSOR
, OnSetCursor
);
342 CR_MESSAGE_HANDLER_EX(WM_KEYDOWN
, OnKeyEvent
)
343 CR_MESSAGE_HANDLER_EX(WM_KEYUP
, OnKeyEvent
)
344 CR_MESSAGE_HANDLER_EX(WM_SYSKEYDOWN
, OnKeyEvent
)
345 CR_MESSAGE_HANDLER_EX(WM_SYSKEYUP
, OnKeyEvent
)
348 CR_MESSAGE_HANDLER_EX(WM_IME_SETCONTEXT
, OnImeMessages
)
349 CR_MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION
, OnImeMessages
)
350 CR_MESSAGE_HANDLER_EX(WM_IME_COMPOSITION
, OnImeMessages
)
351 CR_MESSAGE_HANDLER_EX(WM_IME_ENDCOMPOSITION
, OnImeMessages
)
352 CR_MESSAGE_HANDLER_EX(WM_IME_REQUEST
, OnImeMessages
)
353 CR_MESSAGE_HANDLER_EX(WM_IME_NOTIFY
, OnImeMessages
)
354 CR_MESSAGE_HANDLER_EX(WM_CHAR
, OnImeMessages
)
355 CR_MESSAGE_HANDLER_EX(WM_SYSCHAR
, OnImeMessages
)
358 CR_MESSAGE_HANDLER_EX(WM_VSCROLL
, OnScrollMessage
)
359 CR_MESSAGE_HANDLER_EX(WM_HSCROLL
, OnScrollMessage
)
362 CR_MESSAGE_HANDLER_EX(WM_TOUCH
, OnTouchEvent
)
364 // Uses the general handler macro since the specific handler macro
365 // MSG_WM_NCACTIVATE would convert WPARAM type to BOOL type. The high
366 // word of WPARAM could be set when the window is minimized or restored.
367 CR_MESSAGE_HANDLER_EX(WM_NCACTIVATE
, OnNCActivate
)
369 // This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU.
370 CR_MSG_WM_ACTIVATEAPP(OnActivateApp
)
371 CR_MSG_WM_APPCOMMAND(OnAppCommand
)
372 CR_MSG_WM_CANCELMODE(OnCancelMode
)
373 CR_MSG_WM_CAPTURECHANGED(OnCaptureChanged
)
374 CR_MSG_WM_CLOSE(OnClose
)
375 CR_MSG_WM_COMMAND(OnCommand
)
376 CR_MSG_WM_CREATE(OnCreate
)
377 CR_MSG_WM_DESTROY(OnDestroy
)
378 CR_MSG_WM_DISPLAYCHANGE(OnDisplayChange
)
379 CR_MSG_WM_ENTERMENULOOP(OnEnterMenuLoop
)
380 CR_MSG_WM_EXITMENULOOP(OnExitMenuLoop
)
381 CR_MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove
)
382 CR_MSG_WM_ERASEBKGND(OnEraseBkgnd
)
383 CR_MSG_WM_EXITSIZEMOVE(OnExitSizeMove
)
384 CR_MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo
)
385 CR_MSG_WM_INITMENU(OnInitMenu
)
386 CR_MSG_WM_INPUTLANGCHANGE(OnInputLangChange
)
387 CR_MSG_WM_KILLFOCUS(OnKillFocus
)
388 CR_MSG_WM_MOVE(OnMove
)
389 CR_MSG_WM_MOVING(OnMoving
)
390 CR_MSG_WM_NCCALCSIZE(OnNCCalcSize
)
391 CR_MSG_WM_NCHITTEST(OnNCHitTest
)
392 CR_MSG_WM_NCPAINT(OnNCPaint
)
393 CR_MSG_WM_NOTIFY(OnNotify
)
394 CR_MSG_WM_PAINT(OnPaint
)
395 CR_MSG_WM_SETFOCUS(OnSetFocus
)
396 CR_MSG_WM_SETICON(OnSetIcon
)
397 CR_MSG_WM_SETTEXT(OnSetText
)
398 CR_MSG_WM_SETTINGCHANGE(OnSettingChange
)
399 CR_MSG_WM_SIZE(OnSize
)
400 CR_MSG_WM_SYSCOMMAND(OnSysCommand
)
401 CR_MSG_WM_THEMECHANGED(OnThemeChanged
)
402 CR_MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged
)
403 CR_MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging
)
404 CR_MSG_WM_WTSSESSION_CHANGE(OnSessionChange
)
408 // This list is in _ALPHABETICAL_ order!
409 // TODO(beng): Once this object becomes the WindowImpl, these methods can
411 void OnActivateApp(BOOL active
, DWORD thread_id
);
412 // TODO(beng): return BOOL is temporary until this object becomes a
414 BOOL
OnAppCommand(HWND window
, short command
, WORD device
, int keystate
);
416 void OnCaptureChanged(HWND window
);
418 void OnCommand(UINT notification_code
, int command
, HWND window
);
419 LRESULT
OnCreate(CREATESTRUCT
* create_struct
);
421 void OnDisplayChange(UINT bits_per_pixel
, const gfx::Size
& screen_size
);
422 LRESULT
OnDwmCompositionChanged(UINT msg
, WPARAM w_param
, LPARAM l_param
);
423 void OnEnterMenuLoop(BOOL from_track_popup_menu
);
424 void OnEnterSizeMove();
425 LRESULT
OnEraseBkgnd(HDC dc
);
426 void OnExitMenuLoop(BOOL is_shortcut_menu
);
427 void OnExitSizeMove();
428 void OnGetMinMaxInfo(MINMAXINFO
* minmax_info
);
429 LRESULT
OnGetObject(UINT message
, WPARAM w_param
, LPARAM l_param
);
430 LRESULT
OnImeMessages(UINT message
, WPARAM w_param
, LPARAM l_param
);
431 void OnInitMenu(HMENU menu
);
432 void OnInputLangChange(DWORD character_set
, HKL input_language_id
);
433 LRESULT
OnKeyEvent(UINT message
, WPARAM w_param
, LPARAM l_param
);
434 void OnKillFocus(HWND focused_window
);
435 LRESULT
OnMouseActivate(UINT message
, WPARAM w_param
, LPARAM l_param
);
436 LRESULT
OnMouseRange(UINT message
, WPARAM w_param
, LPARAM l_param
);
437 void OnMove(const gfx::Point
& point
);
438 void OnMoving(UINT param
, const RECT
* new_bounds
);
439 LRESULT
OnNCActivate(UINT message
, WPARAM w_param
, LPARAM l_param
);
440 LRESULT
OnNCCalcSize(BOOL mode
, LPARAM l_param
);
441 LRESULT
OnNCHitTest(const gfx::Point
& point
);
442 void OnNCPaint(HRGN rgn
);
443 LRESULT
OnNCUAHDrawCaption(UINT message
, WPARAM w_param
, LPARAM l_param
);
444 LRESULT
OnNCUAHDrawFrame(UINT message
, WPARAM w_param
, LPARAM l_param
);
445 LRESULT
OnNotify(int w_param
, NMHDR
* l_param
);
446 void OnPaint(HDC dc
);
447 LRESULT
OnReflectedMessage(UINT message
, WPARAM w_param
, LPARAM l_param
);
448 LRESULT
OnScrollMessage(UINT message
, WPARAM w_param
, LPARAM l_param
);
449 void OnSessionChange(WPARAM status_code
, PWTSSESSION_NOTIFICATION session_id
);
450 LRESULT
OnSetCursor(UINT message
, WPARAM w_param
, LPARAM l_param
);
451 void OnSetFocus(HWND last_focused_window
);
452 LRESULT
OnSetIcon(UINT size_type
, HICON new_icon
);
453 LRESULT
OnSetText(const wchar_t* text
);
454 void OnSettingChange(UINT flags
, const wchar_t* section
);
455 void OnSize(UINT param
, const gfx::Size
& size
);
456 void OnSysCommand(UINT notification_code
, const gfx::Point
& point
);
457 void OnThemeChanged();
458 LRESULT
OnTouchEvent(UINT message
, WPARAM w_param
, LPARAM l_param
);
459 void OnWindowPosChanging(WINDOWPOS
* window_pos
);
460 void OnWindowPosChanged(WINDOWPOS
* window_pos
);
462 typedef std::vector
<ui::TouchEvent
> TouchEvents
;
463 // Helper to handle the list of touch events passed in. We need this because
464 // touch events on windows don't fire if we enter a modal loop in the context
466 void HandleTouchEvents(const TouchEvents
& touch_events
);
468 // Resets the flag which indicates that we are in the context of a touch down
470 void ResetTouchDownContext();
472 // Helper to handle mouse events.
473 // The |message|, |w_param|, |l_param| parameters identify the Windows mouse
474 // message and its parameters respectively.
475 // The |track_mouse| parameter indicates if we should track the mouse.
476 LRESULT
HandleMouseEventInternal(UINT message
,
481 // Returns true if the mouse message passed in is an OS synthesized mouse
483 // |message| identifies the mouse message.
484 // |message_time| is the time when the message occurred.
485 // |l_param| indicates the location of the mouse message.
486 bool IsSynthesizedMouseMessage(unsigned int message
,
490 // Provides functionality to transition a frame to DWM.
491 void PerformDwmTransition();
493 HWNDMessageHandlerDelegate
* delegate_
;
495 scoped_ptr
<FullscreenHandler
> fullscreen_handler_
;
497 // Set to true in Close() and false is CloseNow().
498 bool waiting_for_close_now_
;
500 bool remove_standard_frame_
;
502 bool use_system_default_icon_
;
504 // Whether all ancestors have been enabled. This is only used if is_modal_ is
506 bool restored_enabled_
;
508 // The current cursor.
509 HCURSOR current_cursor_
;
511 // The last cursor that was active before the current one was selected. Saved
512 // so that we can restore it.
513 HCURSOR previous_cursor_
;
515 // Event handling ------------------------------------------------------------
517 // The flags currently being used with TrackMouseEvent to track mouse
518 // messages. 0 if there is no active tracking. The value of this member is
519 // used when tracking is canceled.
520 DWORD active_mouse_tracking_flags_
;
522 // Set to true when the user presses the right mouse button on the caption
523 // area. We need this so we can correctly show the context menu on mouse-up.
524 bool is_right_mouse_pressed_on_caption_
;
526 // The set of touch devices currently down.
529 // ScopedRedrawLock ----------------------------------------------------------
531 // Represents the number of ScopedRedrawLocks active against this widget.
532 // If this is greater than zero, the widget should be locked against updates.
533 int lock_updates_count_
;
535 // Window resizing -----------------------------------------------------------
537 // When true, this flag makes us discard incoming SetWindowPos() requests that
538 // only change our position/size. (We still allow changes to Z-order,
540 bool ignore_window_pos_changes_
;
542 // The last-seen monitor containing us, and its rect and work area. These are
543 // used to catch updates to the rect and work area and react accordingly.
544 HMONITOR last_monitor_
;
545 gfx::Rect last_monitor_rect_
, last_work_area_
;
547 // Layered windows -----------------------------------------------------------
549 // Should we keep an off-screen buffer? This is false by default, set to true
550 // when WS_EX_LAYERED is specified before the native window is created.
552 // NOTE: this is intended to be used with a layered window (a window with an
553 // extended window style of WS_EX_LAYERED). If you are using a layered window
554 // and NOT changing the layered alpha or anything else, then leave this value
555 // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll
556 // most likely want to set this to false, or after changing the alpha toggle
557 // the extended style bit to false than back to true. See MSDN for more
559 bool use_layered_buffer_
;
561 // The default alpha to be applied to the layered window.
564 // A canvas that contains the window contents in the case of a layered
566 scoped_ptr
<gfx::Canvas
> layered_window_contents_
;
568 // We must track the invalid rect ourselves, for two reasons:
569 // For layered windows, Windows will not do this properly with
570 // InvalidateRect()/GetUpdateRect(). (In fact, it'll return misleading
571 // information from GetUpdateRect()).
572 // We also need to keep track of the invalid rectangle for the RootView should
573 // we need to paint the non-client area. The data supplied to WM_NCPAINT seems
574 // to be insufficient.
575 gfx::Rect invalid_rect_
;
577 // Set to true when waiting for RedrawLayeredWindowContents().
578 bool waiting_for_redraw_layered_window_contents_
;
580 // True the first time nccalc is called on a sizable widget
581 bool is_first_nccalc_
;
583 // Copy of custom window region specified via SetRegion(), if any.
584 base::win::ScopedRegion custom_window_region_
;
586 // If > 0 indicates a menu is running (we're showing a native menu).
589 // A factory used to lookup appbar autohide edges.
590 base::WeakPtrFactory
<HWNDMessageHandler
> autohide_factory_
;
592 // Generates touch-ids for touch-events.
593 ui::SequentialIDGenerator id_generator_
;
595 // Indicates if the window needs the WS_VSCROLL and WS_HSCROLL styles.
596 bool needs_scroll_styles_
;
598 // Set to true if we are in the context of a sizing operation.
601 // Stores a pointer to the WindowEventTarget interface implemented by this
602 // class. Allows callers to retrieve the interface pointer.
603 scoped_ptr
<ui::ViewProp
> prop_window_target_
;
605 // Number of active touch down contexts. This is incremented on touch down
606 // events and decremented later using a delayed task.
607 // We need this to ignore WM_MOUSEACTIVATE messages generated in response to
608 // touch input. This is fine because activation still works correctly via
609 // native SetFocus calls invoked in the views code.
610 int touch_down_contexts_
;
612 // Time the last touch message was received. Used to flag mouse messages
613 // synthesized by Windows for touch which are not flagged by the OS as
614 // synthesized mouse messages. For more information please refer to
615 // the IsMouseEventFromTouch function.
616 static long last_touch_message_time_
;
618 // Time the last WM_MOUSEHWHEEL message is received. Please refer to the
619 // HandleMouseEventInternal function as to why this is needed.
620 long last_mouse_hwheel_time_
;
622 // On Windows Vista and beyond, if we are transitioning from custom frame
623 // to Aero(glass) we delay setting the DWM related properties in full
624 // screen mode as DWM is not supported in full screen windows. We perform
625 // the DWM related operations when the window comes out of fullscreen mode.
626 // This member variable is set to true if the window is transitioning to
627 // glass. Defaults to false.
628 bool dwm_transition_desired_
;
630 DISALLOW_COPY_AND_ASSIGN(HWNDMessageHandler
);
635 #endif // UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_