mouse_cursor_event_filter.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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 ASH_DISPLAY_MOUSE_CURSOR_EVENT_FILTER_H
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_DISPLAY_MOUSE_CURSOR_EVENT_FILTER_H
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RootWindow;
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class Window;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DisplayController;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SharedDisplayEdgeIndicator;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An event filter that controls mouse location in extended desktop
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// environment.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ASH_EXPORT MouseCursorEventFilter : public ui::EventHandler {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum MouseWarpMode {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WARP_ALWAYS,   // Always warp the mouse when possible.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WARP_DRAG,     // Used when dragging a window. Top and bottom
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   // corner of the shared edge is reserved for window
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   // snapping.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WARP_NONE,     // No mouse warping. Used when resizing the window.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseCursorEventFilter();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MouseCursorEventFilter();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_mouse_warp_mode(MouseWarpMode mouse_warp_mode) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_warp_mode_ = mouse_warp_mode;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows/Hide the indicator for window dragging. The |from|
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is the window where the dragging started.
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ShowSharedEdgeIndicator(const aura::Window* from);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HideSharedEdgeIndicator();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  friend class DragWindowResizerTest;
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  friend class MouseCursorEventFilterTest;
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(MouseCursorEventFilterTest, DoNotWarpTwice);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(MouseCursorEventFilterTest, SetMouseWarpModeFlag);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(MouseCursorEventFilterTest,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           IndicatorBoundsTestOnRight);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(MouseCursorEventFilterTest,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           IndicatorBoundsTestOnLeft);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(MouseCursorEventFilterTest,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           IndicatorBoundsTestOnTopBottom);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest, WarpMousePointer);
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void reset_was_mouse_warped_for_test() { was_mouse_warped_ = false; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Warps the mouse cursor to an alternate root window when the
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |point_in_screen|, which is the location of the mouse cursor,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hits or exceeds the edge of the |target_root| and the mouse cursor
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is considered to be in an alternate display. Returns true if
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the cursor was moved.
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool WarpMouseCursorIfNecessary(aura::Window* target_root,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const gfx::Point& point_in_screen);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateHorizontalIndicatorWindowBounds();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateVerticalIndicatorWindowBounds();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseWarpMode mouse_warp_mode_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // This flag is used to suppress the accidental mouse warp back to the
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // original display.
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool was_mouse_warped_;
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bounds for warp hole windows. |dst_indicator_bounds_| is kept
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the instance for testing.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect src_indicator_bounds_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect dst_indicator_bounds_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The root window in which the dragging started.
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const aura::Window* drag_source_root_;
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  float scale_when_drag_started_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the area where a window can be dragged in to/out from
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // another display.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SharedDisplayEdgeIndicator> shared_display_edge_indicator_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MouseCursorEventFilter);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // ASH_DISPLAY_MOUSE_CURSOR_EVENT_FILTER_H
106