From 987b2c5ab20de724f3e2f7035cf3825b658a62b7 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Jun 11 2021 04:20:40 +0000 Subject: import gnome-shell-extensions-3.32.1-19.el8 --- diff --git a/SOURCES/0001-Add-gesture-inhibitor-extension.patch b/SOURCES/0001-Add-gesture-inhibitor-extension.patch new file mode 100644 index 0000000..6e670f7 --- /dev/null +++ b/SOURCES/0001-Add-gesture-inhibitor-extension.patch @@ -0,0 +1,186 @@ +From 7a6819443c896ce288e420cb9bfebebaade61fdb Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Thu, 28 Jan 2021 00:06:12 +0100 +Subject: [PATCH] Add gesture-inhibitor extension + +This extension may disable default GNOME Shell gestures. +--- + extensions/gesture-inhibitor/extension.js | 75 +++++++++++++++++++ + extensions/gesture-inhibitor/meson.build | 8 ++ + extensions/gesture-inhibitor/metadata.json.in | 12 +++ + ...l.extensions.gesture-inhibitor.gschema.xml | 25 +++++++ + extensions/gesture-inhibitor/stylesheet.css | 1 + + meson.build | 1 + + 6 files changed, 122 insertions(+) + create mode 100644 extensions/gesture-inhibitor/extension.js + create mode 100644 extensions/gesture-inhibitor/meson.build + create mode 100644 extensions/gesture-inhibitor/metadata.json.in + create mode 100644 extensions/gesture-inhibitor/org.gnome.shell.extensions.gesture-inhibitor.gschema.xml + create mode 100644 extensions/gesture-inhibitor/stylesheet.css + +diff --git a/extensions/gesture-inhibitor/extension.js b/extensions/gesture-inhibitor/extension.js +new file mode 100644 +index 0000000..e74ede2 +--- /dev/null ++++ b/extensions/gesture-inhibitor/extension.js +@@ -0,0 +1,75 @@ ++/* extension.js ++ * ++ * This program is free software: you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation, either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ * ++ * SPDX-License-Identifier: GPL-2.0-or-later ++ */ ++ ++/* exported init */ ++ ++const Clutter = imports.gi.Clutter; ++const ExtensionUtils = imports.misc.extensionUtils; ++const Me = ExtensionUtils.getCurrentExtension(); ++const ViewSelector = imports.ui.viewSelector; ++const EdgeDragAction = imports.ui.edgeDragAction; ++const WindowManager = imports.ui.windowManager; ++const St = imports.gi.St; ++const Gio = imports.gi.Gio; ++ ++class Extension { ++ constructor() { ++ this._settings = ExtensionUtils.getSettings(); ++ let actions = global.stage.get_actions(); ++ ++ actions.forEach(a => { ++ if (a instanceof ViewSelector.ShowOverviewAction) ++ this._showOverview = a; ++ else if (a instanceof WindowManager.AppSwitchAction) ++ this._appSwitch = a; ++ else if (a instanceof EdgeDragAction.EdgeDragAction && ++ a._side == St.Side.BOTTOM) ++ this._showOsk = a; ++ else if (a instanceof EdgeDragAction.EdgeDragAction && ++ a._side == St.Side.TOP) ++ this._unfullscreen = a; ++ else if (a instanceof EdgeDragAction.EdgeDragAction) ++ this._showAppGrid = a; ++ }); ++ ++ this._map = [ ++ { setting: 'overview', action: this._showOverview }, ++ { setting: 'app-switch', action: this._appSwitch }, ++ { setting: 'show-osk', action: this._showOsk }, ++ { setting: 'unfullscreen', action: this._unfullscreen }, ++ { setting: 'show-app-grid', action: this._showAppGrid } ++ ]; ++ } ++ ++ enable() { ++ this._map.forEach(m => { ++ this._settings.bind(m.setting, m.action, 'enabled', ++ Gio.SettingsBindFlags.DEFAULT); ++ }); ++ } ++ ++ disable() { ++ this._map.forEach(m => { ++ m.action.enabled = true; ++ }); ++ } ++} ++ ++function init() { ++ return new Extension(); ++} +diff --git a/extensions/gesture-inhibitor/meson.build b/extensions/gesture-inhibitor/meson.build +new file mode 100644 +index 0000000..fdad5cc +--- /dev/null ++++ b/extensions/gesture-inhibitor/meson.build +@@ -0,0 +1,8 @@ ++extension_data += configure_file( ++ input: metadata_name + '.in', ++ output: metadata_name, ++ configuration: metadata_conf ++) ++ ++# extension_sources += files('prefs.js') ++extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') +diff --git a/extensions/gesture-inhibitor/metadata.json.in b/extensions/gesture-inhibitor/metadata.json.in +new file mode 100644 +index 0000000..37d6a11 +--- /dev/null ++++ b/extensions/gesture-inhibitor/metadata.json.in +@@ -0,0 +1,12 @@ ++{ ++ "uuid": "@uuid@", ++ "extension-id": "@extension_id@", ++ "settings-schema": "@gschemaname@", ++ "gettext-domain": "@gettext_domain@", ++ "name": "Gesture Inhibitor", ++ "description": "Makes touchscreen gestures optional.", ++ "shell-version": [ "@shell_current@" ], ++ "original-authors": [ "cgarnach@redhat.com" ], ++ "url": "@url@" ++} ++ +diff --git a/extensions/gesture-inhibitor/org.gnome.shell.extensions.gesture-inhibitor.gschema.xml b/extensions/gesture-inhibitor/org.gnome.shell.extensions.gesture-inhibitor.gschema.xml +new file mode 100644 +index 0000000..1d67dcc +--- /dev/null ++++ b/extensions/gesture-inhibitor/org.gnome.shell.extensions.gesture-inhibitor.gschema.xml +@@ -0,0 +1,25 @@ ++ ++ ++ ++ true ++ Show app grid gesture ++ ++ ++ true ++ Show OSK gesture ++ ++ ++ true ++ Show Overview gesture ++ ++ ++ true ++ Application switch gesture ++ ++ ++ true ++ Unfullscreen gesture ++ ++ ++ ++ +diff --git a/extensions/gesture-inhibitor/stylesheet.css b/extensions/gesture-inhibitor/stylesheet.css +new file mode 100644 +index 0000000..37b93f2 +--- /dev/null ++++ b/extensions/gesture-inhibitor/stylesheet.css +@@ -0,0 +1 @@ ++/* Add your custom extension styling here */ +diff --git a/meson.build b/meson.build +index 23bd5ad..9e59729 100644 +--- a/meson.build ++++ b/meson.build +@@ -54,6 +54,7 @@ all_extensions += [ + 'auto-move-windows', + 'dash-to-dock', + 'disable-screenshield', ++ 'gesture-inhibitor', + 'native-window-placement', + 'no-hot-corner', + 'panel-favorites', +-- +2.29.2 + diff --git a/SOURCES/0001-general-launch-only-executable-files.patch b/SOURCES/0001-general-launch-only-executable-files.patch new file mode 100644 index 0000000..5e90b46 --- /dev/null +++ b/SOURCES/0001-general-launch-only-executable-files.patch @@ -0,0 +1,45 @@ +From ee89a91a9ac235b69ff3c47af14d702c0309e892 Mon Sep 17 00:00:00 2001 +From: Sergio Costas +Date: Thu, 25 Jul 2019 00:12:09 +0200 +Subject: [PATCH] general: launch only executable files + +Until now, if a file has the "execute" flag, clicking on it will try +to execute it, no matter if it is really an executable. This means +that a non-executable file (like a JPEG picture, or a text file) +won't be opened with its desired application if it has set the +executable flag. + +This patch fixes this, by ensuring that the only files that can be +executed when the "execute" flag is set, are the ones that makes +sense to execute. + +Fixes https://gitlab.gnome.org/World/ShellExtensions/desktop-icons/issues/144 +--- + extensions/desktop-icons/fileItem.js | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/extensions/desktop-icons/fileItem.js b/extensions/desktop-icons/fileItem.js +index d6d43c9f..44a93352 100644 +--- a/extensions/desktop-icons/fileItem.js ++++ b/extensions/desktop-icons/fileItem.js +@@ -440,10 +440,13 @@ var FileItem = class { + return; + } + +- if (this._attributeCanExecute && !this._isDirectory && !this._isValidDesktopFile) { +- if (this._execLine) +- Util.spawnCommandLine(this._execLine); +- return; ++ if (this._attributeCanExecute && ++ !this._isDirectory && ++ !this._isValidDesktopFile && ++ Gio.content_type_can_be_executable(this._attributeContentType)) { ++ if (this._execLine) ++ Util.spawnCommandLine(this._execLine); ++ return; + } + + Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), +-- +2.31.1 + diff --git a/SOURCES/0001-top-icons-Don-t-use-wm_class-as-role.patch b/SOURCES/0001-top-icons-Don-t-use-wm_class-as-role.patch new file mode 100644 index 0000000..bc3b89b --- /dev/null +++ b/SOURCES/0001-top-icons-Don-t-use-wm_class-as-role.patch @@ -0,0 +1,27 @@ +From ce48dc2f4fba6a7084540df256cb5b3eb0da43da Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Wed, 2 Jun 2021 17:32:21 +0200 +Subject: [PATCH] top-icons: Don't use wm_class as role + +This prevents adding icons for multiple instances of the same app, +which may be desirable in some circumstances. +--- + extensions/top-icons/extension.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/extensions/top-icons/extension.js b/extensions/top-icons/extension.js +index 79e2f423..3dfba469 100644 +--- a/extensions/top-icons/extension.js ++++ b/extensions/top-icons/extension.js +@@ -63,7 +63,7 @@ class SysTray { + button.destroy(); + }); + +- let role = wmClass || `${icon}`; ++ const role = `${icon}`; + Main.panel.addToStatusArea(role, button); + } + +-- +2.31.1 + diff --git a/SOURCES/desktop-icons-touch-support.patch b/SOURCES/desktop-icons-touch-support.patch new file mode 100644 index 0000000..d596c7f --- /dev/null +++ b/SOURCES/desktop-icons-touch-support.patch @@ -0,0 +1,267 @@ +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 + diff --git a/SPECS/gnome-shell-extensions.spec b/SPECS/gnome-shell-extensions.spec index bfbc545..15fa8bb 100644 --- a/SPECS/gnome-shell-extensions.spec +++ b/SPECS/gnome-shell-extensions.spec @@ -6,7 +6,7 @@ Name: gnome-shell-extensions Version: 3.32.1 -Release: 15%{?dist} +Release: 19%{?dist} Summary: Modify and extend GNOME Shell functionality and behavior Group: User Interface/Desktops @@ -41,6 +41,10 @@ Patch0012: 0001-desktop-icons-Update-Japanese-translation.patch Patch0013: 0001-fileItem-Ignore-double-click-distance-clicking-on-it.patch Patch0014: 0001-window-list-Leave-fake-overview-when-destroyed.patch Patch0015: add-workspace-tooltips.patch +Patch0016: 0001-general-launch-only-executable-files.patch +Patch0017: desktop-icons-touch-support.patch +Patch0018: 0001-Add-gesture-inhibitor-extension.patch +Patch0019: 0001-top-icons-Don-t-use-wm_class-as-role.patch %description GNOME Shell Extensions is a collection of extensions providing additional and @@ -52,6 +56,7 @@ Enabled extensions: * dash-to-dock * disable-screenshield * desktop-icons + * gesture-inhibitor * horizontal-workspaces * drive-menu * launch-new-instance @@ -192,6 +197,16 @@ This GNOME Shell extension provides a panel status menu for accessing and unmounting removable devices. +%package -n %{pkg_prefix}-gesture-inhibitor +Summary: Gesture inhibitor +Group: User Interface/Desktops +License: GPLv2+ +Requires: %{pkg_prefix}-common = %{version}-%{release} + +%description -n %{pkg_prefix}-gesture-inhibitor +This GNOME Shell extension allows disabling the default desktop gestures. + + %package -n %{pkg_prefix}-launch-new-instance Summary: Always launch a new application instance for GNOME Shell Group: User Interface/Desktops @@ -411,6 +426,11 @@ cp $RPM_SOURCE_DIR/gnome-classic.desktop $RPM_BUILD_ROOT%{_datadir}/xsessions %{_datadir}/gnome-shell/extensions/drive-menu*/ +%files -n %{pkg_prefix}-gesture-inhibitor +%{_datadir}/glib-2.0/schemas/org.gnome.shell.extensions.gesture-inhibitor.gschema.xml +%{_datadir}/gnome-shell/extensions/gesture-inhibitor*/ + + %files -n %{pkg_prefix}-launch-new-instance %{_datadir}/gnome-shell/extensions/launch-new-instance*/ @@ -474,6 +494,22 @@ cp $RPM_SOURCE_DIR/gnome-classic.desktop $RPM_BUILD_ROOT%{_datadir}/xsessions %changelog +* Wed Jun 02 2021 Florian Müllner - 3.32.1-19 +- Don't use status icon wm_class as top bar role + Resolves: #1897932 + +* Tue Jun 01 2021 Carlos Garnacho - 3.32.1-18 +- Add gesture-inhibitor extension + Resolves: #1854679 + +* Tue Jun 01 2021 Carlos Garnacho - 3.32.1-17 +- Handle touchscreens on Wayland in the desktop-icons extension + Resolves: #1924725 + +* Mon May 31 2021 Florian Müllner - 3.32.1-16 +- Fix opening files with (wrongly) set executable bit + Resolves: #1813727 + * Tue Apr 13 2021 Florian Müllner - 3.32.1-15 - Fix stuck window picker after screen lock Resolves: #1905000