From 990e340366621fa3ca167869b35f3664023bf6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 22 May 2025 18:53:20 +0200 Subject: [PATCH] workspace-indicator: Add back plain workspaces menu Unlike in the top bar, the previews in the menu were not too successful. Change back to a regular menu with a list of workspace names. Part-of: --- .../workspace-indicator/stylesheet-dark.css | 20 ------ .../workspace-indicator/workspaceIndicator.js | 65 ++++++++++++++++++- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/extensions/workspace-indicator/stylesheet-dark.css b/extensions/workspace-indicator/stylesheet-dark.css index e70352f8..3440174e 100644 --- a/extensions/workspace-indicator/stylesheet-dark.css +++ b/extensions/workspace-indicator/stylesheet-dark.css @@ -13,19 +13,10 @@ -st-hfade-offset: 20px; } -.workspace-indicator-menu .workspaces-view { - max-width: 480px; -} - .workspace-indicator .workspaces-box { spacing: 3px; } -.workspace-indicator-menu .workspaces-box { - padding: 5px; - spacing: 6px; -} - .workspace-indicator .workspace-box { padding-top: 5px; padding-bottom: 5px; @@ -40,11 +31,6 @@ padding-right: 5px; } -.workspace-indicator-menu .workspace-box { - spacing: 6px; -} - -.workspace-indicator-menu .workspace, .workspace-indicator .workspace { border: 1px solid transparent; border-radius: 4px; @@ -55,12 +41,6 @@ width: 52px; } -.workspace-indicator-menu .workspace { - height: 80px; - width: 160px; -} - -.workspace-indicator-menu .workspace.active, .workspace-indicator .workspace.active { border-color: #fff; } diff --git a/extensions/workspace-indicator/workspaceIndicator.js b/extensions/workspace-indicator/workspaceIndicator.js index a1601d90..d68adee4 100644 --- a/extensions/workspace-indicator/workspaceIndicator.js +++ b/extensions/workspace-indicator/workspaceIndicator.js @@ -10,7 +10,7 @@ import GObject from 'gi://GObject'; import Meta from 'gi://Meta'; import St from 'gi://St'; -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; +import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; @@ -425,9 +425,68 @@ class WorkspacesMenu extends PopupMenu.PopupMenu { constructor(sourceActor) { super(sourceActor, 0.5, St.Side.TOP); - const previews = new WorkspacePreviews({show_labels: true}); - this.box.add_child(previews); this.actor.add_style_class_name(`${baseStyleClassName}-menu`); + + this._workspacesSection = new PopupMenu.PopupMenuSection(); + this.addMenuItem(this._workspacesSection); + + this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + this.addAction(_('Settings'), () => { + const extension = Extension.lookupByURL(import.meta.url); + extension.openPreferences(); + }); + + this._desktopSettings = + new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'}); + this._desktopSettings.connectObject('changed::workspace-names', + () => this._updateWorkspaceLabels(), this); + + const {workspaceManager} = global; + workspaceManager.connectObject( + 'notify::n-workspaces', () => this._updateWorkspaceItems(), + 'workspace-switched', () => this._updateActiveIndicator(), + this.actor); + this._updateWorkspaceItems(); + } + + _updateWorkspaceItems() { + const {workspaceManager} = global; + const {nWorkspaces} = workspaceManager; + + const section = this._workspacesSection.actor; + while (section.get_n_children() < nWorkspaces) { + const item = new PopupMenu.PopupMenuItem(''); + item.connect('activate', (o, event) => { + const index = [...section].indexOf(item); + const workspace = workspaceManager.get_workspace_by_index(index); + workspace?.activate(event.get_time()); + }); + this._workspacesSection.addMenuItem(item); + } + + [...section].splice(nWorkspaces).forEach(item => item.destroy()); + + this._updateWorkspaceLabels(); + this._updateActiveIndicator(); + } + + _updateWorkspaceLabels() { + const items = [...this._workspacesSection.actor]; + items.forEach( + (item, i) => (item.label.text = Meta.prefs_get_workspace_name(i))); + } + + _updateActiveIndicator() { + const {workspaceManager} = global; + const active = workspaceManager.get_active_workspace_index(); + + const items = [...this._workspacesSection.actor]; + items.forEach((item, i) => { + item.setOrnament(i === active + ? PopupMenu.Ornament.CHECK + : PopupMenu.Ornament.NONE); + }); } }