From b87a0085342b9828e7e57e8db892b79e345bfbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 20 Jan 2021 20:18:39 +0100 Subject: [PATCH 1/2] workspace-indicator: Add tooltips to workspace thumbnails When showing previews instead of the menu, the workspace names from our preferences don't appear anywhere. Some users care strongly about those, so expose them as tooltip on hover. --- extensions/workspace-indicator/extension.js | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/extensions/workspace-indicator/extension.js b/extensions/workspace-indicator/extension.js index 69eef88c..d377f288 100644 --- a/extensions/workspace-indicator/extension.js +++ b/extensions/workspace-indicator/extension.js @@ -8,6 +8,7 @@ const ExtensionUtils = imports.misc.extensionUtils; const Main = imports.ui.main; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; +const Tweener = imports.ui.tweener; const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; @@ -15,6 +16,9 @@ const _ = Gettext.gettext; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_KEY = 'workspace-names'; +const TOOLTIP_OFFSET = 6; +const TOOLTIP_ANIMATION_TIME = 150; + let WindowPreview = GObject.registerClass({ GTypeName: 'WorkspaceIndicatorWindowPreview' }, class WindowPreview extends St.Button { @@ -117,7 +121,14 @@ let WorkspaceThumbnail = GObject.registerClass({ y_fill: true }); + this._tooltip = new St.Label({ + style_class: 'dash-label', + visible: false, + }); + Main.uiGroup.add_child(this._tooltip); + this.connect('destroy', this._onDestroy.bind(this)); + this.connect('notify::hover', this._syncTooltip.bind(this)); this._index = index; this._delegate = this; // needed for DND @@ -204,7 +215,36 @@ let WorkspaceThumbnail = GObject.registerClass({ ws.activate(global.get_current_time()); } + _syncTooltip() { + if (this.hover) { + this._tooltip.text = Meta.prefs_get_workspace_name(this._index); + this._tooltip.opacity = 0; + this._tooltip.show(); + + const [stageX, stageY] = this.get_transformed_position(); + const thumbWidth = this.allocation.get_width(); + const thumbHeight = this.allocation.get_height(); + const tipWidth = this._tooltip.width; + const xOffset = Math.floor((thumbWidth - tipWidth) / 2); + const monitor = Main.layoutManager.findMonitorForActor(this); + const x = Math.min( + Math.max(stageX + xOffset, monitor.x), + monitor.x + monitor.width - tipWidth); + const y = stageY + thumbHeight + TOOLTIP_OFFSET; + this._tooltip.set_position(x, y); + } + + Tweener.addTween(this._tooltip, { + opacity: this.hover ? 255 : 0, + time: TOOLTIP_ANIMATION_TIME / 1000, + transition: 'easeOutQuad', + onComplete: () => (this._tooltip.visible = this.hover), + }); + } + _onDestroy() { + this._tooltip.destroy(); + this._workspace.disconnect(this._windowAddedId); this._workspace.disconnect(this._windowRemovedId); global.display.disconnect(this._restackedId); -- 2.44.0 From 36f2762c8c6cda512f164ea22b62d10d03a369b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 20 Jan 2021 20:29:01 +0100 Subject: [PATCH 2/2] window-list: Add tooltips to workspace thumbnails When showing previews instead of the menu, the workspace names don't appear anywhere. Some users care strongly about those, so expose them as tooltip on hover. --- extensions/window-list/workspaceIndicator.js | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/extensions/window-list/workspaceIndicator.js b/extensions/window-list/workspaceIndicator.js index ca476111..8ae9b288 100644 --- a/extensions/window-list/workspaceIndicator.js +++ b/extensions/window-list/workspaceIndicator.js @@ -5,10 +5,14 @@ const DND = imports.ui.dnd; const Main = imports.ui.main; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; +const Tweener = imports.ui.tweener; const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; +const TOOLTIP_OFFSET = 6; +const TOOLTIP_ANIMATION_TIME = 150; + let WindowPreview = GObject.registerClass({ GTypeName: 'WindowListWindowPreview' }, class WindowPreview extends St.Button { @@ -111,7 +115,14 @@ let WorkspaceThumbnail = GObject.registerClass({ y_fill: true }); + this._tooltip = new St.Label({ + style_class: 'dash-label', + visible: false, + }); + Main.uiGroup.add_child(this._tooltip); + this.connect('destroy', this._onDestroy.bind(this)); + this.connect('notify::hover', this._syncTooltip.bind(this)); this._index = index; this._delegate = this; // needed for DND @@ -198,7 +209,36 @@ let WorkspaceThumbnail = GObject.registerClass({ ws.activate(global.get_current_time()); } + _syncTooltip() { + if (this.hover) { + this._tooltip.text = Meta.prefs_get_workspace_name(this._index); + this._tooltip.opacity = 0; + this._tooltip.show(); + + const [stageX, stageY] = this.get_transformed_position(); + const thumbWidth = this.allocation.get_width(); + const tipWidth = this._tooltip.width; + const tipHeight = this._tooltip.height; + const xOffset = Math.floor((thumbWidth - tipWidth) / 2); + const monitor = Main.layoutManager.findMonitorForActor(this); + const x = Math.min( + Math.max(stageX + xOffset, monitor.x), + monitor.x + monitor.width - tipWidth); + const y = stageY - tipHeight - TOOLTIP_OFFSET; + this._tooltip.set_position(x, y); + } + + Tweener.addTween(this._tooltip, { + opacity: this.hover ? 255 : 0, + time: TOOLTIP_ANIMATION_TIME / 1000, + transition: 'easeOutQuad', + onComplete: () => (this._tooltip.visible = this.hover), + }); + } + _onDestroy() { + this._tooltip.destroy(); + this._workspace.disconnect(this._windowAddedId); this._workspace.disconnect(this._windowRemovedId); global.display.disconnect(this._restackedId); -- 2.44.0