diff --git a/SOURCES/0001-Add-move-clock-extension.patch b/SOURCES/0001-Add-move-clock-extension.patch new file mode 100644 index 0000000..d57434f --- /dev/null +++ b/SOURCES/0001-Add-move-clock-extension.patch @@ -0,0 +1,101 @@ +From 13ea90a5f6f5e73d83a2ab04ea70c6263f6d8f5f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 21 May 2024 19:01:30 +0200 +Subject: [PATCH] Add move-clock extension + +--- + extensions/move-clock/extension.js | 38 ++++++++++++++++++++++++++ + extensions/move-clock/meson.build | 5 ++++ + extensions/move-clock/metadata.json.in | 10 +++++++ + meson.build | 1 + + 4 files changed, 54 insertions(+) + create mode 100644 extensions/move-clock/extension.js + create mode 100644 extensions/move-clock/meson.build + create mode 100644 extensions/move-clock/metadata.json.in + +diff --git a/extensions/move-clock/extension.js b/extensions/move-clock/extension.js +new file mode 100644 +index 00000000..571567f7 +--- /dev/null ++++ b/extensions/move-clock/extension.js +@@ -0,0 +1,38 @@ ++/* exported enable disable */ ++const Main = imports.ui.main; ++const SessionMode = imports.ui.sessionMode; ++ ++class MoveClockExtension { ++ enable() { ++ const panel = SessionMode._modes['user'].panel; ++ ++ const clockIndex = panel.center.indexOf('dateMenu'); ++ this._modified = clockIndex !== -1; ++ ++ if (!this._modified) ++ return; ++ ++ panel.center.splice(clockIndex, 1); ++ panel.right.splice(-1, 0, 'dateMenu'); ++ ++ Main.panel._updatePanel(); ++ } ++ ++ disable() { ++ if (!this._modified) ++ return; ++ ++ const panel = SessionMode._modes['user'].panel; ++ const clockIndex = panel.right.indexOf('dateMenu'); ++ ++ if (clockIndex !== -1) ++ panel.right.splice(clockIndex, 1); ++ panel.center.unshift('dateMenu'); ++ ++ Main.panel._updatePanel(); ++ } ++} ++ ++function init() { ++ return new MoveClockExtension(); ++} +diff --git a/extensions/move-clock/meson.build b/extensions/move-clock/meson.build +new file mode 100644 +index 00000000..48504f63 +--- /dev/null ++++ b/extensions/move-clock/meson.build +@@ -0,0 +1,5 @@ ++extension_data += configure_file( ++ input: metadata_name + '.in', ++ output: metadata_name, ++ configuration: metadata_conf ++) +diff --git a/extensions/move-clock/metadata.json.in b/extensions/move-clock/metadata.json.in +new file mode 100644 +index 00000000..d872ab63 +--- /dev/null ++++ b/extensions/move-clock/metadata.json.in +@@ -0,0 +1,10 @@ ++{ ++"extension-id": "@extension_id@", ++"uuid": "@uuid@", ++"settings-schema": "@gschemaname@", ++"gettext-domain": "@gettext_domain@", ++"name": "Move notification menu", ++"description": "Move the notification menu to the right", ++"shell-version": [ "@shell_current@" ], ++"url": "@url@" ++} +diff --git a/meson.build b/meson.build +index 7e6ed3e8..ea6efb76 100644 +--- a/meson.build ++++ b/meson.build +@@ -53,6 +53,7 @@ all_extensions += [ + 'dash-to-dock', + 'dash-to-panel', + 'gesture-inhibitor', ++ 'move-clock', + 'native-window-placement', + 'panel-favorites', + 'systemMonitor', +-- +2.45.1 + diff --git a/SOURCES/0001-desktop-icons-Handle-touch-events.patch b/SOURCES/0001-desktop-icons-Handle-touch-events.patch new file mode 100644 index 0000000..ce3defc --- /dev/null +++ b/SOURCES/0001-desktop-icons-Handle-touch-events.patch @@ -0,0 +1,242 @@ +From a796215ddce14ebe80774b99e29d0d28109c818b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Wed, 6 Mar 2024 20:14:14 +0100 +Subject: [PATCH] desktop-icons: Handle touch events + +File icons currently only deal with button events. Split up the +current handlers and use them to handle touch events as well. +--- + extensions/desktop-icons/fileItem.js | 181 +++++++++++++++++++-------- + 1 file changed, 128 insertions(+), 53 deletions(-) + +diff --git a/extensions/desktop-icons/fileItem.js b/extensions/desktop-icons/fileItem.js +index 37ee54db..26afddb2 100644 +--- a/extensions/desktop-icons/fileItem.js ++++ b/extensions/desktop-icons/fileItem.js +@@ -140,6 +140,7 @@ var FileItem = GObject.registerClass({ + this._container.connect('leave-event', (actor, event) => this._onLeave(actor, event)); + this._container.connect('enter-event', (actor, event) => this._onEnter(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); +@@ -229,6 +230,10 @@ var FileItem = GObject.registerClass({ + if (this._iconAllocationIdleId) + GLib.source_remove(this._iconAllocationIdleId); + ++ if (this._longPressTimeoutId) ++ GLib.source_remove(this._longPressTimeoutId); ++ delete this._longPressTimeoutId; ++ + /* Menu */ + this._removeMenu(); + } +@@ -731,58 +736,141 @@ var FileItem = GObject.registerClass({ + } + + _updateClickState(event) { ++ const eventType = event.type(); ++ const isButton = ++ eventType === Clutter.EventType.BUTTON_PRESS || ++ eventType === Clutter.EventType.BUTTON_RELEASE; ++ const button = isButton ? event.get_button() : 0; ++ const time = event.get_time(); ++ + let settings = Clutter.Settings.get_default(); +- if ((event.get_button() == this._lastClickButton) && +- ((event.get_time() - this._lastClickTime) < settings.double_click_time)) ++ if (button === this._lastClickButton && ++ (time - this._lastClickTime) < settings.double_click_time) + this._clickCount++; + else + this._clickCount = 1; + +- this._lastClickTime = event.get_time(); +- this._lastClickButton = event.get_button(); ++ this._lastClickTime = time; ++ this._lastClickButton = button; + } + + _getClickCount() { + return this._clickCount; + } + ++ _handlePressEvent(event) { ++ const pressSequence = event.get_event_sequence(); ++ if (this._pressSequence && ++ pressSequence?.get_slot() !== this._pressSequence.get_slot()) ++ return Clutter.EVENT_PROPAGATE; ++ ++ this._primaryButtonPressed = true; ++ this._pressSequence = pressSequence; ++ this._pressDevice = event.get_device(); ++ ++ if (this._getClickCount() !== 1) ++ return Clutter.EVENT_STOP; ++ ++ const [x, y] = event.get_coords(); ++ this._buttonPressInitialX = x; ++ this._buttonPressInitialY = y; ++ ++ const shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); ++ const controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); ++ if (controlPressed || shiftPressed) ++ this.emit('selected', true, false, !this._isSelected); ++ else if (!this._isSelected) ++ this.emit('selected', false, false, true); ++ ++ return Clutter.EVENT_STOP; ++ } ++ ++ _handleSecondaryPress() { ++ if (!this.isSelected) ++ this.emit('selected', false, false, true); ++ this._ensureMenu().toggle(); ++ if (this._actionOpenWith) { ++ let allowOpenWith = Extension.desktopManager.getNumberOfSelectedItems() === 1; ++ this._actionOpenWith.setSensitive(allowOpenWith); ++ } ++ const specialFilesSelected = ++ Extension.desktopManager.checkIfSpecialFilesAreSelected(); ++ if (this._actionCut) ++ this._actionCut.setSensitive(!specialFilesSelected); ++ if (this._actionCopy) ++ this._actionCopy.setSensitive(!specialFilesSelected); ++ if (this._actionTrash) ++ this._actionTrash.setSensitive(!specialFilesSelected); ++ return Clutter.EVENT_STOP; ++ } ++ ++ _handleReleaseEvent(event) { ++ if (this._longPressTimeoutId) ++ GLib.source_remove(this._longPressTimeoutId); ++ delete this._longPressTimeoutId; ++ ++ if (!this._primaryButtonPressed || this._pressDevice !== event.get_device()) ++ return Clutter.EVENT_PROPAGATE; ++ ++ const pressSequence = event.get_event_sequence(); ++ if (this._pressSequence && ++ pressSequence?.get_slot() !== this._pressSequence.get_slot()) ++ return Clutter.EVENT_PROPAGATE; ++ ++ // 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 ++ this._primaryButtonPressed = false; ++ delete this._pressDevice; ++ delete this._pressSequence; ++ ++ let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); ++ let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); ++ if (!controlPressed && !shiftPressed) ++ this.emit('selected', false, false, true); ++ if (this._getClickCount() === 1 && Prefs.CLICK_POLICY_SINGLE && !shiftPressed && !controlPressed) ++ this.doOpen(); ++ if (this._getClickCount() === 2 && !Prefs.CLICK_POLICY_SINGLE) ++ this.doOpen(); ++ return Clutter.EVENT_STOP; ++ } ++ ++ _onTouchEvent(actor, event) { ++ // on X11, let pointer emulation deal with touch ++ if (!Meta.is_wayland_compositor()) ++ return Clutter.EVENT_PROPAGATE; ++ ++ const type = event.type(); ++ if (type === Clutter.EventType.TOUCH_BEGIN) { ++ Extension.desktopManager.endRubberBand(); ++ this._updateClickState(event); ++ ++ if (!this._handlePressEvent(event)) ++ return Clutter.EVENT_PROPAGATE; ++ ++ const { longPressDuration } = Clutter.Settings.get_default(); ++ this._longPressTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ++ longPressDuration, ++ () => { ++ this._handleSecondaryPress(); ++ delete this._longPressTimeoutId; ++ return GLib.SOURCE_REMOVE; ++ }); ++ ++ return Clutter.EVENT_STOP; ++ } else if (type === Clutter.EventType.TOUCH_END) { ++ return this._handleReleaseEvent(event); ++ } ++ return Clutter.EVENT_PROPAGATE; ++ } ++ + _onPressButton(actor, event) { + Extension.desktopManager.endRubberBand(); + this._updateClickState(event); + let button = event.get_button(); +- if (button == 3) { +- if (!this.isSelected) +- this.emit('selected', false, false, true); +- this._ensureMenu().toggle(); +- if (this._actionOpenWith) { +- let allowOpenWith = (Extension.desktopManager.getNumberOfSelectedItems() == 1); +- this._actionOpenWith.setSensitive(allowOpenWith); +- } +- let specialFilesSelected = Extension.desktopManager.checkIfSpecialFilesAreSelected(); +- if (this._actionCut) +- this._actionCut.setSensitive(!specialFilesSelected); +- if (this._actionCopy) +- this._actionCopy.setSensitive(!specialFilesSelected); +- if (this._actionTrash) +- this._actionTrash.setSensitive(!specialFilesSelected); +- return Clutter.EVENT_STOP; +- } else if (button == 1) { +- if (this._getClickCount() == 1) { +- let [x, y] = event.get_coords(); +- this._primaryButtonPressed = true; +- this._buttonPressInitialX = x; +- this._buttonPressInitialY = y; +- let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); +- let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); +- if (controlPressed || shiftPressed) { +- this.emit('selected', true, false, !this._isSelected); +- } else { +- if (!this._isSelected) +- this.emit('selected', false, false, true); +- } +- } +- return Clutter.EVENT_STOP; +- } ++ if (button == 3) ++ return this._handleSecondaryPress(); ++ if (button == 1) ++ return this._handlePressEvent(event); + + return Clutter.EVENT_PROPAGATE; + } +@@ -821,22 +909,9 @@ var FileItem = GObject.registerClass({ + + _onReleaseButton(actor, event) { + let button = event.get_button(); +- 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 +- if (this._primaryButtonPressed) { +- this._primaryButtonPressed = false; +- let shiftPressed = !!(event.get_state() & Clutter.ModifierType.SHIFT_MASK); +- let controlPressed = !!(event.get_state() & Clutter.ModifierType.CONTROL_MASK); +- if (!controlPressed && !shiftPressed) +- this.emit('selected', false, false, true); +- if ((this._getClickCount() == 1) && Prefs.CLICK_POLICY_SINGLE && !shiftPressed && !controlPressed) +- this.doOpen(); +- return Clutter.EVENT_STOP; +- } +- if ((this._getClickCount() == 2) && (!Prefs.CLICK_POLICY_SINGLE)) +- this.doOpen(); +- } ++ if (button == 1) ++ return this._handleReleaseEvent(event); ++ + return Clutter.EVENT_PROPAGATE; + } + +-- +2.44.0 + diff --git a/SOURCES/0001-desktop-icons-Notify-icon-drags.patch b/SOURCES/0001-desktop-icons-Notify-icon-drags.patch new file mode 100644 index 0000000..7b3c1a5 --- /dev/null +++ b/SOURCES/0001-desktop-icons-Notify-icon-drags.patch @@ -0,0 +1,40 @@ +From 8389801814c84c797a29f986f15e7ea4dd27bccc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Wed, 6 Mar 2024 13:48:49 +0100 +Subject: [PATCH] desktop-icons: Notify icon drags + +Components like the message tray will use the signal to hide +their layout actor from picks, so that it does no interfere +with the DND operation. +--- + extensions/desktop-icons/desktopManager.js | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/extensions/desktop-icons/desktopManager.js b/extensions/desktop-icons/desktopManager.js +index 75b2a22a..c3b3f7e4 100644 +--- a/extensions/desktop-icons/desktopManager.js ++++ b/extensions/desktop-icons/desktopManager.js +@@ -547,17 +547,20 @@ var DesktopManager = GObject.registerClass({ + this._draggableContainer.allocate_preferred_size(0, 0); + + this._draggable.startDrag(x, y, global.get_current_time(), event.get_event_sequence()); ++ Main.overview.beginItemDrag(this._draggableContainer); + } + + _onDragCancelled() { + let event = Clutter.get_current_event(); + let [x, y] = event.get_coords(); + this._dragCancelled = true; ++ Main.overview.cancelledItemDrag(this._draggableContainer); + } + + _onDragEnd() { + this._inDrag = false; + Main.layoutManager.uiGroup.remove_child(this._draggableContainer); ++ Main.overview.endItemDrag(this._draggableContainer); + } + + _dragActorDropped(event) { +-- +2.44.0 + diff --git a/SOURCES/0001-workspace-indicator-Re-fittsify-workspace-previews.patch b/SOURCES/0001-workspace-indicator-Re-fittsify-workspace-previews.patch new file mode 100644 index 0000000..fc74f7c --- /dev/null +++ b/SOURCES/0001-workspace-indicator-Re-fittsify-workspace-previews.patch @@ -0,0 +1,51 @@ +From 64d4841a77293a45e769b868e1109b63811be7d1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 2 Jul 2024 19:04:10 +0200 +Subject: [PATCH] workspace-indicator: Re-fittsify workspace previews + +For the window-list extension, it is important that the workspace +previews extend to the bottom edge for easier click targets. + +That broke while merging the code with the workspace-indicator, +fix it again by moving the padding from the parent box into the +thumbnail children. +--- + .../workspace-indicator/stylesheet-dark.css | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/extensions/workspace-indicator/stylesheet-dark.css b/extensions/workspace-indicator/stylesheet-dark.css +index fb0e8b1a..017d844a 100644 +--- a/extensions/workspace-indicator/stylesheet-dark.css ++++ b/extensions/workspace-indicator/stylesheet-dark.css +@@ -11,7 +11,6 @@ + } + + .workspace-indicator .workspaces-box { +- padding: 5px; + spacing: 3px; + } + +@@ -20,6 +19,20 @@ + spacing: 6px; + } + ++.workspace-indicator .workspace-box { ++ padding-top: 5px; ++ padding-bottom: 5px; ++} ++ ++.workspace-indicator StButton:first-child:ltr > .workspace-box, ++.workspace-indicator StButton:last-child:rtl > .workspace-box { ++ padding-left: 5px; ++} ++.workspace-indicator StButton:last-child:ltr > .workspace-box, ++.workspace-indicator StButton:first-child:rtl > .workspace-box { ++ padding-right: 5px; ++} ++ + .workspace-indicator-menu .workspace-box { + spacing: 6px; + } +-- +2.45.2 + diff --git a/SPECS/gnome-shell-extensions.spec b/SPECS/gnome-shell-extensions.spec index 71349be..d56b237 100644 --- a/SPECS/gnome-shell-extensions.spec +++ b/SPECS/gnome-shell-extensions.spec @@ -7,7 +7,7 @@ Name: gnome-shell-extensions Version: 40.7 -Release: 15%{?dist}.inferit.3 +Release: 19%{?dist}.inferit Summary: Modify and extend GNOME Shell functionality and behavior License: GPLv2+ @@ -46,9 +46,12 @@ Patch020: 0001-window-list-Explicitly-dispose-settings-on-destroy.patch Patch021: 0001-desktop-icons-Don-t-try-spawn-with-non-existent-work.patch Patch022: 0001-docking-Only-remove-spacer-if-necessary.patch Patch023: 0001-classification-banner-Hide-from-picks.patch -Patch024: prefer-window-icon.patch -Patch025: more-ws-previews.patch - +Patch024: 0001-desktop-icons-Notify-icon-drags.patch +Patch025: prefer-window-icon.patch +Patch026: 0001-desktop-icons-Handle-touch-events.patch +Patch027: more-ws-previews.patch +Patch028: 0001-Add-move-clock-extension.patch +Patch029: 0001-workspace-indicator-Re-fittsify-workspace-previews.patch # MSVSphere Patch1000: 0001-Updated-Russian-translation.patch @@ -68,6 +71,7 @@ Enabled extensions: * gesture-inhibitor * launch-new-instance * heads-up-display + * move-clock * native-window-placement * panel-favorites * places-menu @@ -206,6 +210,15 @@ This GNOME Shell extension modifies the behavior of clicking in the dash and app launcher to always launch a new application instance. +%package -n %{pkg_prefix}-move-clock +Summary: Move GNOME Shell notification menu to the right +License: GPLv2+ +Requires: %{pkg_prefix}-common = %{version}-%{release} + +%description -n %{pkg_prefix}-move-clock +This GNOME Shell extension moves the notification menu to the right. + + %package -n %{pkg_prefix}-heads-up-display Summary: Display persistent on-screen message Group: User Interface/Desktops @@ -406,6 +419,10 @@ install -m644 %{SOURCE2} %{buildroot}%{_datadir}/xsessions/ %{_datadir}/gnome-shell/extensions/launch-new-instance*/ +%files -n %{pkg_prefix}-move-clock +%{_datadir}/gnome-shell/extensions/move-clock*/ + + %files -n %{pkg_prefix}-heads-up-display %{_datadir}/glib-2.0/schemas/org.gnome.shell.extensions.heads-up-display.gschema.xml %{_datadir}/gnome-shell/extensions/heads-up-display*/ @@ -462,27 +479,39 @@ install -m644 %{SOURCE2} %{buildroot}%{_datadir}/xsessions/ %changelog -* Thu Sep 19 2024 Arkady L. Shane - 40.7-15.inferit.3 +* Thu Sep 19 2024 Arkady L. Shane - 40.7-19.inferit - Set 32 as default icon size for dash to dock - -* Tue Sep 10 2024 Arkady L. Shane - 40.7-15.inferit.2 - Update dash to dock config - -* Tue May 14 2024 Arkady L. Shane - 40.7-15.inferit.1 - Update Russian translation - Run only several extensions in Classic Mode -* Fri Apr 19 2024 Florian Müllner - 40.7-15 +* Tue Jul 02 2024 Florian Müllner - 40.7-19 +- Extend workspace buttons to screen edge + Resolves: RHEL-43545 + +* Tue May 21 2024 Florian Müllner - 40.7-18 +- Add "move-clock" extension + Resolves: RHEL-33429 + +* Fri Apr 19 2024 Florian Müllner - 40.7-17 - Fix downstream stylesheets - Resolves: RHEL-31885 + Resolves: RHEL-25016 -* Thu Apr 18 2024 Florian Müllner - 40.7-14 +* Wed Apr 03 2024 Florian Müllner - 40.7-16 - Improve workspace previews - Resolves: RHEL-31885 + Resolves: RHEL-25016 + +* Tue Mar 19 2024 Florian Müllner - 40.7-15 +- Handle touch events in desktop icons + Resolves: RHEL-22713 -* Tue Mar 19 2024 Florian Müllner - 40.7-13 +* Tue Mar 19 2024 Florian Müllner - 40.7-14 - Prefer window icons in window list - Resolves: RHEL-29659 + Resolves: RHEL-24713 + +* Wed Mar 06 2024 Florian Müllner - 40.7-13 +- Notify on desktop icon drags + Resolves: RHEL-26989 * Fri Feb 02 2024 Florian Müllner - 40.7-12 - Hide classification banners from picks