[gnome-shell-extensions/wip/fmuellner/fix-auto-move: 1/4] auto-move-windows: Do not copy checkWorkspaces() method
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell-extensions/wip/fmuellner/fix-auto-move: 1/4] auto-move-windows: Do not copy checkWorkspaces() method
- Date: Fri, 22 Dec 2017 19:56:08 +0000 (UTC)
commit 77e8201bf0d833ce47da7edfc21d59db5d390406
Author: Florian Müllner <fmuellner gnome org>
Date: Fri Dec 22 01:07:06 2017 +0100
auto-move-windows: Do not copy checkWorkspaces() method
When overriding an upstream method, copying the original method code
should always be a last resort, as the two code bases tend to get
out of sync and it often becomes hard to spot the modifications done
by the override. Both those issues can be avoided when figuring out
a way to split out the modifications and call the unmodified upstream
method - we are in luck with our checkWorkspaces() override, as we
can trick the upstream method into not removing workspaces we want
to keep instead of copying the method altogether.
https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/33
extensions/auto-move-windows/extension.js | 64 ++++++-------------------------
1 file changed, 11 insertions(+), 53 deletions(-)
---
diff --git a/extensions/auto-move-windows/extension.js b/extensions/auto-move-windows/extension.js
index ca9cd90..0b7445f 100644
--- a/extensions/auto-move-windows/extension.js
+++ b/extensions/auto-move-windows/extension.js
@@ -85,62 +85,20 @@ function init() {
}
function myCheckWorkspaces() {
- let i;
- let emptyWorkspaces = new Array(this._workspaces.length);
-
- if (!Meta.prefs_get_dynamic_workspaces()) {
- this._checkWorkspacesId = 0;
- return false;
- }
-
- for (i = 0; i < this._workspaces.length; i++) {
- let lastRemoved = this._workspaces[i]._lastRemovedWindow;
- if ((lastRemoved &&
- (lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
- lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
- lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG)) ||
- this._workspaces[i]._keepAliveId)
- emptyWorkspaces[i] = false;
- else
- emptyWorkspaces[i] = true;
- }
-
- let sequences = Shell.WindowTracker.get_default().get_startup_sequences();
- for (i = 0; i < sequences.length; i++) {
- let index = sequences[i].get_workspace();
- if (index >= 0 && index <= global.screen.n_workspaces)
- emptyWorkspaces[index] = false;
- }
-
- let windows = global.get_window_actors();
- for (i = 0; i < windows.length; i++) {
- let winActor = windows[i];
- let win = winActor.meta_window;
- if (win.is_on_all_workspaces())
- continue;
-
- let workspaceIndex = win.get_workspace().index();
- emptyWorkspaces[workspaceIndex] = false;
- }
-
- // If we don't have an empty workspace at the end, add one
- if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
- global.screen.append_new_workspace(false, global.get_current_time());
- emptyWorkspaces.push(false);
+ let keepAliveWorkspaces = [];
+ let foundNonEmpty = false;
+ for (let i = this._workspaces.length - 1; i >= 0; i--) {
+ if (!foundNonEmpty)
+ foundNonEmpty = this._workspaces[i].list_windows().length > 0;
+ else if (!this._workspaces[i]._keepAliveId)
+ keepAliveWorkspaces.push(this._workspaces[i]);
}
- let activeWorkspaceIndex = global.screen.get_active_workspace_index();
- emptyWorkspaces[activeWorkspaceIndex] = false;
-
- // Delete other empty workspaces; do it from the end to avoid index changes
- for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
- if (emptyWorkspaces[i])
- global.screen.remove_workspace(this._workspaces[i], global.get_current_time());
- else
- break;
- }
+ // make sure the original method only removes empty workspaces at the end
+ keepAliveWorkspaces.forEach(ws => { ws._keepAliveId = 1; });
+ prevCheckWorkspaces.call(this);
+ keepAliveWorkspaces.forEach(ws => { delete ws._keepAliveId; });
- this._checkWorkspacesId = 0;
return false;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]