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 30 namespace gfx { 31 class Canvas; 32 class ImageSkia; 33 class Insets; 34 } 35 36 namespace ui { 37 class ViewProp; 38 } 39 40 namespace views { 41 42 class FullscreenHandler; 43 class HWNDMessageHandlerDelegate; 44 class 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. 54 const int WM_NCUAHDRAWCAPTION = 0xAE; 55 const 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. 112 class 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