15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/win/scoped_gdi_object.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/win_util.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_enums.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/win/window_event_target.h"
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/event.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/sequential_id_generator.h"
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/window_impl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method_delegate.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_export.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Canvas;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Insets;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui  {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ViewProp;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenHandler;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HWNDMessageHandlerDelegate;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethod;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These two messages aren't defined in winuser.h, but they are sent to windows
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with captions. They appear to paint the window caption and frame.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unfortunately if you override the standard non-client rendering as we do
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with CustomFrameWindow, sometimes Windows (not deterministically
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reproducibly but definitely frequently) will send these messages to the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window and paint the standard caption/title over the top of the custom one.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So we need to handle these messages in CustomFrameWindow to prevent this
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from happening.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WM_NCUAHDRAWCAPTION = 0xAE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WM_NCUAHDRAWFRAME = 0xAF;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// IsMsgHandled() and BEGIN_SAFE_MSG_MAP_EX are a modified version of
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// BEGIN_MSG_MAP_EX. The main difference is it adds a WeakPtrFactory member
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// (|weak_factory_|) that is used in _ProcessWindowMessage() and changing
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// IsMsgHandled() from a member function to a define that checks if the weak
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// factory is still valid in addition to the member. Together these allow for
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// |this| to be deleted during dispatch.
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define IsMsgHandled() !ref.get() || msg_handled_
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define BEGIN_SAFE_MSG_MAP_EX(the_class) \
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: \
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::WeakPtrFactory<the_class> weak_factory_; \
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BOOL msg_handled_; \
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)\
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: \
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /* "handled" management for cracked handlers */ \
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetMsgHandled(BOOL handled) { \
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    msg_handled_ = handled; \
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } \
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BOOL ProcessWindowMessage(HWND hwnd, \
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            UINT msg, \
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            WPARAM w_param, \
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            LPARAM l_param, \
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            LRESULT& l_result, \
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            DWORD msg_map_id = 0) { \
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); \
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BOOL old_msg_handled = msg_handled_; \
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BOOL ret = _ProcessWindowMessage(hwnd, msg, w_param, l_param, l_result, \
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     msg_map_id); \
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (ref.get()) \
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      msg_handled_ = old_msg_handled; \
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return ret; \
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } \
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BOOL _ProcessWindowMessage(HWND hWnd, \
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             UINT uMsg, \
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             WPARAM wParam, \
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             LPARAM lParam, \
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             LRESULT& lResult, \
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             DWORD dwMsgMapID) { \
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); \
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BOOL bHandled = TRUE; \
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    hWnd; \
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    uMsg; \
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    wParam; \
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    lParam; \
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    lResult; \
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bHandled; \
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    switch(dwMsgMapID) { \
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case 0:
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that handles messages for a HWND that implements the views
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Custom Frame" look. The purpose of this class is to isolate the windows-
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specific message handling from the code that wraps it. It is intended to be
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// used by both a views::NativeWidget and an aura::WindowTreeHost
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): This object should eventually *become* the WindowImpl.
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VIEWS_EXPORT HWNDMessageHandler :
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public gfx::WindowImpl,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public internal::InputMethodDelegate,
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public ui::WindowEventTarget {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~HWNDMessageHandler();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(HWND parent, const gfx::Rect& bounds);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitModalType(ui::ModalType modal_type);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Close();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseNow();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect GetWindowBoundsInScreen() const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect GetClientAreaBoundsInScreen() const;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect GetRestoredBounds() const;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This accounts for the case where the widget size is the client size.
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect GetClientAreaBounds() const;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetWindowPlacement(gfx::Rect* bounds,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ui::WindowShowState* show_state) const;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sets the bounds of the HWND to |bounds_in_pixels|. If the HWND size is not
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // changed, |force_size_changed| determines if we should pretend it is.
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetBounds(const gfx::Rect& bounds_in_pixels, bool force_size_changed);
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(const gfx::Size& size);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CenterWindow(const gfx::Size& size);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRegion(HRGN rgn);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StackAbove(HWND other_hwnd);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StackAtTop();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Show();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowWindowWithState(ui::WindowShowState show_state);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowMaximizedWithBounds(const gfx::Rect& bounds);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Hide();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Maximize();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Minimize();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Restore();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Activate();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Deactivate();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAlwaysOnTop(bool on_top);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsVisible() const;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsActive() const;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMinimized() const;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMaximized() const;
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool IsAlwaysOnTop() const;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMoveLoop(const gfx::Vector2d& drag_offset, bool hide_on_escape);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndMoveLoop();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tells the HWND its client area has changed.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendFrameChanged();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FlashFrame(bool flash);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearNativeFocus();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCapture();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseCapture();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasCapture() const;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenHandler* fullscreen_handler() { return fullscreen_handler_.get(); }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetVisibilityChangedAnimationsEnabled(bool enabled);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns true if the title changed.
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool SetTitle(const base::string16& title);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCursor(HCURSOR cursor);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FrameTypeChanged();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SchedulePaintInRect(const gfx::Rect& rect);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetOpacity(BYTE opacity);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetWindowIcons(const gfx::ImageSkia& window_icon,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const gfx::ImageSkia& app_icon);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_remove_standard_frame(bool remove_standard_frame) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remove_standard_frame_ = remove_standard_frame;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_use_system_default_icon(bool use_system_default_icon) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    use_system_default_icon_ = use_system_default_icon;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void SetFullscreen(bool fullscreen);
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Updates the window style to reflect whether it can be resized or maximized.
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SizeConstraintsChanged();
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<DWORD> TouchIDs;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from internal::InputMethodDelegate:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DispatchKeyEventPostIME(const ui::KeyEvent& key) OVERRIDE;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from WindowImpl:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HICON GetDefaultWindowIcon() const OVERRIDE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual LRESULT OnWndProc(UINT message,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WPARAM w_param,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            LPARAM l_param) OVERRIDE;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Overridden from WindowEventTarget
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual LRESULT HandleMouseMessage(unsigned int message,
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     WPARAM w_param,
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     LPARAM l_param,
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     bool* handled) OVERRIDE;
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual LRESULT HandleKeyboardMessage(unsigned int message,
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                        WPARAM w_param,
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        LPARAM l_param,
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        bool* handled) OVERRIDE;
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual LRESULT HandleTouchMessage(unsigned int message,
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     WPARAM w_param,
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     LPARAM l_param,
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     bool* handled) OVERRIDE;
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual LRESULT HandleScrollMessage(unsigned int message,
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      WPARAM w_param,
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      LPARAM l_param,
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      bool* handled) OVERRIDE;
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual LRESULT HandleNcHitTestMessage(unsigned int message,
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                         WPARAM w_param,
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         LPARAM l_param,
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         bool* handled) OVERRIDE;
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Returns the auto-hide edges of the appbar. See
2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // ViewsDelegate::GetAppbarAutohideEdges() for details. If the edges change,
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // OnAppbarAutohideEdgesChanged() is called.
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int GetAppbarAutohideEdges(HMONITOR monitor);
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Callback if the autohide edges have changed. See
2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // ViewsDelegate::GetAppbarAutohideEdges() for details.
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnAppbarAutohideEdgesChanged();
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can be called after the delegate has had the opportunity to set focus and
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // did not do so.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetInitialFocus();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called after the WM_ACTIVATE message has been processed by the default
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // windows procedure.
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void PostProcessActivateMessage(int activation_state, bool minimized);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enables disabled owner windows that may have been disabled due to this
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window's modality.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RestoreEnabledIfNecessary();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Executes the specified SC_command.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExecuteSystemMenuCommand(int command);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start tracking all mouse events so that this window gets sent mouse leave
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages too.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrackMouseEvents(DWORD mouse_tracking_flags);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Responds to the client area changing size, either at window creation time
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or subsequently.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClientAreaSizeChanged();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the insets of the client area relative to the non-client area of
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window.
281bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool GetClientAreaInsets(gfx::Insets* insets) const;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the window region for the current widget bounds if necessary.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |force| is true, the window region is reset to NULL even for native
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // frame windows.
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ResetWindowRegion(bool force, bool redraw);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Enables or disables rendering of the non-client (glass) area by DWM,
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // under Vista and above, depending on whether the caller has requested a
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // custom frame.
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void UpdateDwmNcRenderingPolicy();
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls DefWindowProc, safely wrapping the call in a ScopedRedrawLock to
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prevent frame flicker. DefWindowProc handling can otherwise render the
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // classic-look window title bar directly.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT DefWindowProcWithRedrawLock(UINT message,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      WPARAM w_param,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LPARAM l_param);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock or unlock the window from being able to redraw itself in response to
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates to its invalid region.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ScopedRedrawLock;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LockUpdates(bool force);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnlockUpdates(bool force);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stops ignoring SetWindowPos() requests (see below).
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopIgnoringPosChanges() { ignore_window_pos_changes_ = false; }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronously updates the invalid contents of the Widget. Valid for
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // layered windows only.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RedrawLayeredWindowContents();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Attempts to force the window to be redrawn, ensuring that it gets
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // onscreen.
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ForceRedrawWindow(int attempts);
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message Handlers ----------------------------------------------------------
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BEGIN_SAFE_MSG_MAP_EX(HWNDMessageHandler)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Range handlers must go first!
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE,
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                WM_NCXBUTTONDBLCLK,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                OnMouseRange)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CustomFrameWindow hacks
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption)
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Vista and newer
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_DWMCOMPOSITIONCHANGED, OnDwmCompositionChanged)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Non-atlcrack.h handlers
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mouse events.
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE, OnMouseActivate)
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_MOUSELEAVE, OnMouseRange)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_NCMOUSELEAVE, OnMouseRange)
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_SETCURSOR, OnSetCursor);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Key events.
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyEvent)
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyEvent)
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_SYSKEYDOWN, OnKeyEvent)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_SYSKEYUP, OnKeyEvent)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IME Events.
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_SETCONTEXT, OnImeMessages)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION, OnImeMessages)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeMessages)
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_ENDCOMPOSITION, OnImeMessages)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_REQUEST, OnImeMessages)
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_IME_NOTIFY, OnImeMessages)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_CHAR, OnImeMessages)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_SYSCHAR, OnImeMessages)
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Scroll events
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_VSCROLL, OnScrollMessage)
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_HSCROLL, OnScrollMessage)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Touch Events.
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_TOUCH, OnTouchEvent)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Uses the general handler macro since the specific handler macro
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // MSG_WM_NCACTIVATE would convert WPARAM type to BOOL type. The high
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // word of WPARAM could be set when the window is minimized or restored.
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MESSAGE_HANDLER_EX(WM_NCACTIVATE, OnNCActivate)
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This list is in _ALPHABETICAL_ order! OR I WILL HURT YOU.
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_ACTIVATEAPP(OnActivateApp)
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_APPCOMMAND(OnAppCommand)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_CANCELMODE(OnCancelMode)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_CAPTURECHANGED(OnCaptureChanged)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_CLOSE(OnClose)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_COMMAND(OnCommand)
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_CREATE(OnCreate)
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_DESTROY(OnDestroy)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_DISPLAYCHANGE(OnDisplayChange)
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_ENTERMENULOOP(OnEnterMenuLoop)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_EXITMENULOOP(OnExitMenuLoop)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_ENTERSIZEMOVE(OnEnterSizeMove)
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_ERASEBKGND(OnEraseBkgnd)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_EXITSIZEMOVE(OnExitSizeMove)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_INITMENU(OnInitMenu)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_INPUTLANGCHANGE(OnInputLangChange)
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_KILLFOCUS(OnKillFocus)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_MOVE(OnMove)
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_MOVING(OnMoving)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_NCCALCSIZE(OnNCCalcSize)
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_NCHITTEST(OnNCHitTest)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_NCPAINT(OnNCPaint)
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_NOTIFY(OnNotify)
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_PAINT(OnPaint)
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SETFOCUS(OnSetFocus)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SETICON(OnSetIcon)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SETTEXT(OnSetText)
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SETTINGCHANGE(OnSettingChange)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SIZE(OnSize)
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_SYSCOMMAND(OnSysCommand)
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_THEMECHANGED(OnThemeChanged)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_WINDOWPOSCHANGING(OnWindowPosChanging)
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CR_MSG_WM_WTSSESSION_CHANGE(OnSessionChange)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CR_END_MSG_MAP()
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message Handlers.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This list is in _ALPHABETICAL_ order!
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): Once this object becomes the WindowImpl, these methods can
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //             be made private.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnActivateApp(BOOL active, DWORD thread_id);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): return BOOL is temporary until this object becomes a
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //             WindowImpl.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL OnAppCommand(HWND window, short command, WORD device, int keystate);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCancelMode();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCaptureChanged(HWND window);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClose();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCommand(UINT notification_code, int command, HWND window);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnCreate(CREATESTRUCT* create_struct);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDestroy();
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnDisplayChange(UINT bits_per_pixel, const gfx::Size& screen_size);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnDwmCompositionChanged(UINT msg, WPARAM w_param, LPARAM l_param);
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnEnterMenuLoop(BOOL from_track_popup_menu);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEnterSizeMove();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnEraseBkgnd(HDC dc);
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnExitMenuLoop(BOOL is_shortcut_menu);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExitSizeMove();
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetMinMaxInfo(MINMAXINFO* minmax_info);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnGetObject(UINT message, WPARAM w_param, LPARAM l_param);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnImeMessages(UINT message, WPARAM w_param, LPARAM l_param);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInitMenu(HMENU menu);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInputLangChange(DWORD character_set, HKL input_language_id);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnKillFocus(HWND focused_window);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnMouseActivate(UINT message, WPARAM w_param, LPARAM l_param);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param);
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnMove(const gfx::Point& point);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMoving(UINT param, const RECT* new_bounds);
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LRESULT OnNCActivate(UINT message, WPARAM w_param, LPARAM l_param);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnNCCalcSize(BOOL mode, LPARAM l_param);
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LRESULT OnNCHitTest(const gfx::Point& point);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNCPaint(HRGN rgn);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnNCUAHDrawCaption(UINT message, WPARAM w_param, LPARAM l_param);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnNCUAHDrawFrame(UINT message, WPARAM w_param, LPARAM l_param);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnNotify(int w_param, NMHDR* l_param);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPaint(HDC dc);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnReflectedMessage(UINT message, WPARAM w_param, LPARAM l_param);
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LRESULT OnScrollMessage(UINT message, WPARAM w_param, LPARAM l_param);
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSessionChange(WPARAM status_code, PWTSSESSION_NOTIFICATION session_id);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetFocus(HWND last_focused_window);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnSetIcon(UINT size_type, HICON new_icon);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnSetText(const wchar_t* text);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSettingChange(UINT flags, const wchar_t* section);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSize(UINT param, const gfx::Size& size);
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSysCommand(UINT notification_code, const gfx::Point& point);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnThemeChanged();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT OnTouchEvent(UINT message, WPARAM w_param, LPARAM l_param);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnWindowPosChanging(WINDOWPOS* window_pos);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnWindowPosChanged(WINDOWPOS* window_pos);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::vector<ui::TouchEvent> TouchEvents;
4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Helper to handle the list of touch events passed in. We need this because
4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // touch events on windows don't fire if we enter a modal loop in the context
4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // of a touch event.
4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void HandleTouchEvents(const TouchEvents& touch_events);
4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Resets the flag which indicates that we are in the context of a touch down
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // event.
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ResetTouchDownContext();
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Helper to handle mouse events.
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The |message|, |w_param|, |l_param| parameters identify the Windows mouse
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // message and its parameters respectively.
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The |track_mouse| parameter indicates if we should track the mouse.
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LRESULT HandleMouseEventInternal(UINT message,
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WPARAM w_param,
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   LPARAM l_param,
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   bool track_mouse);
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns true if the mouse message passed in is an OS synthesized mouse
483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // message.
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |message| identifies the mouse message.
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |message_time| is the time when the message occurred.
486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |l_param| indicates the location of the mouse message.
487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool IsSynthesizedMouseMessage(unsigned int message,
488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 int message_time,
489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 LPARAM l_param);
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
49103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Provides functionality to transition a frame to DWM.
49203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void PerformDwmTransition();
49303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWNDMessageHandlerDelegate* delegate_;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FullscreenHandler> fullscreen_handler_;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set to true in Close() and false is CloseNow().
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool waiting_for_close_now_;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool remove_standard_frame_;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_system_default_icon_;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether all ancestors have been enabled. This is only used if is_modal_ is
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool restored_enabled_;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The current cursor.
510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  HCURSOR current_cursor_;
511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last cursor that was active before the current one was selected. Saved
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that we can restore it.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HCURSOR previous_cursor_;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Event handling ------------------------------------------------------------
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The flags currently being used with TrackMouseEvent to track mouse
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages. 0 if there is no active tracking. The value of this member is
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used when tracking is canceled.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD active_mouse_tracking_flags_;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when the user presses the right mouse button on the caption
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // area. We need this so we can correctly show the context menu on mouse-up.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_right_mouse_pressed_on_caption_;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of touch devices currently down.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchIDs touch_ids_;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ScopedRedrawLock ----------------------------------------------------------
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents the number of ScopedRedrawLocks active against this widget.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this is greater than zero, the widget should be locked against updates.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int lock_updates_count_;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window resizing -----------------------------------------------------------
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, this flag makes us discard incoming SetWindowPos() requests that
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only change our position/size.  (We still allow changes to Z-order,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // activation, etc.)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_window_pos_changes_;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last-seen monitor containing us, and its rect and work area.  These are
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used to catch updates to the rect and work area and react accordingly.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HMONITOR last_monitor_;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect last_monitor_rect_, last_work_area_;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layered windows -----------------------------------------------------------
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should we keep an off-screen buffer? This is false by default, set to true
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when WS_EX_LAYERED is specified before the native window is created.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: this is intended to be used with a layered window (a window with an
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extended window style of WS_EX_LAYERED). If you are using a layered window
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and NOT changing the layered alpha or anything else, then leave this value
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // most likely want to set this to false, or after changing the alpha toggle
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extended style bit to false than back to true. See MSDN for more
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // details.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_layered_buffer_;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default alpha to be applied to the layered window.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BYTE layered_alpha_;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A canvas that contains the window contents in the case of a layered
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gfx::Canvas> layered_window_contents_;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must track the invalid rect ourselves, for two reasons:
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For layered windows, Windows will not do this properly with
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InvalidateRect()/GetUpdateRect(). (In fact, it'll return misleading
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information from GetUpdateRect()).
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We also need to keep track of the invalid rectangle for the RootView should
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we need to paint the non-client area. The data supplied to WM_NCPAINT seems
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be insufficient.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect invalid_rect_;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set to true when waiting for RedrawLayeredWindowContents().
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool waiting_for_redraw_layered_window_contents_;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True the first time nccalc is called on a sizable widget
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_first_nccalc_;
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Copy of custom window region specified via SetRegion(), if any.
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::win::ScopedRegion custom_window_region_;
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If > 0 indicates a menu is running (we're showing a native menu).
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int menu_depth_;
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A factory used to lookup appbar autohide edges.
591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::WeakPtrFactory<HWNDMessageHandler> autohide_factory_;
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Generates touch-ids for touch-events.
594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::SequentialIDGenerator id_generator_;
5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Indicates if the window needs the WS_VSCROLL and WS_HSCROLL styles.
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool needs_scroll_styles_;
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set to true if we are in the context of a sizing operation.
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool in_size_loop_;
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Stores a pointer to the WindowEventTarget interface implemented by this
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // class. Allows callers to retrieve the interface pointer.
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<ui::ViewProp> prop_window_target_;
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Number of active touch down contexts. This is incremented on touch down
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // events and decremented later using a delayed task.
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We need this to ignore WM_MOUSEACTIVATE messages generated in response to
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // touch input. This is fine because activation still works correctly via
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // native SetFocus calls invoked in the views code.
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int touch_down_contexts_;
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Time the last touch message was received. Used to flag mouse messages
614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // synthesized by Windows for touch which are not flagged by the OS as
615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // synthesized mouse messages. For more information please refer to
616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the IsMouseEventFromTouch function.
617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static long last_touch_message_time_;
618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
619a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Time the last WM_MOUSEHWHEEL message is received. Please refer to the
620a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // HandleMouseEventInternal function as to why this is needed.
621a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  long last_mouse_hwheel_time_;
622a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
62303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // On Windows Vista and beyond, if we are transitioning from custom frame
62403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // to Aero(glass) we delay setting the DWM related properties in full
62503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // screen mode as DWM is not supported in full screen windows. We perform
62603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // the DWM related operations when the window comes out of fullscreen mode.
62703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This member variable is set to true if the window is transitioning to
62803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // glass. Defaults to false.
62903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool dwm_transition_desired_;
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HWNDMessageHandler);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_WIN_HWND_MESSAGE_HANDLER_H_
637