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