summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-25 17:19:42 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-25 17:19:42 +0000
commit5bcd97cb25b1d8a8f9ec9d190ef762607b81721f (patch)
tree553a957d1e5a45d9b4f889d612c1328c0acd90fd
parentf7dfaf6943a594e76788e8f1c4f37e5cb3877b00 (diff)
downloadchromium_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.cc83
-rw-r--r--ash/wm/gestures/two_finger_drag_handler.h2
-rw-r--r--ash/wm/system_gesture_event_filter_unittest.cc28
-rw-r--r--ui/base/hit_test.h6
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_