Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3381)

Unified Diff: ash/wm/overview/transparent_activate_window_button.cc

Issue 690103008: Implemented swipe to close in overview mode. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed ET_SCROLL_FLING_CANCEL handling from TransparentButton and removed WindowSelector.MultiWind… Created 5 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/wm/overview/transparent_activate_window_button.cc
diff --git a/ash/wm/overview/transparent_activate_window_button.cc b/ash/wm/overview/transparent_activate_window_button.cc
index 5c6a404f57521155f3e45a4cb4972b12df3c8524..ff0e4842a5a6da89b1f69f295798335ce6b7c866 100644
--- a/ash/wm/overview/transparent_activate_window_button.cc
+++ b/ash/wm/overview/transparent_activate_window_button.cc
@@ -6,9 +6,11 @@
#include <vector>
+#include "ash/ash_switches.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/wm/overview/transparent_activate_window_button_delegate.h"
+#include "base/command_line.h"
#include "ui/events/event.h"
#include "ui/events/gesture_event_details.h"
#include "ui/gfx/display.h"
@@ -22,6 +24,35 @@ namespace ash {
namespace {
const char kTransparentButtonName[] = "TransparentButton";
+// The default close window distance minimum.
+const int kDefaultCloseWindowDistanceMinimum = 100;
+
+// The minimum fling velocity which will cause a window to be closed. Unit is
+// pixels per second.
+const float kMinimumFlingVelocity = 4000.0f;
+
+// Initializes the event handler transparent window.
+views::Widget* InitEventHandler(aura::Window* root_window) {
+ views::Widget* widget = new views::Widget;
+ views::Widget::InitParams params;
+ params.type = views::Widget::InitParams::TYPE_POPUP;
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+ params.accept_events = true;
+ params.parent = Shell::GetContainer(root_window,
+ kShellWindowId_OverlayContainer);
+ widget->set_focus_on_creation(false);
+ widget->Init(params);
+ widget->Show();
+
+ aura::Window* handler = widget->GetNativeWindow();
+ handler->parent()->StackChildAtBottom(handler);
+
+ return widget;
+}
+
+} // namespace
+
// Transparent button that handles events to activate or close windows in
// overview mode.
class TransparentButton
@@ -34,6 +65,10 @@ class TransparentButton
TransparentActivateWindowButtonDelegate* delegate() { return delegate_; }
+ void set_close_window_distance_minimum(int distance) {
+ close_window_distance_minimum_ = distance;
+ }
+
// views::View:
virtual void OnGestureEvent(ui::GestureEvent* event) override;
@@ -47,13 +82,32 @@ class TransparentButton
private:
TransparentActivateWindowButtonDelegate* delegate_;
+ // True if the swipe to close feature is disabled.
+ const bool swipe_to_close_disabled_;
+
+ // The original X location for a tap down event. |original_x_| is in the local
+ // coordinate space as |this|.
+ float original_x_;
+
+ // The velocity of the current fling gesture. A fling is active iff
+ // |flint_velocity_x_| has a value greater than 0.
+ float fling_velocity_x_;
+
+ // The minimum distance, in pixels, for which a touch drag should cause a
+ // window to be closed.
+ int close_window_distance_minimum_;
+
DISALLOW_COPY_AND_ASSIGN(TransparentButton);
};
TransparentButton::TransparentButton(
- TransparentActivateWindowButtonDelegate* delegate)
- : CustomButton(this),
- delegate_(delegate) {
+ TransparentActivateWindowButtonDelegate* delegate)
+ : views::CustomButton(this),
+ delegate_(delegate),
+ swipe_to_close_disabled_(CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kAshDisableSwipeToCloseInOverviewMode)),
+ fling_velocity_x_(0.0f),
+ close_window_distance_minimum_(kDefaultCloseWindowDistanceMinimum) {
}
TransparentButton::~TransparentButton() {
@@ -74,6 +128,37 @@ void TransparentButton::OnGestureEvent(ui::GestureEvent* event) {
GetWidget()->ReleaseCapture();
}
+ if (swipe_to_close_disabled_) {
+ CustomButton::OnGestureEvent(event);
+ return;
+ }
+
+ int delta_x = event->x() - original_x_;
+
+ switch (event->type()) {
+ case ui::ET_GESTURE_TAP_DOWN:
+ original_x_ = event->x();
+ break;
+ case ui::ET_GESTURE_SCROLL_BEGIN:
+ case ui::ET_GESTURE_SCROLL_UPDATE:
+ delegate_->Scroll(delta_x);
+ break;
+ case ui::ET_SCROLL_FLING_START:
+ fling_velocity_x_ = fabs(event->details().velocity_x());
+ break;
+ case ui::ET_GESTURE_END:
+ if (abs(delta_x) > close_window_distance_minimum_ ||
+ fling_velocity_x_ > kMinimumFlingVelocity) {
+ delegate_->Close();
+ } else {
+ delegate_->CancelScroll();
+ }
+ original_x_ = 0;
+ fling_velocity_x_ = 0.0f;
+ break;
+ default:
+ break;
+ }
CustomButton::OnGestureEvent(event);
event->StopPropagation();
}
@@ -83,28 +168,6 @@ void TransparentButton::ButtonPressed(views::Button* sender,
delegate_->Select();
}
-// Initializes the event handler transparent window.
-views::Widget* InitEventHandler(aura::Window* root_window) {
- views::Widget* widget = new views::Widget;
- views::Widget::InitParams params;
- params.type = views::Widget::InitParams::TYPE_POPUP;
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
- params.accept_events = true;
- params.parent = Shell::GetContainer(root_window,
- kShellWindowId_OverlayContainer);
- widget->set_focus_on_creation(false);
- widget->Init(params);
- widget->Show();
-
- aura::Window* handler = widget->GetNativeWindow();
- handler->parent()->StackChildAtBottom(handler);
-
- return widget;
-}
-
-} // namespace
-
TransparentActivateWindowButton::TransparentActivateWindowButton(
aura::Window* root_window,
TransparentActivateWindowButtonDelegate* delegate)
@@ -130,6 +193,11 @@ void TransparentActivateWindowButton::SetBounds(const gfx::Rect& bounds) {
window->SetBoundsInScreen(bounds, display);
}
+void TransparentActivateWindowButton::SetCloseWindowDistanceMinimum(
+ int distance) {
+ transparent_button_->set_close_window_distance_minimum(distance);
+}
+
void TransparentActivateWindowButton::SendFocusAlert() const {
event_handler_widget_->GetContentsView()->
NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, true);

Powered by Google App Engine
This is Rietveld 408576698