1
0
Fork 0

Adding 45/vertical-workspaces version 37+20240412 [9b05a79].

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-03-24 19:43:11 +01:00
parent 155878f41e
commit 9a6f4265d9
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
37 changed files with 3192 additions and 3142 deletions

View file

@ -3,7 +3,7 @@
* extension.js
*
* @author GdH <G-dH@github.com>
* @copyright 2022 - 2023
* @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@ -50,10 +50,6 @@ import { WindowPreviewModule } from './lib/windowPreview.js';
import { WorkspaceAnimationModule } from './lib/workspaceAnimation.js';
import { WorkspaceModule } from './lib/workspace.js';
import { WorkspaceSwitcherPopupModule } from './lib/workspaceSwitcherPopup.js';
import { WindowSearchProviderModule } from './lib/windowSearchProvider.js';
import { RecentFilesSearchProviderModule } from './lib/recentFilesSearchProvider.js';
import { ExtensionsSearchProviderModule } from './lib/extensionsSearchProvider.js';
import { WinTmbModule } from './lib/winTmb.js';
let Me;
// gettext
@ -73,9 +69,10 @@ export default class VShell extends Extension.Extension {
Me.gettext = this.gettext.bind(this);
_ = Me.gettext;
Me.WSP_PREFIX = WindowSearchProviderModule._PREFIX;
Me.RFSP_PREFIX = RecentFilesSearchProviderModule._PREFIX;
Me.ESP_PREFIX = ExtensionsSearchProviderModule._PREFIX;
// search prefixes for supported search providers
Me.WSP_PREFIX = 'wq//';
Me.RFSP_PREFIX = 'fq//';
Me.ESP_PREFIX = 'eq//';
Me.opt = new Me.Settings.Options(Me);
@ -108,11 +105,7 @@ export default class VShell extends Extension.Extension {
this.removeVShell();
this._disposeModules();
// If Dash to Dock is enabled, disabling V-Shell can end in broken overview
Main.overview.hide();
console.debug(`${Me.metadata.name}: disabled`);
this._cleanGlobals();
}
@ -144,10 +137,6 @@ export default class VShell extends Extension.Extension {
Me.Modules.workspaceSwitcherPopupModule = new WorkspaceSwitcherPopupModule(Me);
Me.Modules.workspaceThumbnailModule = new WorkspaceThumbnailModule(Me);
Me.Modules.workspacesViewModule = new WorkspacesViewModule(Me);
Me.Modules.windowSearchProviderModule = new WindowSearchProviderModule(Me);
Me.Modules.recentFilesSearchProviderModule = new RecentFilesSearchProviderModule(Me);
Me.Modules.extensionsSearchProviderModule = new ExtensionsSearchProviderModule(Me);
Me.Modules.winTmbModule = new WinTmbModule(Me);
}
_disposeModules() {
@ -160,9 +149,7 @@ export default class VShell extends Extension.Extension {
}
Me.Util.cleanGlobals();
Me.Modules = null;
opt = null;
}
activateVShell() {
@ -173,6 +160,8 @@ export default class VShell extends Extension.Extension {
this._removeTimeouts();
this._timeouts = {};
this._ensureOverviewIsHidden();
// load VShell configuration
this._updateSettings();
@ -200,9 +189,16 @@ export default class VShell extends Extension.Extension {
// workaround for upstream bug - overview always shows workspace 1 instead of the active one after restart
this._setInitialWsIndex();
this._resetShellProperties();
}
removeVShell() {
// Rebasing V-Shell when overview is open causes problems
// also if Dash to Dock is enabled, disabling V-Shell can result in a broken overview
this._ensureOverviewIsHidden();
this._resetShellProperties();
this._enabled = false;
const reset = true;
@ -217,27 +213,53 @@ export default class VShell extends Extension.Extension {
// switch PageUp/PageDown workspace switcher shortcuts
this._switchPageShortcuts();
// remove any position offsets from dash and ws thumbnails
if (!Me.Util.dashNotDefault()) {
Main.overview.dash.translation_x = 0;
Main.overview.dash.translation_y = 0;
}
Main.overview._overview._controls._thumbnailsBox.translation_x = 0;
Main.overview._overview._controls._thumbnailsBox.translation_y = 0;
Main.overview._overview._controls._searchEntryBin.translation_y = 0;
Main.overview._overview._controls.set_child_above_sibling(Main.overview._overview._controls._workspacesDisplay, null);
// restore default animation speed
St.Settings.get().slow_down_factor = 1;
// restore default dash background style
Main.overview.dash._background.set_style('');
// hide status message if shown
this._showStatusMessage(false);
this._prevDash = null;
// restore default animation speed
St.Settings.get().slow_down_factor = 1;
Meta.Workspace.prototype.get_neighbor = this._originalGetNeighbor;
}
_ensureOverviewIsHidden() {
if (Main.overview._shown) {
Main.overview._shown = false;
// Main.overview._animationInProgress = true;
Main.overview._visibleTarget = false;
Main.overview._overview.prepareToLeaveOverview();
Main.overview._changeShownState('HIDING');
Main.overview._hideDone();
Main.overview.dash.showAppsButton.checked = false;
}
}
_resetShellProperties() {
const controls = Main.overview._overview.controls;
// remove any position offsets from dash and ws thumbnails
if (!Me.Util.dashNotDefault()) {
controls.dash.translation_x = 0;
controls.dash.translation_y = 0;
}
controls._thumbnailsBox.translation_x = 0;
controls._thumbnailsBox.translation_y = 0;
controls._searchEntryBin.translation_y = 0;
controls._workspacesDisplay.scale_x = 1;
controls.set_child_above_sibling(controls._workspacesDisplay, null);
// following properties may be reduced if extensions are rebased while the overview is open
controls._thumbnailsBox.remove_all_transitions();
controls._thumbnailsBox.scale_x = 1;
controls._thumbnailsBox.scale_y = 1;
controls._thumbnailsBox.opacity = 255;
controls._searchController._searchResults.opacity = 255;
// restore default dash background style
controls.dash._background.set_style('');
}
_removeTimeouts() {
if (this._timeouts) {
Object.values(this._timeouts).forEach(id => {
@ -270,7 +292,7 @@ export default class VShell extends Extension.Extension {
Me.Util.getEnabledExtensions('ubuntu-dock').length);
// force enable Fix Dash to Dock option if DtD detected
opt._watchDashToDock = dtdEnabled;
this._watchDashToDock = dtdEnabled;
}
_updateConnections() {
@ -289,7 +311,6 @@ export default class VShell extends Extension.Extension {
() => {
Me.Modules.panelModule.update();
Me.Modules.overviewControlsModule.update();
Me.Modules.winTmbModule.showThumbnails();
this._timeouts.unlock = 0;
return GLib.SOURCE_REMOVE;
@ -297,7 +318,6 @@ export default class VShell extends Extension.Extension {
);
} else if (session.currentMode === 'unlock-dialog') {
Me.Modules.panelModule.update(true);
Me.Modules.winTmbModule.hideThumbnails();
}
});
}
@ -326,12 +346,46 @@ export default class VShell extends Extension.Extension {
const reset = [1, 2].includes(extension.state);
const dashReplacement = uuid.includes('dash-to-dock') || uuid.includes('ubuntu-dock') || uuid.includes('dash-to-panel');
if (dashReplacement && reset)
opt._watchDashToDock = true;
this._watchDashToDock = true;
if (!Main.layoutManager._startingUp && reset && dashReplacement)
this._updateVShell(1999);
}
);
}
this._updateNewWindowConnection();
}
_updateNewWindowConnection() {
const nMonitors = global.display.get_n_monitors();
if (nMonitors > 1 && opt.FIX_NEW_WINDOW_MONITOR && !this._newWindowCreatedConId) {
this._newWindowCreatedConId = global.display.connect_after('window-created', (w, win) => {
if (Main.layoutManager._startingUp || win.get_window_type() !== Meta.WindowType.NORMAL)
return;
const winActor = win.get_compositor_private();
const _moveWinToMonitor = () => {
const currentMonitor = global.display.get_current_monitor();
if (win.get_monitor() !== currentMonitor) {
// some windows ignore this action if executed immediately
GLib.idle_add(GLib.PRIORITY_LOW, () => {
win.move_to_monitor(currentMonitor);
return GLib.SOURCE_REMOVE;
});
}
};
if (!winActor.realized) {
const realizeId = winActor.connect('realize', () => {
winActor.disconnect(realizeId);
_moveWinToMonitor();
});
} else {
_moveWinToMonitor();
}
});
} else if ((nMonitors.length === 1 || !opt.FIX_NEW_WINDOW_MONITOR) && this._newWindowCreatedConId) {
global.display.disconnect(this._newWindowCreatedConId);
this._newWindowCreatedConId = 0;
}
}
_removeConnections() {
@ -354,6 +408,11 @@ export default class VShell extends Extension.Extension {
Main.extensionManager.disconnect(this._watchDockSigId);
this._watchDockSigId = 0;
}
if (this._newWindowCreatedConId) {
global.display.disconnect(this._newWindowCreatedConId);
this._newWindowCreatedConId = 0;
}
}
_updateOverrides(reset = false) {
@ -387,10 +446,6 @@ export default class VShell extends Extension.Extension {
Me.Modules.searchModule.update(reset);
Me.Modules.windowSearchProviderModule.update(reset);
Me.Modules.recentFilesSearchProviderModule.update(reset);
Me.Modules.extensionsSearchProviderModule.update(reset);
// don't rebuild app grid on any screen lock
// even if the extension includes unlock-screen session mode
// disable/enable is called at least once even on GS44
@ -423,7 +478,6 @@ export default class VShell extends Extension.Extension {
Me.Modules.osdWindowModule.update(reset);
Me.Modules.overlayKeyModule.update(reset);
Me.Modules.searchControllerModule.update(reset);
Me.Modules.winTmbModule.update(reset);
if (!reset && !Main.layoutManager._startingUp)
Main.overview._overview.controls.setInitialTranslations();
@ -441,7 +495,7 @@ export default class VShell extends Extension.Extension {
if (!Main.overview._overview.controls._bgManagers && (opt.SHOW_BG_IN_OVERVIEW || opt.SHOW_WS_PREVIEW_BG) && !Me.Util.getEnabledExtensions('blur-my-shell').length)
Main.overview._overview.controls._setBackground();
if (opt._watchDashToDock) {
if (this._watchDashToDock) {
// workaround for Dash to Dock (Ubuntu Dock) breaking overview allocations after enabled and changed position
// DtD replaces dock and its _workId on every position change
const dash = Main.overview.dash;
@ -573,6 +627,12 @@ export default class VShell extends Extension.Extension {
else
Meta.Workspace.prototype.get_neighbor = this._originalGetNeighbor;
// delay search so it doesn't make the search view transition stuttering
// 150 is the default value in GNOME Shell, but the search feels laggy
// Of course there is some overload for fast keyboard typist
if (opt.SEARCH_VIEW_ANIMATION)
opt.SEARCH_DELAY = 150;
if (settings)
this._applySettings(key);
}
@ -601,6 +661,9 @@ export default class VShell extends Extension.Extension {
if (key?.includes('hot-corner') || key?.includes('dash'))
Me.Modules.layoutModule.update();
if (key?.includes('overlay-key'))
Me.Modules.overlayKeyModule.update();
switch (key) {
case 'ws-thumbnails-position':
this._updateOverrides();
@ -626,12 +689,15 @@ export default class VShell extends Extension.Extension {
case 'osd-position':
Me.Modules.osdWindowModule.update();
break;
case 'overlay-key':
Me.Modules.overlayKeyModule.update();
break;
case 'always-activate-selected-window':
Me.Modules.windowPreviewModule.update();
break;
case 'ws-switcher-mode':
Me.Modules.windowManagerModule.update();
break;
case 'new-window-monitor-fix':
this._updateNewWindowConnection();
break;
}
if (key?.includes('app-grid') ||
@ -775,7 +841,7 @@ export default class VShell extends Extension.Extension {
_getNeighbor(direction) {
// workspace matrix is supported
const activeIndex = this.index();
const ignoreLast = opt.WS_IGNORE_LAST && !Main.overview._shown ? 1 : 0;
const ignoreLast = opt.WS_IGNORE_LAST && Meta.prefs_get_dynamic_workspaces() && !Main.overview._shown ? 1 : 0;
const wraparound = opt.WS_WRAPAROUND;
const nWorkspaces = global.workspace_manager.n_workspaces;
const lastIndex = nWorkspaces - 1 - ignoreLast;