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: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/405>
This commit is contained in:
Florian Müllner
2025-05-22 18:53:20 +02:00
parent c9678e89d2
commit 990e340366
2 changed files with 62 additions and 23 deletions
@@ -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;
}
@@ -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);
});
}
}