diff --git a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml index 0b58223..ddd00dc 100644 --- a/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ b/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml @@ -23,6 +23,7 @@ + diff --git a/src/appIcons.js b/src/appIcons.js index 4f5ceb9..6aa5828 100644 --- a/src/appIcons.js +++ b/src/appIcons.js @@ -1156,17 +1156,21 @@ export const TaskbarAppIcon = GObject.registerClass( if (this.window && !handleAsGrouped) { //ungrouped applications behaviors switch (buttonAction) { - case 'RAISE': - case 'CYCLE': - case 'CYCLE-MIN': - case 'MINIMIZE': - case 'TOGGLE-SHOWPREVIEW': - case 'TOGGLE-CYCLE': + case 'LAUNCH': + this._launchNewInstance() + break + + case 'QUIT': + this.window.delete(global.get_current_time()) + break + + default: if ( !Main.overview._shown && (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || + buttonAction == 'TOGGLE-SPREAD' || buttonAction == 'CYCLE-MIN') && (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && @@ -1177,16 +1181,6 @@ export const TaskbarAppIcon = GObject.registerClass( } else { Main.activateWindow(this.window) } - - break - - case 'LAUNCH': - this._launchNewInstance() - break - - case 'QUIT': - this.window.delete(global.get_current_time()) - break } } else { //grouped application behaviors @@ -1279,6 +1273,16 @@ export const TaskbarAppIcon = GObject.registerClass( case 'QUIT': closeAllWindows(this.app, monitor) break + case 'TOGGLE-SPREAD': + if (appCount == 1) { + if (appHasFocus && !Main.overview._shown) + minimizeWindow(this.app, false, monitor) + else activateFirstWindow(this.app, monitor) + } else + // return so the overview stays open if it already is + return this.dtpPanel.panelManager.showFocusedAppInOverview( + this.app, + ) } } } else { @@ -1680,8 +1684,9 @@ export const TaskbarAppIcon = GObject.registerClass( // still visible. The border radius is large to make the shape circular let panelSize = this.dtpPanel.geom[this.dtpPanel.checkIfVertical() ? 'w' : 'h'] + let minFontSize = panelSize >= 32 ? 12 : 10 let fontSize = Math.round( - Math.max(11, 0.3 * panelSize) / Utils.getScaleFactor(), + Math.max(minFontSize, 0.3 * panelSize) / Utils.getScaleFactor(), ) let size = Math.round(fontSize * 1.3) let style = ` @@ -1713,9 +1718,9 @@ export const TaskbarAppIcon = GObject.registerClass( this.window ? Main.activateWindow(this.window) : activateFirstWindow(this.app, this.monitor) + } else this.dtpPanel.panelManager.showFocusedAppInOverview(this.app) - return DND.DragMotionResult.MOVE_DROP - } + return DND.DragMotionResult.MOVE_DROP } return DND.DragMotionResult.CONTINUE diff --git a/src/panel.js b/src/panel.js index b0d465f..0ab7201 100644 --- a/src/panel.js +++ b/src/panel.js @@ -451,8 +451,10 @@ export const Panel = GObject.registerClass( if ( source == Main.xdndHandler && Main.overview.shouldToggleByCornerOrButton() - ) + ) { + this.panelManager.showFocusedAppInOverview(null) Main.overview.show() + } return DND.DragMotionResult.CONTINUE } diff --git a/src/panelManager.js b/src/panelManager.js index 9e8c9c5..c1ff967 100755 --- a/src/panelManager.js +++ b/src/panelManager.js @@ -46,6 +46,7 @@ import * as LookingGlass from 'resource:///org/gnome/shell/ui/lookingGlass.js' import * as Main from 'resource:///org/gnome/shell/ui/main.js' import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js' import { NotificationsMonitor } from './notificationsMonitor.js' +import { Workspace } from 'resource:///org/gnome/shell/ui/workspace.js' import * as Layout from 'resource:///org/gnome/shell/ui/layout.js' import { InjectionManager } from 'resource:///org/gnome/shell/extensions/extension.js' import { SETTINGS } from './extension.js' @@ -54,6 +55,8 @@ import { WorkspacesView, } from 'resource:///org/gnome/shell/ui/workspacesView.js' +let tracker = Shell.WindowTracker.get_default() + export const PanelManager = class { constructor() { this.overview = new Overview.Overview() @@ -189,6 +192,13 @@ export const PanelManager = class { Main.overview._overview._controls._workspacesDisplay, ) + Workspace.prototype._oldIsOverviewWindow = + Workspace.prototype._isOverviewWindow + Workspace.prototype._isOverviewWindow = (metaWindow) => + !metaWindow.skip_taskbar && + (!this.focusedApp || + tracker.get_window_app(metaWindow) == this.focusedApp) + LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize @@ -363,6 +373,10 @@ export const PanelManager = class { Main.overview._overview._controls._workspacesDisplay.setPrimaryWorkspaceVisible = this._oldSetPrimaryWorkspaceVisible + Workspace.prototype._isOverviewWindow = + Workspace.prototype._oldIsOverviewWindow + delete Workspace.prototype._oldIsOverviewWindow + LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize delete LookingGlass.LookingGlass.prototype._oldResize @@ -443,6 +457,69 @@ export const PanelManager = class { } } + showFocusedAppInOverview(app) { + if (app == this.focusedApp) return + + this.focusedApp = app + + if (!this._signalsHandler.hasLabel('overview-spread')) + this._signalsHandler.addWithLabel('overview-spread', [ + Main.overview, + 'hidden', + () => { + Utils.getCurrentWorkspace() + .list_windows() + .forEach((w) => { + if ( + !w.minimized && + !w.customJS_ding && + tracker.get_window_app(w) != this.focusedApp + ) { + let window = w.get_compositor_private() + + ;(window.get_first_child() || window).opacity = 0 + + Utils.animateWindowOpacity(window, { + opacity: 255, + time: 0.25, + transition: 'easeOutQuad', + }) + } + }) + + this.focusedApp = null + this._signalsHandler.removeWithLabel('overview-spread') + }, + ]) + + if (Main.overview._shown) { + let workspaces = [] + + Main.overview._overview._controls._workspacesDisplay._workspacesViews.forEach( + (wv) => + (workspaces = [ + ...workspaces, + ...(wv._workspaces || []), // WorkspacesDisplay --> WorkspacesView (primary monitor) + ...(wv._workspacesView?._workspaces || []), // WorkspacesDisplay --> SecondaryMonitorDisplay --> WorkspacesView + ...(wv._workspacesView?._workspace // WorkspacesDisplay --> SecondaryMonitorDisplay --> ExtraWorkspaceView + ? [wv._workspacesView?._workspace] + : []), + ]), + ) + + workspaces.forEach((w) => { + let metaWorkspace = + w.metaWorkspace || + Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace() + + w._container.layout_manager._windows.forEach((info, preview) => + preview.destroy(), + ) + metaWorkspace.list_windows().forEach((mw) => w._doAddWindow(mw)) + }) + } else Main.overview.show() + } + _newSetPrimaryWorkspaceVisible(visible) { if (this._primaryVisible === visible) return diff --git a/src/utils.js b/src/utils.js index be22825..b813ed5 100644 --- a/src/utils.js +++ b/src/utils.js @@ -79,6 +79,10 @@ export const BasicHandler = class { } } + hasLabel(label) { + return !!this._storage[label] + } + /* Virtual methods to be implemented by subclass */ // create single element to be stored in the storage structure _create() { diff --git a/ui/BoxMiddleClickOptions.ui b/ui/BoxMiddleClickOptions.ui index 023845e..f6b1d24 100644 --- a/ui/BoxMiddleClickOptions.ui +++ b/ui/BoxMiddleClickOptions.ui @@ -29,6 +29,7 @@ Cycle windows + minimize Toggle single / Preview multiple Toggle single / Cycle multiple + Toggle single / Spread multiple Quit @@ -57,6 +58,7 @@ Cycle windows + minimize Toggle single / Preview multiple Toggle single / Cycle multiple + Toggle single / Spread multiple Quit @@ -85,6 +87,7 @@ Cycle windows + minimize Toggle single / Preview multiple Toggle single / Cycle multiple + Toggle single / Spread multiple Quit diff --git a/ui/SettingsAction.ui b/ui/SettingsAction.ui index 58c7a0b..e1a05af 100644 --- a/ui/SettingsAction.ui +++ b/ui/SettingsAction.ui @@ -37,6 +37,7 @@ Cycle through windows Toggle single / Preview multiple Toggle single / Cycle multiple + Toggle single / Spread multiple Toggle windows Raise windows Launch new instance