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