204b62
From bcbf9709802e7644c5911615dabdee7d8ca07719 Mon Sep 17 00:00:00 2001
204b62
From: Carlos Garnacho <carlosg@gnome.org>
204b62
Date: Mon, 31 May 2021 19:29:34 +0200
204b62
Subject: [PATCH 1/3] desktopManager: Handle TOUCH_UPDATE/END events explicitly
204b62
 for rubberband
204b62
204b62
These events need specific handling for Wayland, as we do not get emulated
204b62
pointer events in that platform. Handle these for rubberband selection.
204b62
---
204b62
 extensions/desktop-icons/desktopManager.js | 67 ++++++++++++++++------
204b62
 1 file changed, 48 insertions(+), 19 deletions(-)
204b62
204b62
diff --git a/extensions/desktop-icons/desktopManager.js b/extensions/desktop-icons/desktopManager.js
204b62
index 399aee0..a70cd98 100644
204b62
--- a/extensions/desktop-icons/desktopManager.js
204b62
+++ b/extensions/desktop-icons/desktopManager.js
204b62
@@ -130,26 +130,49 @@ var DesktopManager = GObject.registerClass({
204b62
             }
204b62
             [x, y] = event.get_coords();
204b62
             this._updateRubberBand(x, y);
204b62
-            let x0, y0, x1, y1;
204b62
-            if (x >= this._rubberBandInitialX) {
204b62
-                x0 = this._rubberBandInitialX;
204b62
-                x1 = x;
204b62
-            } else {
204b62
-                x1 = this._rubberBandInitialX;
204b62
-                x0 = x;
204b62
-            }
204b62
-            if (y >= this._rubberBandInitialY) {
204b62
-                y0 = this._rubberBandInitialY;
204b62
-                y1 = y;
204b62
-            } else {
204b62
-                y1 = this._rubberBandInitialY;
204b62
-                y0 = y;
204b62
-            }
204b62
-            for (let [fileUri, fileItem] of this._fileItems) {
204b62
-                fileItem.emit('selected', true, true,
204b62
-                              fileItem.intersectsWith(x0, y0, x1 - x0, y1 - y0));
204b62
-            }
204b62
+            this._updateSelection(x, y);
204b62
         });
204b62
+        this._rubberBandTouchId = global.stage.connect('touch-event', (actor, event) => {
204b62
+            // Let x11 pointer emulation do the job on X11
204b62
+            if (!Meta.is_wayland_compositor())
204b62
+                return Clutter.EVENT_PROPAGATE;
204b62
+            if (!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
204b62
+                return Clutter.EVENT_PROPAGATE;
204b62
+
204b62
+            if (event.type() == Clutter.EventType.TOUCH_END) {
204b62
+                this.endRubberBand();
204b62
+                return Clutter.EVENT_STOP;
204b62
+            } else if (event.type() == Clutter.EventType.TOUCH_UPDATE) {
204b62
+                [x, y] = event.get_coords();
204b62
+                this._updateRubberBand(x, y);
204b62
+                this._updateSelection(x, y);
204b62
+                return Clutter.EVENT_STOP;
204b62
+            }
204b62
+
204b62
+            return Clutter.EVENT_PROPAGATE;
204b62
+	});
204b62
+    }
204b62
+
204b62
+    _updateSelection(x, y) {
204b62
+        let x0, y0, x1, y1;
204b62
+        if (x >= this._rubberBandInitialX) {
204b62
+            x0 = this._rubberBandInitialX;
204b62
+            x1 = x;
204b62
+        } else {
204b62
+            x1 = this._rubberBandInitialX;
204b62
+            x0 = x;
204b62
+        }
204b62
+        if (y >= this._rubberBandInitialY) {
204b62
+            y0 = this._rubberBandInitialY;
204b62
+            y1 = y;
204b62
+        } else {
204b62
+            y1 = this._rubberBandInitialY;
204b62
+            y0 = y;
204b62
+        }
204b62
+        for (let [fileUri, fileItem] of this._fileItems) {
204b62
+            fileItem.emit('selected', true, true,
204b62
+                          fileItem.intersectsWith(x0, y0, x1 - x0, y1 - y0));
204b62
+        }
204b62
     }
204b62
 
204b62
     endRubberBand() {
204b62
@@ -157,8 +180,10 @@ var DesktopManager = GObject.registerClass({
204b62
         Extension.lockActivitiesButton = false;
204b62
         this._grabHelper.ungrab();
204b62
         global.stage.disconnect(this._rubberBandId);
204b62
+        global.stage.disconnect(this._rubberBandTouchId);
204b62
         global.stage.disconnect(this._stageReleaseEventId);
204b62
         this._rubberBandId = 0;
204b62
+        this._rubberBandTouchId = 0;
204b62
         this._stageReleaseEventId = 0;
204b62
 
204b62
         this._selection = new Set([...this._selection, ...this._currentSelection]);
204b62
@@ -739,6 +764,10 @@ var DesktopManager = GObject.registerClass({
204b62
             global.stage.disconnect(this._rubberBandId);
204b62
         this._rubberBandId = 0;
204b62
 
204b62
+        if (this._rubberBandTouchId)
204b62
+            global.stage.disconnect(this._rubberBandTouchId);
204b62
+        this._rubberBandTouchId = 0;
204b62
+
204b62
         this._rubberBand.destroy();
204b62
 
204b62
         if (this._queryFileInfoCancellable)
204b62
-- 
204b62
2.31.1
204b62
204b62
204b62
From 0733004ffeb517f7a80ff41e7181027e8b92b17e Mon Sep 17 00:00:00 2001
204b62
From: Carlos Garnacho <carlosg@gnome.org>
204b62
Date: Mon, 31 May 2021 19:31:03 +0200
204b62
Subject: [PATCH 2/3] desktopGrid: Handle TOUCH_BEGIN events explicitly
204b62
204b62
We do not get pointer emulated events on Wayland, so touch events should
204b62
be handled explicitly there. Handle starting rubberband selection via
204b62
touch.
204b62
---
204b62
 extensions/desktop-icons/desktopGrid.js | 19 +++++++++++++++++++
204b62
 1 file changed, 19 insertions(+)
204b62
204b62
diff --git a/extensions/desktop-icons/desktopGrid.js b/extensions/desktop-icons/desktopGrid.js
204b62
index 94d2dfd..602fa7f 100644
204b62
--- a/extensions/desktop-icons/desktopGrid.js
204b62
+++ b/extensions/desktop-icons/desktopGrid.js
204b62
@@ -21,6 +21,7 @@ const Clutter = imports.gi.Clutter;
204b62
 const St = imports.gi.St;
204b62
 const Gio = imports.gi.Gio;
204b62
 const GLib = imports.gi.GLib;
204b62
+const Meta = imports.gi.Meta;
204b62
 const Shell = imports.gi.Shell;
204b62
 
204b62
 const Signals = imports.signals;
204b62
@@ -123,6 +124,7 @@ var DesktopGrid = class {
204b62
             () => this._backgroundDestroyed());
204b62
 
204b62
         this._grid.connect('button-press-event', (actor, event) => this._onPressButton(actor, event));
204b62
+        this._grid.connect('touch-event', (actor, event) => this._onTouchEvent(actor, event));
204b62
 
204b62
         this._grid.connect('key-press-event', this._onKeyPress.bind(this));
204b62
 
204b62
@@ -506,6 +508,23 @@ var DesktopGrid = class {
204b62
         return Clutter.EVENT_PROPAGATE;
204b62
     }
204b62
 
204b62
+    _onTouchEvent(actor, event) {
204b62
+        // Let x11 pointer emulation do the job on X11
204b62
+        if (!Meta.is_wayland_compositor())
204b62
+            return Clutter.EVENT_PROPAGATE;
204b62
+
204b62
+	if (event.type() == Clutter.EventType.TOUCH_BEGIN &&
204b62
+	    global.display.is_pointer_emulating_sequence(event.get_event_sequence())) {
204b62
+            Extension.desktopManager.clearSelection();
204b62
+            let [x, y] = event.get_coords();
204b62
+            let [gridX, gridY] = this._grid.get_transformed_position();
204b62
+            Extension.desktopManager.startRubberBand(x, y, gridX, gridY);
204b62
+            return Clutter.EVENT_STOP;
204b62
+        }
204b62
+
204b62
+        return Clutter.EVENT_PROPAGATE;
204b62
+    }
204b62
+
204b62
     _addDesktopBackgroundMenu() {
204b62
         this.actor._desktopBackgroundMenu = this._createDesktopBackgroundMenu();
204b62
         this.actor._desktopBackgroundManager = new PopupMenu.PopupMenuManager({ actor: this.actor });
204b62
-- 
204b62
2.31.1
204b62
204b62
204b62
From 2d978ffc58562c4f4d00b1afb03da58be3102e29 Mon Sep 17 00:00:00 2001
204b62
From: Carlos Garnacho <carlosg@gnome.org>
204b62
Date: Mon, 31 May 2021 19:31:50 +0200
204b62
Subject: [PATCH 3/3] fileItem: Handle (multi) touch explicitly via touch
204b62
 events
204b62
204b62
Wayland does not get pointer emulated events, so we must handle TOUCH_BEGIN/
204b62
END here for file clicking/tapping to work there.
204b62
---
204b62
 extensions/desktop-icons/fileItem.js | 34 ++++++++++++++++++++++++----
204b62
 1 file changed, 30 insertions(+), 4 deletions(-)
204b62
204b62
diff --git a/extensions/desktop-icons/fileItem.js b/extensions/desktop-icons/fileItem.js
204b62
index 143cb9b..1cb47e8 100644
204b62
--- a/extensions/desktop-icons/fileItem.js
204b62
+++ b/extensions/desktop-icons/fileItem.js
204b62
@@ -117,6 +117,7 @@ var FileItem = class {
204b62
         this._container.connect('motion-event', (actor, event) => this._onMotion(actor, event));
204b62
         this._container.connect('leave-event', (actor, event) => this._onLeave(actor, event));
204b62
         this._container.connect('button-release-event', (actor, event) => this._onReleaseButton(actor, event));
204b62
+        this._container.connect('touch-event', (actor, event) => this._onTouchEvent(actor, event));
204b62
 
204b62
         /* Set the metadata and update relevant UI */
204b62
         this._updateMetadataFromFileInfo(fileInfo);
204b62
@@ -648,16 +649,26 @@ var FileItem = class {
204b62
         DesktopIconsUtil.launchTerminal(this.file.get_path());
204b62
     }
204b62
 
204b62
+    _eventButton(event) {
204b62
+	// Emulate button1 press on touch events
204b62
+	if (event.type() == Clutter.EventType.TOUCH_BEGIN ||
204b62
+	    event.type() == Clutter.EventType.TOUCH_END ||
204b62
+	    event.type() == Clutter.EventType.TOUCH_UPDATE)
204b62
+	    return 1;
204b62
+
204b62
+	return event.get_button();
204b62
+    }
204b62
+
204b62
     _updateClickState(event) {
204b62
         let settings = Clutter.Settings.get_default();
204b62
-        if ((event.get_button() == this._lastClickButton) &&
204b62
+        if ((this._eventButton(event) == this._lastClickButton) &&
204b62
             ((event.get_time() - this._lastClickTime) < settings.double_click_time))
204b62
             this._clickCount++;
204b62
         else
204b62
             this._clickCount = 1;
204b62
 
204b62
         this._lastClickTime = event.get_time();
204b62
-        this._lastClickButton = event.get_button();
204b62
+        this._lastClickButton = this._eventButton(event);
204b62
     }
204b62
 
204b62
     _getClickCount() {
204b62
@@ -666,7 +677,7 @@ var FileItem = class {
204b62
 
204b62
     _onPressButton(actor, event) {
204b62
         this._updateClickState(event);
204b62
-        let button = event.get_button();
204b62
+        let button = this._eventButton(event);
204b62
         if (button == 3) {
204b62
             if (!this.isSelected)
204b62
                 this.emit('selected', false, false, true);
204b62
@@ -725,7 +736,7 @@ var FileItem = class {
204b62
     }
204b62
 
204b62
     _onReleaseButton(actor, event) {
204b62
-        let button = event.get_button();
204b62
+        let button = this._eventButton(event);
204b62
         if (button == 1) {
204b62
             // primaryButtonPressed is TRUE only if the user has pressed the button
204b62
             // over an icon, and if (s)he has not started a drag&drop operation
204b62
@@ -744,6 +755,21 @@ var FileItem = class {
204b62
         return Clutter.EVENT_PROPAGATE;
204b62
     }
204b62
 
204b62
+    _onTouchEvent(actor, event) {
204b62
+        // Let x11 pointer emulation do the job on X11
204b62
+        if (!Meta.is_wayland_compositor())
204b62
+            return Clutter.EVENT_PROPAGATE;
204b62
+        if (!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
204b62
+            return Clutter.EVENT_PROPAGATE;
204b62
+
204b62
+        if (event.type() == Clutter.EventType.TOUCH_BEGIN)
204b62
+            this._onPressButton(actor, event);
204b62
+        else if (event.type() == Clutter.EventType.TOUCH_UPDATE)
204b62
+            this._onMotion(actor, event);
204b62
+        else if (event.type() == Clutter.EventType.TOUCH_END)
204b62
+            this._onReleaseButton(actor, event);
204b62
+    }
204b62
+
204b62
     get savedCoordinates() {
204b62
         return this._savedCoordinates;
204b62
     }
204b62
-- 
204b62
2.31.1
204b62