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 // To be used when WindowResizer::GetTarget() is destroyed. Neither 64 // completes nor reverts the drag because both access the WindowResizer's 65 // window. 66 DRAG_RESIZER_WINDOW_DESTROYED 67 }; 68 69 // Attempts to start a drag if one is not already in progress. Returns true if 70 // successful. 71 bool AttemptToStartDrag(aura::Window* window, 72 const gfx::Point& point_in_parent, 73 int window_component, 74 aura::client::WindowMoveSource source); 75 76 // Completes or reverts the drag if one is in progress. Returns true if a 77 // drag was completed or reverted. 78 bool CompleteDrag(DragCompletionStatus status); 79 80 void HandleMousePressed(aura::Window* target, ui::MouseEvent* event); 81 void HandleMouseReleased(aura::Window* target, ui::MouseEvent* event); 82 83 // Called during a drag to resize/position the window. 84 void HandleDrag(aura::Window* target, ui::LocatedEvent* event); 85 86 // Called during mouse moves to update window resize shadows. 87 void HandleMouseMoved(aura::Window* target, ui::LocatedEvent* event); 88 89 // Called for mouse exits to hide window resize shadows. 90 void HandleMouseExited(aura::Window* target, ui::LocatedEvent* event); 91 92 // Sets |window|'s state type to |new_state_type|. Called after the drag has 93 // been completed for fling gestures. 94 void SetWindowStateTypeFromGesture(aura::Window* window, 95 wm::WindowStateType new_state_type); 96 97 // Invoked from ScopedWindowResizer if the window is destroyed. 98 void ResizerWindowDestroyed(); 99 100 // The hittest result for the first finger at the time that it initially 101 // touched the screen. |first_finger_hittest_| is one of ui/base/hit_test.h 102 int first_finger_hittest_; 103 104 // The window bounds when the drag was started. When a window is minimized, 105 // maximized or snapped via a swipe/fling gesture, the restore bounds should 106 // be set to the bounds of the window when the drag was started. 107 gfx::Rect pre_drag_window_bounds_; 108 109 // Are we running a nested message loop from RunMoveLoop(). 110 bool in_move_loop_; 111 112 // Is a window move/resize in progress because of gesture events? 113 bool in_gesture_drag_; 114 115 // Whether the drag was reverted. Set by CompleteDrag(). 116 bool drag_reverted_; 117 118 scoped_ptr<ScopedWindowResizer> window_resizer_; 119 120 base::Closure quit_closure_; 121 122 // Used to track if this object is deleted while running a nested message 123 // loop. If non-null the destructor sets this to true. 124 bool* destroyed_; 125 126 DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandler); 127 }; 128 129 } // namespace aura 130 131 #endif // ASH_WM_TOPLEVEL_WINDOW_EVENT_HANDLER_H_ 132