From 0b05b7a52748ea9aae3e1063382e3b2c1152263b Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 15 Apr 2016 16:48:25 +0100 Subject: [PATCH] viewSelection: Handle touchpad 3-finger pinches In order to show the overview, just like touchscreens do. https://bugzilla.gnome.org/show_bug.cgi?id=765937 --- js/ui/viewSelector.js | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js index 412e9d67a..182d344d5 100644 --- a/js/ui/viewSelector.js +++ b/js/ui/viewSelector.js @@ -23,6 +23,7 @@ const EdgeDragAction = imports.ui.edgeDragAction; const IconGrid = imports.ui.iconGrid; const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; +const PINCH_GESTURE_THRESHOLD = 0.7; const ViewPage = { WINDOWS: 1, @@ -51,6 +52,28 @@ function getTermsForSearchString(searchString) { return terms; } +const TouchpadShowOverviewAction = new Lang.Class({ + Name: 'TouchpadShowOverviewAction', + + _init: function(actor) { + actor.connect('captured-event', Lang.bind(this, this._handleEvent)); + }, + + _handleEvent: function(actor, event) { + if (event.type() != Clutter.EventType.TOUCHPAD_PINCH) + return Clutter.EVENT_PROPAGATE; + + if (event.get_touchpad_gesture_finger_count() != 3) + return Clutter.EVENT_PROPAGATE; + + if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END) + this.emit('activated', event.get_gesture_pinch_scale ()); + + return Clutter.EVENT_STOP; + } +}); +Signals.addSignalMethods(TouchpadShowOverviewAction.prototype); + const ShowOverviewAction = new Lang.Class({ Name: 'ShowOverviewAction', Extends: Clutter.GestureAction, @@ -230,11 +253,16 @@ const ViewSelector = new Lang.Class({ global.stage.add_action(gesture); gesture = new ShowOverviewAction(); - gesture.connect('activated', Lang.bind(this, function(action, areaDiff) { - if (areaDiff < 0.7) - Main.overview.show(); - })); + gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated)); global.stage.add_action(gesture); + + gesture = new TouchpadShowOverviewAction(global.stage); + gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated)); + }, + + _pinchGestureActivated: function(action, scale) { + if (scale < PINCH_GESTURE_THRESHOLD) + Main.overview.show(); }, _toggleAppsPage: function() {