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 ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ 6 #define ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ 7 8 #include <set> 9 10 #include "ash/ash_export.h" 11 #include "ash/display/display_controller.h" 12 #include "ash/wm/wm_types.h" 13 #include "base/callback.h" 14 #include "base/compiler_specific.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "ui/events/event_handler.h" 17 #include "ui/gfx/point.h" 18 #include "ui/gfx/rect.h" 19 #include "ui/wm/public/window_move_client.h" 20 21 namespace aura { 22 class Window; 23 } 24 25 namespace ui { 26 class LocatedEvent; 27 } 28 29 namespace ash { 30 31 class WindowResizer; 32 33 class ASH_EXPORT ToplevelWindowEventHandler 34 : public ui::EventHandler, 35 public aura::client::WindowMoveClient, 36 public DisplayController::Observer { 37 public: 38 ToplevelWindowEventHandler(); 39 virtual ~ToplevelWindowEventHandler(); 40 41 // Overridden from ui::EventHandler: 42 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; 43 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 44 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 45 46 // Overridden form aura::client::WindowMoveClient: 47 virtual aura::client::WindowMoveResult RunMoveLoop( 48 aura::Window* source, 49 const gfx::Vector2d& drag_offset, 50 aura::client::WindowMoveSource move_source) OVERRIDE; 51 virtual void EndMoveLoop() OVERRIDE; 52 53 // Overridden form ash::DisplayController::Observer: 54 virtual void OnDisplayConfigurationChanging() OVERRIDE; 55 56 private: 57 class ScopedWindowResizer; 58 59 enum DragCompletionStatus { 60 DRAG_COMPLETE, 61 DRAG_REVERT 62 }; 63 64 // Attempts to start a drag if one is not already in progress. Returns true if 65 // successful. 66 bool AttemptToStartDrag(aura::Window* window, 67 const gfx::Point& point_in_parent, 68 int window_component, 69 aura::client::WindowMoveSource source); 70 71 // Finishes the drag. 72 void CompleteDrag(DragCompletionStatus status); 73 74 void HandleMousePressed(aura::Window* target, ui::MouseEvent* event); 75 void HandleMouseReleased(aura::Window* target, ui::MouseEvent* event); 76 77 // Called during a drag to resize/position the window. 78 void HandleDrag(aura::Window* target, ui::LocatedEvent* event); 79 80 // Called during mouse moves to update window resize shadows. 81 void HandleMouseMoved(aura::Window* target, ui::LocatedEvent* event); 82 83 // Called for mouse exits to hide window resize shadows. 84 void HandleMouseExited(aura::Window* target, ui::LocatedEvent* event); 85 86 // Sets |window|'s state type to |new_state_type|. Called after the drag has 87 // been completed for fling gestures. 88 void SetWindowStateTypeFromGesture(aura::Window* window, 89 wm::WindowStateType new_state_type); 90 91 // Invoked from ScopedWindowResizer if the window is destroyed. 92 void ResizerWindowDestroyed(); 93 94 // The hittest result for the first finger at the time that it initially 95 // touched the screen. |first_finger_hittest_| is one of ui/base/hit_test.h 96 int first_finger_hittest_; 97 98 // The window bounds when the drag was started. When a window is minimized, 99 // maximized or snapped via a swipe/fling gesture, the restore bounds should 100 // be set to the bounds of the window when the drag was started. 101 gfx::Rect pre_drag_window_bounds_; 102 103 // Are we running a nested message loop from RunMoveLoop(). 104 bool in_move_loop_; 105 106 // Is a window move/resize in progress because of gesture events? 107 bool in_gesture_drag_; 108 109 // Whether the drag was reverted. Set by CompleteDrag(). 110 bool drag_reverted_; 111 112 scoped_ptr<ScopedWindowResizer> window_resizer_; 113 114 base::Closure quit_closure_; 115 116 // Used to track if this object is deleted while running a nested message 117 // loop. If non-null the destructor sets this to true. 118 bool* destroyed_; 119 120 DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandler); 121 }; 122 123 } // namespace aura 124 125 #endif // ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ 126