From cc950ae0ea64b3a74c8904bad1cd3ee51ab2e683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 3 Mar 2026 20:19:30 +0100 Subject: [PATCH] Support scrolling in workspace menu Resolves: https://issues.redhat.com/browse/RHEL-153025 --- gnome-shell-extensions.spec | 2 + scrollable-workspace-menu.patch | 108 ++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 scrollable-workspace-menu.patch diff --git a/gnome-shell-extensions.spec b/gnome-shell-extensions.spec index c89fd78..27cb4d0 100644 --- a/gnome-shell-extensions.spec +++ b/gnome-shell-extensions.spec @@ -38,6 +38,8 @@ Patch: 0001-Include-status-icons-in-classic-session.patch Patch: heads-up-display-from-file.patch +Patch: scrollable-workspace-menu.patch + %description GNOME Shell Extensions is a collection of extensions providing additional and optional functionality to GNOME Shell. diff --git a/scrollable-workspace-menu.patch b/scrollable-workspace-menu.patch new file mode 100644 index 0000000..d36265b --- /dev/null +++ b/scrollable-workspace-menu.patch @@ -0,0 +1,108 @@ +From f611e1e505005a9f24a1babe66cb60f6ec610b57 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 3 Mar 2026 12:48:13 +0100 +Subject: [PATCH 1/2] workspace-indicator: Use section box to iterate items + +Menu items are added to a menu's box, so it is more correct to +use that to access items, even when for menu sections the box +is also used as the menu's actor. + +Part-of: +--- + extensions/workspace-indicator/workspaceIndicator.js | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/extensions/workspace-indicator/workspaceIndicator.js b/extensions/workspace-indicator/workspaceIndicator.js +index b2e79508..702bd830 100644 +--- a/extensions/workspace-indicator/workspaceIndicator.js ++++ b/extensions/workspace-indicator/workspaceIndicator.js +@@ -545,7 +545,7 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { + const {workspaceManager} = global; + const {nWorkspaces} = workspaceManager; + +- const section = this._workspacesSection.actor; ++ const section = this._workspacesSection.box; + while (section.get_n_children() < nWorkspaces) { + const item = new EditableMenuItem(); + item.connect('activate', (o, event) => { +@@ -570,7 +570,7 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { + } + + _updateWorkspaceLabels() { +- const items = [...this._workspacesSection.actor]; ++ const items = [...this._workspacesSection.box]; + items.forEach( + (item, i) => (item.label.text = Meta.prefs_get_workspace_name(i))); + } +@@ -579,7 +579,7 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { + const {workspaceManager} = global; + const active = workspaceManager.get_active_workspace_index(); + +- const items = [...this._workspacesSection.actor]; ++ const items = [...this._workspacesSection.box]; + items.forEach((item, i) => { + item.setOrnament(i === active + ? PopupMenu.Ornament.CHECK +-- +2.53.0 + + +From e79cc879b41202212aa4b7afb590a6c0921cefab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Mon, 2 Mar 2026 18:49:16 +0100 +Subject: [PATCH 2/2] workspace-indicator: Support scrolling in workspace menu + +While we should always have enough screen estate to fit a reasonable +number of workspaces, the number can go up to 36 where we are pretty +much guaranteed to run out of space. + +Support those less common cases by making the workspace list scrollable. + +Part-of: +--- + .../workspace-indicator/workspaceIndicator.js | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/extensions/workspace-indicator/workspaceIndicator.js b/extensions/workspace-indicator/workspaceIndicator.js +index 702bd830..d855474e 100644 +--- a/extensions/workspace-indicator/workspaceIndicator.js ++++ b/extensions/workspace-indicator/workspaceIndicator.js +@@ -17,6 +17,7 @@ import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; + import * as Main from 'resource:///org/gnome/shell/ui/main.js'; + import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; + import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; ++import {ensureActorVisibleInScrollView} from 'resource:///org/gnome/shell/misc/animationUtils.js'; + + const TOOLTIP_OFFSET = 6; + const TOOLTIP_ANIMATION_TIME = 150; +@@ -511,6 +512,15 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { + this.actor.add_style_class_name(`${baseStyleClassName}-menu`); + + this._workspacesSection = new PopupMenu.PopupMenuSection(); ++ ++ // make the section scrollable to avoid growing indefinitely ++ const scrollView = new St.ScrollView({ ++ style_class: 'vfade', ++ child: this._workspacesSection.box, ++ }); ++ scrollView._delegate = this._workspacesSection; ++ this._workspacesSection.actor = scrollView; ++ + this.addMenuItem(this._workspacesSection); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); +@@ -560,6 +570,11 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { + this._desktopSettings.set_strv('workspace-names', + [...newNames, ...oldNames.slice(nLabels)]); + }); ++ item.connect('notify::active', () => { ++ const view = this._workspacesSection.actor; ++ if (item.active) ++ ensureActorVisibleInScrollView(view, item); ++ }); + this._workspacesSection.addMenuItem(item); + } + +-- +2.53.0 +