diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-25 17:19:42 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-25 17:19:42 +0000 |
commit | 5bcd97cb25b1d8a8f9ec9d190ef762607b81721f (patch) | |
tree | 553a957d1e5a45d9b4f889d612c1328c0acd90fd | |
parent | f7dfaf6943a594e76788e8f1c4f37e5cb3877b00 (diff) | |
download | chromium_src-5bcd97cb25b1d8a8f9ec9d190ef762607b81721f.zip chromium_src-5bcd97cb25b1d8a8f9ec9d190ef762607b81721f.tar.gz chromium_src-5bcd97cb25b1d8a8f9ec9d190ef762607b81721f.tar.bz2 |
ash: Remove some inconsistency from two-finger window moving.
Allow two-finger window moving only if both fingers are on the same edge of the window.
BUG=151153
Review URL: https://codereview.chromium.org/11269031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164094 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ash/wm/gestures/two_finger_drag_handler.cc | 83 | ||||
-rw-r--r-- | ash/wm/gestures/two_finger_drag_handler.h | 2 | ||||
-rw-r--r-- | ash/wm/system_gesture_event_filter_unittest.cc | 28 | ||||
-rw-r--r-- | ui/base/hit_test.h | 6 |
4 files changed, 109 insertions, 10 deletions
diff --git a/ash/wm/gestures/two_finger_drag_handler.cc b/ash/wm/gestures/two_finger_drag_handler.cc index b60dee7..7ed214a 100644 --- a/ash/wm/gestures/two_finger_drag_handler.cc +++ b/ash/wm/gestures/two_finger_drag_handler.cc @@ -9,16 +9,71 @@ #include "ash/wm/workspace/snap_sizer.h" #include "ui/aura/client/window_types.h" #include "ui/aura/window.h" +#include "ui/aura/window_delegate.h" #include "ui/base/events/event.h" #include "ui/base/events/event_constants.h" #include "ui/base/hit_test.h" #include "ui/compositor/layer.h" #include "ui/compositor/scoped_layer_animation_settings.h" +namespace { + +bool IsTopEdge(int component) { + return component == HTTOPLEFT || + component == HTTOP || + component == HTTOPRIGHT; +} + +bool IsBottomEdge(int component) { + return component == HTBOTTOMLEFT || + component == HTBOTTOM || + component == HTBOTTOMRIGHT; +} + +bool IsRightEdge(int component) { + return component == HTTOPRIGHT || + component == HTRIGHT || + component == HTBOTTOMRIGHT; +} + +bool IsLeftEdge(int component) { + return component == HTTOPLEFT || + component == HTLEFT || + component == HTBOTTOMLEFT; +} + +bool IsSomeEdge(int component) { + switch (component) { + case HTTOPLEFT: + case HTTOP: + case HTTOPRIGHT: + case HTRIGHT: + case HTBOTTOMRIGHT: + case HTBOTTOM: + case HTBOTTOMLEFT: + case HTLEFT: + return true; + } + return false; +} + +// Returns whether a window-move should be allowed depending on the hit-test +// results of the two fingers. +bool WindowComponentsAllowMoving(int component1, int component2) { + return ((IsTopEdge(component1) && IsTopEdge(component2)) || + (IsBottomEdge(component1) && IsBottomEdge(component2)) || + (IsLeftEdge(component1) && IsLeftEdge(component2)) || + (IsRightEdge(component1) && IsRightEdge(component2)) || + (!IsSomeEdge(component1) && !IsSomeEdge(component2))); +} + +} // namespace + namespace ash { namespace internal { -TwoFingerDragHandler::TwoFingerDragHandler() { +TwoFingerDragHandler::TwoFingerDragHandler() + : first_finger_hittest_(HTNOWHERE) { } TwoFingerDragHandler::~TwoFingerDragHandler() { @@ -27,20 +82,34 @@ TwoFingerDragHandler::~TwoFingerDragHandler() { bool TwoFingerDragHandler::ProcessGestureEvent(aura::Window* target, const ui::GestureEvent& event) { if (event.type() == ui::ET_GESTURE_BEGIN && + event.details().touch_points() == 1) { + first_finger_hittest_ = + target->delegate()->GetNonClientComponent(event.location()); + return false; + } + + if (event.type() == ui::ET_GESTURE_BEGIN && event.details().touch_points() == 2) { if (wm::IsWindowNormal(target) && target->type() == aura::client::WINDOW_TYPE_NORMAL) { - target->AddObserver(this); - window_resizer_ = CreateWindowResizer(target, - event.details().bounding_box().CenterPoint(), HTCAPTION); - return true; + if (WindowComponentsAllowMoving(first_finger_hittest_, + target->delegate()->GetNonClientComponent(event.location()))) { + target->AddObserver(this); + window_resizer_ = CreateWindowResizer(target, + event.details().bounding_box().CenterPoint(), HTCAPTION); + return true; + } } return false; } - if (!window_resizer_.get()) - return false; + if (!window_resizer_.get()) { + // Consume all two-finger gestures on a normal window. + return event.details().touch_points() == 2 && + target->type() == aura::client::WINDOW_TYPE_NORMAL && + wm::IsWindowNormal(target); + } switch (event.type()) { case ui::ET_GESTURE_BEGIN: diff --git a/ash/wm/gestures/two_finger_drag_handler.h b/ash/wm/gestures/two_finger_drag_handler.h index 3e91a16..06cb86d 100644 --- a/ash/wm/gestures/two_finger_drag_handler.h +++ b/ash/wm/gestures/two_finger_drag_handler.h @@ -42,6 +42,8 @@ class TwoFingerDragHandler : public aura::WindowObserver { bool visible) OVERRIDE; virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; + int first_finger_hittest_; + scoped_ptr<WindowResizer> window_resizer_; DISALLOW_COPY_AND_ASSIGN(TwoFingerDragHandler); diff --git a/ash/wm/system_gesture_event_filter_unittest.cc b/ash/wm/system_gesture_event_filter_unittest.cc index 7c795b2..9711b12 100644 --- a/ash/wm/system_gesture_event_filter_unittest.cc +++ b/ash/wm/system_gesture_event_filter_unittest.cc @@ -25,6 +25,7 @@ #include "ui/aura/test/event_generator.h" #include "ui/aura/test/test_windows.h" #include "ui/base/events/event.h" +#include "ui/base/hit_test.h" #include "ui/base/ui_base_switches.h" #include "ui/gfx/screen.h" #include "ui/views/widget/widget_delegate.h" @@ -641,5 +642,32 @@ TEST_F(SystemGestureEventFilterTest, TwoFingerDrag) { EXPECT_EQ(current_bounds.ToString(), right_tile_bounds.ToString()); } +TEST_F(SystemGestureEventFilterTest, TwoFingerDragEdge) { + gfx::Rect bounds(0, 0, 100, 100); + aura::RootWindow* root_window = Shell::GetPrimaryRootWindow(); + views::Widget* toplevel = views::Widget::CreateWindowWithBounds( + new ResizableWidgetDelegate, bounds); + toplevel->Show(); + + const int kSteps = 15; + const int kTouchPoints = 2; + gfx::Point points[kTouchPoints] = { + gfx::Point(30, 20), // Caption + gfx::Point(0, 40), // Left edge + }; + + EXPECT_EQ(HTLEFT, toplevel->GetNativeWindow()->delegate()-> + GetNonClientComponent(points[1])); + + aura::test::EventGenerator generator(root_window, + toplevel->GetNativeWindow()); + + bounds = toplevel->GetNativeWindow()->bounds(); + // Swipe down. Nothing should happen. + generator.GestureMultiFingerScroll(kTouchPoints, points, 15, kSteps, 0, 150); + EXPECT_EQ(bounds.ToString(), + toplevel->GetNativeWindow()->bounds().ToString()); +} + } // namespace test } // namespace ash diff --git a/ui/base/hit_test.h b/ui/base/hit_test.h index 9fb46a4..a91ce89 100644 --- a/ui/base/hit_test.h +++ b/ui/base/hit_test.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef VIEWS_WINDOW_HIT_TEST_H_ -#define VIEWS_WINDOW_HIT_TEST_H_ +#ifndef UI_BASE_HIT_TEST_H_ +#define UI_BASE_HIT_TEST_H_ #if !defined(OS_WIN) @@ -42,4 +42,4 @@ enum HitTestCompat { #endif // !defined(OS_WIN) -#endif // VIEWS_WINDOW_HIT_TEST_H_ +#endif // UI_BASE_HIT_TEST_H_ |