summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.txt26
-rw-r--r--Makefile2
-rw-r--r--VERSION.txt2
-rw-r--r--extensions/44/disable-workspace-switcher.mk2
-rw-r--r--extensions/44/hibernate-status.mk2
-rw-r--r--extensions/44/middleclickclose.mk2
-rw-r--r--extensions/44/multi-monitors-add-on.mk2
-rw-r--r--extensions/44/no-overview.mk2
-rw-r--r--extensions/44/vertical-workspaces.mk2
-rw-r--r--extensions/45/middleclickclose/README.md29
-rw-r--r--extensions/45/no-overview/extension.js32
-rw-r--r--extensions/45/vertical-workspaces/README.md88
-rw-r--r--extensions/45/vertical-workspaces/lib/appDisplay.js1677
-rw-r--r--extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js406
-rw-r--r--extensions/45/vertical-workspaces/lib/winTmb.js525
-rw-r--r--extensions/45/vertical-workspaces/lib/windowManager.js237
-rw-r--r--extensions/45/vertical-workspaces/lib/windowSearchProvider.js331
-rw-r--r--extensions/45/vertical-workspaces/po/cs.po1553
-rw-r--r--extensions/45/vertical-workspaces/po/vertical-workspaces.pot1389
-rw-r--r--extensions/45/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml408
-rw-r--r--extensions/45/vertical-workspaces/stylesheet.css308
-rw-r--r--extensions/47/disable-workspace-switcher.mk (renamed from extensions/45/disable-workspace-switcher.mk)2
-rw-r--r--extensions/47/disable-workspace-switcher/LICENSE (renamed from extensions/45/disable-workspace-switcher/LICENSE)0
-rw-r--r--extensions/47/disable-workspace-switcher/README.md (renamed from extensions/45/disable-workspace-switcher/README.md)0
-rw-r--r--extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js (renamed from extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js)0
-rw-r--r--extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json (renamed from extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json)2
-rw-r--r--extensions/47/hibernate-status.mk (renamed from extensions/45/hibernate-status.mk)2
-rw-r--r--extensions/47/hibernate-status/.editorconfig (renamed from extensions/45/hibernate-status/.editorconfig)0
-rw-r--r--extensions/47/hibernate-status/.github/workflows/release.yaml (renamed from extensions/45/hibernate-status/.github/workflows/release.yaml)0
-rw-r--r--extensions/47/hibernate-status/.gitignore (renamed from extensions/45/hibernate-status/.gitignore)0
-rw-r--r--extensions/47/hibernate-status/.prettierrc (renamed from extensions/45/hibernate-status/.prettierrc)0
-rw-r--r--extensions/47/hibernate-status/LICENSE (renamed from extensions/45/hibernate-status/LICENSE)0
-rw-r--r--extensions/47/hibernate-status/Makefile (renamed from extensions/45/hibernate-status/Makefile)0
-rw-r--r--extensions/47/hibernate-status/README.md (renamed from extensions/45/hibernate-status/README.md)2
-rwxr-xr-xextensions/47/hibernate-status/buildforupload.sh (renamed from extensions/45/hibernate-status/buildforupload.sh)0
-rw-r--r--extensions/47/hibernate-status/extension.js (renamed from extensions/45/hibernate-status/extension.js)17
-rw-r--r--extensions/47/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po (renamed from extensions/45/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po)0
-rw-r--r--extensions/47/hibernate-status/metadata.json (renamed from extensions/45/hibernate-status/metadata.json)2
-rw-r--r--extensions/47/hibernate-status/prefs.js (renamed from extensions/45/hibernate-status/prefs.js)3
-rw-r--r--extensions/47/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml (renamed from extensions/45/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml)0
-rw-r--r--extensions/47/middleclickclose.mk (renamed from extensions/45/middleclickclose.mk)2
-rw-r--r--extensions/47/middleclickclose/.gitignore (renamed from extensions/45/middleclickclose/.gitignore)0
-rw-r--r--extensions/47/middleclickclose/LICENSE (renamed from extensions/45/middleclickclose/LICENSE)0
-rw-r--r--extensions/47/middleclickclose/Makefile (renamed from extensions/45/middleclickclose/Makefile)0
-rw-r--r--extensions/47/middleclickclose/README.md39
-rw-r--r--extensions/47/middleclickclose/img/ego.svg22
-rw-r--r--extensions/47/middleclickclose/src/extension.js (renamed from extensions/45/middleclickclose/src/extension.js)91
-rw-r--r--extensions/47/middleclickclose/src/metadata.json (renamed from extensions/45/middleclickclose/src/metadata.json)4
-rw-r--r--extensions/47/middleclickclose/src/po/de.po (renamed from extensions/45/middleclickclose/src/po/de.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/el.po (renamed from extensions/45/middleclickclose/src/po/el.po)40
-rw-r--r--extensions/47/middleclickclose/src/po/fr.po (renamed from extensions/45/middleclickclose/src/po/fr.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/it.po (renamed from extensions/45/middleclickclose/src/po/it.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/nl.po (renamed from extensions/45/middleclickclose/src/po/nl.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/pt.po (renamed from extensions/45/middleclickclose/src/po/pt.po)34
-rw-r--r--extensions/47/middleclickclose/src/po/sk.po (renamed from extensions/45/middleclickclose/src/po/sk.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/sr.po (renamed from extensions/45/middleclickclose/src/po/sr.po)30
-rw-r--r--extensions/47/middleclickclose/src/po/sr@latin.po (renamed from extensions/45/middleclickclose/src/po/sr@latin.po)36
-rw-r--r--extensions/47/middleclickclose/src/po/template.pot (renamed from extensions/45/middleclickclose/src/po/template.pot)30
-rw-r--r--extensions/47/middleclickclose/src/po/uk.po (renamed from extensions/45/middleclickclose/src/po/uk.po)34
-rw-r--r--extensions/47/middleclickclose/src/prefs.js (renamed from extensions/45/middleclickclose/src/prefs.js)24
-rw-r--r--extensions/47/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml (renamed from extensions/45/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml)5
-rw-r--r--extensions/47/middleclickclose/src/settingsWatch.js (renamed from extensions/45/middleclickclose/src/settingsWatch.js)0
-rw-r--r--extensions/47/no-overview.mk (renamed from extensions/45/no-overview.mk)2
-rw-r--r--extensions/47/no-overview/LICENSE (renamed from extensions/45/no-overview/LICENSE)0
-rw-r--r--extensions/47/no-overview/README.md (renamed from extensions/45/no-overview/README.md)0
-rw-r--r--extensions/47/no-overview/extension.js26
-rw-r--r--extensions/47/no-overview/metadata.json (renamed from extensions/45/no-overview/metadata.json)8
-rw-r--r--extensions/47/vertical-workspaces.mk (renamed from extensions/45/vertical-workspaces.mk)2
-rw-r--r--extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md (renamed from extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md)0
-rw-r--r--extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md (renamed from extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md)0
-rw-r--r--extensions/47/vertical-workspaces/CHANGELOG.md (renamed from extensions/45/vertical-workspaces/CHANGELOG.md)107
-rw-r--r--extensions/47/vertical-workspaces/LICENSE (renamed from extensions/45/vertical-workspaces/LICENSE)0
-rw-r--r--extensions/47/vertical-workspaces/Makefile (renamed from extensions/45/vertical-workspaces/Makefile)0
-rw-r--r--extensions/47/vertical-workspaces/README.md190
-rw-r--r--extensions/47/vertical-workspaces/extension.js (renamed from extensions/45/vertical-workspaces/extension.js)396
-rw-r--r--extensions/47/vertical-workspaces/lib/appDisplay.js2014
-rw-r--r--extensions/47/vertical-workspaces/lib/appFavorites.js (renamed from extensions/45/vertical-workspaces/lib/appFavorites.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/dash.js (renamed from extensions/45/vertical-workspaces/lib/dash.js)710
-rw-r--r--extensions/47/vertical-workspaces/lib/iconGrid.js (renamed from extensions/45/vertical-workspaces/lib/iconGrid.js)187
-rw-r--r--extensions/47/vertical-workspaces/lib/layout.js (renamed from extensions/45/vertical-workspaces/lib/layout.js)82
-rw-r--r--extensions/47/vertical-workspaces/lib/messageTray.js (renamed from extensions/45/vertical-workspaces/lib/messageTray.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/optionsFactory.js (renamed from extensions/45/vertical-workspaces/lib/optionsFactory.js)21
-rw-r--r--extensions/47/vertical-workspaces/lib/osdWindow.js (renamed from extensions/45/vertical-workspaces/lib/osdWindow.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/overlayKey.js (renamed from extensions/45/vertical-workspaces/lib/overlayKey.js)8
-rw-r--r--extensions/47/vertical-workspaces/lib/overview.js (renamed from extensions/45/vertical-workspaces/lib/overview.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/overviewControls.js (renamed from extensions/45/vertical-workspaces/lib/overviewControls.js)1137
-rw-r--r--extensions/47/vertical-workspaces/lib/panel.js (renamed from extensions/45/vertical-workspaces/lib/panel.js)28
-rw-r--r--extensions/47/vertical-workspaces/lib/recentFilesSearchProvider.js (renamed from extensions/45/vertical-workspaces/lib/recentFilesSearchProvider.js)58
-rw-r--r--extensions/47/vertical-workspaces/lib/search.js (renamed from extensions/45/vertical-workspaces/lib/search.js)251
-rw-r--r--extensions/47/vertical-workspaces/lib/searchController.js (renamed from extensions/45/vertical-workspaces/lib/searchController.js)8
-rw-r--r--extensions/47/vertical-workspaces/lib/settings.js (renamed from extensions/45/vertical-workspaces/lib/settings.js)82
-rw-r--r--extensions/47/vertical-workspaces/lib/swipeTracker.js (renamed from extensions/45/vertical-workspaces/lib/swipeTracker.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/util.js (renamed from extensions/45/vertical-workspaces/lib/util.js)93
-rw-r--r--extensions/47/vertical-workspaces/lib/windowAttentionHandler.js (renamed from extensions/45/vertical-workspaces/lib/windowAttentionHandler.js)61
-rw-r--r--extensions/47/vertical-workspaces/lib/windowManager.js380
-rw-r--r--extensions/47/vertical-workspaces/lib/windowPreview.js (renamed from extensions/45/vertical-workspaces/lib/windowPreview.js)32
-rw-r--r--extensions/47/vertical-workspaces/lib/workspace.js (renamed from extensions/45/vertical-workspaces/lib/workspace.js)45
-rw-r--r--extensions/47/vertical-workspaces/lib/workspaceAnimation.js (renamed from extensions/45/vertical-workspaces/lib/workspaceAnimation.js)2
-rw-r--r--extensions/47/vertical-workspaces/lib/workspaceSwitcherPopup.js (renamed from extensions/45/vertical-workspaces/lib/workspaceSwitcherPopup.js)11
-rw-r--r--extensions/47/vertical-workspaces/lib/workspaceThumbnail.js (renamed from extensions/45/vertical-workspaces/lib/workspaceThumbnail.js)53
-rw-r--r--extensions/47/vertical-workspaces/lib/workspacesView.js (renamed from extensions/45/vertical-workspaces/lib/workspacesView.js)320
-rw-r--r--extensions/47/vertical-workspaces/meson.build25
-rw-r--r--extensions/47/vertical-workspaces/metadata.json (renamed from extensions/45/vertical-workspaces/metadata.json)7
-rw-r--r--extensions/47/vertical-workspaces/po/LINGUAS2
-rw-r--r--extensions/47/vertical-workspaces/po/cs.po2568
-rw-r--r--extensions/47/vertical-workspaces/po/meson.build1
-rw-r--r--extensions/47/vertical-workspaces/po/nl.po (renamed from extensions/45/vertical-workspaces/po/nl.po)0
-rw-r--r--extensions/47/vertical-workspaces/po/vertical-workspaces.pot2005
-rw-r--r--extensions/47/vertical-workspaces/prefs.js (renamed from extensions/45/vertical-workspaces/prefs.js)1075
-rw-r--r--extensions/47/vertical-workspaces/schemas/meson.build6
-rw-r--r--extensions/47/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml907
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot.jpg (renamed from extensions/45/vertical-workspaces/screenshots/screenshot.jpg)bin416550 -> 416550 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot0.jpg (renamed from extensions/45/vertical-workspaces/screenshots/screenshot0.jpg)bin290880 -> 290880 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot0.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot0.png)bin1027234 -> 1027234 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot1.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot1.png)bin280303 -> 280303 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot2.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot2.png)bin286557 -> 286557 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot3.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot3.png)bin384363 -> 384363 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot4.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot4.png)bin148233 -> 148233 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/screenshot5.png (renamed from extensions/45/vertical-workspaces/screenshots/screenshot5.png)bin51071 -> 51071 bytes
-rw-r--r--extensions/47/vertical-workspaces/screenshots/vertical-workspaces.gif (renamed from extensions/45/vertical-workspaces/screenshots/vertical-workspaces.gif)bin1213475 -> 1213475 bytes
-rw-r--r--extensions/47/vertical-workspaces/stylesheet.css449
l---------extensions/current2
-rw-r--r--share/man/Makefile2
-rw-r--r--share/man/gnome-shell-extensions-extra.7.rst2
-rw-r--r--share/man/man.in2
140 files changed, 11516 insertions, 9457 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 5188f77..4e7abed 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,29 @@
+2024-09-16 Daniel Baumann <daniel.baumann@progress-linux.org>
+
+ * Releasing version 20240916.
+
+ [ Daniel Baumann ]
+ * Adding gnome-shell version 47 in 46/disable-workspace-switcher metadata.json.
+ * Updating 46/hibernate-status to version 1.16~rc1 [d56e571].
+ * Adding gnome-shell version 47 in 46/hibernate-status metadata.json.
+ * Updating 46/middleclickclose to version 31 [2bac2aa].
+ * Adding gnome-shell version 47 in 46/no-overview metadata.json.
+ * Updating 46/vertical-workspaces to version 46.2+20240828 [5b87af5].
+ * Renaming extensions subdirectory for GNOME 47.
+
+2024-04-12 Daniel Baumann <daniel.baumann@progress-linux.org>
+
+ * Releasing version 20240412.
+
+ [ Daniel Baumann ]
+ * Updating 45/hibernate-status to version 1.15 [0e25653].
+ * Updating 45/middleclickclose to version 30 [168768a].
+ * Updating 45/no-overview to version 46 [85eba64].
+ * Adding 45/vertical-workspaces version 37+20240412 [9b05a79].
+ * Adding gnome-shell version 46 in 45/disable-workspace-switcher metadata.json.
+ * Renaming extensions subdirectory for GNOME 46.
+ * Updating years in copyright notices for 2024.
+
2023-12-10 Daniel Baumann <daniel.baumann@progress-linux.org>
* Releasing version 20231210.
diff --git a/Makefile b/Makefile
index eed2f8b..16c3382 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/VERSION.txt b/VERSION.txt
index 19d30f1..657376e 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-20231210
+20240916
diff --git a/extensions/44/disable-workspace-switcher.mk b/extensions/44/disable-workspace-switcher.mk
index f522857..5b585dc 100644
--- a/extensions/44/disable-workspace-switcher.mk
+++ b/extensions/44/disable-workspace-switcher.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/44/hibernate-status.mk b/extensions/44/hibernate-status.mk
index 05651b5..b97a0d6 100644
--- a/extensions/44/hibernate-status.mk
+++ b/extensions/44/hibernate-status.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/44/middleclickclose.mk b/extensions/44/middleclickclose.mk
index d484427..3f4f896 100644
--- a/extensions/44/middleclickclose.mk
+++ b/extensions/44/middleclickclose.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/44/multi-monitors-add-on.mk b/extensions/44/multi-monitors-add-on.mk
index e3658ff..b0ea06e 100644
--- a/extensions/44/multi-monitors-add-on.mk
+++ b/extensions/44/multi-monitors-add-on.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/44/no-overview.mk b/extensions/44/no-overview.mk
index f59ce6f..e2a604c 100644
--- a/extensions/44/no-overview.mk
+++ b/extensions/44/no-overview.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/44/vertical-workspaces.mk b/extensions/44/vertical-workspaces.mk
index 3dd5bd0..db823e4 100644
--- a/extensions/44/vertical-workspaces.mk
+++ b/extensions/44/vertical-workspaces.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/middleclickclose/README.md b/extensions/45/middleclickclose/README.md
deleted file mode 100644
index bfb193b..0000000
--- a/extensions/45/middleclickclose/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-Quick Close in Overview
-================
-
-Gnome shell extension for closing apps in overview with a middle (or other) click.
-
-All credit goes to Paolo Tranquilli (http://cs.unibo.it/~tranquil/en/hacking.html), I've merely
-copied its code here to provide Gnome Shell 3.10+ compatibility
-
-This extension is installable from
-https://extensions.gnome.org/extension/352/middle-click-to-close-in-overview/.
-
-Otherwise you may
-
-* download a [zip](https://github.com/p91paul/middleclickclose/archive/master.zip) of this extension
-* extract it
-* run the following command
- ```
- make install
-```
-* reload gnome-shell (Alt-F2, r, Enter) -> on Wayland you need to log out and log in again, there is no in-place reload
-* activate it through the Gnome Extensions application.
-
-## Translations
-
-If you're interested in contributing a translation, import the translation template file under
-`src/po/template.pot` to your favourite po-editing software and create a `*.po` file under `src/po`.
-
-To update all existing translations after changing the code, run `make po`. To regenerate only the
-`template.pot` file, run `make pot`
diff --git a/extensions/45/no-overview/extension.js b/extensions/45/no-overview/extension.js
deleted file mode 100644
index 63c914a..0000000
--- a/extensions/45/no-overview/extension.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- No overview at start-up
- GNOME Shell 45+ extension
- Contributors: @fthx, @fmuellner
- License: GPL v3
-*/
-
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-
-export default class NoOverviewExtension {
- constructor() {
- this._realHasOverview = Main.sessionMode.hasOverview;
- }
-
- enable() {
- if (!Main.layoutManager._startingUp) {
- return;
- }
-
- Main.sessionMode.hasOverview = false;
-
- this._startup_complete = Main.layoutManager.connect('startup-complete', () => {
- Main.sessionMode.hasOverview = this._realHasOverview;
- });
- }
-
- disable() {
- Main.sessionMode.hasOverview = this._realHasOverview;
- Main.layoutManager.disconnect(this._startup_complete);
- }
-}
diff --git a/extensions/45/vertical-workspaces/README.md b/extensions/45/vertical-workspaces/README.md
deleted file mode 100644
index 9ff690c..0000000
--- a/extensions/45/vertical-workspaces/README.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# V-Shell (Vertical Workspaces)
-
-A GNOME Shell extension that lets you customize your GNOME Shell UX to suit your workflow, whether you like horizontally or vertically stacked workspaces.
-
-Currently supported GNOME versions: 42 - 45
-
-[<img alt="" height="100" src="https://raw.githubusercontent.com/andyholmes/gnome-shell-extensions-badge/master/get-it-on-ego.svg?sanitize=true">](https://extensions.gnome.org/extension/5177/vertical-workspaces/)
-
-![Custom Overview Layout](screenshots/screenshot.jpg)
-![Custom Overview Layout](screenshots/screenshot0.jpg)
-
-## Features
-- Vertically or horizontally stacked workspaces
-- Adjust position, orientation, scale and visibility of overview content
-- Customizable profiles offer predefined configurations for GNOME 3.xx, GNOME 40+ and another 2 custom layouts
-- 2 overview modes with static windows/workspace. The *Static Workspace* option allows you to use dash like a dock with auto-hide, but with all advantages of the activities overview
-- Support for secondary monitors, workspace thumbnails can be placed on the opposite side than on the primary monitor
-- Wallpaper background with adjustable blur effect and brightness in the overview
-- Custom Dash icon size and on-click/scroll behavior
-- Optional workspace isolated Dash
-- Dash background transparency and corner radius adjustments
-- Adjustable app grid icon size, number of columns and rows, content, optional active and draggable icons in folder preview in optional 3x3 grid
-- Custom search view width, app results icons size and number of result lists rows, improved app search
-- Workspace thumbnails can show background wallpaper and labels (always or on mouse hover) with combination of workspace index, workspace name, name of the current application and current window title
-- Title captions of window previews moved into the preview (originally beneath the preview) and can be set as always visible. Adjustable window preview icon
-- Static background in workspace switcher (outside overview). Keeps Conky below, DING desktop icons stay visible (if not covered by windows)
-- Control over transition animations, including speed
-- Window search provider with *Space* hotkey allows quick window navigation
-- Recent files search provider with *Ctrl + Space* hotkey
-- Extensions search provider with *Ctrl + Shift + Space* hotkey allows to search for extensions, open their settings and enable or disable them
-- Reorder workspaces in overview using *Shift + Scroll* or *Shift + Page Up/Down*
-- Adds *Force Quit*, *Close Windows on Current Workspace* and *Move Windows to Current Workspace* items to app icon menu. The latter action can be activated using *Shift + click* on app icon
-- Change notification banners and OSD popups position
-- Window attention handler options can activate the attention-demanding window immediately or silence its notification
-- Optional position of the hot corner that can follow the dash and expand to hot edge
-- Super key double-press options
-- Window thumbnail (PIP) options allows you to create scaled down clone of the window by clicking on its preview in the overview (secondary mouse buttons or window preview icon)
-
-
-## Changelog
-[CHANGELOG.md](CHANGELOG.md)
-
-## Installation
-
-### Installation from extensions.gnome.org
-The easiest way to install the latest stable release of V-Shell: go to [extensions.gnome.org](https://extensions.gnome.org/extension/5177/vertical-workspaces/) and toggle the switch.
-
-### Installation from the latest Github release
-Download the latest release archive using following command:
-
- wget https://github.com/G-dH/vertical-workspaces/releases/latest/download/vertical-workspaces@G-dH.github.com.zip
-
-Install the extension (`--force` switch needs to be used only if some version of the extension is already installed):
-
- gnome-extensions install --force vertical-workspaces@G-dH.github.com.zip
-
-### Installation from GitHub repository
-The most recent version in the repository is the one I'm currently using and developing on my own systems, problems may occur, but usually nothing serious. The repository version may change often and doesn't updates automatically on your system. If you want to help me, use this latest version and report bugs.
-You may need to install `git`, `make`, `gettext` and `glib2.0` for successful installation.
-Navigate to the directory you want to download the source code and execute following commands in the terminal:
-
-GNOME 45:
-
- git clone https://github.com/G-dH/vertical-workspaces.git
- cd vertical-workspaces
- make install
-
-GNOME 42 - 44:
-
- git clone https://github.com/G-dH/vertical-workspaces.git
- cd vertical-workspaces
- git checkout gnome-42-44
- make install
-
-If you get `Can't recursively copy directory` error, take a look at issue #51.
-
-### Enabling the extension
-After installation you need to enable the extension and access its settings.
-
-- First restart GNOME Shell (`ALt` + `F2`, `r`, `Enter`, or Log Out/Log In if you use Wayland)
-- Now you should see *Vertical Workspaces* extension in *Extensions* application (re-open the app if needed to load new data), where you can enable it and access its Preferences window by pressing `Settings` button.
-
-## Credits
-This extension uses customized utils and dash modules of the [Vertical Overview extension](https://github.com/RensAlthuis/vertical-overview).
-
-## Buy me a coffee
-If you like my extensions and want to keep me motivated give me some useful feedback, but you can also help me with my coffee expenses:
-[buymeacoffee.com/georgdh](https://buymeacoffee.com/georgdh)
diff --git a/extensions/45/vertical-workspaces/lib/appDisplay.js b/extensions/45/vertical-workspaces/lib/appDisplay.js
deleted file mode 100644
index 22640c6..0000000
--- a/extensions/45/vertical-workspaces/lib/appDisplay.js
+++ /dev/null
@@ -1,1677 +0,0 @@
-/**
- * V-Shell (Vertical Workspaces)
- * appDisplay.js
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
- * @license GPL-3.0
- *
- */
-
-'use strict';
-
-import Clutter from 'gi://Clutter';
-import Gio from 'gi://Gio';
-import GLib from 'gi://GLib';
-import GObject from 'gi://GObject';
-import Graphene from 'gi://Graphene';
-import Meta from 'gi://Meta';
-import Pango from 'gi://Pango';
-import Shell from 'gi://Shell';
-import St from 'gi://St';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js';
-import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
-
-let Me;
-let opt;
-// gettext
-let _;
-
-let _timeouts;
-
-const APP_ICON_TITLE_EXPAND_TIME = 200;
-const APP_ICON_TITLE_COLLAPSE_TIME = 100;
-
-function _getCategories(info) {
- let categoriesStr = info.get_categories();
- if (!categoriesStr)
- return [];
- return categoriesStr.split(';');
-}
-
-function _listsIntersect(a, b) {
- for (let itemA of a) {
- if (b.includes(itemA))
- return true;
- }
- return false;
-}
-
-export const AppDisplayModule = class {
- constructor(me) {
- Me = me;
- opt = Me.opt;
- _ = Me.gettext;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
- this._overrides = null;
-
- this._appGridLayoutSettings = null;
- this._appDisplayScrollConId = 0;
- this._appSystemStateConId = 0;
- this._appGridLayoutConId = 0;
- this._origAppViewItemAcceptDrop = null;
- this._updateFolderIcons = 0;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- _ = null;
- }
-
- update(reset) {
- this._removeTimeouts();
- this.moduleEnabled = opt.get('appDisplayModule');
- const conflict = false;
-
- reset = reset || !this.moduleEnabled || conflict;
-
- // don't touch the original code if module disabled
- if (reset && !this._firstActivation) {
- this._disableModule();
- this.moduleEnabled = false;
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation) {
- this.moduleEnabled = false;
- console.debug(' AppDisplayModule - Keeping untouched');
- }
- }
-
- _activateModule() {
- Me.Modules.iconGridModule.update();
-
- if (!this._overrides)
- this._overrides = new Me.Util.Overrides();
-
- _timeouts = {};
-
- // Common
- // this._overrides.addOverride('BaseAppViewCommon', AppDisplay.BaseAppView.prototype, BaseAppViewCommon);
- // instead of overriding inaccessible BaseAppView class, we override its children - AppDisplay and FolderView
- this._overrides.addOverride('BaseAppViewCommonApp', AppDisplay.AppDisplay.prototype, BaseAppViewCommon);
- this._overrides.addOverride('BaseAppViewCommonFolder', AppDisplay.FolderView.prototype, BaseAppViewCommon);
- this._overrides.addOverride('FolderView', AppDisplay.FolderView.prototype, FolderView);
- this._overrides.addOverride('AppDisplay', AppDisplay.AppDisplay.prototype, AppDisplayCommon);
- this._overrides.addOverride('AppViewItem', AppDisplay.AppViewItem.prototype, AppViewItemCommon);
- this._overrides.addOverride('FolderIcon', AppDisplay.FolderIcon.prototype, FolderIcon);
- if (opt.APP_GRID_ACTIVE_PREVIEW)
- this._overrides.addOverride('ActiveFolderIcon', AppDisplay.FolderIcon, ActiveFolderIcon);
- this._overrides.addOverride('AppIcon', AppDisplay.AppIcon.prototype, AppIcon);
-
- if (opt.ORIENTATION === Clutter.Orientation.VERTICAL) {
- // this._overrides.addOverride('BaseAppViewVertical', AppDisplay.BaseAppView.prototype, BaseAppViewVertical);
- this._overrides.addOverride('BaseAppViewVerticalApp', AppDisplay.AppDisplay.prototype, BaseAppViewVertical);
- this._overrides.addOverride('BaseAppViewVerticalFolder', AppDisplay.FolderView.prototype, BaseAppViewVertical);
- this._overrides.addOverride('AppDisplayVertical', AppDisplay.AppDisplay.prototype, AppDisplayVertical);
- }
-
- // Custom App Grid
- this._overrides.addOverride('AppFolderDialog', AppDisplay.AppFolderDialog.prototype, AppFolderDialog);
-
- // BaseAppViewGridLayout is not exported, we can only access current instance
- this._overrides.addOverride('BaseAppViewGridLayout', Main.overview._overview.controls._appDisplay._appGridLayout, BaseAppViewGridLayout);
- // this._overrides.addOverride('FolderGrid', AppDisplay.FolderGrid.prototype, FolderGrid);
-
- this._setAppDisplayOrientation(opt.ORIENTATION === Clutter.Orientation.VERTICAL);
- this._updateDND();
-
- const appDisplay = Main.overview._overview.controls._appDisplay;
-
- if (!this._originalWorkId)
- this._originalWorkId = appDisplay._redisplayWorkId;
- if (!this._newWorkId) {
- appDisplay._redisplayWorkId = Main.initializeDeferredWork(appDisplay, () => {
- appDisplay._redisplay();
- if (appDisplay._overviewHiddenId === 0)
- appDisplay._overviewHiddenId = Main.overview.connect('hidden', () => appDisplay.goToPage(0));
- });
- this._newWorkId = appDisplay._redisplayWorkId;
- } else {
- appDisplay._redisplayWorkId = this._newWorkId;
- }
-
-
- if (!Main.sessionMode.isGreeter)
- this._updateAppDisplayProperties();
-
- console.debug(' AppDisplayModule - Activated');
- }
-
- _disableModule() {
- Me.Modules.iconGridModule.update(true);
-
- if (this._overrides)
- this._overrides.removeAll();
- this._overrides = null;
-
- const reset = true;
- this._setAppDisplayOrientation(false);
- this._updateAppDisplayProperties(reset);
- this._updateDND(reset);
- this._restoreOverviewGroup();
- this._removeStatusMessage();
-
- // register a new appDisplay workId so the original code will be called from the callback
- const appDisplay = Main.overview._overview.controls._appDisplay;
- appDisplay._redisplayWorkId = this._originalWorkId;
-
- console.debug(' AppDisplayModule - Disabled');
- }
-
- _removeTimeouts() {
- if (_timeouts) {
- Object.values(_timeouts).forEach(t => {
- if (t)
- GLib.source_remove(t);
- });
- _timeouts = null;
- }
- }
-
- _setAppDisplayOrientation(vertical = false) {
- const CLUTTER_ORIENTATION = vertical ? Clutter.Orientation.VERTICAL : Clutter.Orientation.HORIZONTAL;
- const scroll = vertical ? 'vscroll' : 'hscroll';
- // app display to vertical has issues - page indicator not working
- // global appDisplay orientation switch is not built-in
- let appDisplay = Main.overview._overview._controls._appDisplay;
- // following line itself only changes in which axis will operate overshoot detection which switches appDisplay pages while dragging app icon to vertical
- appDisplay._orientation = CLUTTER_ORIENTATION;
- appDisplay._grid.layoutManager._orientation = CLUTTER_ORIENTATION;
- appDisplay._swipeTracker.orientation = CLUTTER_ORIENTATION;
- appDisplay._swipeTracker._reset();
- if (vertical) {
- appDisplay._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL);
-
- // move and change orientation of page indicators
- const pageIndicators = appDisplay._pageIndicators;
- pageIndicators.vertical = true;
- appDisplay._box.vertical = false;
- pageIndicators.x_expand = false;
- pageIndicators.y_align = Clutter.ActorAlign.CENTER;
- pageIndicators.x_align = Clutter.ActorAlign.START;
-
- // moving these bars needs more patching of the appDisplay's code
- // for now we just change bars style to be more like vertically oriented arrows indicating direction to prev/next page
- appDisplay._nextPageIndicator.add_style_class_name('nextPageIndicator');
- appDisplay._prevPageIndicator.add_style_class_name('prevPageIndicator');
-
- // setting their x_scale to 0 removes the arrows and avoid allocation issues compared to .hide() them
- appDisplay._nextPageArrow.scale_x = 0;
- appDisplay._prevPageArrow.scale_x = 0;
- } else {
- appDisplay._scrollView.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.NEVER);
- if (this._appDisplayScrollConId) {
- appDisplay._adjustment.disconnect(this._appDisplayScrollConId);
- this._appDisplayScrollConId = 0;
- }
-
- // restore original page indicators
- const pageIndicators = appDisplay._pageIndicators;
- pageIndicators.vertical = false;
- appDisplay._box.vertical = true;
- pageIndicators.x_expand = true;
- pageIndicators.y_align = Clutter.ActorAlign.END;
- pageIndicators.x_align = Clutter.ActorAlign.CENTER;
-
- // put back touch friendly navigation buttons
- const scrollContainer = appDisplay._scrollView.get_parent();
- if (appDisplay._hintContainer && !appDisplay._hintContainer.get_parent()) {
- scrollContainer.add_child(appDisplay._hintContainer);
- // the hit container covers the entire app grid and added at the top of the stack blocks DND drops
- // so it needs to be pushed below
- scrollContainer.set_child_below_sibling(appDisplay._hintContainer, null);
- }
-
- appDisplay._nextPageArrow.scale_x = 1;
- appDisplay._prevPageArrow.scale_x = 1;
-
- appDisplay._nextPageIndicator.remove_style_class_name('nextPageIndicator');
- appDisplay._prevPageIndicator.remove_style_class_name('prevPageIndicator');
- }
-
- // value for page indicator is calculated from scroll adjustment, horizontal needs to be replaced by vertical
- appDisplay._adjustment = appDisplay._scrollView[scroll].adjustment;
-
- // no need to connect already connected signal (wasn't removed the original one before)
- if (!vertical) {
- // reset used appDisplay properties
- Main.overview._overview._controls._appDisplay.scale_y = 1;
- Main.overview._overview._controls._appDisplay.scale_x = 1;
- Main.overview._overview._controls._appDisplay.opacity = 255;
- return;
- }
-
- // update appGrid dot pages indicators
- this._appDisplayScrollConId = appDisplay._adjustment.connect('notify::value', adj => {
- const value = adj.value / adj.page_size;
- appDisplay._pageIndicators.setCurrentPosition(value);
- });
- }
-
- // Set App Grid columns, rows, icon size, incomplete pages
- _updateAppDisplayProperties(reset = false) {
- opt._appGridNeedsRedisplay = false;
- // columns, rows, icon size
- const appDisplay = Main.overview._overview._controls._appDisplay;
- appDisplay.visible = true;
- if (reset) {
- appDisplay._grid.layoutManager.fixedIconSize = -1;
- appDisplay._grid.layoutManager.allow_incomplete_pages = true;
- appDisplay._grid._currentMode = -1;
- appDisplay._grid.setGridModes();
- if (this._appGridLayoutSettings) {
- this._appGridLayoutSettings.disconnect(this._appGridLayoutConId);
- this._appGridLayoutConId = 0;
- this._appGridLayoutSettings = null;
- }
- appDisplay._redisplay();
-
- appDisplay._grid.set_style('');
- this._updateAppGrid(reset);
- } else {
- // update grid on layout reset
- if (!this._appGridLayoutSettings) {
- this._appGridLayoutSettings = Me.getSettings('org.gnome.shell');
- this._appGridLayoutConId = this._appGridLayoutSettings.connect('changed::app-picker-layout', this._updateLayout);
- }
-
- appDisplay._grid.layoutManager.allow_incomplete_pages = opt.APP_GRID_ALLOW_INCOMPLETE_PAGES;
- // appDisplay._grid.set_style(`column-spacing: ${opt.APP_GRID_SPACING}px; row-spacing: ${opt.APP_GRID_SPACING}px;`);
- // APP_GRID_SPACING constant is used for grid dimensions calculation
- // but sometimes the actual grid spacing properties affect/change the calculated size, therefore we set it lower to avoid this problem
- // main app grid always use available space and the spacing is optimized for the grid dimensions
- appDisplay._grid.set_style('column-spacing: 5px; row-spacing: 5px;');
-
- // force redisplay
- appDisplay._grid._currentMode = -1;
- appDisplay._grid.setGridModes();
- appDisplay._grid.layoutManager.fixedIconSize = opt.APP_GRID_ICON_SIZE;
- // avoid resetting appDisplay before startup animation
- // x11 shell restart skips startup animation
- if (!Main.layoutManager._startingUp) {
- this._updateAppGrid();
- } else if (Main.layoutManager._startingUp && (Meta.is_restart() || Me.Util.dashIsDashToDock())) {
- _timeouts.three = GLib.idle_add(GLib.PRIORITY_LOW, () => {
- this._updateAppGrid();
- _timeouts.three = 0;
- return GLib.SOURCE_REMOVE;
- });
- }
- }
- }
-
- _updateDND(reset) {
- if (!reset) {
- if (!this._appSystemStateConId && opt.APP_GRID_INCLUDE_DASH >= 3) {
- this._appSystemStateConId = Shell.AppSystem.get_default().connect(
- 'app-state-changed',
- () => {
- this._updateFolderIcons = true;
- Main.overview._overview.controls._appDisplay._redisplay();
- }
- );
- }
- } else if (this._appSystemStateConId) {
- Shell.AppSystem.get_default().disconnect(this._appSystemStateConId);
- this._appSystemStateConId = 0;
- }
- }
-
- _restoreOverviewGroup() {
- Main.overview.dash.showAppsButton.checked = false;
- Main.layoutManager.overviewGroup.opacity = 255;
- Main.layoutManager.overviewGroup.scale_x = 1;
- Main.layoutManager.overviewGroup.scale_y = 1;
- Main.layoutManager.overviewGroup.hide();
- Main.overview._overview._controls._appDisplay.translation_x = 0;
- Main.overview._overview._controls._appDisplay.translation_y = 0;
- Main.overview._overview._controls._appDisplay.visible = true;
- Main.overview._overview._controls._appDisplay.opacity = 255;
- }
-
- // update all invalid positions that may be result of grid/icon size change
- _updateIconPositions() {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- const layout = JSON.stringify(global.settings.get_value('app-picker-layout').recursiveUnpack());
- // if app grid layout is empty, sort source alphabetically to avoid misplacing
- if (layout === JSON.stringify([]) && appDisplay._sortOrderedItemsAlphabetically)
- appDisplay._sortOrderedItemsAlphabetically();
- const icons = [...appDisplay._orderedItems];
- for (let i = 0; i < icons.length; i++)
- appDisplay._moveItem(icons[i], -1, -1);
- }
-
- _removeIcons() {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- const icons = [...appDisplay._orderedItems];
- for (let i = 0; i < icons.length; i++) {
- const icon = icons[i];
- if (icon._dialog)
- Main.layoutManager.overviewGroup.remove_child(icon._dialog);
- appDisplay._removeItem(icon);
- icon.destroy();
- }
- appDisplay._folderIcons = [];
- }
-
- _removeStatusMessage() {
- if (Me._vShellStatusMessage) {
- if (Me._vShellMessageTimeoutId) {
- GLib.source_remove(Me._vShellMessageTimeoutId);
- Me._vShellMessageTimeoutId = 0;
- }
- Me._vShellStatusMessage.destroy();
- Me._vShellStatusMessage = null;
- }
- }
-
- _updateLayout(settings, key) {
- const currentValue = JSON.stringify(settings.get_value(key).deep_unpack());
- const emptyValue = JSON.stringify([]);
- const customLayout = currentValue !== emptyValue;
- if (!customLayout) {
- this._updateAppGrid();
- }
- }
-
- _updateAppGrid(reset = false, callback) {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- // reset the grid only if called directly without args or if all folders where removed by using reset button in Settings window
- // otherwise this function is called every time a user moves icon to another position as a settings callback
-
- // force update icon size using adaptToSize(), the page size cannot be the same as the current one
- appDisplay._grid.layoutManager._pageWidth += 1;
- appDisplay._grid.layoutManager.adaptToSize(appDisplay._grid.layoutManager._pageWidth - 1, appDisplay._grid.layoutManager._pageHeight);
-
- // don't delay the first screen lock whe extensions are rebased
- // removing icons takes time and with other
- if (!Main.sessionMode.isLocked)
- this._removeIcons();
-
- appDisplay._redisplay();
-
- // don't realize appDisplay on disable, or at startup if disabled
- // always realize appDisplay otherwise to avoid errors while opening folders (that I was unable to trace)
- if (reset || (!opt.APP_GRID_PERFORMANCE && callback)) {
- this._removeStatusMessage();
- if (callback)
- callback();
- return;
- }
-
- // workaround - silently realize appDisplay
- // appDisplay and its content must be "visible" (opacity > 0) on the screen (within monitor geometry)
- // to realize its objects
- // this action takes some time and affects animations during the first use
- // if we do it invisibly before user needs it, it can improve the user's experience
-
- this._exposeAppGrid();
-
- // let the main loop process our changes before continuing
- _timeouts.one = GLib.idle_add(GLib.PRIORITY_LOW, () => {
- this._updateIconPositions();
- if (appDisplay._sortOrderedItemsAlphabetically) {
- appDisplay._sortOrderedItemsAlphabetically();
- appDisplay._grid.layoutManager._pageWidth += 1;
- appDisplay._grid.layoutManager.adaptToSize(appDisplay._grid.layoutManager._pageWidth - 1, appDisplay._grid.layoutManager._pageHeight);
- appDisplay._setLinearPositions(appDisplay._orderedItems);
- }
-
- appDisplay._redisplay();
- // realize also all app folders (by opening them) so the first popup is as smooth as the second one
- // let the main loop process our changes before continuing
- _timeouts.two = GLib.idle_add(GLib.PRIORITY_LOW, () => {
- this._restoreAppGrid();
- Me._resetInProgress = false;
- this._removeStatusMessage();
-
- if (callback)
- callback();
-
- _timeouts.two = 0;
- return GLib.SOURCE_REMOVE;
- });
- _timeouts.one = 0;
- return GLib.SOURCE_REMOVE;
- });
- }
-
- _exposeAppGrid() {
- const overviewGroup = Main.layoutManager.overviewGroup;
- if (!overviewGroup.visible) {
- // scale down the overviewGroup so it don't cover uiGroup
- overviewGroup.scale_y = 0.001;
- // make it invisible to the eye, but visible for the renderer
- overviewGroup.opacity = 1;
- // if overview is hidden, show it
- overviewGroup.visible = true;
- }
-
- const appDisplay = Main.overview._overview._controls._appDisplay;
- appDisplay.opacity = 1;
-
- // find usable value, sometimes it's one, sometime the other...
- let [x, y] = appDisplay.get_position();
- let { x1, y1 } = appDisplay.allocation;
- x = x === Infinity ? 0 : x;
- y = y === Infinity ? 0 : y;
- x1 = x1 === Infinity ? 0 : x1;
- y1 = y1 === Infinity ? 0 : y1;
- appDisplay.translation_x = -(x ? x : x1);
- appDisplay.translation_y = -(y ? y : y1);
- this._exposeAppFolders();
- }
-
- _exposeAppFolders() {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- appDisplay._folderIcons.forEach(d => {
- d._ensureFolderDialog();
- d._dialog._updateFolderSize();
- d._dialog.scale_y = 0.0001;
- d._dialog.show();
- });
- }
-
- _restoreAppGrid() {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- appDisplay.translation_x = 0;
- appDisplay.translation_y = 0;
- // appDisplay.opacity = 0;
- this._hideAppFolders();
-
- const overviewGroup = Main.layoutManager.overviewGroup;
- if (!Main.overview._shown)
- overviewGroup.hide();
- overviewGroup.scale_y = 1;
- overviewGroup.opacity = 255;
-
- this._removeStatusMessage();
- }
-
- _hideAppFolders() {
- const appDisplay = Main.overview._overview._controls._appDisplay;
- appDisplay._folderIcons.forEach(d => {
- if (d._dialog) {
- d._dialog._updateFolderSize();
- d._dialog.hide();
- d._dialog.scale_y = 1;
- }
- });
- }
-
- _getWindowApp(metaWin) {
- const tracker = Shell.WindowTracker.get_default();
- return tracker.get_window_app(metaWin);
- }
-
- _getAppLastUsedWindow(app) {
- let recentWin;
- global.display.get_tab_list(Meta.TabList.NORMAL_ALL, null).forEach(metaWin => {
- const winApp = this._getWindowApp(metaWin);
- if (!recentWin && winApp === app)
- recentWin = metaWin;
- });
- return recentWin;
- }
-
- _getAppRecentWorkspace(app) {
- const recentWin = this._getAppLastUsedWindow(app);
- if (recentWin)
- return recentWin.get_workspace();
-
- return null;
- }
-};
-
-const AppDisplayVertical = {
- // correction of the appGrid size when page indicators were moved from the bottom to the right
- adaptToSize(width, height) {
- const [, indicatorWidth] = this._pageIndicators.get_preferred_width(-1);
- width -= indicatorWidth;
-
- this._grid.findBestModeForSize(width, height);
-
- const adaptToSize = AppDisplay.BaseAppView.prototype.adaptToSize.bind(this);
- adaptToSize(width, height);
- },
-};
-
-function _getViewFromIcon(icon) {
- for (let parent = icon.get_parent(); parent; parent = parent.get_parent()) {
- if (parent instanceof AppDisplay.AppDisplay || parent instanceof AppDisplay.FolderView) {
- return parent;
- }
- }
- return null;
-}
-
-const AppDisplayCommon = {
- _ensureDefaultFolders() {
- // disable creation of default folders if user deleted them
- },
-
- // apps load adapted for custom sorting and including dash items
- _loadApps() {
- let appIcons = [];
- const runningApps = Shell.AppSystem.get_default().get_running().map(a => a.id);
-
- this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
- try {
- appInfo.get_id(); // catch invalid file encodings
- } catch (e) {
- return false;
- }
-
- const appIsRunning = runningApps.includes(appInfo.get_id());
- const appIsFavorite = this._appFavorites.isFavorite(appInfo.get_id());
- const excludeApp = (opt.APP_GRID_EXCLUDE_RUNNING && appIsRunning) || (opt.APP_GRID_EXCLUDE_FAVORITES && appIsFavorite);
-
- return this._parentalControlsManager.shouldShowApp(appInfo) && !excludeApp;
- });
-
- let apps = this._appInfoList.map(app => app.get_id());
-
- let appSys = Shell.AppSystem.get_default();
-
- const appsInsideFolders = new Set();
- this._folderIcons = [];
- if (!opt.APP_GRID_USAGE) {
- let folders = this._folderSettings.get_strv('folder-children');
- folders.forEach(id => {
- let path = `${this._folderSettings.path}folders/${id}/`;
- let icon = this._items.get(id);
- if (!icon) {
- icon = new AppDisplay.FolderIcon(id, path, this);
- icon.connect('apps-changed', () => {
- this._redisplay();
- this._savePages();
- });
- icon.connect('notify::pressed', () => {
- if (icon.pressed)
- this.updateDragFocus(icon);
- });
- } else if (this._updateFolderIcons && opt.APP_GRID_EXCLUDE_RUNNING) {
- // if any app changed its running state, update folder icon
- icon.icon.update();
- }
-
- // remove empty folder icons
- if (!icon.visible) {
- icon.destroy();
- return;
- }
-
- appIcons.push(icon);
- this._folderIcons.push(icon);
-
- icon.getAppIds().forEach(appId => appsInsideFolders.add(appId));
- });
- }
-
- // reset request to update active icon
- this._updateFolderIcons = false;
-
- // Allow dragging of the icon only if the Dash would accept a drop to
- // change favorite-apps. There are no other possible drop targets from
- // the app picker, so there's no other need for a drag to start,
- // at least on single-monitor setups.
- // This also disables drag-to-launch on multi-monitor setups,
- // but we hope that is not used much.
- const isDraggable =
- global.settings.is_writable('favorite-apps') ||
- global.settings.is_writable('app-picker-layout');
-
- apps.forEach(appId => {
- if (!opt.APP_GRID_USAGE && appsInsideFolders.has(appId))
- return;
-
- let icon = this._items.get(appId);
- if (!icon) {
- let app = appSys.lookup_app(appId);
- icon = new AppDisplay.AppIcon(app, { isDraggable });
- icon.connect('notify::pressed', () => {
- if (icon.pressed)
- this.updateDragFocus(icon);
- });
- }
-
- appIcons.push(icon);
- });
-
- // At last, if there's a placeholder available, add it
- if (this._placeholder)
- appIcons.push(this._placeholder);
-
- return appIcons;
- },
-
- // support active preview icons
- _onDragBegin(overview, source) {
- if (source._sourceItem)
- source = source._sourceItem;
-
- this._dragMonitor = {
- dragMotion: this._onDragMotion.bind(this),
- };
- DND.addDragMonitor(this._dragMonitor);
-
- this._appGridLayout.showPageIndicators();
- this._dragFocus = null;
- this._swipeTracker.enabled = false;
-
- // When dragging from a folder dialog, the dragged app icon doesn't
- // exist in AppDisplay. We work around that by adding a placeholder
- // icon that is either destroyed on cancel, or becomes the effective
- // new icon when dropped.
- if (/* AppDisplay.*/_getViewFromIcon(source) instanceof AppDisplay.FolderView ||
- (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(source.id)))
- this._ensurePlaceholder(source);
- },
-
- _ensurePlaceholder(source) {
- if (this._placeholder)
- return;
-
- if (source._sourceItem)
- source = source._sourceItem;
-
- const appSys = Shell.AppSystem.get_default();
- const app = appSys.lookup_app(source.id);
-
- const isDraggable =
- global.settings.is_writable('favorite-apps') ||
- global.settings.is_writable('app-picker-layout');
-
- this._placeholder = new AppDisplay.AppIcon(app, { isDraggable });
- this._placeholder.connect('notify::pressed', () => {
- if (this._placeholder?.pressed)
- this.updateDragFocus(this._placeholder);
- });
- this._placeholder.scaleAndFade();
- this._redisplay();
- },
-
- // accept source from active folder preview
- acceptDrop(source) {
- if (opt.APP_GRID_USAGE)
- return false;
- if (source._sourceItem)
- source = source._sourceItem;
-
- if (!this._acceptDropCommon(source))
- return false;
-
- let view = /* AppDisplay.*/_getViewFromIcon(source);
- if (view instanceof AppDisplay.FolderView)
- view.removeApp(source.app);
-
- if (this._currentDialog)
- this._currentDialog.popdown();
-
- if (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(source.id))
- this._appFavorites.removeFavorite(source.id);
-
- return true;
- },
-};
-
-const BaseAppViewVertical = {
- after__init() {
- this._grid.layoutManager._orientation = Clutter.Orientation.VERTICAL;
- this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL);
- this._orientation = Clutter.Orientation.VERTICAL;
- this._swipeTracker.orientation = Clutter.Orientation.VERTICAL;
- this._swipeTracker._reset();
- this._pageIndicators.vertical = true;
- this._box.vertical = false;
- this._pageIndicators.x_expand = false;
- this._pageIndicators.y_align = Clutter.ActorAlign.CENTER;
- this._pageIndicators.x_align = Clutter.ActorAlign.START;
- this._pageIndicators.set_style('margin-right: 10px;');
- // moving these bars needs more patching of the this's code
- // for now we just change bars style to be more like vertically oriented arrows indicating direction to prev/next page
- this._nextPageIndicator.add_style_class_name('nextPageIndicator');
- this._prevPageIndicator.add_style_class_name('prevPageIndicator');
-
- // setting their x_scale to 0 removes the arrows and avoid allocation issues compared to .hide() them
- this._nextPageArrow.scale_x = 0;
- this._prevPageArrow.scale_x = 0;
-
- this._adjustment = this._scrollView.vscroll.adjustment;
-
- this._adjustment.connect('notify::value', adj => {
- const value = adj.value / adj.page_size;
- this._pageIndicators.setCurrentPosition(value);
- });
- },
-};
-
-const BaseAppViewCommon = {
- _sortOrderedItemsAlphabetically(icons = null) {
- if (!icons)
- icons = this._orderedItems;
- icons.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
- },
-
- _setLinearPositions(icons) {
- const { itemsPerPage } = this._grid;
- icons.forEach((icon, i) => {
- const page = Math.floor(i / itemsPerPage);
- const position = i % itemsPerPage;
- try {
- this._moveItem(icon, page, position);
- } catch (e) {
- console.warn(`Warning:${e}`);
- }
- });
- },
-
- // adds sorting options and option to add favorites and running apps
- _redisplay() {
- if (this._folderIcons) {
- this._folderIcons.forEach(icon => {
- icon.view._redisplay();
- });
- }
- let oldApps = this._orderedItems.slice();
- let oldAppIds = oldApps.map(icon => icon.id);
-
- let newApps = this._loadApps().sort(this._compareItems.bind(this));
- let newAppIds = newApps.map(icon => icon.id);
-
- let addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id));
- let removedApps = oldApps.filter(icon => !newAppIds.includes(icon.id));
-
- // Remove old app icons
- removedApps.forEach(icon => {
- this._removeItem(icon);
- icon.destroy();
- });
-
- // Add new app icons, or move existing ones
- newApps.forEach(icon => {
- const [page, position] = this._getItemPosition(icon);
- if (addedApps.includes(icon)) {
- this._addItem(icon, page, position);
- } else if (page !== -1 && position !== -1) {
- this._moveItem(icon, page, position);
- } else {
- // App is part of a folder
- }
- });
-
- // different options for root app grid and app folders
- const thisIsFolder = this instanceof AppDisplay.FolderView;
- const thisIsAppDisplay = !thisIsFolder;
- if ((opt.APP_GRID_ORDER && thisIsAppDisplay) ||
- (opt.APP_FOLDER_ORDER && thisIsFolder)) {
- // const { itemsPerPage } = this._grid;
- let appIcons = this._orderedItems;
- // sort all alphabetically
- this._sortOrderedItemsAlphabetically(appIcons);
- // appIcons.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
- // then sort used apps by usage
- if ((opt.APP_GRID_USAGE && thisIsAppDisplay) ||
- (opt.APP_FOLDER_USAGE && thisIsFolder))
- appIcons.sort((a, b) => Shell.AppUsage.get_default().compare(a.app.id, b.app.id));
-
- // sort favorites first
- if (opt.APP_GRID_DASH_FIRST) {
- const fav = Object.keys(this._appFavorites._favorites);
- appIcons.sort((a, b) => {
- let aFav = fav.indexOf(a.id);
- if (aFav < 0)
- aFav = 999;
- let bFav = fav.indexOf(b.id);
- if (bFav < 0)
- bFav = 999;
- return bFav < aFav;
- });
- }
-
- // sort running first
- if (opt.APP_GRID_DASH_FIRST && thisIsAppDisplay)
- appIcons.sort((a, b) => a.app.get_state() !== Shell.AppState.RUNNING && b.app.get_state() === Shell.AppState.RUNNING);
-
- if (opt.APP_GRID_FOLDERS_FIRST)
- appIcons.sort((a, b) => b._folder && !a._folder);
- else if (opt.APP_GRID_FOLDERS_LAST)
- appIcons.sort((a, b) => a._folder && !b._folder);
-
- this._setLinearPositions(appIcons);
-
- this._orderedItems = appIcons;
- }
-
- this.emit('view-loaded');
- if (!opt.APP_GRID_ALLOW_INCOMPLETE_PAGES) {
- for (let i = 0; i < this._grid.nPages; i++)
- this._grid.layoutManager._fillItemVacancies(i);
- }
- },
-
- _canAccept(source) {
- return source instanceof AppDisplay.AppViewItem;
- },
-
- // this method is replacing BaseAppVew.acceptDrop which can't be overridden directly
- _acceptDropCommon(source) {
- const dropTarget = this._dropTarget;
- delete this._dropTarget;
-
- if (!this._canAccept(source))
- return false;
-
- if (dropTarget === this._prevPageIndicator ||
- dropTarget === this._nextPageIndicator) {
- let increment;
-
- increment = dropTarget === this._prevPageIndicator ? -1 : 1;
-
- const { currentPage, nPages } = this._grid;
- const page = Math.min(currentPage + increment, nPages);
- const position = page < nPages ? -1 : 0;
-
- this._moveItem(source, page, position);
- this.goToPage(page);
- } else if (this._delayedMoveData) {
- // Dropped before the icon was moved
- const { page, position } = this._delayedMoveData;
-
- try {
- this._moveItem(source, page, position);
- } catch (e) {
- console.warn(`Warning:${e}`);
- }
- this._removeDelayedMove();
- }
-
- return true;
- },
-
- // support active preview icons
- _onDragMotion(dragEvent) {
- if (!(dragEvent.source instanceof AppDisplay.AppViewItem))
- return DND.DragMotionResult.CONTINUE;
-
- if (dragEvent.source._sourceItem)
- dragEvent.source = dragEvent.source._sourceItem;
-
- const appIcon = dragEvent.source;
-
- if (appIcon instanceof AppDisplay.AppViewItem) {
- if (!this._dragMaybeSwitchPageImmediately(dragEvent)) {
- // Two ways of switching pages during DND:
- // 1) When "bumping" the cursor against the monitor edge, we switch
- // page immediately.
- // 2) When hovering over the next-page indicator for a certain time,
- // we also switch page.
-
- const { targetActor } = dragEvent;
-
- if (targetActor === this._prevPageIndicator ||
- targetActor === this._nextPageIndicator)
- this._maybeSetupDragPageSwitchInitialTimeout(dragEvent);
- else
- this._resetDragPageSwitch();
- }
- }
-
- const thisIsFolder = this instanceof AppDisplay.FolderView;
- const thisIsAppDisplay = !thisIsFolder;
- if ((!opt.APP_GRID_ORDER && thisIsAppDisplay) || (!opt.APP_FOLDER_ORDER && thisIsFolder))
- this._maybeMoveItem(dragEvent);
-
- return DND.DragMotionResult.CONTINUE;
- },
-};
-
-const BaseAppViewGridLayout = {
- _getIndicatorsWidth(box) {
- const [width, height] = box.get_size();
- const arrows = [
- this._nextPageArrow,
- this._previousPageArrow,
- ];
-
- const minArrowsWidth = arrows.reduce(
- (previousWidth, accessory) => {
- const [min] = accessory.get_preferred_width(height);
- return Math.max(previousWidth, min);
- }, 0);
-
- const idealIndicatorWidth = (width * 0.1/* PAGE_PREVIEW_RATIO*/) / 2;
-
- return Math.max(idealIndicatorWidth, minArrowsWidth);
- },
-};
-
-const FolderIcon = {
- after__init() {
- /* // If folder preview icons are clickable,
- // disable opening the folder with primary mouse button and enable the secondary one
- const buttonMask = opt.APP_GRID_ACTIVE_PREVIEW
- ? St.ButtonMask.TWO | St.ButtonMask.THREE
- : St.ButtonMask.ONE | St.ButtonMask.TWO;
- this.button_mask = buttonMask;*/
- this.button_mask = St.ButtonMask.ONE | St.ButtonMask.TWO;
- },
-
- open() {
- this._ensureFolderDialog();
- // always open folder with the first page
- this.view._scrollView.vscroll.adjustment.value = 0;
- this._dialog.popup();
- },
-};
-
-const ActiveFolderIcon = {
- handleDragOver() {
- return DND.DragMotionResult.CONTINUE;
- },
-
- acceptDrop() {
- return false;
- },
-
- _onDragEnd() {
- this._dragging = false;
- this.undoScaleAndFade();
- Main.overview.endItemDrag(this._sourceItem.icon);
- },
-};
-
-const FolderView = {
- _createGrid() {
- let grid = new FolderGrid();
- return grid;
- },
-
- createFolderIcon(size) {
- const layout = new Clutter.GridLayout({
- row_homogeneous: true,
- column_homogeneous: true,
- });
-
- let icon = new St.Widget({
- layout_manager: layout,
- x_align: Clutter.ActorAlign.CENTER,
- style: `width: ${size}px; height: ${size}px;`,
- });
-
- const numItems = this._orderedItems.length;
- // decide what number of icons switch to 3x3 grid
- // APP_GRID_FOLDER_ICON_GRID: 3 -> more than 4
- // : 4 -> more than 8
- const threshold = opt.APP_GRID_FOLDER_ICON_GRID % 3 ? 8 : 4;
- const gridSize = opt.APP_GRID_FOLDER_ICON_GRID > 2 && numItems > threshold ? 3 : 2;
- const FOLDER_SUBICON_FRACTION = gridSize === 2 ? 0.4 : 0.27;
-
- let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
- let rtl = icon.get_text_direction() === Clutter.TextDirection.RTL;
- for (let i = 0; i < gridSize * gridSize; i++) {
- const style = `width: ${subSize}px; height: ${subSize}px;`;
- let bin = new St.Bin({ style, reactive: true });
- bin.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 });
- if (i < numItems) {
- if (!opt.APP_GRID_ACTIVE_PREVIEW) {
- bin.child = this._orderedItems[i].app.create_icon_texture(subSize);
- } else {
- const app = this._orderedItems[i].app;
- const child = new AppDisplay.AppIcon(app, {
- setSizeManually: true,
- showLabel: false,
- });
-
- child._sourceItem = this._orderedItems[i];
- child._sourceFolder = this;
- child.icon.style_class = '';
- child.icon.set_style('margin: 0; padding: 0;');
- child._dot.set_style('margin-bottom: 1px;');
- child.icon.setIconSize(subSize);
-
- bin.child = child;
-
- bin.connect('enter-event', () => {
- bin.ease({
- duration: 100,
- scale_x: 1.14,
- scale_y: 1.14,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
- });
- bin.connect('leave-event', () => {
- bin.ease({
- duration: 100,
- scale_x: 1,
- scale_y: 1,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
- });
- }
- }
-
- layout.attach(bin, rtl ? (i + 1) % gridSize : i % gridSize, Math.floor(i / gridSize), 1, 1);
- }
-
- // if folder content changed, update folder size, but not if it's empty
- if (this._dialog && this._dialog._designCapacity !== this._orderedItems.length && this._orderedItems.length)
- this._dialog._updateFolderSize();
-
- return icon;
- },
-
- _loadApps() {
- this._apps = [];
- const excludedApps = this._folder.get_strv('excluded-apps');
- const appSys = Shell.AppSystem.get_default();
- const addAppId = appId => {
- if (excludedApps.includes(appId))
- return;
-
- if (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(appId))
- return;
-
- const app = appSys.lookup_app(appId);
- if (!app)
- return;
-
- if (opt.APP_GRID_EXCLUDE_RUNNING) {
- const runningApps = Shell.AppSystem.get_default().get_running().map(a => a.id);
- if (runningApps.includes(appId))
- return;
- }
-
- if (!this._parentalControlsManager.shouldShowApp(app.get_app_info()))
- return;
-
- if (this._apps.indexOf(app) !== -1)
- return;
-
- this._apps.push(app);
- };
-
- const folderApps = this._folder.get_strv('apps');
- folderApps.forEach(addAppId);
-
- const folderCategories = this._folder.get_strv('categories');
- const appInfos = this._parentView.getAppInfos();
- appInfos.forEach(appInfo => {
- let appCategories = /* AppDisplay.*/_getCategories(appInfo);
- if (!_listsIntersect(folderCategories, appCategories))
- return;
-
- addAppId(appInfo.get_id());
- });
-
- let items = [];
- this._apps.forEach(app => {
- let icon = this._items.get(app.get_id());
- if (!icon)
- icon = new AppDisplay.AppIcon(app);
-
- items.push(icon);
- });
-
- if (opt.APP_FOLDER_ORDER)
- Main.overview._overview.controls._appDisplay._sortOrderedItemsAlphabetically(items);
-
- if (opt.APP_FOLDER_USAGE)
- items.sort((a, b) => Shell.AppUsage.get_default().compare(a.app.id, b.app.id));
-
- this._appIds = this._apps.map(app => app.get_id());
- return items;
- },
-
- // 42 only - don't apply appGrid scale on folders
- adaptToSize(width, height) {
- if (!opt.ORIENTATION) {
- const [, indicatorHeight] = this._pageIndicators.get_preferred_height(-1);
- height -= indicatorHeight;
- }
- BaseAppViewCommon.adaptToSize.bind(this)(width, height, true);
- },
-
- acceptDrop(source) {
- /* if (!BaseAppViewCommon.acceptDrop.bind(this)(source))
- return false;*/
- if (opt.APP_FOLDER_ORDER)
- return false;
- if (source._sourceItem)
- source = source._sourceItem;
-
- if (!this._acceptDropCommon(source))
- return false;
-
- const folderApps = this._orderedItems.map(item => item.id);
- this._folder.set_strv('apps', folderApps);
-
- return true;
- },
-};
-
-const FolderGrid = GObject.registerClass(
-class FolderGrid extends AppDisplay.AppGrid {
- _init() {
- super._init({
- allow_incomplete_pages: false,
- columns_per_page: opt.APP_GRID_FOLDER_COLUMNS ? opt.APP_GRID_FOLDER_COLUMNS : 20,
- rows_per_page: opt.APP_GRID_FOLDER_ROWS ? opt.APP_GRID_FOLDER_ROWS : 20,
- page_halign: Clutter.ActorAlign.CENTER,
- page_valign: Clutter.ActorAlign.CENTER,
- });
- this.layout_manager._isFolder = true;
- const spacing = opt.APP_GRID_SPACING;
- this.set_style(`column-spacing: ${spacing}px; row-spacing: ${spacing}px;`);
- this.layoutManager.fixedIconSize = opt.APP_GRID_FOLDER_ICON_SIZE;
-
- this.setGridModes([
- {
- columns: opt.APP_GRID_FOLDER_COLUMNS ? opt.APP_GRID_FOLDER_COLUMNS : 3,
- rows: opt.APP_GRID_FOLDER_ROWS ? opt.APP_GRID_FOLDER_ROWS : 3,
- },
- ]);
- }
-
- adaptToSize(width, height) {
- this.layout_manager.adaptToSize(width, height);
- }
-});
-
-
-const FOLDER_DIALOG_ANIMATION_TIME = 200; // AppDisplay.FOLDER_DIALOG_ANIMATION_TIME
-const AppFolderDialog = {
- // injection to _init()
- after__init() {
- this._viewBox.add_style_class_name('app-folder-dialog-vshell');
-
- // delegate this dialog to the FolderIcon._view
- // so its _createFolderIcon function can update the dialog if folder content changed
- this._view._dialog = this;
-
- // right click into the folder popup should close it
- this.child.reactive = true;
- const clickAction = new Clutter.ClickAction();
- clickAction.connect('clicked', act => {
- if (act.get_button() === Clutter.BUTTON_PRIMARY)
- return Clutter.EVENT_STOP;
- const [x, y] = clickAction.get_coords();
- const actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
- // if it's not entry for editing folder title
- if (actor !== this._entry)
- this.popdown();
- return Clutter.EVENT_STOP;
- });
-
- this.child.add_action(clickAction);
- },
-
- after__addFolderNameEntry() {
- // Edit button
- this._removeButton = new St.Button({
- style_class: 'edit-folder-button',
- button_mask: St.ButtonMask.ONE,
- toggle_mode: false,
- reactive: true,
- can_focus: true,
- x_align: Clutter.ActorAlign.END,
- y_align: Clutter.ActorAlign.CENTER,
- child: new St.Icon({
- icon_name: 'user-trash-symbolic',
- icon_size: 16,
- }),
- });
-
- this._removeButton.connect('clicked', () => {
- if (Date.now() - this._removeButton._lastClick < Clutter.Settings.get_default().double_click_time) {
- this._grabHelper.ungrab({ actor: this });
- // without hiding the dialog, Shell crashes (at least on X11)
- this.hide();
- this._view._deletingFolder = true;
-
- // Resetting all keys deletes the relocatable schema
- let keys = this._folder.settings_schema.list_keys();
- for (const key of keys)
- this._folder.reset(key);
-
- let settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
- let folders = settings.get_strv('folder-children');
- folders.splice(folders.indexOf(this._view._id), 1);
-
- // remove all abandoned folders (usually my own garbage and unwanted default folders...)
- /* const appFolders = this._appDisplay._folderIcons.map(icon => icon._id);
- folders.forEach(folder => {
- if (!appFolders.includes(folder)) {
- folders.splice(folders.indexOf(folder._id), 1);
- }
- });*/
- settings.set_strv('folder-children', folders);
-
- this._view._deletingFolder = false;
- return;
- }
- this._removeButton._lastClick = Date.now();
- });
-
- this._entryBox.add_child(this._removeButton);
-
- // Adjust empty actor to center the title
- this._entryBox.get_first_child().width = 82;
- },
-
- popup() {
- if (this._isOpen)
- return;
-
- this._isOpen = this._grabHelper.grab({
- actor: this,
- onUngrab: () => this.popdown(),
- });
-
- if (!this._isOpen)
- return;
-
- this.get_parent().set_child_above_sibling(this, null);
-
- this._needsZoomAndFade = true;
-
- // the first folder dialog realization needs size correction
- // so set the folder size, let it realize and then update the folder content
- if (!this.realized) {
- this._updateFolderSize();
- GLib.idle_add(
- GLib.PRIORITY_DEFAULT,
- () => {
- this._updateFolderSize();
- }
- );
- }
-
- this.show();
- this.emit('open-state-changed', true);
- },
-
- _updateFolderSize() {
- const view = this._view;
- const [firstItem] = view._grid.layoutManager._container;
- if (!firstItem)
- return;
- // adapt folder size according to the settings and number of icons
- const appDisplay = this._source._parentView;
- if (!appDisplay.width || appDisplay.allocation.x2 === Infinity || appDisplay.allocation.x2 === -Infinity) {
- return;
- }
-
- const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
- const itemPadding = 55; // default icon item padding on Fedora 44
- // const dialogMargin = 30;
- const nItems = view._orderedItems.length;
- let columns = opt.APP_GRID_FOLDER_COLUMNS;
- let rows = opt.APP_GRID_FOLDER_ROWS;
- const fullAdaptiveGrid = !columns && !rows;
- let spacing = opt.APP_GRID_SPACING;
- const minItemSize = 48 + itemPadding;
-
- if (fullAdaptiveGrid) {
- columns = Math.ceil(Math.sqrt(nItems));
- rows = columns;
- if (columns * (columns - 1) >= nItems) {
- rows = columns - 1;
- } else if ((columns + 1) * (columns - 1) >= nItems) {
- rows = columns - 1;
- columns += 1;
- }
- } else if (!columns && rows) {
- columns = Math.ceil(nItems / rows);
- } else if (columns && !rows) {
- rows = Math.ceil(nItems / columns);
- }
-
- const iconSize = opt.APP_GRID_FOLDER_ICON_SIZE < 0 ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT : opt.APP_GRID_FOLDER_ICON_SIZE;
- view._grid.layoutManager.fixedIconSize = iconSize;
- view._grid.set_style(`column-spacing: ${opt.APP_GRID_SPACING}px; row-spacing: ${opt.APP_GRID_SPACING}px;`);
- view._grid.layoutManager._pageWidth += 1;
- view._grid.layoutManager.adaptToSize(view._grid.layoutManager._pageWidth - 1, view._grid.layoutManager._pageHeight);
-
- let itemSize = iconSize + 55; // icon padding
- // first run sets the grid before we can read the real icon size
- // so we estimate the size from default properties
- // and correct it in the second run
- if (this.realized) {
- firstItem.icon.setIconSize(iconSize);
- const [firstItemWidth] = firstItem.get_preferred_size();
- const realSize = firstItemWidth / scaleFactor;
- // if the preferred item size is smaller than icon plus some padding, ignore it
- // (icons that are not yet realized are returning sizes like 45 or 53)
- if (realSize > (iconSize + 24))
- itemSize = realSize;
- }
-
- let width = columns * (itemSize + spacing) + /* padding for nav arrows*/64;
- width = Math.round(width + (opt.ORIENTATION ? 100 : 160/* space for navigation arrows*/));
- let height = rows * (itemSize + spacing) + /* header*/75 + /* padding*/ 2 * 30 + /* padding + ?page indicator*/(!opt.ORIENTATION || !opt.APP_GRID_FOLDER_COLUMNS ? 100 : 70);
-
- // allocation is more reliable than appDisplay width/height properties
- const appDisplayWidth = appDisplay.allocation.x2 - appDisplay.allocation.x1;
- const appDisplayHeight = appDisplay.allocation.y2 - appDisplay.allocation.y1 + (opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0);
-
- // folder must fit the appDisplay area
- // reduce columns/rows if needed and count with the scaled values
- if (!opt.APP_GRID_FOLDER_ROWS) {
- while ((height * scaleFactor) > appDisplayHeight) {
- height -= itemSize + spacing;
- rows -= 1;
- }
- }
-
- if (!opt.APP_GRID_FOLDER_COLUMNS) {
- while ((width * scaleFactor) > appDisplayWidth) {
- width -= itemSize + spacing;
- columns -= 1;
- }
- }
- // try to compensate for the previous reduction if there is a space
- if (!opt.APP_GRID_FOLDER_COLUMNS) {
- while ((nItems > columns * rows) && ((width * scaleFactor + itemSize + spacing) <= appDisplayWidth)) {
- width += itemSize + spacing;
- columns += 1;
- }
- // remove columns that cannot be displayed
- if ((columns * minItemSize + (columns - 1) * spacing) > appDisplayWidth)
- columns = Math.floor(appDisplayWidth / (minItemSize + spacing));
- }
- if (!opt.APP_GRID_FOLDER_ROWS) {
- while ((nItems > columns * rows) && ((height * scaleFactor + itemSize + spacing) <= appDisplayHeight)) {
- height += itemSize + spacing;
- rows += 1;
- }
- // remove rows that cannot be displayed
- if ((rows * minItemSize + (rows - 1) * spacing) > appDisplayHeight)
- rows = Math.floor(appDisplayWidth / (minItemSize + spacing));
- }
-
- width = Math.clamp(width, 640, appDisplayWidth);
- height = Math.min(height, appDisplayHeight);
-
- const layoutManager = view._grid.layoutManager;
- layoutManager.rows_per_page = rows;
- layoutManager.columns_per_page = columns;
-
- // this line is required by GS 43
- // view._grid.setGridModes([{ columns, rows }]);
-
- this.child.set_style(`
- width: ${width}px;
- height: ${height}px;
- padding: 30px;
- `);
-
- view._redisplay();
- // store original item count
- this._designCapacity = nItems;
- },
-
- _zoomAndFadeIn() {
- let [sourceX, sourceY] =
- this._source.get_transformed_position();
- let [dialogX, dialogY] =
- this.child.get_transformed_position();
-
- const sourceCenterX = sourceX + this._source.width / 2;
- const sourceCenterY = sourceY + this._source.height / 2;
-
- // this. covers the whole screen
- let dialogTargetX = dialogX;
- let dialogTargetY = dialogY;
-
- const appDisplay = this._source._parentView;
-
- const [appDisplayX, appDisplayY] = this._source._parentView.get_transformed_position();
- if (!opt.APP_GRID_FOLDER_CENTER) {
- dialogTargetX = sourceCenterX - this.child.width / 2;
- dialogTargetY = sourceCenterY - this.child.height / 2;
-
- // keep the dialog in appDisplay area if possible
- dialogTargetX = Math.clamp(
- dialogTargetX,
- appDisplayX,
- appDisplayX + appDisplay.width - this.child.width
- );
-
- dialogTargetY = Math.clamp(
- dialogTargetY,
- appDisplayY,
- appDisplayY + appDisplay.height - this.child.height
- );
- } else {
- const searchEntryHeight = opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0;
- dialogTargetX = appDisplayX + appDisplay.width / 2 - this.child.width / 2;
- dialogTargetY = appDisplayY - searchEntryHeight + ((appDisplay.height + searchEntryHeight) / 2 - this.child.height / 2) / 2;
- }
-
- const dialogOffsetX = Math.round(dialogTargetX - dialogX);
- const dialogOffsetY = Math.round(dialogTargetY - dialogY);
-
- this.child.set({
- translation_x: sourceX - dialogX,
- translation_y: sourceY - dialogY,
- scale_x: this._source.width / this.child.width,
- scale_y: this._source.height / this.child.height,
- opacity: 0,
- });
-
- this.child.ease({
- translation_x: dialogOffsetX,
- translation_y: dialogOffsetY,
- scale_x: 1,
- scale_y: 1,
- opacity: 255,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
-
- appDisplay.ease({
- opacity: 0,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
-
- if (opt.SHOW_SEARCH_ENTRY) {
- Main.overview.searchEntry.ease({
- opacity: 0,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
- }
-
- this._needsZoomAndFade = false;
-
- if (this._sourceMappedId === 0) {
- this._sourceMappedId = this._source.connect(
- 'notify::mapped', this._zoomAndFadeOut.bind(this));
- }
- },
-
- _zoomAndFadeOut() {
- if (!this._isOpen)
- return;
-
- if (!this._source.mapped) {
- this.hide();
- return;
- }
-
- // if the dialog was shown silently, skip animation
- if (this.scale_y < 1) {
- this._needsZoomAndFade = false;
- this.hide();
- this._popdownCallbacks.forEach(func => func());
- this._popdownCallbacks = [];
- return;
- }
-
- let [sourceX, sourceY] =
- this._source.get_transformed_position();
- let [dialogX, dialogY] =
- this.child.get_transformed_position();
-
- this.child.ease({
- translation_x: sourceX - dialogX + this.child.translation_x,
- translation_y: sourceY - dialogY + this.child.translation_y,
- scale_x: this._source.width / this.child.width,
- scale_y: this._source.height / this.child.height,
- opacity: 0,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- onComplete: () => {
- this.child.set({
- translation_x: 0,
- translation_y: 0,
- scale_x: 1,
- scale_y: 1,
- opacity: 255,
- });
- this.hide();
-
- this._popdownCallbacks.forEach(func => func());
- this._popdownCallbacks = [];
- },
- });
-
- const appDisplay = this._source._parentView;
- appDisplay.ease({
- opacity: 255,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
-
- if (opt.SHOW_SEARCH_ENTRY) {
- Main.overview.searchEntry.ease({
- opacity: 255,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
- }
-
- this._needsZoomAndFade = false;
- },
-
- _setLighterBackground(lighter) {
- if (this._isOpen)
- Main.overview._overview._controls._appDisplay.opacity = lighter ? 20 : 0;
- /* const backgroundColor = lighter
- ? this.DIALOG_SHADE_HIGHLIGHT
- : this.DIALOG_SHADE_NORMAL;
-
- this.ease({
- backgroundColor,
- duration: FOLDER_DIALOG_ANIMATION_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- }); */
- },
-};
-
-const AppIcon = {
- after__init() {
- // update the app label behavior
- this._updateMultiline();
- },
-
- // avoid accepting by placeholder when dragging active preview
- // and also by icon if alphabet or usage sorting are used
- _canAccept(source) {
- if (source._sourceItem)
- source = source._sourceItem;
- let view = /* AppDisplay.*/_getViewFromIcon(source);
-
- return source !== this &&
- (source instanceof this.constructor) &&
- (view instanceof AppDisplay.AppDisplay &&
- !opt.APP_GRID_USAGE);
- },
-};
-
-const AppViewItemCommon = {
- _updateMultiline() {
- const { label } = this.icon;
- if (label)
- label.opacity = 255;
- if (!this._expandTitleOnHover || !this.icon.label)
- return;
-
- const { clutterText } = label;
-
- const isHighlighted = this.has_key_focus() || this.hover || this._forcedHighlight;
-
- if (opt.APP_GRID_NAMES_MODE === 2 && this._expandTitleOnHover) { // !_expandTitleOnHover indicates search result icon
- label.opacity = isHighlighted || !this.app ? 255 : 0;
- }
- if (isHighlighted)
- this.get_parent()?.set_child_above_sibling(this, null);
-
- if (!opt.APP_GRID_NAMES_MODE) {
- const layout = clutterText.get_layout();
- if (!layout.is_wrapped() && !layout.is_ellipsized())
- return;
- }
-
- label.remove_transition('allocation');
-
- const id = label.connect('notify::allocation', () => {
- label.restore_easing_state();
- label.disconnect(id);
- });
-
- const expand = opt.APP_GRID_NAMES_MODE === 1 || this._forcedHighlight || this.hover || this.has_key_focus();
-
- label.save_easing_state();
- label.set_easing_duration(expand
- ? APP_ICON_TITLE_EXPAND_TIME
- : APP_ICON_TITLE_COLLAPSE_TIME);
- clutterText.set({
- line_wrap: expand,
- line_wrap_mode: expand ? Pango.WrapMode.WORD_CHAR : Pango.WrapMode.NONE,
- ellipsize: expand ? Pango.EllipsizeMode.NONE : Pango.EllipsizeMode.END,
- });
- },
-
- // support active preview icons
- acceptDrop(source, _actor, x) {
- if (opt.APP_GRID_USAGE)
- return DND.DragMotionResult.NO_DROP;
-
- this._setHoveringByDnd(false);
-
- if (!this._canAccept(source))
- return false;
-
- if (this._withinLeeways(x))
- return false;
-
- // added - remove app from the source folder after dnd to other folder
- if (source._sourceItem) {
- const app = source._sourceItem.app;
- source._sourceFolder.removeApp(app);
- }
-
- return true;
- },
-
-};
diff --git a/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js b/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js
deleted file mode 100644
index 30d9960..0000000
--- a/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js
+++ /dev/null
@@ -1,406 +0,0 @@
-/**
-* V-Shell (Vertical Workspaces)
- * extensionsSearchProvider.js
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
- * @license GPL-3.0
- */
-
-'use strict';
-
-import GLib from 'gi://GLib';
-import St from 'gi://St';
-import Gio from 'gi://Gio';
-import Shell from 'gi://Shell';
-import GObject from 'gi://GObject';
-import Clutter from 'gi://Clutter';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-
-const ExtensionState = {
- 1: 'ENABLED',
- 2: 'DISABLED',
- 3: 'ERROR',
- 4: 'INCOMPATIBLE',
- 5: 'DOWNLOADING',
- 6: 'INITIALIZED',
- 7: 'DISABLING',
- 8: 'ENABLING',
-};
-
-let Me;
-let opt;
-// gettext
-let _;
-let _toggleTimeout;
-
-// prefix helps to eliminate results from other search providers
-// so it needs to be something less common
-// needs to be accessible from vw module
-export const PREFIX = 'eq//';
-
-export class ExtensionsSearchProviderModule {
- // export for other modules
- static _PREFIX = PREFIX;
- constructor(me) {
- Me = me;
- opt = Me.opt;
- _ = Me.gettext;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
- this._extensionsSearchProvider = null;
- this._enableTimeoutId = 0;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- _ = null;
- }
-
- update(reset) {
- if (_toggleTimeout)
- GLib.source_remove(_toggleTimeout);
-
- this.moduleEnabled = opt.get('extensionsSearchProviderModule');
-
- reset = reset || !this.moduleEnabled;
-
- if (reset && !this._firstActivation) {
- this._disableModule();
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation)
- console.debug(' ExtensionsSearchProviderModule - Keeping untouched');
- }
-
- _activateModule() {
- // delay because Fedora had problem to register a new provider soon after Shell restarts
- this._enableTimeoutId = GLib.timeout_add(
- GLib.PRIORITY_DEFAULT,
- 2000,
- () => {
- if (!this._extensionsSearchProvider) {
- this._extensionsSearchProvider = new extensionsSearchProvider(opt);
- this._getOverviewSearchResult()._registerProvider(this._extensionsSearchProvider);
- }
- this._enableTimeoutId = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- console.debug(' ExtensionsSearchProviderModule - Activated');
- }
-
- _disableModule() {
- if (this._enableTimeoutId) {
- GLib.source_remove(this._enableTimeoutId);
- this._enableTimeoutId = 0;
- }
-
- if (this._extensionsSearchProvider) {
- this._getOverviewSearchResult()._unregisterProvider(this._extensionsSearchProvider);
- this._extensionsSearchProvider = null;
- }
-
-
- console.debug(' ExtensionsSearchProviderModule - Disabled');
- }
-
- _getOverviewSearchResult() {
- return Main.overview._overview.controls._searchController._searchResults;
- }
-}
-
-class extensionsSearchProvider {
- constructor() {
- this.id = 'extensions';
- const appSystem = Shell.AppSystem.get_default();
- let appInfo = appSystem.lookup_app('com.matjakeman.ExtensionManager.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = appSystem.lookup_app('org.gnome.Extensions.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = Gio.AppInfo.create_from_commandline('/usr/bin/gnome-extensions-app', 'Extensions', null);
- appInfo.get_description = () => _('Search extensions');
- appInfo.get_name = () => _('Extensions');
- appInfo.get_id = () => 'org.gnome.Extensions.desktop';
- appInfo.get_icon = () => Gio.icon_new_for_string('application-x-addon');
- appInfo.should_show = () => true;
-
- this.appInfo = appInfo;
- this.canLaunchSearch = true;
- this.isRemoteProvider = false;
- }
-
- getInitialResultSet(terms/* , callback*/) {
- const extensions = {};
- Main.extensionManager._extensions.forEach(
- e => {
- extensions[e.uuid] = e;
- }
- );
- this.extensions = extensions;
-
- return new Promise(resolve => resolve(this._getResultSet(terms)));
- }
-
- _getResultSet(terms) {
- // do not modify original terms
- let termsCopy = [...terms];
- // search for terms without prefix
- termsCopy[0] = termsCopy[0].replace(PREFIX, '');
-
- const candidates = this.extensions;
- const _terms = [].concat(termsCopy);
-
- const term = _terms.join(' ');
-
- const results = [];
- let m;
- for (let id in candidates) {
- const extension = this.extensions[id];
- const text = extension.metadata.name + (extension.state === 1 ? 'enabled' : '') + ([6, 2].includes(extension.state) ? 'disabled' : '');
- if (opt.SEARCH_FUZZY)
- m = Me.Util.fuzzyMatch(term, text);
- else
- m = Me.Util.strictMatch(term, text);
-
- if (m !== -1)
- results.push({ weight: m, id });
- }
-
- // sort alphabetically
- results.sort((a, b) => this.extensions[a.id].metadata.name.localeCompare(this.extensions[b.id].metadata.name));
- // enabled first
- // results.sort((a, b) => this.extensions[a.id].state !== 1 && this.extensions[b.id].state === 1);
- // incompatible last
- results.sort((a, b) => this.extensions[a.id].state === 4 && this.extensions[b.id].state !== 4);
-
- const resultIds = results.map(item => item.id);
- return resultIds;
- }
-
- getResultMetas(resultIds/* , callback = null*/) {
- const metas = resultIds.map(id => this.getResultMeta(id));
- return new Promise(resolve => resolve(metas));
- }
-
- getResultMeta(resultId) {
- const result = this.extensions[resultId];
-
- const versionName = result.metadata['version-name'] ?? '';
- let version = result.metadata['version'] ?? '';
- version = versionName && version ? `/${version}` : version;
- const versionStr = `${versionName}${version}`;
-
- return {
- 'id': resultId,
- 'name': `${result.metadata.name}`,
- 'version': versionStr,
- 'description': versionStr, // description will be updated in result object
- 'createIcon': size => {
- let icon = this.getIcon(result, size);
- return icon;
- },
- };
- }
-
- getIcon(extension, size) {
- let opacity = 0;
- let iconName = 'process-stop-symbolic';
-
- switch (extension.state) {
- case 1:
- if (extension.hasUpdate)
- iconName = 'software-update-available'; // 'software-update-available-symbolic';
- else
- iconName = 'object-select-symbolic';// 'object-select-symbolic';
-
- opacity = 255;
- break;
- case 3:
- if (Main.extensionManager._enabledExtensions.includes(extension.uuid))
- iconName = 'emblem-ok-symbolic';
- else
- iconName = 'dialog-error';
- opacity = 100;
- break;
- case 4:
- iconName = 'software-update-urgent'; // 'software-update-urgent-symbolic';
- opacity = 100;
- break;
- }
-
- if (extension.hasUpdate) {
- iconName = 'software-update-available'; // 'software-update-available-symbolic';
- opacity = 100;
- }
-
- const icon = new St.Icon({ icon_name: iconName, icon_size: size });
- icon.set({
- opacity,
- });
-
- return icon;
- }
-
- createResultObject(meta) {
- return new ListSearchResult(this, meta, this.extensions[meta.id]);
- }
-
- launchSearch(terms, timeStamp) {
- this.appInfo.launch([], global.create_app_launch_context(timeStamp, -1), null);
- }
-
- activateResult(resultId/* terms, timeStamp*/) {
- const extension = this.extensions[resultId];
- if (Me.Util.isShiftPressed())
- this._toggleExtension(extension);
- else if (extension.hasPrefs)
- Me.Util.openPreferences(extension.metadata);
- }
-
- filterResults(results /* , maxResults*/) {
- // return results.slice(0, maxResults);
- return results;
- }
-
- getSubsearchResultSet(previousResults, terms/* , callback*/) {
- return this.getInitialResultSet(terms);
- }
-
- getSubsearchResultSet42(terms, callback) {
- callback(this._getResultSet(terms));
- }
-}
-
-const ListSearchResult = GObject.registerClass(
-class ListSearchResult extends St.Button {
- _init(provider, metaInfo, extension) {
- this.provider = provider;
- this.metaInfo = metaInfo;
- this.extension = extension;
-
- super._init({
- reactive: true,
- can_focus: true,
- track_hover: true,
- });
-
- this.style_class = 'list-search-result';
-
- let content = new St.BoxLayout({
- style_class: 'list-search-result-content',
- vertical: false,
- x_align: Clutter.ActorAlign.START,
- x_expand: true,
- y_expand: true,
- });
- this.set_child(content);
-
- let titleBox = new St.BoxLayout({
- style_class: 'list-search-result-title',
- y_align: Clutter.ActorAlign.CENTER,
- });
-
- content.add_child(titleBox);
-
- // An icon for, or thumbnail of, content
- let icon = this.metaInfo['createIcon'](this.ICON_SIZE);
- let iconBox = new St.Button();
- iconBox.set_child(icon);
- titleBox.add(iconBox);
- iconBox.set_style('border: 1px solid rgba(200,200,200,0.2); padding: 2px; border-radius: 8px;');
- this._iconBox = iconBox;
- this.icon = icon;
-
- iconBox.connect('clicked', () => {
- this._toggleExtension();
- return Clutter.EVENT_STOP;
- });
-
- let title = new St.Label({
- text: this.metaInfo['name'],
- y_align: Clutter.ActorAlign.CENTER,
- opacity: extension.hasPrefs ? 255 : 150,
- });
- titleBox.add_child(title);
-
- this.label_actor = title;
-
- this._descriptionLabel = new St.Label({
- style_class: 'list-search-result-description',
- y_align: Clutter.ActorAlign.CENTER,
- });
- content.add_child(this._descriptionLabel);
-
- this._highlightTerms();
-
- this.connect('destroy', () => {
- if (_toggleTimeout) {
- GLib.source_remove(_toggleTimeout);
- _toggleTimeout = 0;
- }
- });
- }
-
- _toggleExtension() {
- const state = this.extension.state;
- if (![1, 2, 6, 3].includes(state) || this.extension.metadata.name.includes('vertical-workspaces'))
- return;
-
- if ([2, 6].includes(state))
- Main.extensionManager.enableExtension(this.extension.uuid);
- else if ([1, 3].includes(state))
- Main.extensionManager.disableExtension(this.extension.uuid);
-
- if (_toggleTimeout)
- GLib.source_remove(_toggleTimeout);
-
- _toggleTimeout = GLib.timeout_add(GLib.PRIORITY_LOW, 200,
- () => {
- if ([7, 8].includes(this.extension.state))
- return GLib.SOURCE_CONTINUE;
-
- this.icon?.destroy();
- this.icon = this.metaInfo['createIcon'](this.ICON_SIZE);
- this._iconBox.set_child(this.icon);
- this._highlightTerms();
-
- _toggleTimeout = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- }
-
- get ICON_SIZE() {
- return 24;
- }
-
- _highlightTerms() {
- const extension = this.extension;
- const state = extension.state === 4 ? ExtensionState[this.extension.state] : '';
- const error = extension.state === 3 ? ` ERROR: ${this.extension.error}` : '';
- const update = extension.hasUpdate ? ' | UPDATE PENDING' : '';
- const text = `${this.metaInfo.version} ${state}${error}${update}`;
- let markup = text;// this.metaInfo['description'].split('\n')[0];
- this._descriptionLabel.clutter_text.set_markup(markup);
- }
-
- vfunc_clicked() {
- this.activate();
- }
-
- activate() {
- this.provider.activateResult(this.metaInfo.id);
-
- if (this.metaInfo.clipboardText) {
- St.Clipboard.get_default().set_text(
- St.ClipboardType.CLIPBOARD, this.metaInfo.clipboardText);
- }
- Main.overview.toggle();
- }
-});
diff --git a/extensions/45/vertical-workspaces/lib/winTmb.js b/extensions/45/vertical-workspaces/lib/winTmb.js
deleted file mode 100644
index 4205822..0000000
--- a/extensions/45/vertical-workspaces/lib/winTmb.js
+++ /dev/null
@@ -1,525 +0,0 @@
-/**
- * V-Shell (Vertical Workspaces)
- * WinTmb
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2021-2023
- * @license GPL-3.0
- */
-
-'use strict';
-
-import GLib from 'gi://GLib';
-import Clutter from 'gi://Clutter';
-import St from 'gi://St';
-import Meta from 'gi://Meta';
-import GObject from 'gi://GObject';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
-import * as AltTab from 'resource:///org/gnome/shell/ui/altTab.js';
-
-let Me;
-let opt;
-
-const SCROLL_ICON_OPACITY = 240;
-const DRAG_OPACITY = 200;
-const CLOSE_BTN_OPACITY = 240;
-
-
-export const WinTmbModule = class {
- constructor(me) {
- Me = me;
- opt = Me.opt;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- }
-
- update(reset) {
- this._removeTimeouts();
-
- this.moduleEnabled = opt.get('windowThumbnailModule');
-
- reset = reset || !this.moduleEnabled;
-
- // don't touch the original code if module disabled
- if (reset && !this._firstActivation) {
- this._disableModule();
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation)
- console.debug(' WinTmb - Keeping untouched');
- }
-
- _activateModule() {
- this._timeouts = {};
- if (!this._windowThumbnails)
- this._windowThumbnails = [];
-
- Main.overview.connectObject('hidden', () => this.showThumbnails(), this);
- console.debug(' WinTmb - Activated');
- }
-
- _disableModule() {
- Main.overview.disconnectObject(this);
- this._disconnectStateAdjustment();
- this.removeAllThumbnails();
- console.debug(' WinTmb - Disabled');
- }
-
- _removeTimeouts() {
- if (this._timeouts) {
- Object.values(this._timeouts).forEach(t => {
- if (t)
- GLib.source_remove(t);
- });
- this._timeouts = null;
- }
- }
-
- createThumbnail(metaWin) {
- const thumbnail = new WindowThumbnail(metaWin, {
- 'height': Math.floor(opt.WINDOW_THUMBNAIL_SCALE * global.display.get_monitor_geometry(global.display.get_current_monitor()).height),
- 'thumbnailsOnScreen': this._windowThumbnails.length,
- });
-
- this._windowThumbnails.push(thumbnail);
- thumbnail.connect('removed', tmb => {
- this._windowThumbnails.splice(this._windowThumbnails.indexOf(tmb), 1);
- tmb.destroy();
- if (!this._windowThumbnails.length)
- this._disconnectStateAdjustment();
- });
-
- if (!this._stateAdjustmentConId) {
- this._stateAdjustmentConId = Main.overview._overview.controls._stateAdjustment.connectObject('notify::value', () => {
- if (!this._thumbnailsHidden && (!opt.OVERVIEW_MODE2 || opt.WORKSPACE_MODE))
- this.hideThumbnails();
- }, this);
- }
- }
-
- hideThumbnails() {
- this._windowThumbnails.forEach(tmb => {
- tmb.ease({
- opacity: 0,
- duration: 200,
- mode: Clutter.AnimationMode.LINEAR,
- onComplete: () => tmb.hide(),
- });
- });
- this._thumbnailsHidden = true;
- }
-
- showThumbnails() {
- this._windowThumbnails.forEach(tmb => {
- tmb.show();
- tmb.ease({
- opacity: 255,
- duration: 100,
- mode: Clutter.AnimationMode.LINEAR,
- });
- });
- this._thumbnailsHidden = false;
- }
-
- removeAllThumbnails() {
- this._windowThumbnails.forEach(tmb => tmb.remove());
- this._windowThumbnails = [];
- }
-
- _disconnectStateAdjustment() {
- Main.overview._overview.controls._stateAdjustment.disconnectObject(this);
- }
-};
-
-const WindowThumbnail = GObject.registerClass({
- Signals: { 'removed': {} },
-}, class WindowThumbnail extends St.Widget {
- _init(metaWin, args) {
- this._hoverShowsPreview = false;
- this._customOpacity = 255;
- this._initTmbHeight = args.height;
- this._minimumHeight = Math.floor(5 / 100 * global.display.get_monitor_geometry(global.display.get_current_monitor()).height);
- this._scrollTimeout = 100;
- this._positionOffset = args.thumbnailsOnScreen;
- this._reverseTmbWheelFunc = false;
- this._click_count = 1;
- this._prevBtnPressTime = 0;
- this.w = metaWin;
- super._init({
- layout_manager: new Clutter.BinLayout(),
- visible: true,
- reactive: true,
- can_focus: true,
- track_hover: true,
- });
- this.connect('button-release-event', this._onBtnReleased.bind(this));
- this.connect('scroll-event', this._onScrollEvent.bind(this));
- // this.connect('motion-event', this._onMouseMove.bind(this)); // may be useful in the future..
-
- this._delegate = this;
- this._draggable = DND.makeDraggable(this, { dragActorOpacity: DRAG_OPACITY });
- this._draggable.connect('drag-end', this._end_drag.bind(this));
- this._draggable.connect('drag-cancelled', this._end_drag.bind(this));
- this._draggable._animateDragEnd = eventTime => {
- this._draggable._animationInProgress = true;
- this._draggable._onAnimationComplete(this._draggable._dragActor, eventTime);
- this.opacity = this._customOpacity;
- };
-
- this.clone = new Clutter.Clone({ reactive: true });
- Main.layoutManager.addChrome(this);
-
- this.window = this.w.get_compositor_private();
-
- this.clone.set_source(this.window);
-
- this.add_child(this.clone);
- this._addCloseButton();
- this._addScrollModeIcon();
-
- this.connect('enter-event', () => {
- global.display.set_cursor(Meta.Cursor.POINTING_HAND);
- this._closeButton.opacity = CLOSE_BTN_OPACITY;
- this._scrollModeBin.opacity = SCROLL_ICON_OPACITY;
- if (this._hoverShowsPreview && !Main.overview._shown) {
- this._closeButton.opacity = 50;
- this._showWindowPreview(false, true);
- }
- });
-
- this.connect('leave-event', () => {
- global.display.set_cursor(Meta.Cursor.DEFAULT);
- this._closeButton.opacity = 0;
- this._scrollModeBin.opacity = 0;
- if (this._winPreview)
- this._destroyWindowPreview();
- });
-
- this._setSize(true);
- this.set_position(...this._getInitialPosition());
- this.show();
- this.window_id = this.w.get_id();
- this.tmbRedrawDirection = true;
-
- // remove thumbnail content and hide thumbnail if its window is destroyed
- this.windowConnect = this.window.connect('destroy', () => {
- if (this)
- this.remove();
- });
- }
-
- _getInitialPosition() {
- const offset = 20;
- let monitor = Main.layoutManager.monitors[global.display.get_current_monitor()];
- let x = Math.min(monitor.x + monitor.width - (this.window.width * this.scale) - offset);
- let y = Math.min(monitor.y + monitor.height - (this.window.height * this.scale) - offset - ((this._positionOffset * this._initTmbHeight) % (monitor.height - this._initTmbHeight)));
- return [x, y];
- }
-
- _setSize(resetScale = false) {
- if (resetScale)
- this.scale = Math.min(1.0, this._initTmbHeight / this.window.height);
-
- const width = this.window.width * this.scale;
- const height = this.window.height * this.scale;
- this.set_size(width, height);
- /* if (this.icon) {
- this.icon.scale_x = this.scale;
- this.icon.scale_y = this.scale;
- }*/
-
- // when the scale of this. actor change, this.clone resize accordingly,
- // but the reactive area of the actor doesn't change until the actor is redrawn
- // this updates the actor's input region area:
- Main.layoutManager._queueUpdateRegions();
- }
-
- /* _onMouseMove(actor, event) {
- let [pos_x, pos_y] = event.get_coords();
- let state = event.get_state();
- if (this._ctrlPressed(state)) {
- }
- }*/
-
- _onBtnReleased(actor, event) {
- // Clutter.Event.click_count property in no longer available, since GS42
- if ((event.get_time() - this._prevBtnPressTime) < Clutter.Settings.get_default().double_click_time)
- this._click_count += 1;
- else
- this._click_count = 1;
-
- this._prevBtnPressTime = event.get_time();
-
- if (this._click_count === 2 && event.get_button() === Clutter.BUTTON_PRIMARY)
- this.w.activate(global.get_current_time());
-
-
- const button = event.get_button();
- const state = event.get_state();
- switch (button) {
- case Clutter.BUTTON_PRIMARY:
- if (this._ctrlPressed(state)) {
- this._setSize();
- } else {
- this._reverseTmbWheelFunc = !this._reverseTmbWheelFunc;
- this._scrollModeBin.set_child(this._reverseTmbWheelFunc ? this._scrollModeSourceIcon : this._scrollModeResizeIcon);
- }
- return Clutter.EVENT_STOP;
- case Clutter.BUTTON_SECONDARY:
- if (this._ctrlPressed(state)) {
- this.remove();
- } else {
- this._hoverShowsPreview = !this._hoverShowsPreview;
- this._showWindowPreview();
- }
- return Clutter.EVENT_STOP;
- case Clutter.BUTTON_MIDDLE:
- if (this._ctrlPressed(state))
- this.w.delete(global.get_current_time());
- return Clutter.EVENT_STOP;
- default:
- return Clutter.EVENT_PROPAGATE;
- }
- }
-
- _onScrollEvent(actor, event) {
- let direction = Me.Util.getScrollDirection(event);
-
- if (this._actionTimeoutActive())
- return Clutter.EVENT_PROPAGATE;
- let state = event.get_state();
- switch (direction) {
- case Clutter.ScrollDirection.UP:
- if (this._shiftPressed(state)) {
- this.opacity = Math.min(255, this.opacity + 24);
- this._customOpacity = this.opacity;
- } else if (this._reverseTmbWheelFunc !== this._ctrlPressed(state)) {
- this._switchSourceWin(-1);
- } else if (this._reverseTmbWheelFunc === this._ctrlPressed(state)) {
- this.scale = Math.max(0.05, this.scale - 0.025);
- }
- break;
- case Clutter.ScrollDirection.DOWN:
- if (this._shiftPressed(state)) {
- this.opacity = Math.max(48, this.opacity - 24);
- this._customOpacity = this.opacity;
- } else if (this._reverseTmbWheelFunc !== this._ctrlPressed(state)) {
- this._switchSourceWin(+1);
- } else if (this._reverseTmbWheelFunc === this._ctrlPressed(state)) {
- this.scale = Math.min(1, this.scale + 0.025);
- }
- break;
- default:
- return Clutter.EVENT_PROPAGATE;
- }
- this._setSize();
- return Clutter.EVENT_STOP;
- }
-
- remove() {
- if (this.clone) {
- this.window.disconnect(this.windowConnect);
- this.clone.set_source(null);
- }
- if (this._winPreview)
- this._destroyWindowPreview();
-
- this.emit('removed');
- }
-
- _end_drag() {
- this.set_position(this._draggable._dragOffsetX + this._draggable._dragX, this._draggable._dragOffsetY + this._draggable._dragY);
- this._setSize();
- }
-
- _ctrlPressed(state) {
- return (state & Clutter.ModifierType.CONTROL_MASK) !== 0;
- }
-
- _shiftPressed(state) {
- return (state & Clutter.ModifierType.SHIFT_MASK) !== 0;
- }
-
- _switchSourceWin(direction) {
- let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, null);
- windows = windows.filter(w => !(w.skip_taskbar || w.minimized));
- let idx = -1;
- for (let i = 0; i < windows.length; i++) {
- if (windows[i] === this.w) {
- idx = i + direction;
- break;
- }
- }
- idx = idx >= windows.length ? 0 : idx;
- idx = idx < 0 ? windows.length - 1 : idx;
- let w = windows[idx];
- let win = w.get_compositor_private();
- this.clone.set_source(win);
- this.window.disconnect(this.windowConnect);
- // the new thumbnail should be the same height as the previous one
- this.scale = (this.scale * this.window.height) / win.height;
- this.window = win;
- this.windowConnect = this.window.connect('destroy', () => {
- if (this)
- this.remove();
- });
- this.w = w;
-
- if (this._winPreview)
- this._showWindowPreview(true);
- }
-
- _actionTimeoutActive() {
- const timeout = this._reverseTmbWheelFunc ? this._scrollTimeout : this._scrollTimeout / 4;
- if (!this._lastActionTime || Date.now() - this._lastActionTime > timeout) {
- this._lastActionTime = Date.now();
- return false;
- }
- return true;
- }
-
- /* _setIcon() {
- let tracker = Shell.WindowTracker.get_default();
- let app = tracker.get_window_app(this.w);
- let icon = app
- ? app.create_icon_texture(this.height)
- : new St.Icon({ icon_name: 'icon-missing', icon_size: this.height });
- icon.x_expand = icon.y_expand = true;
- if (this.icon)
- this.icon.destroy();
- this.icon = icon;
- }*/
-
- _addCloseButton() {
- const closeButton = new St.Button({
- opacity: 0,
- style_class: 'window-close',
- child: new St.Icon({ icon_name: 'preview-close-symbolic' }),
- x_align: Clutter.ActorAlign.END,
- y_align: Clutter.ActorAlign.START,
- x_expand: true,
- y_expand: true,
- });
-
- closeButton.set_style(`
- margin: 3px;
- background-color: rgba(200, 0, 0, 0.9);
- `);
-
- closeButton.connect('clicked', () => {
- this.remove();
- return Clutter.EVENT_STOP;
- });
-
- this._closeButton = closeButton;
- this.add_child(this._closeButton);
- }
-
- _addScrollModeIcon() {
- this._scrollModeBin = new St.Bin({
- x_expand: true,
- y_expand: true,
- });
- this._scrollModeResizeIcon = new St.Icon({
- icon_name: 'view-fullscreen-symbolic',
- x_align: Clutter.ActorAlign.CENTER,
- y_align: Clutter.ActorAlign.END,
- x_expand: true,
- y_expand: true,
- opacity: SCROLL_ICON_OPACITY,
- style_class: 'icon-dropshadow',
- scale_x: 0.5,
- scale_y: 0.5,
- });
- this._scrollModeResizeIcon.set_style(`
- margin: 13px;
- color: rgb(255, 255, 255);
- box-shadow: 0 0 40px 40px rgba(0,0,0,0.7);
- `);
- this._scrollModeSourceIcon = new St.Icon({
- icon_name: 'media-skip-forward-symbolic',
- x_align: Clutter.ActorAlign.CENTER,
- y_align: Clutter.ActorAlign.END,
- x_expand: true,
- y_expand: true,
- opacity: SCROLL_ICON_OPACITY,
- style_class: 'icon-dropshadow',
- scale_x: 0.5,
- scale_y: 0.5,
- });
- this._scrollModeSourceIcon.set_style(`
- margin: 13px;
- color: rgb(255, 255, 255);
- box-shadow: 0 0 40px 40px rgba(0,0,0,0.7);
- `);
- this._scrollModeBin.set_child(this._scrollModeResizeIcon);
- this.add_child(this._scrollModeBin);
- this._scrollModeBin.opacity = 0;
- }
-
- _showWindowPreview(update = false, dontDestroy = false) {
- if (this._winPreview && !dontDestroy) {
- this._destroyWindowPreview();
- this._previewCreationTime = 0;
- this._closeButton.opacity = CLOSE_BTN_OPACITY;
- if (!update)
- return;
- }
-
- if (!this._winPreview) {
- this._winPreview = new AltTab.CyclerHighlight();
- global.window_group.add_actor(this._winPreview);
- [this._winPreview._xPointer, this._winPreview._yPointer] = global.get_pointer();
- }
-
- if (!update) {
- this._winPreview.opacity = 0;
- this._winPreview.ease({
- opacity: 255,
- duration: 70,
- mode: Clutter.AnimationMode.LINEAR,
- /* onComplete: () => {
- this._closeButton.opacity = 50;
- },*/
- });
-
- this.ease({
- opacity: Math.min(50, this._customOpacity),
- duration: 70,
- mode: Clutter.AnimationMode.LINEAR,
- onComplete: () => {
- },
- });
- } else {
- this._winPreview.opacity = 255;
- }
- this._winPreview.window = this.w;
- this._winPreview._window = this.w;
- global.window_group.set_child_above_sibling(this._winPreview, null);
- }
-
- _destroyWindowPreview() {
- if (this._winPreview) {
- this._winPreview.ease({
- opacity: 0,
- duration: 100,
- mode: Clutter.AnimationMode.LINEAR,
- onComplete: () => {
- this._winPreview.destroy();
- this._winPreview = null;
- this.opacity = this._customOpacity;
- },
- });
- }
- }
-});
diff --git a/extensions/45/vertical-workspaces/lib/windowManager.js b/extensions/45/vertical-workspaces/lib/windowManager.js
deleted file mode 100644
index dd467cb..0000000
--- a/extensions/45/vertical-workspaces/lib/windowManager.js
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * V-Shell (Vertical Workspaces)
- * windowManager.js
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
- * @license GPL-3.0
- *
- */
-
-'use strict';
-
-import Clutter from 'gi://Clutter';
-import Meta from 'gi://Meta';
-import GObject from 'gi://GObject';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-import * as WindowManager from 'resource:///org/gnome/shell/ui/windowManager.js';
-
-let Me;
-let opt;
-
-export const WindowManagerModule = class {
- constructor(me) {
- Me = me;
- opt = Me.opt;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
- this._overrides = null;
-
- this._originalMinimizeSigId = 0;
- this._minimizeSigId = 0;
- this._originalUnminimizeSigId = 0;
- this._unminimizeSigId = 0;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- }
-
- update(reset) {
- this.moduleEnabled = opt.get('windowManagerModule');
- const conflict = false;
-
- reset = reset || !this.moduleEnabled || conflict;
-
- // don't even touch the original code if module disabled
- if (reset && !this._firstActivation) {
- this._disableModule();
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation)
- console.debug(' WindowManagerModule - Keeping untouched');
- }
-
- _activateModule() {
- if (!this._overrides)
- this._overrides = new Me.Util.Overrides();
-
- this._overrides.addOverride('WindowManager', WindowManager.WindowManager.prototype, WindowManagerCommon);
-
- if (!this._minimizeSigId) {
- this._originalMinimizeSigId = GObject.signal_handler_find(Main.wm._shellwm, { signalId: 'minimize' });
- if (this._originalMinimizeSigId) {
- Main.wm._shellwm.block_signal_handler(this._originalMinimizeSigId);
- this._minimizeSigId = Main.wm._shellwm.connect('minimize', WindowManagerCommon._minimizeWindow.bind(Main.wm));
- }
-
- this._originalUnminimizeSigId = GObject.signal_handler_find(Main.wm._shellwm, { signalId: 'unminimize' });
- if (this._originalUnminimizeSigId) {
- Main.wm._shellwm.block_signal_handler(this._originalUnminimizeSigId);
- this._unminimizeSigId = Main.wm._shellwm.connect('unminimize', WindowManagerCommon._unminimizeWindow.bind(Main.wm));
- }
- }
- console.debug(' WindowManagerModule - Activated');
- }
-
- _disableModule() {
- if (this._overrides)
- this._overrides.removeAll();
- this._overrides = null;
-
- if (this._minimizeSigId) {
- Main.wm._shellwm.disconnect(this._minimizeSigId);
- this._minimizeSigId = 0;
- }
- if (this._originalMinimizeSigId) {
- Main.wm._shellwm.unblock_signal_handler(this._originalMinimizeSigId);
- this._originalMinimizeSigId = 0;
- }
-
- if (this._unminimizeSigId) {
- Main.wm._shellwm.disconnect(this._unminimizeSigId);
- this._unminimizeSigId = 0;
- }
- if (this._originalUnminimizeSigId) {
- Main.wm._shellwm.unblock_signal_handler(this._originalUnminimizeSigId);
- this._originalUnminimizeSigId = 0;
- }
-
- console.debug(' WindowManagerModule - Disabled');
- }
-};
-
-// fix for mainstream bug - fullscreen windows should minimize using opacity transition
-// but its being applied directly on window actor and that doesn't work
-// anyway, animation is better, even if the Activities button is not visible...
-// and also add support for bottom position of the panel
-const WindowManagerCommon = {
- _minimizeWindow(shellwm, actor) {
- const types = [
- Meta.WindowType.NORMAL,
- Meta.WindowType.MODAL_DIALOG,
- Meta.WindowType.DIALOG,
- ];
- if (!this._shouldAnimateActor(actor, types)) {
- shellwm.completed_minimize(actor);
- return;
- }
-
- actor.set_scale(1.0, 1.0);
-
- this._minimizing.add(actor);
-
- /* if (actor.meta_window.is_monitor_sized()) {
- actor.get_first_child().ease({
- opacity: 0,
- duration: WindowManager.MINIMIZE_WINDOW_ANIMATION_TIME,
- mode: WindowManager.MINIMIZE_WINDOW_ANIMATION_MODE,
- onStopped: () => this._minimizeWindowDone(shellwm, actor),
- });
- } else { */
- let xDest, yDest, xScale, yScale;
- let [success, geom] = actor.meta_window.get_icon_geometry();
- if (success) {
- xDest = geom.x;
- yDest = geom.y;
- xScale = geom.width / actor.width;
- yScale = geom.height / actor.height;
- } else {
- let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
- if (!monitor) {
- this._minimizeWindowDone();
- return;
- }
- xDest = monitor.x;
- yDest = opt.PANEL_POSITION_TOP ? monitor.y : monitor.y + monitor.height;
- if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
- xDest += monitor.width;
- xScale = 0;
- yScale = 0;
- }
-
- actor.ease({
- scale_x: xScale,
- scale_y: yScale,
- x: xDest,
- y: yDest,
- duration: WindowManager.MINIMIZE_WINDOW_ANIMATION_TIME,
- mode: WindowManager.MINIMIZE_WINDOW_ANIMATION_MODE,
- onStopped: () => this._minimizeWindowDone(shellwm, actor),
- });
- // }
- },
-
- _minimizeWindowDone(shellwm, actor) {
- if (this._minimizing.delete(actor)) {
- actor.remove_all_transitions();
- actor.set_scale(1.0, 1.0);
- actor.get_first_child().set_opacity(255);
- actor.set_pivot_point(0, 0);
-
- shellwm.completed_minimize(actor);
- }
- },
-
- _unminimizeWindow(shellwm, actor) {
- const types = [
- Meta.WindowType.NORMAL,
- Meta.WindowType.MODAL_DIALOG,
- Meta.WindowType.DIALOG,
- ];
- if (!this._shouldAnimateActor(actor, types)) {
- shellwm.completed_unminimize(actor);
- return;
- }
-
- this._unminimizing.add(actor);
-
- /* if (false/* actor.meta_window.is_monitor_sized()) {
- actor.opacity = 0;
- actor.set_scale(1.0, 1.0);
- actor.ease({
- opacity: 255,
- duration: WindowManager.MINIMIZE_WINDOW_ANIMATION_TIME,
- mode: WindowManager.MINIMIZE_WINDOW_ANIMATION_MODE,
- onStopped: () => this._unminimizeWindowDone(shellwm, actor),
- });
- } else { */
- let [success, geom] = actor.meta_window.get_icon_geometry();
- if (success) {
- actor.set_position(geom.x, geom.y);
- actor.set_scale(geom.width / actor.width,
- geom.height / actor.height);
- } else {
- let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
- if (!monitor) {
- actor.show();
- this._unminimizeWindowDone();
- return;
- }
- actor.set_position(monitor.x, opt.PANEL_POSITION_TOP ? monitor.y : monitor.y + monitor.height);
- if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
- actor.x += monitor.width;
- actor.set_scale(0, 0);
- }
-
- let rect = actor.meta_window.get_buffer_rect();
- let [xDest, yDest] = [rect.x, rect.y];
-
- actor.show();
- actor.ease({
- scale_x: 1,
- scale_y: 1,
- x: xDest,
- y: yDest,
- duration: WindowManager.MINIMIZE_WINDOW_ANIMATION_TIME,
- mode: WindowManager.MINIMIZE_WINDOW_ANIMATION_MODE,
- onStopped: () => this._unminimizeWindowDone(shellwm, actor),
- });
- // }
- },
-};
diff --git a/extensions/45/vertical-workspaces/lib/windowSearchProvider.js b/extensions/45/vertical-workspaces/lib/windowSearchProvider.js
deleted file mode 100644
index 7deddb6..0000000
--- a/extensions/45/vertical-workspaces/lib/windowSearchProvider.js
+++ /dev/null
@@ -1,331 +0,0 @@
-/**
- * V-Shell (Vertical Workspaces)
- * windowSearchProvider.js
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2022 -2023
- * @license GPL-3.0
- */
-
-'use strict';
-
-import Gio from 'gi://Gio';
-import GLib from 'gi://GLib';
-import Meta from 'gi://Meta';
-import Shell from 'gi://Shell';
-import St from 'gi://St';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-
-let Me;
-let opt;
-// gettext
-let _;
-
-// prefix helps to eliminate results from other search providers
-// so it needs to be something less common
-// needs to be accessible from vw module
-export const PREFIX = 'wq//';
-
-const Action = {
- NONE: 0,
- CLOSE: 1,
- CLOSE_ALL: 2,
- MOVE_TO_WS: 3,
- MOVE_ALL_TO_WS: 4,
-};
-
-export const WindowSearchProviderModule = class {
- // export for other modules
- static _PREFIX = PREFIX;
- constructor(me) {
- Me = me;
- opt = Me.opt;
- _ = Me.gettext;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
-
- this._windowSearchProvider = null;
- this._enableTimeoutId = 0;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- _ = null;
- }
-
- update(reset) {
- this.moduleEnabled = opt.get('windowSearchProviderModule');
-
- reset = reset || !this.moduleEnabled;
-
- if (reset && !this._firstActivation) {
- this._disableModule();
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation)
- console.debug(' WindowSearchProviderModule - Keeping untouched');
- }
-
- _activateModule() {
- // delay because Fedora had problem to register a new provider soon after Shell restarts
- this._enableTimeoutId = GLib.timeout_add(
- GLib.PRIORITY_DEFAULT,
- 2000,
- () => {
- if (!this._windowSearchProvider) {
- this._windowSearchProvider = new WindowSearchProvider(opt);
- this._getOverviewSearchResult()._registerProvider(this._windowSearchProvider);
- }
- this._enableTimeoutId = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- console.debug(' WindowSearchProviderModule - Activated');
- }
-
- _disableModule() {
- if (this._windowSearchProvider) {
- this._getOverviewSearchResult()._unregisterProvider(this._windowSearchProvider);
- this._windowSearchProvider = null;
- }
- if (this._enableTimeoutId) {
- GLib.source_remove(this._enableTimeoutId);
- this._enableTimeoutId = 0;
- }
-
- console.debug(' WindowSearchProviderModule - Disabled');
- }
-
- _getOverviewSearchResult() {
- return Main.overview._overview.controls._searchController._searchResults;
- }
-};
-
-/* const closeSelectedRegex = /^\/x!$/;
-const closeAllResultsRegex = /^\/xa!$/;
-const moveToWsRegex = /^\/m[0-9]+$/;
-const moveAllToWsRegex = /^\/ma[0-9]+$/;*/
-
-class WindowSearchProvider {
- constructor() {
- this.id = 'open-windows';
- // use arbitrary app to get complete appInfo object
- // Gio.AppInfo.create_from_commandline lacks something that causes error with parental content / malcontent
- const appSystem = Shell.AppSystem.get_default();
- let appInfo = appSystem.lookup_app('com.matjakeman.ExtensionManager.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = appSystem.lookup_app('org.gnome.Extensions.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = Gio.AppInfo.create_from_commandline('true', _('Open Windows'), null);
- appInfo.get_description = () => _('Search open windows');
- appInfo.get_name = () => _('Open Windows');
- appInfo.get_id = () => this.id;
- appInfo.get_icon = () => Gio.icon_new_for_string('focus-windows-symbolic');
- appInfo.should_show = () => true;
-
- this.appInfo = appInfo;
- this.canLaunchSearch = false;
- this.isRemoteProvider = false;
-
- this.action = 0;
- }
-
- _getResultSet(terms) {
- // do not modify original terms
- let termsCopy = [...terms];
- // search for terms without prefix
- termsCopy[0] = termsCopy[0].replace(PREFIX, '');
-
- /* if (gOptions.get('searchWindowsCommands')) {
- this.action = 0;
- this.targetWs = 0;
-
- const lastTerm = terms[terms.length - 1];
- if (lastTerm.match(closeSelectedRegex)) {
- this.action = Action.CLOSE;
- } else if (lastTerm.match(closeAllResultsRegex)) {
- this.action = Action.CLOSE_ALL;
- } else if (lastTerm.match(moveToWsRegex)) {
- this.action = Action.MOVE_TO_WS;
- } else if (lastTerm.match(moveAllToWsRegex)) {
- this.action = Action.MOVE_ALL_TO_WS;
- }
- if (this.action) {
- terms.pop();
- if (this.action === Action.MOVE_TO_WS || this.action === Action.MOVE_ALL_TO_WS) {
- this.targetWs = parseInt(lastTerm.replace(/^[^0-9]+/, '')) - 1;
- }
- } else if (lastTerm.startsWith('/')) {
- terms.pop();
- }
- }*/
-
- const candidates = this.windows;
- const _terms = [].concat(termsCopy);
- // let match;
-
- const term = _terms.join(' ');
- /* match = s => {
- return fuzzyMatch(term, s);
- }; */
-
- const results = [];
- let m;
- for (let key in candidates) {
- if (opt.SEARCH_FUZZY)
- m = Me.Util.fuzzyMatch(term, candidates[key].name);
- else
- m = Me.Util.strictMatch(term, candidates[key].name);
-
- if (m !== -1)
- results.push({ weight: m, id: key });
- }
-
- results.sort((a, b) => a.weight > b.weight);
- const currentWs = global.workspace_manager.get_active_workspace_index();
- // prefer current workspace
- switch (opt.WINDOW_SEARCH_ORDER) {
- case 1: // MRU - current ws first
- results.sort((a, b) => (this.windows[a.id].window.get_workspace().index() !== currentWs) && (this.windows[b.id].window.get_workspace().index() === currentWs));
- break;
- case 2: // MRU - by workspace
- results.sort((a, b) => this.windows[a.id].window.get_workspace().index() > this.windows[b.id].window.get_workspace().index());
- break;
- case 3: // Stable sequence - by workspace
- results.sort((a, b) => this.windows[a.id].window.get_stable_sequence() > this.windows[b.id].window.get_stable_sequence());
- results.sort((a, b) => this.windows[a.id].window.get_workspace().index() > this.windows[b.id].window.get_workspace().index());
- break;
- }
-
- results.sort((a, b) => (_terms !== ' ') && (a.weight > 0 && b.weight === 0));
-
- this.resultIds = results.map(item => item.id);
- return this.resultIds;
- }
-
- getResultMetas(resultIds/* , callback = null*/) {
- const metas = resultIds.map(id => this.getResultMeta(id));
- return new Promise(resolve => resolve(metas));
- }
-
- getResultMeta(resultId) {
- const result = this.windows[resultId];
- const wsIndex = result.window.get_workspace().index();
- const app = Shell.WindowTracker.get_default().get_window_app(result.window);
- return {
- 'id': resultId,
- 'name': `${wsIndex + 1}: ${result.windowTitle}`,
- 'description': result.appName,
- 'createIcon': size => {
- return app
- ? app.create_icon_texture(size)
- : new St.Icon({ icon_name: 'icon-missing', icon_size: size });
- },
- };
- }
-
- makeResult(window, i) {
- const app = Shell.WindowTracker.get_default().get_window_app(window);
- const appName = app ? app.get_name() : 'Unknown';
- const windowTitle = window.get_title();
- const wsIndex = window.get_workspace().index();
-
- return {
- 'id': i,
- // convert all accented chars to their basic form and lower case for search
- 'name': `${wsIndex + 1}: ${windowTitle} ${appName}`.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase(),
- appName,
- windowTitle,
- window,
- };
- }
-
- launchSearch(/* terms, timeStamp*/) {
-
- }
-
- activateResult(resultId/* , terms, timeStamp*/) {
- const isCtrlPressed = Me.Util.isCtrlPressed();
- const isShiftPressed = Me.Util.isShiftPressed();
-
- this.action = 0;
- this.targetWs = 0;
-
- this.targetWs = global.workspaceManager.get_active_workspace().index() + 1;
- if (isShiftPressed && !isCtrlPressed)
- this.action = Action.MOVE_TO_WS;
- else if (isShiftPressed && isCtrlPressed)
- this.action = Action.MOVE_ALL_TO_WS;
-
-
- if (!this.action) {
- const result = this.windows[resultId];
- Main.activateWindow(result.window);
- return;
- }
-
- switch (this.action) {
- case Action.CLOSE:
- this._closeWindows([resultId]);
- break;
- case Action.CLOSE_ALL:
- this._closeWindows(this.resultIds);
- break;
- case Action.MOVE_TO_WS:
- this._moveWindowsToWs(resultId, [resultId]);
- break;
- case Action.MOVE_ALL_TO_WS:
- this._moveWindowsToWs(resultId, this.resultIds);
- break;
- }
- }
-
- _closeWindows(ids) {
- let time = global.get_current_time();
- for (let i = 0; i < ids.length; i++)
- this.windows[ids[i]].window.delete(time + i);
-
- Main.notify('Window Search Provider', `Closed ${ids.length} windows.`);
- }
-
- _moveWindowsToWs(selectedId, resultIds) {
- const workspace = global.workspaceManager.get_active_workspace();
-
- for (let i = 0; i < resultIds.length; i++)
- this.windows[resultIds[i]].window.change_workspace(workspace);
-
- const selectedWin = this.windows[selectedId].window;
- selectedWin.activate_with_workspace(global.get_current_time(), workspace);
- }
-
- getInitialResultSet(terms/* , callback*/) {
- let windows;
- this.windows = windows = {};
- global.display.get_tab_list(Meta.TabList.NORMAL, null).filter(w => w.get_workspace() !== null).map(
- (v, i) => {
- windows[`${i}-${v.get_id()}`] = this.makeResult(v, `${i}-${v.get_id()}`);
- return windows[`${i}-${v.get_id()}`];
- }
- );
-
- return new Promise(resolve => resolve(this._getResultSet(terms)));
- }
-
- filterResults(results /* , maxResults*/) {
- // return results.slice(0, maxResults);
- return results;
- }
-
- getSubsearchResultSet(previousResults, terms/* , callback*/) {
- return this.getInitialResultSet(terms);
- }
-
- getSubsearchResultSet42(terms, callback) {
- callback(this._getResultSet(terms));
- }
-}
diff --git a/extensions/45/vertical-workspaces/po/cs.po b/extensions/45/vertical-workspaces/po/cs.po
deleted file mode 100644
index e588c73..0000000
--- a/extensions/45/vertical-workspaces/po/cs.po
+++ /dev/null
@@ -1,1553 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR GdH
-# This file is distributed under the same license as the vertical-workspaces package.
-# FIRST AUTHOR Amerey.eu <info@amerey.eu>, 2023.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: vertical-workspaces\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-03-08 12:37+0100\n"
-"PO-Revision-Date: 2023-03-09 15:09+0100\n"
-"Last-Translator: Amerey.eu <info@amerey.eu>\n"
-"Language-Team: \n"
-"Language: cs\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n"
-"X-Generator: Poedit 3.1.1\n"
-
-#: dash.js:743
-msgid "Search Open Windows (Hotkey: Space)"
-msgstr "Hledat v otevřených oknech (klávesová zkratka: mezerník)"
-
-#: dash.js:816
-msgid "Search Recent Files (Hotkey: Ctrl + Space)"
-msgstr "Hledat v posledních souborech (klávesová zkratka: Ctrl + mezerník)"
-
-#: windowSearchProvider.js:117 windowSearchProvider.js:119
-msgid "Open Windows"
-msgstr "Otevřené okna"
-
-#: windowSearchProvider.js:118
-msgid "List of open windows"
-msgstr "Seznam otevřených oken"
-
-#: appDisplay.js:1317
-msgid "Force Quit"
-msgstr "Vynutit vypnutí"
-
-#: appDisplay.js:1335
-msgid "Move App to Current Workspace ( Shift + Click )"
-msgstr "Přesunout aplikaci do aktuální pracovní plochy (Shift + kliknutí)"
-
-#: prefs.js:47 prefs.js:1465
-msgid "Layout"
-msgstr "Rozložení"
-
-#: prefs.js:53
-msgid "Appearance"
-msgstr "Vzhled"
-
-#: prefs.js:59
-msgid "Behavior"
-msgstr "Vlastnosti"
-
-#: prefs.js:65
-msgid "Misc"
-msgstr "Různé"
-
-#: prefs.js:71
-msgid "About"
-msgstr "O aplikaci"
-
-#: prefs.js:119 prefs.js:517 prefs.js:1030 prefs.js:1456
-msgid "Dash"
-msgstr "Dash"
-
-#: prefs.js:125
-msgid "Dash Position"
-msgstr "Pozice Dash"
-
-#: prefs.js:131
-msgid "Top"
-msgstr "Nahoře"
-
-#: prefs.js:132
-msgid "Right"
-msgstr "Vpravo"
-
-#: prefs.js:133 prefs.js:355
-msgid "Bottom"
-msgstr "Dole"
-
-#: prefs.js:134
-msgid "Left"
-msgstr "Vlevo"
-
-#: prefs.js:135 prefs.js:393 prefs.js:557 prefs.js:572 prefs.js:587
-msgid "Hide"
-msgstr "Skrýt"
-
-#: prefs.js:142
-msgid "Center Horizontal Dash to Workspace"
-msgstr "Vycentrovat horizontální Dash"
-
-#: prefs.js:143
-msgid ""
-"If the Dash Position is set to Top or Bottom, the position will be "
-"recalculated relative to the workspace preview instead of the screen. Works "
-"only with the default Dash."
-msgstr ""
-"Pokud je pozice nastavena na Nahoře nebo Dole, pozice se přepočítá vzhledem "
-"k náhledu pracovního prostoru místo obrazovky. Funguje pouze se standardním "
-"Dash."
-
-#: prefs.js:160
-msgid "Fine Tune Dash Position"
-msgstr "Upravit pozici Dash"
-
-#: prefs.js:161
-msgid ""
-"Adjusts position of the dock on chosen axis. Works only with the default "
-"Dash."
-msgstr "Upraví polohu doku na zvolené ose. Funguje pouze se standardním Dash."
-
-#: prefs.js:170
-msgid "Workspace Thumbnails / Orientation"
-msgstr "Náhledy pracovního prostoru / Orientace"
-
-#: prefs.js:176
-msgid "Thumbnails Position / Workspaces Orientation"
-msgstr "Pozice náhledů / Orientace pracovních ploch"
-
-#: prefs.js:177
-msgid ""
-"Position of the workspace thumbnails on the screen also sets orientation of "
-"the workspaces to vertical or horizontal. You have two options to disable "
-"workspace thumbnails, one sets workspaces to the vertical orientation, the "
-"second one to horizontal."
-msgstr ""
-"Umístění miniatur pracovních ploch na obrazovce také nastavuje orientaci "
-"pracovních ploch na vertikální nebo horizontální. Máte dvě možnosti, jak "
-"zakázat miniatury pracovních ploch, jedna nastaví pracovní plochy na "
-"vertikální orientaci, druhá na horizontální."
-
-#: prefs.js:183
-msgid "Left \t Vertical Orientation"
-msgstr "Svislá orientace \t vlevo"
-
-#: prefs.js:184
-msgid "Right \t Vertical Orientation"
-msgstr "Svislá orientace \t vpravo"
-
-#: prefs.js:185
-msgid "Hide \t Set Vertical Orientation"
-msgstr "Svislá orientace \t skrýt"
-
-#: prefs.js:186
-msgid "Top \t Horizontal Orientation"
-msgstr "Vodorovná orientace \t nahoře"
-
-#: prefs.js:187
-msgid "Bottom \t Horizontal Orientation"
-msgstr "Vodorovná orientace \t dole"
-
-#: prefs.js:188
-msgid "Hide \t Set Horizontal Orientation"
-msgstr "Vodorovná orientace \t skrýt"
-
-#: prefs.js:204 prefs.js:409
-msgid "Fine Tune Workspace Thumbnails Position"
-msgstr "Doladit pozice miniatur pracovního prostoru"
-
-#: prefs.js:205
-msgid "Adjusts workspace thumbnails vertical position."
-msgstr "Upraví vertikální polohu miniatur pracovního prostoru."
-
-#: prefs.js:213
-msgid "Reserve Full Screen Height/Width for Thumbnails"
-msgstr "Vyhradit výšku/šířku celé obrazovky pro miniatury"
-
-#: prefs.js:214
-msgid ""
-"The whole screen height/width will be reserved for workspace thumbnails at "
-"the expense of space available for Dash (if the Dash is oriented in a "
-"different axis)."
-msgstr ""
-"Celá výška/šířka obrazovky bude vyhrazena pro miniatury pracovního prostoru "
-"na úkor místa dostupného pro Dash (pokud je Dash orientován v jiné ose)."
-
-#: prefs.js:231 prefs.js:427
-msgid "Workspace Thumbnails Max Scale"
-msgstr "Miniatury pracovního prostoru Maximální měřítko"
-
-#: prefs.js:232
-msgid ""
-"Adjusts maximum size of the workspace thumbnails (% relative to display "
-"width)."
-msgstr ""
-"Upraví maximální velikost miniatur pracovního prostoru (% vzhledem k šířce "
-"zobrazení)."
-
-#: prefs.js:241 prefs.js:697
-msgid "Workspace Preview"
-msgstr "Náhled pracovního prostoru"
-
-#: prefs.js:256
-msgid "Workspaces Scale"
-msgstr "Měřítko pracovních prostorů"
-
-#: prefs.js:257
-msgid ""
-"Scales down workspace previews so you can fit more of the adjacent "
-"workspaces on the screen. Default size is calculated to use all available "
-"space."
-msgstr ""
-"Zmenšuje náhledy pracovních ploch, takže se na obrazovku vejde více "
-"sousedních pracovních ploch. Výchozí velikost se vypočítá tak, aby využila "
-"veškerý dostupný prostor."
-
-#: prefs.js:274
-msgid "Workspaces Spacing"
-msgstr "Rozestupy pracovních prostorů"
-
-#: prefs.js:275
-msgid ""
-"Adjusts spacing between workspace previews so you can control how much of "
-"the adjacent workspaces overlap to the current workspace overview. Default "
-"value should set the adjacent workspaces out of the screen."
-msgstr ""
-"Upraví rozestupy mezi náhledy pracovního prostoru, takže můžete ovládat, jak "
-"velká část sousedních pracovních prostorů se překrývá s aktuálním přehledem "
-"pracovního prostoru. Výchozí hodnota by měla nastavit sousední pracovní "
-"plochy mimo obrazovku."
-
-#: prefs.js:284 prefs.js:712 prefs.js:1072
-msgid "App Grid"
-msgstr "Mřížka aplikace"
-
-#: prefs.js:290
-msgid "Center App Grid"
-msgstr "Vycentrovat mřížku aplikace"
-
-#: prefs.js:291
-msgid ""
-"App grid in app view page will be centered to the display instead of the "
-"available space. This option may have impact on the size of the grid, more "
-"for narrower and small resolution displays, especially if workspace "
-"thumbnails are bigger."
-msgstr ""
-"Mřížka aplikace na stránce zobrazení aplikace bude vystředěna k displeji "
-"místo dostupného místa. Tato možnost může mít vliv na velikost mřížky, spíše "
-"pro užší displeje a displeje s malým rozlišením, zvláště pokud jsou "
-"miniatury pracovního prostoru větší."
-
-#: prefs.js:300
-msgid "Search View"
-msgstr "Zobrazení vyhledávání"
-
-#: prefs.js:306
-msgid "Center Search View"
-msgstr "Vycentrovat zobrazení vyhledávání"
-
-#: prefs.js:307
-msgid ""
-"Search view will be centered to the display instead of the available space."
-msgstr ""
-"Zobrazení vyhledávání bude vystředěno na displej namísto dostupného místa."
-
-#: prefs.js:315
-msgid "Always Show Search Entry"
-msgstr "Vždy zobrazit pole vyhledávání"
-
-#: prefs.js:316
-msgid ""
-"If disabled, the search entry field will be hidden when not in use, so the "
-"workspace preview and app grid may take up more space."
-msgstr ""
-"Pokud je tato možnost zakázána, pole pro zadání vyhledávání bude skryto, "
-"když se nepoužívá, takže náhled pracovního prostoru a mřížka aplikace mohou "
-"zabírat více místa."
-
-#: prefs.js:333
-msgid "Search Results Width"
-msgstr "Šířka výsledků hledání"
-
-#: prefs.js:334
-msgid ""
-"Adjusts maximum width of search results view (% relative to default). This "
-"allows you to fit more (or less) app icons into the app search result."
-msgstr ""
-"Upraví maximální šířku zobrazení výsledků vyhledávání (% vzhledem k "
-"výchozímu nastavení). To vám umožní umístit více (nebo méně) ikon aplikací "
-"do výsledku vyhledávání aplikací."
-
-#: prefs.js:342 prefs.js:1483
-msgid "Panel"
-msgstr "Panel"
-
-#: prefs.js:348
-msgid "Main Panel Position"
-msgstr "Umístění hlavního panelu"
-
-#: prefs.js:349
-msgid "Allows you to place the main panel at the bottom of your monitor."
-msgstr "Umožňuje umístit hlavní panel na spodní část monitoru."
-
-#: prefs.js:354
-msgid "Top (Default)"
-msgstr "Nahoře (výchozí)"
-
-#: prefs.js:362
-msgid "Main Panel Visibility"
-msgstr "Viditelnost hlavního panelu"
-
-#: prefs.js:363
-msgid "Main panel can be visible always, only in the overview or never."
-msgstr "Hlavní panel může být viditelný vždy, pouze v přehledu nebo nikdy."
-
-#: prefs.js:368
-msgid "Always Visible (Default)"
-msgstr "Vždy viditelný (výchozí)"
-
-#: prefs.js:369
-msgid "Overview Only"
-msgstr "Pouze přehled"
-
-#: prefs.js:370
-msgid "Always Hidden"
-msgstr "Vždy skrytý"
-
-#: prefs.js:378
-msgid "Secondary Monitors"
-msgstr "Sekundární monitory"
-
-#: prefs.js:384
-msgid "Workspace Thumbnails Position"
-msgstr "Pozice miniatur pracovního prostoru"
-
-#: prefs.js:385
-msgid ""
-"Allows you to place workspace thumbnails of secondary monitors on the "
-"opposite side than on the primary monitor."
-msgstr ""
-"Umožňuje umístit miniatury pracovního prostoru sekundárních monitorů na "
-"opačnou stranu než na primárním monitoru."
-
-#: prefs.js:390
-msgid "Same as Primary"
-msgstr "Stejné jako primární"
-
-#: prefs.js:391
-msgid "Left / Top"
-msgstr "Vlevo / Nahoře"
-
-#: prefs.js:392
-msgid "Right / Bottom"
-msgstr "Vpravo / Dole"
-
-#: prefs.js:410
-msgid "Adjusts secondary monitors workspace thumbnails vertical position."
-msgstr ""
-"Upravuje vertikální polohu miniatur pracovního prostoru sekundárních "
-"monitorů."
-
-#: prefs.js:428
-msgid ""
-"Adjusts maximum size of the workspace thumbnails (% relative to display "
-"width) for secondary monitors."
-msgstr ""
-"Upravuje maximální velikost miniatur pracovního prostoru (% vzhledem k šířce "
-"zobrazení) pro sekundární monitory."
-
-#: prefs.js:445
-msgid "Workspace Preview Scale"
-msgstr "Měřítko náhledu pracovního prostoru"
-
-#: prefs.js:446
-msgid "Scales down workspace previews on secondary monitors."
-msgstr "Zmenšuje náhledy pracovního prostoru na sekundárních monitorech."
-
-#: prefs.js:454
-msgid "Shift Workspace Preview by Panel Height"
-msgstr "Posunout náhled pracovního prostoru podle výšky panelu"
-
-#: prefs.js:455
-msgid ""
-"This option can help align overview of the secondary monitor with the "
-"primary monitor."
-msgstr ""
-"Tato možnost může pomoci zarovnat přehled sekundárního monitoru s primárním "
-"monitorem."
-
-#: prefs.js:464
-msgid "Workspace Switcher Popup"
-msgstr "Přepínač pracovního prostoru - vyskakovací okno"
-
-#: prefs.js:480
-msgid "Horizontal Position (% from left)"
-msgstr "Horizontální poloha (% zleva)"
-
-#: prefs.js:481
-msgid ""
-"This popup shows up when you switch workspace using a keyboard shortcut or "
-"gesture outside of the overview. You can disable it on the Behavior tab. If "
-"you want more control over the popup, try Workspace Switcher Manager "
-"extension."
-msgstr ""
-"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí "
-"klávesové zkratky nebo gesta mimo přehled. Můžete jej zakázat na kartě "
-"Vlastnosti. Pokud chcete větší kontrolu nad vyskakovacím oknem, vyzkoušejte "
-"rozšíření Workspace Switcher Manager."
-
-#: prefs.js:499
-msgid "Vertical Position (% from top)"
-msgstr "Vertikální pozice (% shora)"
-
-#: prefs.js:523
-msgid "Dash Max Icon Size"
-msgstr "Maximální velikost ikon"
-
-#: prefs.js:524
-msgid "Maximum size of Dash icons in pixels. Works only with default Dash."
-msgstr "Maximální velikost ikon v pixelech. Funguje pouze s výchozím Dash."
-
-#: prefs.js:529 prefs.js:732 prefs.js:752 prefs.js:853
-msgid "128"
-msgstr "128"
-
-#: prefs.js:530 prefs.js:733 prefs.js:753 prefs.js:854
-msgid "112"
-msgstr "112"
-
-#: prefs.js:531 prefs.js:734 prefs.js:754 prefs.js:855
-msgid "96"
-msgstr "96"
-
-#: prefs.js:532 prefs.js:735 prefs.js:755 prefs.js:856
-msgid "80"
-msgstr "80"
-
-#: prefs.js:533 prefs.js:676 prefs.js:736 prefs.js:756 prefs.js:857
-msgid "64"
-msgstr "64"
-
-#: prefs.js:534 prefs.js:677 prefs.js:737 prefs.js:757 prefs.js:858
-msgid "48"
-msgstr "48"
-
-#: prefs.js:535 prefs.js:678 prefs.js:758 prefs.js:859
-msgid "32"
-msgstr "32"
-
-#: prefs.js:536
-msgid "24"
-msgstr "24"
-
-#: prefs.js:537
-msgid "16"
-msgstr "16"
-
-#: prefs.js:551
-msgid "Show Apps Icon Position"
-msgstr "Zobrazit pozici ikony aplikací"
-
-#: prefs.js:552
-msgid "Sets the position of the \"Show Applications\" icon in the Dash."
-msgstr "Nastavuje pozici ikony \"Zobrazit aplikace\"."
-
-#: prefs.js:558 prefs.js:573 prefs.js:588
-msgid "Start"
-msgstr "Začátek"
-
-#: prefs.js:559 prefs.js:574 prefs.js:589
-msgid "End"
-msgstr "Konec"
-
-#: prefs.js:566
-msgid "Open Windows Icon Position"
-msgstr "Pozice ikony „Hledat v otevřených oknech“"
-
-#: prefs.js:567
-msgid ""
-"This option adds \"Search Open Windows\" icon into dash (if window search "
-"provider enabled on the Behavior tab) so you can directly toggle window "
-"search provider results. Even if you disable this icon, you can use the "
-"secondary mouse button click on the Show Apps Icon, or the Space hotkey to "
-"access this feature."
-msgstr ""
-"Tato možnost přidá ikonu „Hledat v otevřených oknech“ (pokud je na kartě "
-"Vlastnosti povolen poskytovatel vyhledávání v okně), takže můžete přímo "
-"přepínat výsledky poskytovatele vyhledávání v okně. I když tuto ikonu "
-"zakážete, můžete pro přístup k této funkci použít sekundární tlačítko myši "
-"na ikonu Zobrazit aplikaci nebo mezerník."
-
-#: prefs.js:581
-msgid "Recent Files Icon Position"
-msgstr "Pozice ikony „Hledat v posledních souborech“"
-
-#: prefs.js:582
-msgid ""
-"This option adds \"Search Recent Files\" icon into dash (if recent files "
-"search provider enabled on the Behavior tab) so you can directly toggle "
-"recent files search provider results. Even if you disable this icon, you can "
-"use Ctrl + Space hotkey to access this feature."
-msgstr ""
-"Tato možnost přidá ikonu „Hledat v posledních souborech“ na pomlčku (pokud "
-"je poskytovatel vyhledávání posledních souborů povolen na kartě Vlastnosti), "
-"takže můžete přímo přepínat výsledky poskytovatele vyhledávání posledních "
-"souborů. I když tuto ikonu zakážete, můžete pro přístup k této funkci použít "
-"klávesovou zkratku Ctrl + mezerník."
-
-#: prefs.js:597
-msgid "Dash Background Opacity"
-msgstr "Průhlednost pozadí"
-
-#: prefs.js:598
-msgid "Adjusts the opacity of the dash background."
-msgstr "Upraví průhlednost pozadí."
-
-#: prefs.js:614
-msgid "Dash Background Radius"
-msgstr "Poloměr pozadí"
-
-#: prefs.js:615
-msgid ""
-"Adjusts the border radius of the dash background in pixels. 0 means default "
-"value."
-msgstr "Upraví poloměr okraje pozadí v pixelech. 0 znamená výchozí hodnotu."
-
-#: prefs.js:623 prefs.js:1050
-msgid "Workspace Thumbnails"
-msgstr "Miniatury pracovního prostoru"
-
-#: prefs.js:629
-msgid "Show Workspace Thumbnail Labels"
-msgstr "Zobrazit štítky miniatur pracovního prostoru"
-
-#: prefs.js:630
-msgid ""
-"Each workspace thumbnail can show its index and name (if defined in the "
-"system settings) or name/title of its most recently used app/window."
-msgstr ""
-"Každá miniatura pracovního prostoru může zobrazovat svůj index a název "
-"(pokud je definován v nastavení systému) nebo jméno/název naposledy použité "
-"aplikace/okna."
-
-#: prefs.js:635 prefs.js:680 prefs.js:1001 prefs.js:1062 prefs.js:1260
-#: prefs.js:1278 prefs.js:1296 prefs.js:1331
-msgid "Disable"
-msgstr "Zakázat"
-
-#: prefs.js:636
-msgid "Index"
-msgstr "Index"
-
-#: prefs.js:637
-msgid "Index + WS Name"
-msgstr "Index + Název WS"
-
-#: prefs.js:638
-msgid "Index + App Name"
-msgstr "Index + Název aplikace"
-
-#: prefs.js:639
-msgid "Index + Window Title"
-msgstr "Rejstřík + Název okna"
-
-#: prefs.js:646
-msgid "Show WS Thumbnail Label on Hover"
-msgstr "Zobrazit štítek miniatur WS při umístění kurzoru myši"
-
-#: prefs.js:647
-msgid "Show label only when the mouse pointer hovers over a thumbnail"
-msgstr "Zobrazit popisek pouze tehdy, když ukazatel myši najede na miniaturu"
-
-#: prefs.js:655
-msgid "Show Wallpaper in Workspace Thumbnails"
-msgstr "Zobrazit tapetu v miniaturách pracovního prostoru"
-
-#: prefs.js:656
-msgid "All workspace thumbnails will include the current desktop background."
-msgstr ""
-"Všechny miniatury pracovního prostoru budou obsahovat aktuální pozadí plochy."
-
-#: prefs.js:664
-msgid "Window Preview"
-msgstr "Náhled okna"
-
-#: prefs.js:670
-msgid "Window Preview App Icon Size"
-msgstr "Velikost ikony aplikace náhledu okna"
-
-#: prefs.js:671
-msgid "Default size is 64."
-msgstr "Výchozí velikost je 64."
-
-#: prefs.js:679
-msgid "22"
-msgstr "22"
-
-#: prefs.js:687
-msgid "Always Show Window Titles"
-msgstr "Vždy zobrazovat názvy oken"
-
-#: prefs.js:688
-msgid ""
-"All windows on the workspace preview will show their titles, not only the "
-"one with the mouse pointer."
-msgstr ""
-"Všechna okna v náhledu pracovní plochy budou zobrazovat své názvy, nejen ty "
-"s ukazatelem myši."
-
-#: prefs.js:703
-msgid "Show Workspace Preview Background"
-msgstr "Zobrazit pozadí náhledu pracovní plochy"
-
-#: prefs.js:704
-msgid "Allows you to hide the scaling background of the workspace preview."
-msgstr "Umožňuje skrýt pozadí náhledu pracovní plochy."
-
-#: prefs.js:718
-msgid "Icon Size"
-msgstr "Velikost ikony"
-
-#: prefs.js:719
-msgid ""
-"Allows to force fixed icon size and bypass the default adaptive algorithm."
-msgstr ""
-"Umožňuje vynutit pevnou velikost ikony a obejít výchozí adaptivní algoritmus."
-
-#: prefs.js:724 prefs.js:751
-msgid "Adaptive (Default)"
-msgstr "Adaptivní (výchozí)"
-
-#: prefs.js:725
-msgid "256"
-msgstr "256"
-
-#: prefs.js:726
-msgid "224"
-msgstr "224"
-
-#: prefs.js:727
-msgid "208"
-msgstr "208"
-
-#: prefs.js:728
-msgid "192"
-msgstr "192"
-
-#: prefs.js:729
-msgid "176"
-msgstr "176"
-
-#: prefs.js:730
-msgid "160"
-msgstr "160"
-
-#: prefs.js:731
-msgid "144"
-msgstr "144"
-
-#: prefs.js:745
-msgid "Folder Icon Size"
-msgstr "Velikost ikony složky"
-
-#: prefs.js:746
-msgid ""
-"Allows to disable the default adaptive algorithm and set a fixed size of "
-"icons inside folders."
-msgstr ""
-"Umožňuje zakázat výchozí adaptivní algoritmus a nastavit pevnou velikost "
-"ikon uvnitř složek."
-
-#: prefs.js:766
-msgid "Max App Folder Icon Grid Size"
-msgstr "Maximální velikost mřížky ikony složky aplikace"
-
-#: prefs.js:767
-msgid ""
-"Each folder icon shows (up to) 4 app icons as a preview of the folder "
-"content, this option allows you to increase the number to 9 icons if folder "
-"contains more than 4 or 8 apps. The latter avoids half empty folder icons."
-msgstr ""
-"Každá ikona složky zobrazuje (až) 4 ikony aplikací jako náhled obsahu "
-"složky. Tato možnost umožňuje zvýšit počet na 9 ikon, pokud složka obsahuje "
-"více než 4 nebo 8 aplikací."
-
-#: prefs.js:772
-msgid "2x2 (Default)"
-msgstr "2x2 (výchozí)"
-
-#: prefs.js:773
-msgid "3x3 for 5+ apps"
-msgstr "3x3 pro 5+ aplikací"
-
-#: prefs.js:774
-msgid "3x3 for 9+ apps"
-msgstr "3x3 pro 9+ aplikací"
-
-#: prefs.js:788
-msgid "Columns per Page (0 for adaptive grid)"
-msgstr "Počet sloupců na stránku (0 pro adaptivní mřížku)"
-
-#: prefs.js:789
-msgid ""
-"Number of columns in application grid. If set to 0 (default setting) the "
-"number will be set automatically to fit available height."
-msgstr ""
-"Počet sloupců v mřížce aplikace. Pokud je nastaveno na 0 (výchozí "
-"nastavení), číslo se nastaví automaticky tak, aby odpovídalo dostupné výšce."
-
-#: prefs.js:803
-msgid "Rows per Page (0 for adaptive grid)"
-msgstr "Počet řádků na stránku (0 pro adaptivní mřížku)"
-
-#: prefs.js:804
-msgid ""
-"Number of rows in application grid. If set to 0 (default setting) the number "
-"will be set automatically to fit available height."
-msgstr ""
-"Počet řádků v mřížce aplikace. Pokud je nastaveno na 0 (výchozí nastavení), "
-"číslo se nastaví automaticky tak, aby odpovídalo dostupné výšce."
-
-#: prefs.js:818
-msgid "Folder Columns per Page (0 for adaptive grid)"
-msgstr "Počet sloupců složek na stránku (0 pro adaptivní mřížku)"
-
-#: prefs.js:819
-msgid ""
-"Number of columns in folder grid. If you leave the value on 0, the number of "
-"columns will be calculated to fit all folder icons."
-msgstr ""
-"Počet sloupců v mřížce složek. Pokud ponecháte hodnotu na 0, počet sloupců "
-"se vypočítá tak, aby se vešly všechny ikony složek."
-
-#: prefs.js:833
-msgid "Folder Rows per Page (0 for adaptive grid)"
-msgstr "Počet řádků složek na stránku (0 pro adaptivní mřížku)"
-
-#: prefs.js:834
-msgid ""
-"Number of rows in folder grid. If you leave the value on 0, the number of "
-"rows will be calculated to fit all folder icons."
-msgstr ""
-"Počet řádků v mřížce složek. Pokud ponecháte hodnotu na 0, počet řádků se "
-"vypočítá tak, aby se vešly všechny ikony složek."
-
-#: prefs.js:841 prefs.js:1174 prefs.js:1492
-msgid "Search"
-msgstr "Vyhledávání"
-
-#: prefs.js:847
-msgid "App Search Icon Size"
-msgstr "Velikost ikony vyhledávání aplikací"
-
-#: prefs.js:848
-msgid "Size of results provided by the App Search Provider."
-msgstr "Velikost ikon aplikací ve výsledcích hledání."
-
-#: prefs.js:878
-msgid "Max Search Results Rows"
-msgstr "Maximální počet řádků výsledků hledání"
-
-#: prefs.js:879
-msgid ""
-"Sets the maximum number of rows for result lists of all search providers "
-"except window search provider which always lists all results."
-msgstr "Nastaví maximální počet řádků pro seznamy výsledků všech vyhledávání."
-
-#: prefs.js:888
-msgid "Overview Background"
-msgstr "Přehled - pozadí"
-
-#: prefs.js:894
-msgid "Show Static Background"
-msgstr "Zobrazit statické pozadí"
-
-#: prefs.js:895
-msgid "Show static background wallpaper instead of the solid grey color."
-msgstr "Zobrazit statickou tapetu na pozadí místo šedé barvy."
-
-#: prefs.js:911
-msgid "Blur Window Picker Background"
-msgstr "Rozostření pozadí"
-
-#: prefs.js:912
-msgid "Blur background wallpaper (if enabled) in the window picker view."
-msgstr "Rozostření tapety na pozadí (pokud je povoleno)."
-
-#: prefs.js:928
-msgid "Blur App Grid/Search View Background"
-msgstr "Rozostření pozadí v mřížce aplikací/hledání"
-
-#: prefs.js:929
-msgid ""
-"Blur background wallpaper (if enabled) in the app grid and search results "
-"views."
-msgstr ""
-"Rozostření tapety na pozadí (je-li povoleno) v mřížce aplikace a zobrazení "
-"výsledků vyhledávání."
-
-#: prefs.js:937
-msgid "Smooth Blur Transitions"
-msgstr "Plynulé přechody rozostření"
-
-#: prefs.js:938
-msgid ""
-"Makes blur transitions smoother but can impact overall smoothness of "
-"overview animations."
-msgstr ""
-"Umožňuje hladší přechody rozostření, ale může ovlivnit celkovou plynulost "
-"animací v přehledu."
-
-#: prefs.js:953 prefs.js:980 prefs.js:1002
-msgid "Overview"
-msgstr "Přehled"
-
-#: prefs.js:959
-msgid "Overview Mode"
-msgstr "Režim přehledu"
-
-#: prefs.js:960
-msgid ""
-"The Expose Windows on Hover mode do not expose the workspace preview windows "
-"until the mouse pointer enters any window.\n"
-"The Static Workspace mode does not scale the workspace preview, it only "
-"shows Dash and workspace thumbnails over the desktop. Clicking on a "
-"workspace thumbnail scales the ws preview and exposes its windows like in "
-"the default overview mode."
-msgstr ""
-"Režim Zobrazit okna při najetí myší neodkryje okna náhledu pracovního "
-"prostoru, dokud ukazatel myši nenajede do jakéhokoli okna.\n"
-"Režim Statická pracovní plocha nemění měřítko náhledu pracovní plochy, "
-"zobrazuje pouze Dash a miniatury pracovní plochy. Kliknutím na miniaturu "
-"pracovního prostoru se změní měřítko náhledu ws a zobrazí se jeho okna jako "
-"ve výchozím režimu přehledu."
-
-#: prefs.js:965 prefs.js:1259 prefs.js:1277 prefs.js:1317
-msgid "Default"
-msgstr "Výchozí"
-
-#: prefs.js:966
-msgid "Expose Windows on Hover"
-msgstr "Zobrazit okna při najetí myší"
-
-#: prefs.js:967
-msgid "Static Workspace"
-msgstr "Statická pracovní plocha"
-
-#: prefs.js:974
-msgid "Startup State"
-msgstr "Stav spuštění"
-
-#: prefs.js:975
-msgid "Allows to change the state in which GNOME Shell starts a session."
-msgstr "Umožňuje změnit stav, ve kterém GNOME Shell zahajuje relaci."
-
-#: prefs.js:981
-msgid "Desktop"
-msgstr "Desktop"
-
-#: prefs.js:982 prefs.js:1003
-msgid "Applications"
-msgstr "Aplikace"
-
-#: prefs.js:989
-msgid ""
-"Hot Corner (Install Custom Hot Corners - Extended extension for more options)"
-msgstr ""
-"Hot Corner (nainstalujte Custom Hot Corners - Extended rozšíření pro více "
-"možností)"
-
-#: prefs.js:995
-msgid "Hot corner Action"
-msgstr "Hot Corner Akce"
-
-#: prefs.js:996
-msgid ""
-"Disable or change behavior of hot corner. Holding down the Ctrl key while "
-"hitting the hot corner switches between Overview/Applications actions."
-msgstr ""
-"Zakázat nebo změnit chování Hot Corner. Podržením klávesy Ctrl při stisknutí "
-"Hot Corner se přepíná mezi akcemi Přehled/Aplikace."
-
-#: prefs.js:1010
-msgid "Enable Hot Corner in Full-Screen mode"
-msgstr "Aktivovat Hot Corner v režimu celé obrazovky"
-
-#: prefs.js:1011
-msgid ""
-"If you often work with full-screen applications and want the hot corner to "
-"be usable."
-msgstr ""
-"Pokud často pracujete s celoobrazovkovými aplikacemi a chcete, aby byl Hot "
-"Corner použitelný."
-
-#: prefs.js:1020
-msgid "Show Ripples Animation"
-msgstr "Zobrazit animaci vlnění"
-
-#: prefs.js:1021
-msgid "Ripples animation shows up when you trigger hot corner."
-msgstr "Animace vlnění se zobrazí, když spustíte Hot Corner."
-
-#: prefs.js:1036
-msgid "Dash Icon Click"
-msgstr "Dash - kliknutí na ikonu"
-
-#: prefs.js:1037
-msgid ""
-"if the app you clicked on has more than one window and the recently used "
-"window is not on the current workspace, the overview can switch to the "
-"workspace with the recent window."
-msgstr ""
-"pokud aplikace, na kterou jste klikli, má více než jedno okno a naposledy "
-"použité okno není na aktuální pracovní ploše, přehled se může přepnout na "
-"pracovní plochu s posledním oknem."
-
-#: prefs.js:1042
-msgid "Activate Last Used Window Immediately"
-msgstr "Okamžitě aktivuje naposledy použité okno"
-
-#: prefs.js:1043
-msgid "Switch to Workspace with Recently Used Window"
-msgstr "Přepnout na plochu s naposledy použitým oknem"
-
-#: prefs.js:1056
-msgid "Close Workspace Button"
-msgstr "Tlačítko Zavřít pracovní plochu"
-
-#: prefs.js:1057
-msgid ""
-"The Close Workspace button appears on the workspace thumbnail when you hover "
-"over it and allows you to close all windows on the workspace. You can choose "
-"a safety lock to prevent accidental use."
-msgstr ""
-"Tlačítko Zavřít pracovní plochu se objeví na miniatuře pracovní plochy, když "
-"na ni umístíte ukazatel myši, a umožní vám zavřít všechna okna na pracovní "
-"ploše. Můžete si vybrat bezpečnostní zámek, který zabrání náhodnému použití."
-
-#: prefs.js:1063
-msgid "Single Click"
-msgstr "Jedno kliknutí"
-
-#: prefs.js:1064
-msgid "Double Click"
-msgstr "Dvojité kliknutí"
-
-#: prefs.js:1065
-msgid "Ctrl Key + Click"
-msgstr "Klávesa Ctrl + kliknutí"
-
-#: prefs.js:1078
-msgid "Apps Order"
-msgstr "Pořadí aplikací"
-
-#: prefs.js:1079
-msgid ""
-"Choose sorting method for the app grid. Note that sorting by alphabet and "
-"usage ignores folders."
-msgstr ""
-"Vyberte metodu řazení pro mřížku aplikace. Řazení podle abecedy a použití "
-"ignoruje složky."
-
-#: prefs.js:1084
-msgid "Custom (Default)"
-msgstr "Vlastní (výchozí)"
-
-#: prefs.js:1085
-msgid "Alphabet"
-msgstr "Abeceda"
-
-#: prefs.js:1086
-msgid "Usage"
-msgstr "Použití"
-
-#: prefs.js:1093
-msgid "App Grid Content"
-msgstr "Obsah mřížky aplikací"
-
-#: prefs.js:1094
-msgid ""
-"The default Shell removes favorite apps, this option lets you duplicate them "
-"in the grid or remove also running applications. Option \"Favorites and "
-"Running First\" only works with the Alphabet and Usage sorting."
-msgstr ""
-"Výchozí prostředí Shell odebere oblíbené aplikace, tato možnost vám umožňuje "
-"duplikovat je v mřížce nebo odebrat také spuštěné aplikace. Možnost "
-"„Oblíbené a spuštěné jako první“ funguje pouze s řazením podle abecedy a "
-"použití."
-
-#: prefs.js:1099
-msgid "Include All"
-msgstr "Zahrnout vše"
-
-#: prefs.js:1100
-msgid "Include All - Favorites and Running First"
-msgstr "Zahrnout vše – Oblíbené a Spuštěné jako první"
-
-#: prefs.js:1101
-msgid "Exclude Favorites (Default)"
-msgstr "Vyloučit oblíbené (výchozí)"
-
-#: prefs.js:1102
-msgid "Exclude Running"
-msgstr "Vyloučit spuštěné"
-
-#: prefs.js:1103
-msgid "Exclude Favorites and Running"
-msgstr "Vyloučit Oblíbené a spuštěné"
-
-#: prefs.js:1110
-msgid "Active Icons in Folder Preview"
-msgstr "Aktivní ikony v náhledu složky"
-
-#: prefs.js:1111
-msgid ""
-"If enabled, clicking an app icon in a folder preview directly opens the app "
-"without having to open the folder first. Middle button opens new window of "
-"the app without closing the overview, so you can open multiple apps in a row "
-"on the current workspace and secondary button opens the folder."
-msgstr ""
-"Pokud je tato možnost povolena, kliknutím na ikonu aplikace v náhledu složky "
-"se aplikace otevře přímo, aniž byste museli nejprve otevřít složku. "
-"Prostřední tlačítko otevře nové okno aplikace bez zavření přehledu, takže na "
-"aktuálním pracovním prostoru můžete otevřít více aplikací v řadě a "
-"sekundární tlačítko otevře složku."
-
-#: prefs.js:1120
-msgid "Center Open Folders"
-msgstr "Vycentrovat otevřené složky"
-
-#: prefs.js:1121
-msgid ""
-"App folder may open in the center of the screen or above the source folder "
-"icon."
-msgstr ""
-"Složka aplikace se může otevřít ve středu obrazovky nebo nad ikonou zdrojové "
-"složky."
-
-#: prefs.js:1130
-msgid "Allow Incomplete Pages"
-msgstr "Povolit neúplné stránky"
-
-#: prefs.js:1131
-msgid ""
-"If disabled, icons from the next page (if any) are automatically moved to "
-"fill any empty slot left after an icon was (re)moved (to a folder for "
-"example)."
-msgstr ""
-"Pokud je zakázáno, ikony z další stránky (pokud existují) se automaticky "
-"přesunou tak, aby zaplnily jakýkoli prázdný slot, který zbyl po (znovu) "
-"přesunutí ikony (například do složky)."
-
-#: prefs.js:1140
-msgid "App Labels Behavior"
-msgstr "Chování štítků aplikací"
-
-#: prefs.js:1141
-msgid "Choose how and when to display app names."
-msgstr "Vyberte, jak a kdy se mají zobrazovat názvy aplikací."
-
-#: prefs.js:1146
-msgid "Ellipsized - Expand Selected (Default)"
-msgstr "Zkrácené – rozbalit vybrané (výchozí)"
-
-#: prefs.js:1147
-msgid "Always Expanded"
-msgstr "Vždy rozbalené"
-
-#: prefs.js:1148
-msgid "Hidden - Show Selected Only"
-msgstr "Skryté - zobrazit pouze vybrané"
-
-#: prefs.js:1154
-msgid "Reset App Grid Layout"
-msgstr "Resetovat rozložení mřížky aplikace"
-
-#: prefs.js:1155
-msgid ""
-"Removes all stored app grid icons positions, after the reset icons will be "
-"ordered alphabetically."
-msgstr ""
-"Odebere všechny uložené pozice mřížky aplikací, po resetování budou ikony "
-"seřazeny podle abecedy."
-
-#: prefs.js:1163
-msgid "Remove App Grid Folders"
-msgstr "Odebrat složky mřížky aplikace"
-
-#: prefs.js:1164
-msgid "Removes all folders, folder apps move to root grid."
-msgstr ""
-"Odebere všechny složky, aplikace složek se přesunou do kořenové mřížky."
-
-#: prefs.js:1186
-msgid "Enable Window Search Provider"
-msgstr "Povolit poskytovatele vyhledávání oken"
-
-#: prefs.js:1187
-msgid ""
-"Activates the window search provider that adds open windows to the search "
-"results. You can search app names and window titles. You can also use \"wq/"
-"\" prefix to suppress results from other search providers."
-msgstr ""
-"Aktivuje poskytovatele vyhledávání oken, který do výsledků vyhledávání "
-"přidává otevřená okna. Můžete vyhledávat názvy aplikací a názvy oken. Můžete "
-"také použít předponu „wq/“ k potlačení výsledků od jiných poskytovatelů "
-"vyhledávání."
-
-#: prefs.js:1195
-msgid "Enable Recent Files Search Provider"
-msgstr "Povolit poskytovatele vyhledávání nedávných souborů"
-
-#: prefs.js:1196
-msgid ""
-"Activates the recent files search provider that can be triggered by a dash "
-"icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search entry "
-"field. This option needs File History option enabled in the GNOME Privacy "
-"settings."
-msgstr ""
-"Aktivuje poskytovatele vyhledávání posledních souborů, který lze spustit "
-"ikonou v Dash, klávesovou zkratkou Ctrl + mezerník nebo zadáním předpony "
-"„fq//“ do pole pro zadání vyhledávání. Tato možnost vyžaduje, aby byla v "
-"nastavení ochrany osobních údajů GNOME povolena možnost Historie souborů."
-
-#: prefs.js:1204
-msgid "Enable Fuzzy Match"
-msgstr "Povolit neúplnou shodu"
-
-#: prefs.js:1205
-msgid ""
-"Enabling the fuzzy match allows you to skip letters in the pattern you are "
-"searching for and find \"Firefox\" even if you type \"ffx\". Works only for "
-"the App, Window and Recent files search providers."
-msgstr ""
-"Povolení neúplné shody vám umožní přeskočit písmena v řetězci, který hledáte "
-"(například najde \"Firefox\", i když zadáte \"ffx\"). Funguje pouze pro "
-"poskytovatele vyhledávání aplikací, oken a posledních souborů."
-
-#: prefs.js:1223
-msgid "Animations - General"
-msgstr "Animace - Obecné"
-
-#: prefs.js:1238
-msgid "Animation Speed"
-msgstr "Rychlost animace"
-
-#: prefs.js:1239
-msgid ""
-"Adjusts the global animation speed in % of the default duration - higher "
-"value means slower animation."
-msgstr ""
-"Upraví globální rychlost animace v % u výchozí doby trvání – vyšší hodnota "
-"znamená pomalejší animaci."
-
-#: prefs.js:1247
-msgid "Animations - Overview"
-msgstr "Animace – přehled"
-
-#: prefs.js:1253
-msgid "App Grid Animation"
-msgstr "Animace mřížky aplikací"
-
-#: prefs.js:1254
-msgid ""
-"When entering the App Grid view, the app grid animates from the edge of the "
-"screen. You can choose direction, keep it Default (direction will be chosen "
-"automatically) or disable the animation if you don't like it."
-msgstr ""
-"Mřížka aplikací se animuje od okraje obrazovky. Můžete si vybrat směr, "
-"ponechat výchozí (směr bude vybrán automaticky) nebo vypnout animaci, pokud "
-"se vám nelíbí."
-
-#: prefs.js:1261 prefs.js:1279
-msgid "Right to Left"
-msgstr "Zprava doleva"
-
-#: prefs.js:1262 prefs.js:1280
-msgid "Left to Right"
-msgstr "Zleva doprava"
-
-#: prefs.js:1263 prefs.js:1281
-msgid "Bottom to Top"
-msgstr "Zespodu nahoru"
-
-#: prefs.js:1264 prefs.js:1282
-msgid "Top to Bottom"
-msgstr "Zhora dolů"
-
-#: prefs.js:1271
-msgid "Search View Animation"
-msgstr "Animace zobrazení vyhledávání"
-
-#: prefs.js:1272
-msgid ""
-"When search is activated the search view with search results can animate "
-"from the edge of the screen. You can choose direction, keep it Default "
-"(currently Bottom to Top) or disable the animation if you don't like it."
-msgstr ""
-"Když je aktivováno vyhledávání, zobrazení vyhledávání s výsledky vyhledávání "
-"se může animovat od okraje obrazovky. Můžete si vybrat směr, ponechat "
-"výchozí (aktuálně zdola nahoru) nebo zakázat animaci, pokud se vám nelíbí."
-
-#: prefs.js:1290
-msgid "Workspace Preview Animation"
-msgstr "Animace náhledu pracovního prostoru"
-
-#: prefs.js:1291
-msgid ""
-"When entering / leaving the App Grid / Search view, the workspace preview "
-"can animate to/from workspace thumbnail."
-msgstr ""
-"Při vstupu / opuštění mřížky aplikací / vyhledávání se náhled pracovního "
-"prostoru může animovat do/z miniatury pracovního prostoru."
-
-#: prefs.js:1297
-msgid "Enable"
-msgstr "Povolit"
-
-#: prefs.js:1305
-msgid "Workspace Switcher"
-msgstr "Přepínač pracovního prostoru"
-
-#: prefs.js:1311
-msgid "Workspace Switcher Animation"
-msgstr "Animace"
-
-#: prefs.js:1312
-msgid ""
-"Allows you to disable movement of the desktop background during workspace "
-"switcher animation outside of the overview. The Static Background mode also "
-"keeps Conky and desktop icons on their place during switching."
-msgstr ""
-"Umožňuje zakázat pohyb pozadí plochy během animace přepínače pracovního "
-"prostoru mimo přehled. Režim Statické pozadí také udržuje ikony Conky a "
-"plochy na svém místě během přepínání."
-
-#: prefs.js:1318
-msgid "Static Background"
-msgstr "Statické pozadí"
-
-#: prefs.js:1325
-msgid "Workspace Switcher Popup Mode"
-msgstr "Vyskakovací režim přepínače pracovní plochy"
-
-#: prefs.js:1326
-msgid ""
-"This popup shows up when you switch workspace using a keyboard shortcut or "
-"gesture outside of the overview. You can to disable the popup at all, or "
-"show it on the current monitor (the one with mouse pointer) instead of the "
-"primary."
-msgstr ""
-"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí "
-"klávesové zkratky nebo gesta mimo přehled. Vyskakovací okno můžete úplně "
-"zakázat nebo jej zobrazit na aktuálním monitoru (na tom s ukazatelem myši) "
-"místo na primárním."
-
-#: prefs.js:1332
-msgid "Show on Primary Monitor (Default)"
-msgstr "Zobrazit na primárním monitoru (výchozí)"
-
-#: prefs.js:1333
-msgid "Show on Current Monitor"
-msgstr "Zobrazit na aktuálním monitoru"
-
-#: prefs.js:1341
-msgid "Notifications"
-msgstr "Oznámení"
-
-#: prefs.js:1347
-msgid "Notification Banner Position"
-msgstr "Pozice oznamovacího banneru"
-
-#: prefs.js:1348
-msgid "Choose where the notification pop-ups appear on the screen."
-msgstr "Vyberte, kde se na obrazovce zobrazí vyskakovací okna."
-
-#: prefs.js:1353
-msgid "Top Left"
-msgstr "Nahoře vlevo"
-
-#: prefs.js:1354
-msgid "Top Middle"
-msgstr "Nahoře uprostřed"
-
-#: prefs.js:1355
-msgid "Top Right (Default)"
-msgstr "Nahoře vpravo (výchozí)"
-
-#: prefs.js:1356
-msgid "Bottom Left"
-msgstr "Dole vlevo"
-
-#: prefs.js:1357
-msgid "Bottom Middle"
-msgstr "Dole uprostřed"
-
-#: prefs.js:1358
-msgid "Bottom Right"
-msgstr "Dole vpravo"
-
-#: prefs.js:1365
-msgid "Window Attention Handler"
-msgstr "Okno - vyžádání pozornosti"
-
-#: prefs.js:1366
-msgid ""
-"When a window requires attention (often a new window), GNOME Shell shows you "
-"a notification about it. You can disable popups of these messages "
-"(notification will be pushed into the message tray silently) or focus the "
-"source window immediately instead."
-msgstr ""
-"Když okno vyžaduje pozornost (často nové okno), GNOME Shell vám o tom "
-"zobrazí upozornění. Můžete deaktivovat vyskakovací okna těchto zpráv "
-"(oznámení bude do panelu zpráv vloženo tiše) nebo místo toho okamžitě "
-"zvýrazní zdrojové okno."
-
-#: prefs.js:1371 prefs.js:1386
-msgid "Show Notifications (Default)"
-msgstr "Zobrazit oznámení (výchozí)"
-
-#: prefs.js:1372
-msgid "Disable Notification Popups"
-msgstr "Zakázat vyskakovací okna s upozorněním"
-
-#: prefs.js:1373
-msgid "Immediately Focus Window"
-msgstr "Okamžitě zvýraznit okno"
-
-#: prefs.js:1380
-msgid "Favorites"
-msgstr "Oblíbené"
-
-#: prefs.js:1381
-msgid "Disable pin/unpin app notifications."
-msgstr "Zakázat upozornění aplikací připnout/odepnout."
-
-#: prefs.js:1387
-msgid "Disable Notifications"
-msgstr "Zakázat oznámení"
-
-#: prefs.js:1402
-msgid "Keyboard"
-msgstr "Klávesnice"
-
-#: prefs.js:1408
-msgid "Override Page Up/Down Shortcuts"
-msgstr "Přepsat zkratky Page Up/Down"
-
-#: prefs.js:1409
-msgid ""
-"This option automatically overrides the (Shift +) Super + Page Up/Down "
-"keyboard shortcuts for the current workspace orientation. If you encounter "
-"any issues, check the configuration in the dconf editor."
-msgstr ""
-"Tato možnost automaticky přepíše klávesové zkratky (Shift +) Super + Page Up/"
-"Down pro aktuální orientaci pracovního prostoru. Pokud narazíte na nějaké "
-"problémy, zkontrolujte konfiguraci v editoru dconf."
-
-#: prefs.js:1417
-msgid "Compatibility"
-msgstr "Kompatibilita"
-
-#: prefs.js:1423
-msgid "Fix for Dash to Dock"
-msgstr "Oprava pro Dash to Dock"
-
-#: prefs.js:1424
-msgid ""
-"With the default Ubuntu Dock and other Dash To Dock forks, you may "
-"experience issues with Activities overview after you change Dock position or "
-"change monitors configuration. If you are experiencing such issues, try to "
-"enable this option, or (better) disable/replace the dock extension."
-msgstr ""
-"S výchozím dokem Ubuntu a dalšími variantami Dash To Dock můžete zaznamenat "
-"problémy s přehledem aktivit poté, co změníte polohu doku nebo změníte "
-"konfiguraci monitorů. Pokud máte takové problémy, zkuste tuto možnost "
-"povolit nebo (lépe) zakázat/vyměnit rozšíření doku."
-
-#: prefs.js:1432
-msgid ""
-"V-Shell Modules that can be disabled in case of conflict or misbehavior."
-msgstr ""
-"Moduly V-Shell, které lze deaktivovat v případě konfliktu nebo špatného "
-"chování."
-
-#: prefs.js:1438
-msgid "AppFavorites"
-msgstr "Oblíbené aplikace"
-
-#: prefs.js:1439
-msgid "Pin/unpin app notification options."
-msgstr "Možnosti upozornění pro připnutí/odepnutí aplikací."
-
-#: prefs.js:1447
-msgid "AppDisplay / IconGrid"
-msgstr "Zobrazení aplikací / mřížka ikon"
-
-#: prefs.js:1448
-msgid "App grid customization and options."
-msgstr "Přizpůsobení a možnosti mřížky aplikace."
-
-#: prefs.js:1457
-msgid "Dash configuration options and support for vertical orientation."
-msgstr "Možnosti konfigurace Dash a podpora vertikální orientace."
-
-#: prefs.js:1466
-msgid ""
-"Hot corner options, removes right panel barrier that collides with CHC-E "
-"extension."
-msgstr ""
-"Možnosti Hot Corner, odstraňuje zábranu pravého panelu, která koliduje s "
-"rozšířením CHC-E."
-
-#: prefs.js:1474
-msgid "MessageTray"
-msgstr "Panel zpráv"
-
-#: prefs.js:1475
-msgid "Notification position options."
-msgstr "Možnosti umístění oznámení."
-
-#: prefs.js:1484
-msgid "Panel options."
-msgstr "Možnosti panelu."
-
-#: prefs.js:1493
-msgid "Search view and app search provider customization and options."
-msgstr ""
-"Zobrazení vyhledávání a přizpůsobení a možnosti poskytovatele vyhledávání "
-"aplikací."
-
-#: prefs.js:1501
-msgid "SwipeTracker"
-msgstr "Sledování gest"
-
-#: prefs.js:1502
-msgid "Gestures for vertical workspace orientation."
-msgstr "Gesta pro vertikální orientaci pracovního prostoru."
-
-#: prefs.js:1510
-msgid "WindowAttentionHandler"
-msgstr "Okno - vyžádání pozornosti"
-
-#: prefs.js:1511
-msgid "Window attention handler options."
-msgstr "Možnosti okna."
-
-#: prefs.js:1519
-msgid "WindowManager"
-msgstr "Správce oken"
-
-#: prefs.js:1520
-msgid ""
-"Fixes an upstream bug in the minimization animation of a full-screen window."
-msgstr "Opravuje chybu v animaci minimalizace okna na celou obrazovku."
-
-#: prefs.js:1528
-msgid "WindowPreview"
-msgstr "Náhled okna"
-
-#: prefs.js:1529
-msgid ""
-"Window preview options, fixes an upstream bug that fills the system log with "
-"errors when you close a window from an overview or exit the overview with a "
-"gesture when any window is selected."
-msgstr ""
-"Možnosti náhledu okna - opravuje chybu, která zaplňuje systémový protokol "
-"chybami, když zavřete okno z přehledu nebo opustíte přehled gestem, když je "
-"vybráno jakékoli okno."
-
-#: prefs.js:1537
-msgid "Workspace"
-msgstr "Pracovní plocha"
-
-#: prefs.js:1538
-msgid ""
-"Fixes workspace preview allocations for vertical workspaces orientation and "
-"window scaling in static overview modes."
-msgstr ""
-"Opravuje přidělení náhledu pracovního prostoru pro vertikální orientaci "
-"pracovních prostorů a měřítko okna v režimech statického přehledu."
-
-#: prefs.js:1546
-msgid "WorkspaceAnimation"
-msgstr "Animace pracovní plochy"
-
-#: prefs.js:1547
-msgid "Static workspace animation option."
-msgstr "Možnost animace statické pracovní plochy."
-
-#: prefs.js:1555
-msgid "WorkspaceSwitcherPopup"
-msgstr "Vyskakovací přepínač pracovní plochy"
-
-#: prefs.js:1556
-msgid "Workspace switcher popup position options."
-msgstr "Možnosti vyskakovací pozice přepínače pracovní plochy."
-
-#: prefs.js:1573
-msgid "Version"
-msgstr "Verze"
-
-#: prefs.js:1579
-msgid "Reset all options"
-msgstr "Obnovit všechny možnosti"
-
-#: prefs.js:1580
-msgid "Set all options to default values."
-msgstr "Nastavte všechny možnosti na výchozí hodnoty."
-
-#: prefs.js:1586
-msgid "Links"
-msgstr "Odkazy"
-
-#: prefs.js:1590
-msgid "Homepage"
-msgstr "Domovská stránka"
-
-#: prefs.js:1591
-msgid "Source code and more info about this extension"
-msgstr "Zdrojový kód a další informace o tomto rozšíření"
-
-#: prefs.js:1596
-msgid "Changelog"
-msgstr "Seznam změn"
-
-#: prefs.js:1597
-msgid "See what's changed."
-msgstr "Podívejte se, co se změnilo."
-
-#: prefs.js:1602
-msgid "GNOME Extensions"
-msgstr "Rozšíření GNOME"
-
-#: prefs.js:1603
-msgid "Rate and comment the extension on GNOME Extensions site."
-msgstr "Ohodnoťte a okomentujte rozšíření na webu GNOME Extensions."
-
-#: prefs.js:1608
-msgid "Report a bug or suggest new feature"
-msgstr "Nahlaste chybu nebo navrhněte novou funkci"
-
-#: prefs.js:1614
-msgid "Buy Me a Coffee"
-msgstr "Kupte mi kávu"
-
-#: prefs.js:1615
-msgid "If you like this extension, you can help me with my coffee expenses."
-msgstr ""
-"Pokud se vám toto rozšíření líbí, můžete mi pomoci s mými výdaji na kávu."
-
-#: recentFilesSearchProvider.js:109
-msgid "Search recent files"
-msgstr "Prohledat nedávné soubory"
-
-#: recentFilesSearchProvider.js:110
-msgid "Recent Files"
-msgstr "Nedávné soubory"
diff --git a/extensions/45/vertical-workspaces/po/vertical-workspaces.pot b/extensions/45/vertical-workspaces/po/vertical-workspaces.pot
deleted file mode 100644
index 44ccddb..0000000
--- a/extensions/45/vertical-workspaces/po/vertical-workspaces.pot
+++ /dev/null
@@ -1,1389 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR GdH
-# This file is distributed under the same license as the vertical-workspaces package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: vertical-workspaces\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-03-08 12:37+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: dash.js:743
-msgid "Search Open Windows (Hotkey: Space)"
-msgstr ""
-
-#: dash.js:816
-msgid "Search Recent Files (Hotkey: Ctrl + Space)"
-msgstr ""
-
-#: windowSearchProvider.js:117 windowSearchProvider.js:119
-msgid "Open Windows"
-msgstr ""
-
-#: windowSearchProvider.js:118
-msgid "List of open windows"
-msgstr ""
-
-#: appDisplay.js:1317
-msgid "Force Quit"
-msgstr ""
-
-#: appDisplay.js:1335
-msgid "Move App to Current Workspace ( Shift + Click )"
-msgstr ""
-
-#: prefs.js:47 prefs.js:1465
-msgid "Layout"
-msgstr ""
-
-#: prefs.js:53
-msgid "Appearance"
-msgstr ""
-
-#: prefs.js:59
-msgid "Behavior"
-msgstr ""
-
-#: prefs.js:65
-msgid "Misc"
-msgstr ""
-
-#: prefs.js:71
-msgid "About"
-msgstr ""
-
-#: prefs.js:119 prefs.js:517 prefs.js:1030 prefs.js:1456
-msgid "Dash"
-msgstr ""
-
-#: prefs.js:125
-msgid "Dash Position"
-msgstr ""
-
-#: prefs.js:131
-msgid "Top"
-msgstr ""
-
-#: prefs.js:132
-msgid "Right"
-msgstr ""
-
-#: prefs.js:133 prefs.js:355
-msgid "Bottom"
-msgstr ""
-
-#: prefs.js:134
-msgid "Left"
-msgstr ""
-
-#: prefs.js:135 prefs.js:393 prefs.js:557 prefs.js:572 prefs.js:587
-msgid "Hide"
-msgstr ""
-
-#: prefs.js:142
-msgid "Center Horizontal Dash to Workspace"
-msgstr ""
-
-#: prefs.js:143
-msgid ""
-"If the Dash Position is set to Top or Bottom, the position will be "
-"recalculated relative to the workspace preview instead of the screen. Works "
-"only with the default Dash."
-msgstr ""
-
-#: prefs.js:160
-msgid "Fine Tune Dash Position"
-msgstr ""
-
-#: prefs.js:161
-msgid ""
-"Adjusts position of the dock on chosen axis. Works only with the default "
-"Dash."
-msgstr ""
-
-#: prefs.js:170
-msgid "Workspace Thumbnails / Orientation"
-msgstr ""
-
-#: prefs.js:176
-msgid "Thumbnails Position / Workspaces Orientation"
-msgstr ""
-
-#: prefs.js:177
-msgid ""
-"Position of the workspace thumbnails on the screen also sets orientation of "
-"the workspaces to vertical or horizontal. You have two options to disable "
-"workspace thumbnails, one sets workspaces to the vertical orientation, the "
-"second one to horizontal."
-msgstr ""
-
-#: prefs.js:183
-msgid "Left \t Vertical Orientation"
-msgstr ""
-
-#: prefs.js:184
-msgid "Right \t Vertical Orientation"
-msgstr ""
-
-#: prefs.js:185
-msgid "Hide \t Set Vertical Orientation"
-msgstr ""
-
-#: prefs.js:186
-msgid "Top \t Horizontal Orientation"
-msgstr ""
-
-#: prefs.js:187
-msgid "Bottom \t Horizontal Orientation"
-msgstr ""
-
-#: prefs.js:188
-msgid "Hide \t Set Horizontal Orientation"
-msgstr ""
-
-#: prefs.js:204 prefs.js:409
-msgid "Fine Tune Workspace Thumbnails Position"
-msgstr ""
-
-#: prefs.js:205
-msgid "Adjusts workspace thumbnails vertical position."
-msgstr ""
-
-#: prefs.js:213
-msgid "Reserve Full Screen Height/Width for Thumbnails"
-msgstr ""
-
-#: prefs.js:214
-msgid ""
-"The whole screen height/width will be reserved for workspace thumbnails at "
-"the expense of space available for Dash (if the Dash is oriented in a "
-"different axis)."
-msgstr ""
-
-#: prefs.js:231 prefs.js:427
-msgid "Workspace Thumbnails Max Scale"
-msgstr ""
-
-#: prefs.js:232
-msgid ""
-"Adjusts maximum size of the workspace thumbnails (% relative to display "
-"width)."
-msgstr ""
-
-#: prefs.js:241 prefs.js:697
-msgid "Workspace Preview"
-msgstr ""
-
-#: prefs.js:256
-msgid "Workspaces Scale"
-msgstr ""
-
-#: prefs.js:257
-msgid ""
-"Scales down workspace previews so you can fit more of the adjacent "
-"workspaces on the screen. Default size is calculated to use all available "
-"space."
-msgstr ""
-
-#: prefs.js:274
-msgid "Workspaces Spacing"
-msgstr ""
-
-#: prefs.js:275
-msgid ""
-"Adjusts spacing between workspace previews so you can control how much of "
-"the adjacent workspaces overlap to the current workspace overview. Default "
-"value should set the adjacent workspaces out of the screen."
-msgstr ""
-
-#: prefs.js:284 prefs.js:712 prefs.js:1072
-msgid "App Grid"
-msgstr ""
-
-#: prefs.js:290
-msgid "Center App Grid"
-msgstr ""
-
-#: prefs.js:291
-msgid ""
-"App grid in app view page will be centered to the display instead of the "
-"available space. This option may have impact on the size of the grid, more "
-"for narrower and small resolution displays, especially if workspace "
-"thumbnails are bigger."
-msgstr ""
-
-#: prefs.js:300
-msgid "Search View"
-msgstr ""
-
-#: prefs.js:306
-msgid "Center Search View"
-msgstr ""
-
-#: prefs.js:307
-msgid ""
-"Search view will be centered to the display instead of the available space."
-msgstr ""
-
-#: prefs.js:315
-msgid "Always Show Search Entry"
-msgstr ""
-
-#: prefs.js:316
-msgid ""
-"If disabled, the search entry field will be hidden when not in use, so the "
-"workspace preview and app grid may take up more space."
-msgstr ""
-
-#: prefs.js:333
-msgid "Search Results Width"
-msgstr ""
-
-#: prefs.js:334
-msgid ""
-"Adjusts maximum width of search results view (% relative to default). This "
-"allows you to fit more (or less) app icons into the app search result."
-msgstr ""
-
-#: prefs.js:342 prefs.js:1483
-msgid "Panel"
-msgstr ""
-
-#: prefs.js:348
-msgid "Main Panel Position"
-msgstr ""
-
-#: prefs.js:349
-msgid "Allows you to place the main panel at the bottom of your monitor."
-msgstr ""
-
-#: prefs.js:354
-msgid "Top (Default)"
-msgstr ""
-
-#: prefs.js:362
-msgid "Main Panel Visibility"
-msgstr ""
-
-#: prefs.js:363
-msgid "Main panel can be visible always, only in the overview or never."
-msgstr ""
-
-#: prefs.js:368
-msgid "Always Visible (Default)"
-msgstr ""
-
-#: prefs.js:369
-msgid "Overview Only"
-msgstr ""
-
-#: prefs.js:370
-msgid "Always Hidden"
-msgstr ""
-
-#: prefs.js:378
-msgid "Secondary Monitors"
-msgstr ""
-
-#: prefs.js:384
-msgid "Workspace Thumbnails Position"
-msgstr ""
-
-#: prefs.js:385
-msgid ""
-"Allows you to place workspace thumbnails of secondary monitors on the "
-"opposite side than on the primary monitor."
-msgstr ""
-
-#: prefs.js:390
-msgid "Same as Primary"
-msgstr ""
-
-#: prefs.js:391
-msgid "Left / Top"
-msgstr ""
-
-#: prefs.js:392
-msgid "Right / Bottom"
-msgstr ""
-
-#: prefs.js:410
-msgid "Adjusts secondary monitors workspace thumbnails vertical position."
-msgstr ""
-
-#: prefs.js:428
-msgid ""
-"Adjusts maximum size of the workspace thumbnails (% relative to display "
-"width) for secondary monitors."
-msgstr ""
-
-#: prefs.js:445
-msgid "Workspace Preview Scale"
-msgstr ""
-
-#: prefs.js:446
-msgid "Scales down workspace previews on secondary monitors."
-msgstr ""
-
-#: prefs.js:454
-msgid "Shift Workspace Preview by Panel Height"
-msgstr ""
-
-#: prefs.js:455
-msgid ""
-"This option can help align overview of the secondary monitor with the "
-"primary monitor."
-msgstr ""
-
-#: prefs.js:464
-msgid "Workspace Switcher Popup"
-msgstr ""
-
-#: prefs.js:480
-msgid "Horizontal Position (% from left)"
-msgstr ""
-
-#: prefs.js:481
-msgid ""
-"This popup shows up when you switch workspace using a keyboard shortcut or "
-"gesture outside of the overview. You can disable it on the Behavior tab. If "
-"you want more control over the popup, try Workspace Switcher Manager "
-"extension."
-msgstr ""
-
-#: prefs.js:499
-msgid "Vertical Position (% from top)"
-msgstr ""
-
-#: prefs.js:523
-msgid "Dash Max Icon Size"
-msgstr ""
-
-#: prefs.js:524
-msgid "Maximum size of Dash icons in pixels. Works only with default Dash."
-msgstr ""
-
-#: prefs.js:529 prefs.js:732 prefs.js:752 prefs.js:853
-msgid "128"
-msgstr ""
-
-#: prefs.js:530 prefs.js:733 prefs.js:753 prefs.js:854
-msgid "112"
-msgstr ""
-
-#: prefs.js:531 prefs.js:734 prefs.js:754 prefs.js:855
-msgid "96"
-msgstr ""
-
-#: prefs.js:532 prefs.js:735 prefs.js:755 prefs.js:856
-msgid "80"
-msgstr ""
-
-#: prefs.js:533 prefs.js:676 prefs.js:736 prefs.js:756 prefs.js:857
-msgid "64"
-msgstr ""
-
-#: prefs.js:534 prefs.js:677 prefs.js:737 prefs.js:757 prefs.js:858
-msgid "48"
-msgstr ""
-
-#: prefs.js:535 prefs.js:678 prefs.js:758 prefs.js:859
-msgid "32"
-msgstr ""
-
-#: prefs.js:536
-msgid "24"
-msgstr ""
-
-#: prefs.js:537
-msgid "16"
-msgstr ""
-
-#: prefs.js:551
-msgid "Show Apps Icon Position"
-msgstr ""
-
-#: prefs.js:552
-msgid "Sets the position of the \"Show Applications\" icon in the Dash."
-msgstr ""
-
-#: prefs.js:558 prefs.js:573 prefs.js:588
-msgid "Start"
-msgstr ""
-
-#: prefs.js:559 prefs.js:574 prefs.js:589
-msgid "End"
-msgstr ""
-
-#: prefs.js:566
-msgid "Open Windows Icon Position"
-msgstr ""
-
-#: prefs.js:567
-msgid ""
-"This option adds \"Search Open Windows\" icon into dash (if window search "
-"provider enabled on the Behavior tab) so you can directly toggle window "
-"search provider results. Even if you disable this icon, you can use the "
-"secondary mouse button click on the Show Apps Icon, or the Space hotkey to "
-"access this feature."
-msgstr ""
-
-#: prefs.js:581
-msgid "Recent Files Icon Position"
-msgstr ""
-
-#: prefs.js:582
-msgid ""
-"This option adds \"Search Recent Files\" icon into dash (if recent files "
-"search provider enabled on the Behavior tab) so you can directly toggle "
-"recent files search provider results. Even if you disable this icon, you can "
-"use Ctrl + Space hotkey to access this feature."
-msgstr ""
-
-#: prefs.js:597
-msgid "Dash Background Opacity"
-msgstr ""
-
-#: prefs.js:598
-msgid "Adjusts the opacity of the dash background."
-msgstr ""
-
-#: prefs.js:614
-msgid "Dash Background Radius"
-msgstr ""
-
-#: prefs.js:615
-msgid ""
-"Adjusts the border radius of the dash background in pixels. 0 means default "
-"value."
-msgstr ""
-
-#: prefs.js:623 prefs.js:1050
-msgid "Workspace Thumbnails"
-msgstr ""
-
-#: prefs.js:629
-msgid "Show Workspace Thumbnail Labels"
-msgstr ""
-
-#: prefs.js:630
-msgid ""
-"Each workspace thumbnail can show its index and name (if defined in the "
-"system settings) or name/title of its most recently used app/window."
-msgstr ""
-
-#: prefs.js:635 prefs.js:680 prefs.js:1001 prefs.js:1062 prefs.js:1260
-#: prefs.js:1278 prefs.js:1296 prefs.js:1331
-msgid "Disable"
-msgstr ""
-
-#: prefs.js:636
-msgid "Index"
-msgstr ""
-
-#: prefs.js:637
-msgid "Index + WS Name"
-msgstr ""
-
-#: prefs.js:638
-msgid "Index + App Name"
-msgstr ""
-
-#: prefs.js:639
-msgid "Index + Window Title"
-msgstr ""
-
-#: prefs.js:646
-msgid "Show WS Thumbnail Label on Hover"
-msgstr ""
-
-#: prefs.js:647
-msgid "Show label only when the mouse pointer hovers over a thumbnail"
-msgstr ""
-
-#: prefs.js:655
-msgid "Show Wallpaper in Workspace Thumbnails"
-msgstr ""
-
-#: prefs.js:656
-msgid "All workspace thumbnails will include the current desktop background."
-msgstr ""
-
-#: prefs.js:664
-msgid "Window Preview"
-msgstr ""
-
-#: prefs.js:670
-msgid "Window Preview App Icon Size"
-msgstr ""
-
-#: prefs.js:671
-msgid "Default size is 64."
-msgstr ""
-
-#: prefs.js:679
-msgid "22"
-msgstr ""
-
-#: prefs.js:687
-msgid "Always Show Window Titles"
-msgstr ""
-
-#: prefs.js:688
-msgid ""
-"All windows on the workspace preview will show their titles, not only the "
-"one with the mouse pointer."
-msgstr ""
-
-#: prefs.js:703
-msgid "Show Workspace Preview Background"
-msgstr ""
-
-#: prefs.js:704
-msgid "Allows you to hide the scaling background of the workspace preview."
-msgstr ""
-
-#: prefs.js:718
-msgid "Icon Size"
-msgstr ""
-
-#: prefs.js:719
-msgid ""
-"Allows to force fixed icon size and bypass the default adaptive algorithm."
-msgstr ""
-
-#: prefs.js:724 prefs.js:751
-msgid "Adaptive (Default)"
-msgstr ""
-
-#: prefs.js:725
-msgid "256"
-msgstr ""
-
-#: prefs.js:726
-msgid "224"
-msgstr ""
-
-#: prefs.js:727
-msgid "208"
-msgstr ""
-
-#: prefs.js:728
-msgid "192"
-msgstr ""
-
-#: prefs.js:729
-msgid "176"
-msgstr ""
-
-#: prefs.js:730
-msgid "160"
-msgstr ""
-
-#: prefs.js:731
-msgid "144"
-msgstr ""
-
-#: prefs.js:745
-msgid "Folder Icon Size"
-msgstr ""
-
-#: prefs.js:746
-msgid ""
-"Allows to disable the default adaptive algorithm and set a fixed size of "
-"icons inside folders."
-msgstr ""
-
-#: prefs.js:766
-msgid "Max App Folder Icon Grid Size"
-msgstr ""
-
-#: prefs.js:767
-msgid ""
-"Each folder icon shows (up to) 4 app icons as a preview of the folder "
-"content, this option allows you to increase the number to 9 icons if folder "
-"contains more than 4 or 8 apps. The latter avoids half empty folder icons."
-msgstr ""
-
-#: prefs.js:772
-msgid "2x2 (Default)"
-msgstr ""
-
-#: prefs.js:773
-msgid "3x3 for 5+ apps"
-msgstr ""
-
-#: prefs.js:774
-msgid "3x3 for 9+ apps"
-msgstr ""
-
-#: prefs.js:788
-msgid "Columns per Page (0 for adaptive grid)"
-msgstr ""
-
-#: prefs.js:789
-msgid ""
-"Number of columns in application grid. If set to 0 (default setting) the "
-"number will be set automatically to fit available height."
-msgstr ""
-
-#: prefs.js:803
-msgid "Rows per Page (0 for adaptive grid)"
-msgstr ""
-
-#: prefs.js:804
-msgid ""
-"Number of rows in application grid. If set to 0 (default setting) the number "
-"will be set automatically to fit available height."
-msgstr ""
-
-#: prefs.js:818
-msgid "Folder Columns per Page (0 for adaptive grid)"
-msgstr ""
-
-#: prefs.js:819
-msgid ""
-"Number of columns in folder grid. If you leave the value on 0, the number of "
-"columns will be calculated to fit all folder icons."
-msgstr ""
-
-#: prefs.js:833
-msgid "Folder Rows per Page (0 for adaptive grid)"
-msgstr ""
-
-#: prefs.js:834
-msgid ""
-"Number of rows in folder grid. If you leave the value on 0, the number of "
-"rows will be calculated to fit all folder icons."
-msgstr ""
-
-#: prefs.js:841 prefs.js:1174 prefs.js:1492
-msgid "Search"
-msgstr ""
-
-#: prefs.js:847
-msgid "App Search Icon Size"
-msgstr ""
-
-#: prefs.js:848
-msgid "Size of results provided by the App Search Provider."
-msgstr ""
-
-#: prefs.js:878
-msgid "Max Search Results Rows"
-msgstr ""
-
-#: prefs.js:879
-msgid ""
-"Sets the maximum number of rows for result lists of all search providers "
-"except window search provider which always lists all results."
-msgstr ""
-
-#: prefs.js:888
-msgid "Overview Background"
-msgstr ""
-
-#: prefs.js:894
-msgid "Show Static Background"
-msgstr ""
-
-#: prefs.js:895
-msgid "Show static background wallpaper instead of the solid grey color."
-msgstr ""
-
-#: prefs.js:911
-msgid "Blur Window Picker Background"
-msgstr ""
-
-#: prefs.js:912
-msgid "Blur background wallpaper (if enabled) in the window picker view."
-msgstr ""
-
-#: prefs.js:928
-msgid "Blur App Grid/Search View Background"
-msgstr ""
-
-#: prefs.js:929
-msgid ""
-"Blur background wallpaper (if enabled) in the app grid and search results "
-"views."
-msgstr ""
-
-#: prefs.js:937
-msgid "Smooth Blur Transitions"
-msgstr ""
-
-#: prefs.js:938
-msgid ""
-"Makes blur transitions smoother but can impact overall smoothness of "
-"overview animations."
-msgstr ""
-
-#: prefs.js:953 prefs.js:980 prefs.js:1002
-msgid "Overview"
-msgstr ""
-
-#: prefs.js:959
-msgid "Overview Mode"
-msgstr ""
-
-#: prefs.js:960
-msgid ""
-"The Expose Windows on Hover mode do not expose the workspace preview windows "
-"until the mouse pointer enters any window.\n"
-"The Static Workspace mode does not scale the workspace preview, it only "
-"shows Dash and workspace thumbnails over the desktop. Clicking on a "
-"workspace thumbnail scales the ws preview and exposes its windows like in "
-"the default overview mode."
-msgstr ""
-
-#: prefs.js:965 prefs.js:1259 prefs.js:1277 prefs.js:1317
-msgid "Default"
-msgstr ""
-
-#: prefs.js:966
-msgid "Expose Windows on Hover"
-msgstr ""
-
-#: prefs.js:967
-msgid "Static Workspace"
-msgstr ""
-
-#: prefs.js:974
-msgid "Startup State"
-msgstr ""
-
-#: prefs.js:975
-msgid "Allows to change the state in which GNOME Shell starts a session."
-msgstr ""
-
-#: prefs.js:981
-msgid "Desktop"
-msgstr ""
-
-#: prefs.js:982 prefs.js:1003
-msgid "Applications"
-msgstr ""
-
-#: prefs.js:989
-msgid ""
-"Hot Corner (Install Custom Hot Corners - Extended extension for more options)"
-msgstr ""
-
-#: prefs.js:995
-msgid "Hot corner Action"
-msgstr ""
-
-#: prefs.js:996
-msgid ""
-"Disable or change behavior of hot corner. Holding down the Ctrl key while "
-"hitting the hot corner switches between Overview/Applications actions."
-msgstr ""
-
-#: prefs.js:1010
-msgid "Enable Hot Corner in Full-Screen mode"
-msgstr ""
-
-#: prefs.js:1011
-msgid ""
-"If you often work with full-screen applications and want the hot corner to "
-"be usable."
-msgstr ""
-
-#: prefs.js:1020
-msgid "Show Ripples Animation"
-msgstr ""
-
-#: prefs.js:1021
-msgid "Ripples animation shows up when you trigger hot corner."
-msgstr ""
-
-#: prefs.js:1036
-msgid "Dash Icon Click"
-msgstr ""
-
-#: prefs.js:1037
-msgid ""
-"if the app you clicked on has more than one window and the recently used "
-"window is not on the current workspace, the overview can switch to the "
-"workspace with the recent window."
-msgstr ""
-
-#: prefs.js:1042
-msgid "Activate Last Used Window Immediately"
-msgstr ""
-
-#: prefs.js:1043
-msgid "Switch to Workspace with Recently Used Window"
-msgstr ""
-
-#: prefs.js:1056
-msgid "Close Workspace Button"
-msgstr ""
-
-#: prefs.js:1057
-msgid ""
-"The Close Workspace button appears on the workspace thumbnail when you hover "
-"over it and allows you to close all windows on the workspace. You can choose "
-"a safety lock to prevent accidental use."
-msgstr ""
-
-#: prefs.js:1063
-msgid "Single Click"
-msgstr ""
-
-#: prefs.js:1064
-msgid "Double Click"
-msgstr ""
-
-#: prefs.js:1065
-msgid "Ctrl Key + Click"
-msgstr ""
-
-#: prefs.js:1078
-msgid "Apps Order"
-msgstr ""
-
-#: prefs.js:1079
-msgid ""
-"Choose sorting method for the app grid. Note that sorting by alphabet and "
-"usage ignores folders."
-msgstr ""
-
-#: prefs.js:1084
-msgid "Custom (Default)"
-msgstr ""
-
-#: prefs.js:1085
-msgid "Alphabet"
-msgstr ""
-
-#: prefs.js:1086
-msgid "Usage"
-msgstr ""
-
-#: prefs.js:1093
-msgid "App Grid Content"
-msgstr ""
-
-#: prefs.js:1094
-msgid ""
-"The default Shell removes favorite apps, this option lets you duplicate them "
-"in the grid or remove also running applications. Option \"Favorites and "
-"Running First\" only works with the Alphabet and Usage sorting."
-msgstr ""
-
-#: prefs.js:1099
-msgid "Include All"
-msgstr ""
-
-#: prefs.js:1100
-msgid "Include All - Favorites and Running First"
-msgstr ""
-
-#: prefs.js:1101
-msgid "Exclude Favorites (Default)"
-msgstr ""
-
-#: prefs.js:1102
-msgid "Exclude Running"
-msgstr ""
-
-#: prefs.js:1103
-msgid "Exclude Favorites and Running"
-msgstr ""
-
-#: prefs.js:1110
-msgid "Active Icons in Folder Preview"
-msgstr ""
-
-#: prefs.js:1111
-msgid ""
-"If enabled, clicking an app icon in a folder preview directly opens the app "
-"without having to open the folder first. Middle button opens new window of "
-"the app without closing the overview, so you can open multiple apps in a row "
-"on the current workspace and secondary button opens the folder."
-msgstr ""
-
-#: prefs.js:1120
-msgid "Center Open Folders"
-msgstr ""
-
-#: prefs.js:1121
-msgid ""
-"App folder may open in the center of the screen or above the source folder "
-"icon."
-msgstr ""
-
-#: prefs.js:1130
-msgid "Allow Incomplete Pages"
-msgstr ""
-
-#: prefs.js:1131
-msgid ""
-"If disabled, icons from the next page (if any) are automatically moved to "
-"fill any empty slot left after an icon was (re)moved (to a folder for "
-"example)."
-msgstr ""
-
-#: prefs.js:1140
-msgid "App Labels Behavior"
-msgstr ""
-
-#: prefs.js:1141
-msgid "Choose how and when to display app names."
-msgstr ""
-
-#: prefs.js:1146
-msgid "Ellipsized - Expand Selected (Default)"
-msgstr ""
-
-#: prefs.js:1147
-msgid "Always Expanded"
-msgstr ""
-
-#: prefs.js:1148
-msgid "Hidden - Show Selected Only"
-msgstr ""
-
-#: prefs.js:1154
-msgid "Reset App Grid Layout"
-msgstr ""
-
-#: prefs.js:1155
-msgid ""
-"Removes all stored app grid icons positions, after the reset icons will be "
-"ordered alphabetically."
-msgstr ""
-
-#: prefs.js:1163
-msgid "Remove App Grid Folders"
-msgstr ""
-
-#: prefs.js:1164
-msgid "Removes all folders, folder apps move to root grid."
-msgstr ""
-
-#: prefs.js:1186
-msgid "Enable Window Search Provider"
-msgstr ""
-
-#: prefs.js:1187
-msgid ""
-"Activates the window search provider that adds open windows to the search "
-"results. You can search app names and window titles. You can also use \"wq/"
-"\" prefix to suppress results from other search providers."
-msgstr ""
-
-#: prefs.js:1195
-msgid "Enable Recent Files Search Provider"
-msgstr ""
-
-#: prefs.js:1196
-msgid ""
-"Activates the recent files search provider that can be triggered by a dash "
-"icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search entry "
-"field. This option needs File History option enabled in the GNOME Privacy "
-"settings."
-msgstr ""
-
-#: prefs.js:1204
-msgid "Enable Fuzzy Match"
-msgstr ""
-
-#: prefs.js:1205
-msgid ""
-"Enabling the fuzzy match allows you to skip letters in the pattern you are "
-"searching for and find \"Firefox\" even if you type \"ffx\". Works only for "
-"the App, Window and Recent files search providers."
-msgstr ""
-
-#: prefs.js:1223
-msgid "Animations - General"
-msgstr ""
-
-#: prefs.js:1238
-msgid "Animation Speed"
-msgstr ""
-
-#: prefs.js:1239
-msgid ""
-"Adjusts the global animation speed in % of the default duration - higher "
-"value means slower animation."
-msgstr ""
-
-#: prefs.js:1247
-msgid "Animations - Overview"
-msgstr ""
-
-#: prefs.js:1253
-msgid "App Grid Animation"
-msgstr ""
-
-#: prefs.js:1254
-msgid ""
-"When entering the App Grid view, the app grid animates from the edge of the "
-"screen. You can choose direction, keep it Default (direction will be chosen "
-"automatically) or disable the animation if you don't like it."
-msgstr ""
-
-#: prefs.js:1261 prefs.js:1279
-msgid "Right to Left"
-msgstr ""
-
-#: prefs.js:1262 prefs.js:1280
-msgid "Left to Right"
-msgstr ""
-
-#: prefs.js:1263 prefs.js:1281
-msgid "Bottom to Top"
-msgstr ""
-
-#: prefs.js:1264 prefs.js:1282
-msgid "Top to Bottom"
-msgstr ""
-
-#: prefs.js:1271
-msgid "Search View Animation"
-msgstr ""
-
-#: prefs.js:1272
-msgid ""
-"When search is activated the search view with search results can animate "
-"from the edge of the screen. You can choose direction, keep it Default "
-"(currently Bottom to Top) or disable the animation if you don't like it."
-msgstr ""
-
-#: prefs.js:1290
-msgid "Workspace Preview Animation"
-msgstr ""
-
-#: prefs.js:1291
-msgid ""
-"When entering / leaving the App Grid / Search view, the workspace preview "
-"can animate to/from workspace thumbnail."
-msgstr ""
-
-#: prefs.js:1297
-msgid "Enable"
-msgstr ""
-
-#: prefs.js:1305
-msgid "Workspace Switcher"
-msgstr ""
-
-#: prefs.js:1311
-msgid "Workspace Switcher Animation"
-msgstr ""
-
-#: prefs.js:1312
-msgid ""
-"Allows you to disable movement of the desktop background during workspace "
-"switcher animation outside of the overview. The Static Background mode also "
-"keeps Conky and desktop icons on their place during switching."
-msgstr ""
-
-#: prefs.js:1318
-msgid "Static Background"
-msgstr ""
-
-#: prefs.js:1325
-msgid "Workspace Switcher Popup Mode"
-msgstr ""
-
-#: prefs.js:1326
-msgid ""
-"This popup shows up when you switch workspace using a keyboard shortcut or "
-"gesture outside of the overview. You can to disable the popup at all, or "
-"show it on the current monitor (the one with mouse pointer) instead of the "
-"primary."
-msgstr ""
-
-#: prefs.js:1332
-msgid "Show on Primary Monitor (Default)"
-msgstr ""
-
-#: prefs.js:1333
-msgid "Show on Current Monitor"
-msgstr ""
-
-#: prefs.js:1341
-msgid "Notifications"
-msgstr ""
-
-#: prefs.js:1347
-msgid "Notification Banner Position"
-msgstr ""
-
-#: prefs.js:1348
-msgid "Choose where the notification pop-ups appear on the screen."
-msgstr ""
-
-#: prefs.js:1353
-msgid "Top Left"
-msgstr ""
-
-#: prefs.js:1354
-msgid "Top Middle"
-msgstr ""
-
-#: prefs.js:1355
-msgid "Top Right (Default)"
-msgstr ""
-
-#: prefs.js:1356
-msgid "Bottom Left"
-msgstr ""
-
-#: prefs.js:1357
-msgid "Bottom Middle"
-msgstr ""
-
-#: prefs.js:1358
-msgid "Bottom Right"
-msgstr ""
-
-#: prefs.js:1365
-msgid "Window Attention Handler"
-msgstr ""
-
-#: prefs.js:1366
-msgid ""
-"When a window requires attention (often a new window), GNOME Shell shows you "
-"a notification about it. You can disable popups of these messages "
-"(notification will be pushed into the message tray silently) or focus the "
-"source window immediately instead."
-msgstr ""
-
-#: prefs.js:1371 prefs.js:1386
-msgid "Show Notifications (Default)"
-msgstr ""
-
-#: prefs.js:1372
-msgid "Disable Notification Popups"
-msgstr ""
-
-#: prefs.js:1373
-msgid "Immediately Focus Window"
-msgstr ""
-
-#: prefs.js:1380
-msgid "Favorites"
-msgstr ""
-
-#: prefs.js:1381
-msgid "Disable pin/unpin app notifications."
-msgstr ""
-
-#: prefs.js:1387
-msgid "Disable Notifications"
-msgstr ""
-
-#: prefs.js:1402
-msgid "Keyboard"
-msgstr ""
-
-#: prefs.js:1408
-msgid "Override Page Up/Down Shortcuts"
-msgstr ""
-
-#: prefs.js:1409
-msgid ""
-"This option automatically overrides the (Shift +) Super + Page Up/Down "
-"keyboard shortcuts for the current workspace orientation. If you encounter "
-"any issues, check the configuration in the dconf editor."
-msgstr ""
-
-#: prefs.js:1417
-msgid "Compatibility"
-msgstr ""
-
-#: prefs.js:1423
-msgid "Fix for Dash to Dock"
-msgstr ""
-
-#: prefs.js:1424
-msgid ""
-"With the default Ubuntu Dock and other Dash To Dock forks, you may "
-"experience issues with Activities overview after you change Dock position or "
-"change monitors configuration. If you are experiencing such issues, try to "
-"enable this option, or (better) disable/replace the dock extension."
-msgstr ""
-
-#: prefs.js:1432
-msgid ""
-"V-Shell Modules that can be disabled in case of conflict or misbehavior."
-msgstr ""
-
-#: prefs.js:1438
-msgid "AppFavorites"
-msgstr ""
-
-#: prefs.js:1439
-msgid "Pin/unpin app notification options."
-msgstr ""
-
-#: prefs.js:1447
-msgid "AppDisplay / IconGrid"
-msgstr ""
-
-#: prefs.js:1448
-msgid "App grid customization and options."
-msgstr ""
-
-#: prefs.js:1457
-msgid "Dash configuration options and support for vertical orientation."
-msgstr ""
-
-#: prefs.js:1466
-msgid ""
-"Hot corner options, removes right panel barrier that collides with CHC-E "
-"extension."
-msgstr ""
-
-#: prefs.js:1474
-msgid "MessageTray"
-msgstr ""
-
-#: prefs.js:1475
-msgid "Notification position options."
-msgstr ""
-
-#: prefs.js:1484
-msgid "Panel options."
-msgstr ""
-
-#: prefs.js:1493
-msgid "Search view and app search provider customization and options."
-msgstr ""
-
-#: prefs.js:1501
-msgid "SwipeTracker"
-msgstr ""
-
-#: prefs.js:1502
-msgid "Gestures for vertical workspace orientation."
-msgstr ""
-
-#: prefs.js:1510
-msgid "WindowAttentionHandler"
-msgstr ""
-
-#: prefs.js:1511
-msgid "Window attention handler options."
-msgstr ""
-
-#: prefs.js:1519
-msgid "WindowManager"
-msgstr ""
-
-#: prefs.js:1520
-msgid ""
-"Fixes an upstream bug in the minimization animation of a full-screen window."
-msgstr ""
-
-#: prefs.js:1528
-msgid "WindowPreview"
-msgstr ""
-
-#: prefs.js:1529
-msgid ""
-"Window preview options, fixes an upstream bug that fills the system log with "
-"errors when you close a window from an overview or exit the overview with a "
-"gesture when any window is selected."
-msgstr ""
-
-#: prefs.js:1537
-msgid "Workspace"
-msgstr ""
-
-#: prefs.js:1538
-msgid ""
-"Fixes workspace preview allocations for vertical workspaces orientation and "
-"window scaling in static overview modes."
-msgstr ""
-
-#: prefs.js:1546
-msgid "WorkspaceAnimation"
-msgstr ""
-
-#: prefs.js:1547
-msgid "Static workspace animation option."
-msgstr ""
-
-#: prefs.js:1555
-msgid "WorkspaceSwitcherPopup"
-msgstr ""
-
-#: prefs.js:1556
-msgid "Workspace switcher popup position options."
-msgstr ""
-
-#: prefs.js:1573
-msgid "Version"
-msgstr ""
-
-#: prefs.js:1579
-msgid "Reset all options"
-msgstr ""
-
-#: prefs.js:1580
-msgid "Set all options to default values."
-msgstr ""
-
-#: prefs.js:1586
-msgid "Links"
-msgstr ""
-
-#: prefs.js:1590
-msgid "Homepage"
-msgstr ""
-
-#: prefs.js:1591
-msgid "Source code and more info about this extension"
-msgstr ""
-
-#: prefs.js:1596
-msgid "Changelog"
-msgstr ""
-
-#: prefs.js:1597
-msgid "See what's changed."
-msgstr ""
-
-#: prefs.js:1602
-msgid "GNOME Extensions"
-msgstr ""
-
-#: prefs.js:1603
-msgid "Rate and comment the extension on GNOME Extensions site."
-msgstr ""
-
-#: prefs.js:1608
-msgid "Report a bug or suggest new feature"
-msgstr ""
-
-#: prefs.js:1614
-msgid "Buy Me a Coffee"
-msgstr ""
-
-#: prefs.js:1615
-msgid "If you like this extension, you can help me with my coffee expenses."
-msgstr ""
-
-#: recentFilesSearchProvider.js:109
-msgid "Search recent files"
-msgstr ""
-
-#: recentFilesSearchProvider.js:110
-msgid "Recent Files"
-msgstr ""
diff --git a/extensions/45/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml b/extensions/45/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml
deleted file mode 100644
index ecaacd1..0000000
--- a/extensions/45/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml
+++ /dev/null
@@ -1,408 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schemalist gettext-domain="vertical-workspaces">
- <schema id="org.gnome.shell.extensions.vertical-workspaces" path="/org/gnome/shell/extensions/vertical-workspaces/">
- <key type="i" name="ws-thumbnails-position">
- <default>0</default>
- </key>
- <key type="b" name="ws-thumbnails-full">
- <default>false</default>
- </key>
- <key type="i" name="secondary-ws-thumbnails-position">
- <default>2</default>
- </key>
- <key type="i" name="ws-max-spacing">
- <default>350</default>
- </key>
- <key type="i" name="ws-preview-scale">
- <default>95</default>
- </key>
- <key type="i" name="secondary-ws-preview-scale">
- <default>100</default>
- </key>
- <key type="b" name="secondary-ws-preview-shift">
- <default>false</default>
- </key>
- <key type="i" name="dash-position">
- <default>2</default>
- </key>
- <key type="i" name="dash-position-adjust">
- <default>0</default>
- </key>
- <key type="i" name="show-app-icon-position">
- <default>1</default>
- </key>
- <key type="i" name="dash-show-windows-icon">
- <default>1</default>
- </key>
- <key type="i" name="dash-show-recent-files-icon">
- <default>1</default>
- </key>
- <key type="i" name="dash-show-extensions-icon">
- <default>1</default>
- </key>
- <key type="i" name="wst-position-adjust">
- <default>0</default>
- </key>
- <key type="i" name="show-wst-labels">
- <default>3</default>
- </key>
- <key type="b" name="show-wst-labels-on-hover">
- <default>false</default>
- </key>
- <key type="i" name="sec-wst-position-adjust">
- <default>0</default>
- </key>
- <key type="i" name="close-ws-button-mode">
- <default>2</default>
- </key>
- <key type="b" name="center-dash-to-ws">
- <default>false</default>
- </key>
- <key type="b" name="show-search-entry">
- <default>false</default>
- </key>
- <key type="b" name="center-search">
- <default>true</default>
- </key>
- <key type="b" name="center-app-grid">
- <default>false</default>
- </key>
- <key type="i" name="ws-thumbnail-scale">
- <default>13</default>
- </key>
- <key type="i" name="ws-thumbnail-scale-appgrid">
- <default>13</default>
- </key>
- <key type="i" name="secondary-ws-thumbnail-scale">
- <default>13</default>
- </key>
- <key type="i" name="dash-max-icon-size">
- <default>48</default>
- </key>
- <key type="i" name="dash-bg-opacity">
- <default>85</default>
- </key>
- <key type="i" name="dash-bg-color">
- <default>0</default>
- </key>
- <key type="i" name="dash-bg-radius">
- <default>18</default>
- </key>
- <key type="b" name="dash-bg-gs3-style">
- <default>true</default>
- </key>
- <key type="i" name="running-dot-style">
- <default>1</default>
- </key>
- <key type="b" name="enable-page-shortcuts">
- <default>false</default>
- </key>
- <key type="b" name="show-ws-switcher-bg">
- <default>true</default>
- </key>
- <key type="b" name="show-ws-preview-bg">
- <default>false</default>
- </key>
- <key type="i" name="ws-preview-bg-radius">
- <default>30</default>
- </key>
- <key type="b" name="show-bg-in-overview">
- <default>true</default>
- </key>
- <key type="i" name="overview-bg-blur-sigma">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-bg-blur-sigma">
- <default>40</default>
- </key>
- <key type="i" name="overview-bg-brightness">
- <default>60</default>
- </key>
- <key type="i" name="search-bg-brightness">
- <default>30</default>
- </key>
- <key type="b" name="smooth-blur-transitions">
- <default>false</default>
- </key>
- <key type="i" name="app-grid-animation">
- <default>4</default>
- </key>
- <key type="i" name="search-view-animation">
- <default>0</default>
- </key>
- <key type="i" name="workspace-animation">
- <default>1</default>
- </key>
- <key type="i" name="workspace-switcher-animation">
- <default>1</default>
- </key>
- <key type="i" name="animation-speed-factor">
- <default>100</default>
- </key>
- <key type="i" name="win-preview-icon-size">
- <default>1</default>
- </key>
- <key type="i" name="win-title-position">
- <default>0</default>
- </key>
- <key type="i" name="startup-state">
- <default>2</default>
- </key>
- <key type="i" name="overview-mode">
- <default>0</default>
- </key>
- <key type="i" name="search-icon-size">
- <default>96</default>
- </key>
- <key type="i" name="search-width-scale">
- <default>104</default>
- </key>
- <key type="i" name="app-grid-icon-size">
- <default>-1</default>
- </key>
- <key type="i" name="app-grid-columns">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-rows">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-order">
- <default>0</default>
- </key>
- <key type="i" name="app-folder-order">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-content">
- <default>2</default>
- </key>
- <key type="i" name="app-grid-folder-icon-size">
- <default>-1</default>
- </key>
- <key type="i" name="app-grid-folder-columns">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-folder-rows">
- <default>0</default>
- </key>
- <key type="i" name="app-grid-spacing">
- <default>12</default>
- </key>
- <key type="b" name="app-grid-incomplete-pages">
- <default>true</default>
- </key>
- <key type="i" name="app-grid-names">
- <default>1</default>
- </key>
- <key type="i" name="app-grid-folder-icon-grid">
- <default>3</default>
- </key>
- <key type="b" name="app-grid-active-preview">
- <default>false</default>
- </key>
- <key type="b" name="app-grid-folder-center">
- <default>false</default>
- </key>
- <key type="i" name="app-grid-page-width-scale">
- <default>90</default>
- </key>
- <key type="i" name="dash-show-windows-before-activation">
- <default>1</default>
- </key>
- <key type="i" name="dash-icon-scroll">
- <default>1</default>
- </key>
- <key type="b" name="dash-isolate-workspaces">
- <default>false</default>
- </key>
- <key type="i" name="search-windows-icon-scroll">
- <default>1</default>
- </key>
- <key type="b" name="search-windows-enable">
- <default>true</default>
- </key>
- <key type="i" name="search-windows-order">
- <default>1</default>
- </key>
- <key type="b" name="search-fuzzy">
- <default>false</default>
- </key>
- <key type="i" name="search-max-results-rows">
- <default>5</default>
- </key>
- <key type="i" name="panel-visibility">
- <default>0</default>
- </key>
- <key type="i" name="panel-position">
- <default>0</default>
- </key>
- <key type="i" name="window-attention-mode">
- <default>0</default>
- </key>
- <key type="i" name="ws-sw-popup-h-position">
- <default>50</default>
- </key>
- <key type="i" name="ws-sw-popup-v-position">
- <default>95</default>
- </key>
- <key type="i" name="ws-sw-popup-mode">
- <default>1</default>
- </key>
- <key type="b" name="ws-switcher-wraparound">
- <default>false</default>
- </key>
- <key type="b" name="ws-switcher-ignore-last">
- <default>false</default>
- </key>
- <key type="i" name="favorites-notify">
- <default>1</default>
- </key>
- <key type="i" name="notification-position">
- <default>2</default>
- </key>
- <key type="i" name="osd-position">
- <default>6</default>
- </key>
- <key type="i" name="hot-corner-action">
- <default>1</default>
- </key>
- <key type="i" name="hot-corner-position">
- <default>6</default>
- </key>
- <key type="b" name="hot-corner-fullscreen">
- <default>true</default>
- </key>
- <key type="b" name="hot-corner-ripples">
- <default>true</default>
- </key>
- <key type="b" name="always-activate-selected-window">
- <default>false</default>
- </key>
- <key type="i" name="win-preview-sec-mouse-btn-action">
- <default>2</default>
- </key>
- <key type="i" name="win-preview-mid-mouse-btn-action">
- <default>0</default>
- </key>
- <key type="b" name="win-preview-show-close-button">
- <default>true</default>
- </key>
- <key type="i" name="window-icon-click-action">
- <default>1</default>
- </key>
- <key type="i" name="overlay-key-primary">
- <default>1</default>
- </key>
- <key type="i" name="overlay-key-secondary">
- <default>1</default>
- </key>
- <key type="i" name="overview-esc-behavior">
- <default>0</default>
- </key>
- <key type="b" name="new-window-focus-fix">
- <default>false</default>
- </key>
- <key type="b" name="app-grid-performance">
- <default>true</default>
- </key>
- <key type="i" name="window-thumbnail-scale">
- <default>15</default>
- </key>
-
- <key type="b" name="workspace-switcher-popup-module">
- <default>true</default>
- </key>
- <key type="b" name="workspace-animation-module">
- <default>true</default>
- </key>
- <key type="b" name="workspace-module">
- <default>true</default>
- </key>
- <key type="b" name="window-manager-module">
- <default>true</default>
- </key>
- <key type="b" name="window-preview-module">
- <default>true</default>
- </key>
- <key type="b" name="win-attention-handler-module">
- <default>true</default>
- </key>
- <key type="b" name="window-thumbnail-module">
- <default>true</default>
- </key>
- <key type="b" name="swipe-tracker-module">
- <default>true</default>
- </key>
- <key type="b" name="search-controller-module">
- <default>true</default>
- </key>
- <key type="b" name="search-module">
- <default>true</default>
- </key>
- <key type="b" name="panel-module">
- <default>true</default>
- </key>
- <key type="b" name="overlay-key-module">
- <default>true</default>
- </key>
- <key type="b" name="osd-window-module">
- <default>true</default>
- </key>
- <key type="b" name="message-tray-module">
- <default>true</default>
- </key>
- <key type="b" name="layout-module">
- <default>true</default>
- </key>
- <key type="b" name="dash-module">
- <default>true</default>
- </key>
- <key type="b" name="app-display-module">
- <default>true</default>
- </key>
- <key type="b" name="app-favorites-module">
- <default>true</default>
- </key>
- <key type="b" name="window-search-provider-module">
- <default>true</default>
- </key>
- <key type="b" name="recent-files-search-provider-module">
- <default>false</default>
- </key>
- <key type="b" name="extensions-search-provider-module">
- <default>true</default>
- </key>
-
- <key type="b" name="aaa-loading-profile">
- <default>false</default>
- </key>
-
- <key type="s" name="profile-name-1">
- <default>""</default>
- </key>
- <key type="a{ss}" name="profile-data-1">
- <default>{'workspaceThumbnailsPosition': '1', 'wsMaxSpacing': '350', 'wsPreviewScale': '95', 'secWsPreviewScale': '100', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', 'dashPosition': '3', 'dashPositionAdjust': '0', 'wsTmbPositionAdjust': '-80', 'showWsTmbLabels': '3', 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '-80', 'dashMaxIconSize': '64', 'dashShowWindowsIcon': '2', 'dashShowRecentFilesIcon': '2', 'dashShowExtensionsIcon': '2', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '13', 'wsThumbnailScaleAppGrid': '13', 'secWsThumbnailScale': '13', 'showSearchEntry': 'true', 'centerSearch': 'true', 'centerAppGrid': 'true', 'dashBgOpacity': '80', 'dashBgColor': '0', 'dashBgRadius': '0', 'dashBgGS3Style': 'true', 'runningDotStyle': '1', 'enablePageShortcuts': 'false', 'showWsSwitcherBg': 'true', 'showWsPreviewBg': 'false', 'wsPreviewBgRadius': '30', 'showBgInOverview': 'true', 'overviewBgBrightness': '30', 'searchBgBrightness': '30', 'overviewBgBlurSigma': '0', 'appGridBgBlurSigma': '40', 'smoothBlurTransitions': 'false', 'appGridAnimation': '4', 'searchViewAnimation': '0', 'workspaceAnimation': '1', 'animationSpeedFactor': '100', 'winPreviewIconSize': '1', 'winTitlePosition': '0', 'startupState': '0', 'overviewMode': '0', 'workspaceSwitcherAnimation': '1', 'searchIconSize': '96', 'searchViewScale': '104', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', 'appGridFolderIconSize': '-1', 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '2', 'appGridContent': '2', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', 'appGridNamesMode': '1', 'appGridActivePreview': 'false', 'appGridFolderCenter': 'false', 'appGridPageWidthScale': '100', 'appGridSpacing': '12', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', 'searchWindowsIconScroll': '1', 'panelVisibility': '0', 'panelPosition': '0', 'windowAttentionMode': '0', 'wsSwPopupHPosition': '50', 'wsSwPopupVPosition': '95', 'wsSwPopupMode': '1', 'wsSwitcherWraparound': 'false', 'wsSwitcherIgnoreLast': 'false', 'favoritesNotify': '1', 'notificationPosition': '1', 'osdPosition': '6', 'hotCornerAction': '1', 'hotCornerPosition': '0', 'hotCornerFullscreen': 'true', 'hotCornerRipples': 'true', 'alwaysActivateSelectedWindow': 'false', 'winPreviewSecBtnAction': '3', 'winPreviewMidBtnAction': '1', 'winPreviewShowCloseButton': 'true', 'windowIconClickAction': '1', 'overlayKeyPrimary': '1', 'overlayKeySecondary': '1', 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'appGridPerformance': 'true', 'windowThumbnailScale': '20', 'workspaceSwitcherPopupModule': 'true', 'workspaceAnimationModule': 'true', 'workspaceModule': 'true', 'windowManagerModule': 'true', 'windowPreviewModule': 'true', 'windowAttentionHandlerModule': 'true', 'windowThumbnailModule': 'true', 'swipeTrackerModule': 'true', 'searchControllerModule': 'true', 'searchModule': 'true', 'panelModule': 'true', 'overlayKeyModule': 'true', 'osdWindowModule': 'true', 'messageTrayModule': 'true', 'layoutModule': 'true', 'dashModule': 'true', 'appFavoritesModule': 'true', 'appDisplayModule': 'true', 'windowSearchProviderModule': 'true', 'extensionsSearchProviderModule': 'true'}</default>
- </key>
-
- <key type="s" name="profile-name-2">
- <default>""</default>
- </key>
- <key type="a{ss}" name="profile-data-2">
- <default>{'workspaceThumbnailsPosition': '5', 'wsMaxSpacing': '80', 'wsPreviewScale': '100', 'secWsPreviewScale': '100', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', 'dashPosition': '2', 'dashPositionAdjust': '0', 'wsTmbPositionAdjust': '0', 'showWsTmbLabels': '0', 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '0', 'dashMaxIconSize': '64', 'dashShowWindowsIcon': '2', 'dashShowRecentFilesIcon': '2', 'dashShowExtensionsIcon': '2', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '5', 'wsThumbnailScaleAppGrid': '15', 'secWsThumbnailScale': '5', 'showSearchEntry': 'true', 'centerSearch': 'true', 'centerAppGrid': 'true', 'dashBgOpacity': '20', 'dashBgColor': '1', 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'false', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', 'showBgInOverview': 'true', 'overviewBgBrightness': '50', 'searchBgBrightness': '30', 'overviewBgBlurSigma': '50', 'appGridBgBlurSigma': '40', 'smoothBlurTransitions': 'false', 'appGridAnimation': '4', 'searchViewAnimation': '4', 'workspaceAnimation': '1', 'animationSpeedFactor': '100', 'winPreviewIconSize': '1', 'winTitlePosition': '0', 'startupState': '0', 'overviewMode': '0', 'workspaceSwitcherAnimation': '0', 'searchIconSize': '96', 'searchViewScale': '104', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', 'appGridFolderIconSize': '-1', 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '2', 'appGridContent': '2', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', 'appGridNamesMode': '1', 'appGridActivePreview': 'false', 'appGridFolderCenter': 'true', 'appGridPageWidthScale': '90', 'appGridSpacing': '12', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', 'searchWindowsIconScroll': '1', 'panelVisibility': '0', 'panelPosition': '0', 'windowAttentionMode': '0', 'wsSwPopupHPosition': '50', 'wsSwPopupVPosition': '95', 'wsSwPopupMode': '1', 'wsSwitcherWraparound': 'false', 'wsSwitcherIgnoreLast': 'false', 'favoritesNotify': '1', 'notificationPosition': '1', 'osdPosition': '6', 'hotCornerAction': '1', 'hotCornerPosition': '6', 'hotCornerFullscreen': 'true', 'hotCornerRipples': 'false', 'alwaysActivateSelectedWindow': 'false', 'winPreviewSecBtnAction': '2', 'winPreviewMidBtnAction': '1', 'winPreviewShowCloseButton': 'true', 'windowIconClickAction': '1', 'overlayKeyPrimary': '1', 'overlayKeySecondary': '1', 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'appGridPerformance': 'true', 'windowThumbnailScale': '20', 'workspaceSwitcherPopupModule': 'true', 'workspaceAnimationModule': 'true', 'workspaceModule': 'true', 'windowManagerModule': 'true', 'windowPreviewModule': 'true', 'windowAttentionHandlerModule': 'true', 'windowThumbnailModule': 'true', 'swipeTrackerModule': 'true', 'searchControllerModule': 'true', 'searchModule': 'true', 'panelModule': 'true', 'overlayKeyModule': 'true', 'osdWindowModule': 'true', 'messageTrayModule': 'true', 'layoutModule': 'true', 'dashModule': 'true', 'appFavoritesModule': 'true', 'appDisplayModule': 'true', 'windowSearchProviderModule': 'true', 'extensionsSearchProviderModule': 'true'}</default>
- </key>
-
- <key type="s" name="profile-name-3">
- <default>""</default>
- </key>
- <key type="a{ss}" name="profile-data-3">
- <default>{'workspaceThumbnailsPosition': '0', 'wsMaxSpacing': '350', 'wsPreviewScale': '95', 'secWsPreviewScale': '100', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', 'dashPosition': '0', 'dashPositionAdjust': '-100', 'wsTmbPositionAdjust': '-100', 'showWsTmbLabels': '3', 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '0', 'dashMaxIconSize': '48', 'dashShowWindowsIcon': '1', 'dashShowRecentFilesIcon': '1', 'dashShowExtensionsIcon': '1', 'centerDashToWs': 'false', 'showAppsIconPosition': '0', 'wsThumbnailScale': '13', 'wsThumbnailScaleAppGrid': '13', 'secWsThumbnailScale': '13', 'showSearchEntry': 'false', 'centerSearch': 'true', 'centerAppGrid': 'false', 'dashBgOpacity': '20', 'dashBgColor': '1', 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'false', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', 'showBgInOverview': 'true', 'overviewBgBrightness': '60', 'searchBgBrightness': '30', 'overviewBgBlurSigma': '30', 'appGridBgBlurSigma': '80', 'smoothBlurTransitions': 'false', 'appGridAnimation': '4', 'searchViewAnimation': '4', 'workspaceAnimation': '1', 'animationSpeedFactor': '100', 'winPreviewIconSize': '1', 'winTitlePosition': '0', 'startupState': '2', 'overviewMode': '1', 'workspaceSwitcherAnimation': '1', 'searchIconSize': '96', 'searchViewScale': '104', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', 'appGridFolderIconSize': '-1', 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '3', 'appGridContent': '0', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', 'appGridNamesMode': '1', 'appGridActivePreview': 'true', 'appGridFolderCenter': 'false', 'appGridPageWidthScale': '90', 'appGridSpacing': '12', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', 'searchWindowsIconScroll': '1', 'panelVisibility': '0', 'panelPosition': '0', 'windowAttentionMode': '0', 'wsSwPopupHPosition': '50', 'wsSwPopupVPosition': '95', 'wsSwPopupMode': '1', 'wsSwitcherWraparound': 'false', 'wsSwitcherIgnoreLast': 'false', 'favoritesNotify': '0', 'notificationPosition': '2', 'osdPosition': '6', 'hotCornerAction': '1', 'hotCornerPosition': '1', 'hotCornerFullscreen': 'true', 'hotCornerRipples': 'true', 'alwaysActivateSelectedWindow': 'false', 'winPreviewSecBtnAction': '2', 'winPreviewMidBtnAction': '1', 'winPreviewShowCloseButton': 'true', 'windowIconClickAction': '1', 'overlayKeyPrimary': '1', 'overlayKeySecondary': '1', 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'appGridPerformance': 'true', 'windowThumbnailScale': '20', 'workspaceSwitcherPopupModule': 'true', 'workspaceAnimationModule': 'true', 'workspaceModule': 'true', 'windowManagerModule': 'true', 'windowPreviewModule': 'true', 'windowAttentionHandlerModule': 'true', 'windowThumbnailModule': 'true', 'swipeTrackerModule': 'true', 'searchControllerModule': 'true', 'searchModule': 'true', 'panelModule': 'true', 'overlayKeyModule': 'true', 'osdWindowModule': 'true', 'messageTrayModule': 'true', 'layoutModule': 'true', 'dashModule': 'true', 'appFavoritesModule': 'true', 'appDisplayModule': 'true', 'windowSearchProviderModule': 'true', 'extensionsSearchProviderModule': 'true'}</default>
- </key>
-
- <key type="s" name="profile-name-4">
- <default>""</default>
- </key>
- <key type="a{ss}" name="profile-data-4">
- <default>{'workspaceThumbnailsPosition': '6', 'wsMaxSpacing': '65', 'wsPreviewScale': '95', 'secWsPreviewScale': '100', 'secWsPreviewShift': 'false', 'wsThumbnailsFull': 'false', 'secWsThumbnailsPosition': '2', 'dashPosition': '2', 'dashPositionAdjust': '0', 'wsTmbPositionAdjust': '0', 'showWsTmbLabels': '3', 'showWsTmbLabelsOnHover': 'false', 'closeWsButtonMode': '2', 'secWsTmbPositionAdjust': '0', 'dashMaxIconSize': '48', 'dashShowWindowsIcon': '1', 'dashShowRecentFilesIcon': '1', 'dashShowExtensionsIcon': '1', 'centerDashToWs': 'false', 'showAppsIconPosition': '1', 'wsThumbnailScale': '10', 'wsThumbnailScaleAppGrid': '10', 'secWsThumbnailScale': '10', 'showSearchEntry': 'false', 'centerSearch': 'true', 'centerAppGrid': 'false', 'dashBgOpacity': '100', 'dashBgColor': '0', 'dashBgRadius': '0', 'dashBgGS3Style': 'false', 'runningDotStyle': '1', 'enablePageShortcuts': 'true', 'showWsSwitcherBg': 'true', 'showWsPreviewBg': 'true', 'wsPreviewBgRadius': '30', 'showBgInOverview': 'true', 'overviewBgBrightness': '60', 'searchBgBrightness': '30', 'overviewBgBlurSigma': '80', 'appGridBgBlurSigma': '80', 'smoothBlurTransitions': 'false', 'appGridAnimation': '4', 'searchViewAnimation': '4', 'workspaceAnimation': '1', 'animationSpeedFactor': '100', 'winPreviewIconSize': '1', 'winTitlePosition': '0', 'startupState': '2', 'overviewMode': '2', 'workspaceSwitcherAnimation': '1', 'searchIconSize': '96', 'searchViewScale': '104', 'appGridIconSize': '-1', 'appGridColumns': '0', 'appGridRows': '0', 'appGridFolderIconSize': '-1', 'appGridFolderColumns': '0', 'appGridFolderRows': '0', 'appGridFolderIconGrid': '3', 'appGridContent': '0', 'appGridIncompletePages': 'false', 'appGridOrder': '0', 'appFolderOrder': '0', 'appGridNamesMode': '1', 'appGridActivePreview': 'true', 'appGridFolderCenter': 'false', 'appGridPageWidthScale': '90', 'appGridSpacing': '5', 'searchWindowsOrder': '1', 'searchFuzzy': 'false', 'searchMaxResultsRows': '5', 'dashShowWindowsBeforeActivation': '1', 'dashIconScroll': '1', 'dashIsolateWorkspaces': 'false', 'searchWindowsIconScroll': '1', 'panelVisibility': '0', 'panelPosition': '0', 'windowAttentionMode': '0', 'wsSwPopupHPosition': '50', 'wsSwPopupVPosition': '95', 'wsSwPopupMode': '1', 'wsSwitcherWraparound': 'false', 'wsSwitcherIgnoreLast': 'false', 'favoritesNotify': '0', 'notificationPosition': '1', 'osdPosition': '6', 'hotCornerAction': '1', 'hotCornerPosition': '6', 'hotCornerFullscreen': 'true', 'hotCornerRipples': 'false', 'alwaysActivateSelectedWindow': 'false', 'winPreviewSecBtnAction': '2', 'winPreviewMidBtnAction': '1', 'winPreviewShowCloseButton': 'true', 'windowIconClickAction': '1', 'overlayKeyPrimary': '1', 'overlayKeySecondary': '1', 'overviewEscBehavior': '0', 'newWindowFocusFix': 'false', 'appGridPerformance': 'true', 'windowThumbnailScale': '20', 'workspaceSwitcherPopupModule': 'true', 'workspaceAnimationModule': 'true', 'workspaceModule': 'true', 'windowManagerModule': 'true', 'windowPreviewModule': 'true', 'windowAttentionHandlerModule': 'true', 'windowThumbnailModule': 'true', 'swipeTrackerModule': 'true', 'searchControllerModule': 'true', 'searchModule': 'true', 'panelModule': 'true', 'overlayKeyModule': 'true', 'osdWindowModule': 'true', 'messageTrayModule': 'true', 'layoutModule': 'true', 'dashModule': 'true', 'appFavoritesModule': 'true', 'appDisplayModule': 'true', 'windowSearchProviderModule': 'true', 'extensionsSearchProviderModule': 'true'}</default>
- </key>
-
- </schema>
-</schemalist>
diff --git a/extensions/45/vertical-workspaces/stylesheet.css b/extensions/45/vertical-workspaces/stylesheet.css
deleted file mode 100644
index dca1d29..0000000
--- a/extensions/45/vertical-workspaces/stylesheet.css
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
-* V-Shell (Vertical Workspaces)
-* stylesheet.css
-*/
-
-/* General dash */
-#dash.vertical {
- margin: 0px;
- padding: 0px;
-}
-
-#dash.vertical .app-well-app,
-#dash.vertical .show-apps {
- /* left/right padding exceeds dash bg by 6px to
- cover spacing between dash and the edge of the screen
- so the icons will be selectable even at the edge
- this spacing must be accounted for in overview allocate() */
- padding-right: 16px;
- padding-left: 16px;
- /*spacing between icons*/
- padding-top: 1px;
- padding-bottom: 1px;
- margin: 0px;
-}
-
-#dash.vertical .dash-separator {
- height: 1px;
- margin-right: 2px;
- margin-left: 2px;
- margin-top: 4px;
- margin-bottom: 4px;
- background-color: transparentize(#eeeeec, 0.7);
-}
-
-#dash.vertical .overview-icon {
- padding: 5px 0;
-}
-
-#dash.vertical .app-well-app-running-dot {
- margin: 4px 0px;
-}
-
-#dash.vertical .app-well-app-running-dot-custom {
- margin: 4px 0px;
- width: 2px;
- height: 16px;
-}
-
-#dash.vertical .dash-background {
- margin: 0px;
-}
-
-#dash.vertical-gs3-left .dash-background {
- border-radius: 0 18px 18px 0;
- border-left: 0px;
- padding: 8px 12px 8px 4px;
- margin-left: 0;
-}
-
-#dash.vertical-gs3-right .dash-background {
- border-radius: 18px 0 0 18px;
- border-right: 0px;
- padding: 8px 4px 8px 12px;
- margin-right: 0;
-}
-
-#dash.vertical-gs3-left {
- margin-right: 6px;
- margin-left: 0px;
- padding: 0px;
-}
-
-#dash.vertical-gs3-right {
- margin-right: 0px;
- margin-left: 6px;
- padding: 0px;
-}
-
-#dash.vertical-gs3-left .app-well-app,
-#dash.vertical-gs3-left .show-apps,
-#dash.vertical-gs3-right .app-well-app,
-#dash.vertical-gs3-right .show-apps {
- /* left/right padding exceeds dash bg by 6px to
- cover spacing between dash and the edge of the screen
- so the icons will be selectable even at the edge
- this spacing must be accounted for in overview allocate() */
- padding-right: 9px;
- padding-left: 9px;
-}
-
-.dash-background-light {
- background-color: rgb(200, 200, 200);
- border-color: rgba(150, 150, 150, 0.4);
-}
-
-.dash-background-reduced {
- padding: 10px;
-}
-
-.app-well-app-running-dot {
- margin-bottom: 12px;
-}
-
-.app-well-app-running-dot-custom {
- margin-bottom: 12px;
- width: 16px;
- height: 2px;
-}
-
-
-/* add shadow to the app grid app label to be readable if it overlaps light icon below */
-.overview-icon-with-label, .folder-name-label {
- text-shadow: 1px 1px 3px rgba(33, 33, 33, 0.5);
-}
-
-/* adjustment for the vertical ws switcher indicator popup*/
-.ws-switcher-indicator {
- padding: 3px;
- margin: 5px;
-}
-
-.ws-switcher-indicator:active {
- padding: 5px;
- margin: 3px;
-}
-
-/* ws thumbnails captions */
-.ws-tmb-label {
- padding: 2px;
- color: rgb(255, 255, 255);
- background-color: rgba(40,40,40,0.8);
- text-align: center;
-}
-
-.workspace-thumbnail-indicator {
- border-radius: 6px;
-}
-
-.ws-tmb-labeled {
- border: 0px;
-}
-
-.ws-tmb-transparent {
- border: 0px;
- background-color: rgba(200, 200, 200, 0.2);
-}
-
-/* app grid page indicatos */
-.page-indicator-icon {
- margin: 10px 10px 10px 10px;
-}
-
-.page-indicator {
- padding: 0px;
-}
-
-/* GS 43 App Grid - indicators that show up when dragging icon */
-.prevPageIndicator {
- background: rgba(255, 255, 255, 0.1);
- background-gradient-start: rgba(255, 255, 255, 0.1);
- background-gradient-end: transparent;
- background-gradient-direction: vertical;
- border-radius: 100px 100px 0px 0px;
-}
-.nextPageIndicator {
- background: rgba(255, 255, 255, 0.1);
- background-gradient-start: transparent;
- background-gradient-end: rgba(255, 255, 255, 0.1);
- background-gradient-direction: vertical;
- border-radius: 0px 0px 100px 100px;
-
-}
-/*
-.search-entry{
- background-color: rgba(200, 200, 200, 0.1);
- color: white;
- border-color: rgba(160, 160, 160, 0.4);
-}
-
-.search-entry:hover,
-.search-entry:focus {
- background-color: rgba(200, 200, 200, 0.2);
-}*/
-
-.search-entry-om2 {
- color: white;
- background-color: rgba(40, 40, 40, 1);
-}
-
-.search-entry-om2:hover,
-.search-entry-om2:focus {
- background-color: rgba(50, 50, 50, 1);
-}
-
-/* for static ws mode */
-/*.search-section-content-bg,*/
-.search-section-content-bg-om2 {
- border-radius: 26px;
- border: 1px, rgb(60, 60, 60);
- padding-top: 15px;
-}
-
-.search-section-content-bg-om2 {
- background-color: rgb(40, 40, 40);
-}
-
-.search-section-content {
- background-color: rgba(200, 200, 200, 0.1);
-}
-
-/* "no results" / "searching..." text*/
-.search-statustext, .search-statustext-om2 {
- background-color: rgba(200, 200, 200, 0.1);
- color: white;
- margin-top: 50px;
- padding: 30px;
- border-radius: 20px;
- text-shadow: 0px 0px 5px rgb(23, 23, 23);
-}
-
-.search-statustext-om2 {
- background-color: rgb(40, 40, 40);
- border: 1px rgba(200, 200, 200, 0.1);
-}
-
-#panel:overview, .transparent-panel {
- background-color: transparent;
-}
-
-/* reduce spacing between app icons in search results */
-.grid-search-results {
- spacing: 4px;
-}
-
-/* hide vertical scroll bar, it's distracting in the search results */
-StButton#vhandle {
- background-color: transparent;
-}
-
-.show-apps-icon-horizontal-hide {
- width: 0;
- margin: 0;
- spacing: 0;
-}
-
-.show-apps-icon-vertical-hide {
- height: 0;
- margin: 0;
- spacing: 0;
-}
-
-.workspace-close-button {
- color: white;
- background-color: dimgrey;
- width: 18px;
- height: 18px;
- padding: 2px;
- margin: 2px;
- box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
- border: 0px;
- border-radius: 35px;
-}
-
-.workspace-close-button-hover {
- background-color: rgb(255, 0, 0);
-}
-
-/* ws tmb placeholder */
-.placeholder-vertical {
- background-size: contain;
- height: 18px;
-}
-
-/* reduce size of hot corner ripples to half */
-.ripple-box {
- width: 26px;
- height: 26px;
-}
-
-.osd-window {
- margin: 4em;
-}
-
-.app-folder .overview-icon,
-.edit-folder-button,
-.folder-name-entry {
- background-color: rgba(200, 200, 200, 0.08);
-}
-
-.app-folder-dialog-vshell {
- background-color: rgba(200, 200, 200, 0.08);
-}
-
-.app-folder-dialog {
- border-color: rgba(160, 160, 160, 0.3);
-}
-
-.edit-folder-button:hover,
-.app-folder:hover .overview-icon,
-.app-folder:focus .overview-icon {
- background-color: rgba(200, 200, 200, 0.15);
-}
-
-/* reduce quick menu buttons height in GS44 */
-/*.quick-toggle,
-.quick-menu-toggle {
- min-height: 42px;
-}*/
diff --git a/extensions/45/disable-workspace-switcher.mk b/extensions/47/disable-workspace-switcher.mk
index f522857..5b585dc 100644
--- a/extensions/45/disable-workspace-switcher.mk
+++ b/extensions/47/disable-workspace-switcher.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/disable-workspace-switcher/LICENSE b/extensions/47/disable-workspace-switcher/LICENSE
index f288702..f288702 100644
--- a/extensions/45/disable-workspace-switcher/LICENSE
+++ b/extensions/47/disable-workspace-switcher/LICENSE
diff --git a/extensions/45/disable-workspace-switcher/README.md b/extensions/47/disable-workspace-switcher/README.md
index bae853f..bae853f 100644
--- a/extensions/45/disable-workspace-switcher/README.md
+++ b/extensions/47/disable-workspace-switcher/README.md
diff --git a/extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js b/extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js
index a814f54..a814f54 100644
--- a/extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js
+++ b/extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/extension.js
diff --git a/extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json b/extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json
index 6c83096..4d19032 100644
--- a/extensions/45/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json
+++ b/extensions/47/disable-workspace-switcher/disable-workspace-switcher@jbradaric.me/metadata.json
@@ -5,6 +5,6 @@
"uuid": "disable-workspace-switcher@jbradaric.me",
"url": "https://github.com/jbradaric/disable-workspace-switcher",
"shell-version": [
- "45"
+ "45", "46", "47"
]
}
diff --git a/extensions/45/hibernate-status.mk b/extensions/47/hibernate-status.mk
index 05651b5..b97a0d6 100644
--- a/extensions/45/hibernate-status.mk
+++ b/extensions/47/hibernate-status.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/hibernate-status/.editorconfig b/extensions/47/hibernate-status/.editorconfig
index bf58f2f..bf58f2f 100644
--- a/extensions/45/hibernate-status/.editorconfig
+++ b/extensions/47/hibernate-status/.editorconfig
diff --git a/extensions/45/hibernate-status/.github/workflows/release.yaml b/extensions/47/hibernate-status/.github/workflows/release.yaml
index 80138f9..80138f9 100644
--- a/extensions/45/hibernate-status/.github/workflows/release.yaml
+++ b/extensions/47/hibernate-status/.github/workflows/release.yaml
diff --git a/extensions/45/hibernate-status/.gitignore b/extensions/47/hibernate-status/.gitignore
index 68270f9..68270f9 100644
--- a/extensions/45/hibernate-status/.gitignore
+++ b/extensions/47/hibernate-status/.gitignore
diff --git a/extensions/45/hibernate-status/.prettierrc b/extensions/47/hibernate-status/.prettierrc
index 8da2b4c..8da2b4c 100644
--- a/extensions/45/hibernate-status/.prettierrc
+++ b/extensions/47/hibernate-status/.prettierrc
diff --git a/extensions/45/hibernate-status/LICENSE b/extensions/47/hibernate-status/LICENSE
index d6a9326..d6a9326 100644
--- a/extensions/45/hibernate-status/LICENSE
+++ b/extensions/47/hibernate-status/LICENSE
diff --git a/extensions/45/hibernate-status/Makefile b/extensions/47/hibernate-status/Makefile
index f74ed54..f74ed54 100644
--- a/extensions/45/hibernate-status/Makefile
+++ b/extensions/47/hibernate-status/Makefile
diff --git a/extensions/45/hibernate-status/README.md b/extensions/47/hibernate-status/README.md
index 54d5fad..f356bd7 100644
--- a/extensions/45/hibernate-status/README.md
+++ b/extensions/47/hibernate-status/README.md
@@ -4,7 +4,7 @@ Gnome Shell extension that adds a hibernate/hybrid suspend button in Status menu
Originally developed by [@arelange](https://github.com/arelange) and then [@p91paul](https://github.com/p91paul). Now maintained by [@slaclau](https://github.com/slaclau).
-Supports GNOME 45.
+Supports GNOME 45 and 46.
## FAQ
diff --git a/extensions/45/hibernate-status/buildforupload.sh b/extensions/47/hibernate-status/buildforupload.sh
index d2c705c..d2c705c 100755
--- a/extensions/45/hibernate-status/buildforupload.sh
+++ b/extensions/47/hibernate-status/buildforupload.sh
diff --git a/extensions/45/hibernate-status/extension.js b/extensions/47/hibernate-status/extension.js
index d0c7708..b0a26c7 100644
--- a/extensions/45/hibernate-status/extension.js
+++ b/extensions/47/hibernate-status/extension.js
@@ -219,6 +219,22 @@ export default class HibernateButtonExtension extends Extension {
_updateDefaults() {
console.log("Update defaults");
+ let menuItems = this.systemMenu._systemItem.menu._getMenuItems()
+ for (let menuItem of menuItems) {
+ console.log(menuItem.label.get_text())
+ if ( menuItem.label.get_text() === _('Suspend') ) {
+ console.log(`Show suspend button: ${this._setting.get_boolean('show-suspend')}`)
+ menuItem.visible = this._setting.get_boolean('show-suspend');
+ }
+ if ( menuItem.label.get_text() === _('Restart…') ) {
+ console.log(`Show restart button: ${this._setting.get_boolean('show-restart')}`)
+ menuItem.visible = this._setting.get_boolean('show-restart');
+ }
+ if ( menuItem.label.get_text() === _('Power Off…') ) {
+ console.log(`Show shutdown button: ${this._setting.get_boolean('show-shutdown')}`)
+ menuItem.visible = this._setting.get_boolean('show-shutdown');
+ }
+ }
}
_onHibernateClicked() {
@@ -571,3 +587,4 @@ var ConfirmDialog = GObject.registerClass(
);
const _DIALOG_ICON_SIZE = 32;
+
diff --git a/extensions/45/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po
index 689fee9..689fee9 100644
--- a/extensions/45/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/bg/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po
index 32e541d..32e541d 100644
--- a/extensions/45/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/cs/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po
index 3fdb8c2..3fdb8c2 100644
--- a/extensions/45/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/de/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po
index 92c14bc..92c14bc 100644
--- a/extensions/45/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/es/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po
index e4edef0..e4edef0 100644
--- a/extensions/45/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/fa/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po
index 9dca80d..9dca80d 100644
--- a/extensions/45/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/fr/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po
index 70da5aa..70da5aa 100644
--- a/extensions/45/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/hu/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po
index a41e5ac..a41e5ac 100644
--- a/extensions/45/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/it/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po
index 3146d8a..3146d8a 100644
--- a/extensions/45/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/nl/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po
index 25debf8..25debf8 100644
--- a/extensions/45/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/oc/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po
index 57b735c..57b735c 100644
--- a/extensions/45/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/pl/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po
index 143129c..143129c 100644
--- a/extensions/45/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/pt/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po
index 326481a..326481a 100644
--- a/extensions/45/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/pt_BR/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po
index c55e2c6..c55e2c6 100644
--- a/extensions/45/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/ru/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po
index 68c6b8c..68c6b8c 100644
--- a/extensions/45/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/uk/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po b/extensions/47/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po
index d6a6ebe..d6a6ebe 100644
--- a/extensions/45/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po
+++ b/extensions/47/hibernate-status/locale/zh_CN/LC_MESSAGES/hibernate-status-button.po
diff --git a/extensions/45/hibernate-status/metadata.json b/extensions/47/hibernate-status/metadata.json
index 9947c4b..db14afb 100644
--- a/extensions/45/hibernate-status/metadata.json
+++ b/extensions/47/hibernate-status/metadata.json
@@ -3,7 +3,7 @@
"name": "Hibernate Status Button",
"url": "https://github.com/arelange/gnome-shell-extension-hibernate-status",
"description": "Adds a Hibernate button in Status menu. Using Alt modifier, you can also select Hybrid Sleep instead.",
- "shell-version": ["45"],
+ "shell-version": ["45", "46", "47"],
"gettext-domain": "hibernate-status-button",
"settings-schema": "org.gnome.shell.extensions.hibernate-status-button"
}
diff --git a/extensions/45/hibernate-status/prefs.js b/extensions/47/hibernate-status/prefs.js
index 1407a6b..3a04ca6 100644
--- a/extensions/45/hibernate-status/prefs.js
+++ b/extensions/47/hibernate-status/prefs.js
@@ -101,7 +101,6 @@ export default class Prefs extends ExtensionPreferences {
const suspend_row = new Adw.SwitchRow({
title: __('Suspend'),
- subtitle: __('Not implemented yet'),
});
modes_group.add(suspend_row);
const hibernate_row = new Adw.SwitchRow({
@@ -118,12 +117,10 @@ export default class Prefs extends ExtensionPreferences {
modes_group.add(suspend_then_hibernate_row);
const restart_row = new Adw.SwitchRow({
title: __('Restart...'),
- subtitle: __('Not implemented yet'),
});
modes_group.add(restart_row);
const shutdown_row = new Adw.SwitchRow({
title: __('Shutdown...'),
- subtitle: __('Not implemented yet'),
});
modes_group.add(shutdown_row);
diff --git a/extensions/45/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml b/extensions/47/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml
index 242d9cc..242d9cc 100644
--- a/extensions/45/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml
+++ b/extensions/47/hibernate-status/schemas/org.gnome.shell.extensions.hibernate-status-button.gschema.xml
diff --git a/extensions/45/middleclickclose.mk b/extensions/47/middleclickclose.mk
index 38a3c2b..e774c20 100644
--- a/extensions/45/middleclickclose.mk
+++ b/extensions/47/middleclickclose.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/middleclickclose/.gitignore b/extensions/47/middleclickclose/.gitignore
index cf09213..cf09213 100644
--- a/extensions/45/middleclickclose/.gitignore
+++ b/extensions/47/middleclickclose/.gitignore
diff --git a/extensions/45/middleclickclose/LICENSE b/extensions/47/middleclickclose/LICENSE
index 22fbe5d..22fbe5d 100644
--- a/extensions/45/middleclickclose/LICENSE
+++ b/extensions/47/middleclickclose/LICENSE
diff --git a/extensions/45/middleclickclose/Makefile b/extensions/47/middleclickclose/Makefile
index 8960c95..8960c95 100644
--- a/extensions/45/middleclickclose/Makefile
+++ b/extensions/47/middleclickclose/Makefile
diff --git a/extensions/47/middleclickclose/README.md b/extensions/47/middleclickclose/README.md
new file mode 100644
index 0000000..adcf2f9
--- /dev/null
+++ b/extensions/47/middleclickclose/README.md
@@ -0,0 +1,39 @@
+Quick Close in Overview
+-----------------------
+GNOME shell extension for quickly closing apps in the overview.
+
+[![Download from extensions.gnome.org](img/ego.svg)](https://extensions.gnome.org/extension/352/middle-click-to-close-in-overview/)
+
+## Features
+
+- **Middle click to close**: Just hover over the app you want to close in the overview, and middle
+ click. The mouse button that will trigger closing can be adjusted in the settings.
+- **`Alt+F4` in the overview**: When triggering the close action (typically `Alt+F4`), the focused
+ window will be closed. This can be turned off in the settings.
+- **Adjustable rearrange delay**: After closing an application, GNOME will wait a bit before
+ rearranging the remaining windows. This extension allows configuring that delay.
+
+## Building
+
+Make sure `gettext` is installed on your system and the `gnome-extensions` executable is available
+on your `PATH` (It is typically bundled with `gnome-shell`).
+
+Afterwards, simply run `make` to build a zip suitable for submition to
+[EGO](https://extensions.gnome.org/).
+
+`make install` can also be used to install the extension for the current user.
+
+## Debugging tips & tricks
+
+- `journalctl -f --user` is your friend.
+- `make install && dbus-run-session -- gnome-shell --nested --wayland` allows for quick prototyping
+ without having to log out and back in every single time when running under wayland.
+- `make install`, then `Alt+F2`, `r` and `Enter` allow for quick prototyping under X11.
+
+## Translations
+
+If you're interested in contributing a translation, import the translation template file under
+`src/po/template.pot` to your favourite po-editing software and create a `*.po` file under `src/po`.
+
+To update all existing translations after changing the code, run `make po`. To regenerate only the
+`template.pot` file, run `make pot`.
diff --git a/extensions/47/middleclickclose/img/ego.svg b/extensions/47/middleclickclose/img/ego.svg
new file mode 100644
index 0000000..ae750fa
--- /dev/null
+++ b/extensions/47/middleclickclose/img/ego.svg
@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="60" viewBox="0 0 500 150">
+ <title>Download From EGO</title>
+ <defs>
+ <linearGradient id="grad">
+ <stop offset="0" stop-color="#003eaa" />
+ <stop offset="1" stop-color="#0060df" />
+ </linearGradient>
+ </defs>
+ <rect fill="url(#grad)" width="100%" height="100%" rx="15" />
+
+ <g fill="white">
+ <path d="M 101.068,15 C 76.466,15 71.851,50.041 85.691,50.041 99.529,50.041 125.671,15 101.068,15 Z" />
+ <path d="m 60.217,45.699 c 7.369,0.45 15.454,-28.122 1.604,-26.325 -13.845,1.797 -8.976,25.875 -1.604,26.325 z" />
+ <path d="M 26.445,63.453 C 31.686,61.146 27.12,38.581 18.208,44.735 9.3,50.89 21.204,65.759 26.445,63.453 Z" />
+ <path d="M 41.212,51.642 C 47.451,50.37 47.793,24.778 36.667,29.369 25.539,33.961 34.978,52.916 41.212,51.642 Z" />
+ <path d="m 73.791,108.913 c 1.107,8.454 -6.202,12.629 -13.36,7.179 C 37.644,98.743 98.16,90.088 94.171,66.386 90.86,46.712 30.495,52.769 23.621,83.553 c -4.653,20.821 19.153,49.707 43.993,49.707 12.22,0 26.315,-11.034 28.952,-25.012 2.014,-10.659 -23.699,-6.388 -22.775,0.665 z" />
+
+ <path d="m 137.55613,63.203362 h -8.57342 V 38.824737 h 8.65523 q 3.66498,0 6.29918,1.472535 2.65056,1.456174 4.07401,4.18854 1.42345,2.716011 1.42345,6.511877 0,3.812229 -1.42345,6.544596 -1.42345,2.73237 -4.09037,4.204905 -2.66693,1.456172 -6.36463,1.456172 z m -3.58316,-4.303074 h 3.33774 q 3.51773,0 5.33385,-1.897931 1.81613,-1.897934 1.81613,-6.004668 0,-4.090374 -1.81613,-5.971946 -1.79976,-1.897934 -5.30113,-1.897934 h -3.37046 z m 27.27461,4.663028 q -2.74873,0 -4.7612,-1.178026 -2.01246,-1.19439 -3.10868,-3.305025 -1.07986,-2.126994 -1.07986,-4.941169 0,-2.830539 1.07986,-4.957533 1.09622,-2.126994 3.10868,-3.305021 2.01247,-1.194389 4.7612,-1.194389 2.74873,0 4.76119,1.194389 2.01247,1.178027 3.09233,3.305021 1.09621,2.126994 1.09621,4.957533 0,2.814175 -1.09621,4.941169 -1.07986,2.110635 -3.09233,3.305025 -2.01246,1.178026 -4.76119,1.178026 z m 0,-3.861311 q 1.96338,0 2.96143,-1.587067 0.99805,-1.587066 0.99805,-3.992205 0,-2.421499 -0.99805,-3.992203 -0.99805,-1.587066 -2.96143,-1.587066 -1.96338,0 -2.96143,1.587066 -0.98169,1.570704 -0.98169,3.992203 0,2.405139 0.98169,3.992205 0.99805,1.587067 2.96143,1.587067 z m 15.72339,3.501357 -5.39929,-18.29215 h 5.15387 l 1.58707,6.757299 q 0.32723,1.521617 0.7199,3.272298 0.39268,1.75068 0.76899,3.795865 0.37632,-1.996102 0.78536,-3.746779 0.42539,-1.767044 0.80171,-3.321384 l 1.66887,-6.757299 h 4.51577 l 1.63615,6.757299 q 0.34359,1.55434 0.75263,3.305021 0.4254,1.75068 0.81808,3.779506 0.34359,-2.028826 0.7199,-3.779506 0.37631,-1.750681 0.73627,-3.305021 l 1.58706,-6.757299 h 5.21932 l -5.43202,18.29215 h -4.99025 l -2.02883,-7.051804 q -0.34359,-1.178026 -0.67082,-2.650562 -0.31087,-1.472535 -0.6381,-2.912343 -0.31087,1.439808 -0.6381,2.928707 -0.32722,1.472535 -0.65446,2.634198 l -2.02882,7.051804 z m 29.58159,-10.585887 v 10.585887 h -4.90845 v -18.29215 h 4.6303 l 0.0654,3.779506 q 0.76899,-1.914294 2.17607,-2.96143 1.40709,-1.047135 3.51773,-1.047135 2.84689,0 4.56485,1.832485 1.71796,1.832489 1.71796,5.055701 v 11.633023 h -4.90845 V 52.421138 q 0,-1.701594 -0.88352,-2.666921 -0.86716,-0.965331 -2.4215,-0.965331 -1.5707,0 -2.56875,1.014413 -0.98169,0.998053 -0.98169,2.814176 z m 20.8609,-13.792738 v 24.378625 h -4.90845 V 38.824737 Z m 12.35293,24.738579 q -2.74873,0 -4.7612,-1.178026 -2.01246,-1.19439 -3.10868,-3.305025 -1.07986,-2.126994 -1.07986,-4.941169 0,-2.830539 1.07986,-4.957533 1.09622,-2.126994 3.10868,-3.305021 2.01247,-1.194389 4.7612,-1.194389 2.74873,0 4.76119,1.194389 2.01247,1.178027 3.09232,3.305021 1.09623,2.126994 1.09623,4.957533 0,2.814175 -1.09623,4.941169 -1.07985,2.110635 -3.09232,3.305025 -2.01246,1.178026 -4.76119,1.178026 z m 0,-3.861311 q 1.96338,0 2.96143,-1.587067 0.99805,-1.587066 0.99805,-3.992205 0,-2.421499 -0.99805,-3.992203 -0.99805,-1.587066 -2.96143,-1.587066 -1.96338,0 -2.96143,1.587066 -0.98169,1.570704 -0.98169,3.992203 0,2.405139 0.98169,3.992205 0.99805,1.587067 2.96143,1.587067 z m 17.8013,3.861311 q -2.61784,0 -4.35215,-1.374367 -1.73433,-1.390726 -1.73433,-4.106733 0,-2.045186 0.9817,-3.206853 0.98169,-1.161667 2.55239,-1.701594 1.5707,-0.539931 3.37047,-0.703545 2.35605,-0.229063 3.38683,-0.474485 1.04713,-0.261782 1.04713,-1.161664 v -0.08181 q 0,-1.161667 -0.75263,-1.799766 -0.73627,-0.638096 -2.11063,-0.638096 -1.42345,0 -2.29061,0.621737 -0.86716,0.605376 -1.16166,1.488894 l -4.49942,-0.752627 q 0.70355,-2.372416 2.79782,-3.681338 2.11063,-1.308917 5.17023,-1.308917 1.96338,0 3.73042,0.621736 1.7834,0.621736 2.89599,1.996103 1.12894,1.358003 1.12894,3.583165 v 12.320205 h -4.64666 v -2.53603 h -0.16362 q -0.67082,1.276195 -1.9961,2.094271 -1.32528,0.801713 -3.35411,0.801714 z m 1.39073,-3.452275 q 1.71796,0 2.79781,-0.998053 1.09623,-0.99805 1.09623,-2.454222 v -1.979743 q -0.29451,0.2127 -0.96533,0.376317 -0.65446,0.147251 -1.39073,0.278146 -0.73627,0.114527 -1.2762,0.179977 -1.358,0.196336 -2.19244,0.768986 -0.83443,0.572654 -0.83443,1.668876 0,1.063495 0.76899,1.619785 0.78535,0.539931 1.9961,0.539931 z m 19.65015,3.403189 q -2.11063,0 -3.79586,-1.079858 -1.68524,-1.096218 -2.68329,-3.190489 -0.98169,-2.110635 -0.98169,-5.153873 0,-3.125044 1.01441,-5.219315 1.01442,-2.094271 2.69965,-3.141407 1.68523,-1.047135 3.71406,-1.047135 1.55434,0 2.58512,0.523567 1.03077,0.523568 1.65251,1.292559 0.6381,0.76899 0.96532,1.488894 h 0.16362 v -9.162436 h 4.90845 v 24.378625 h -4.82664 v -2.928707 h -0.24543 q -0.34359,0.736268 -0.98169,1.488895 -0.63809,0.736267 -1.66887,1.243476 -1.03077,0.507204 -2.51967,0.507204 z m 1.50526,-3.94312 q 1.86521,0 2.89598,-1.505258 1.03078,-1.505254 1.03078,-3.992202 0,-2.486948 -1.03078,-3.975842 -1.01441,-1.488899 -2.89598,-1.488899 -1.93066,0 -2.92871,1.537981 -0.99805,1.521621 -0.99805,3.92676 0,2.421499 0.99805,3.95948 1.01442,1.53798 2.92871,1.53798 z m 31.03775,-14.659898 v 3.746783 H 307.323 v 14.545367 h -4.89209 V 48.657995 h -3.22322 v -3.746783 h 3.22322 v -1.407086 q 0,-2.912348 1.70159,-4.368521 1.7016,-1.456172 4.23763,-1.456172 1.16167,0 2.11063,0.179976 0.94897,0.179976 1.40709,0.32723 l -0.88352,3.697698 q -0.2945,-0.08181 -0.73627,-0.163614 -0.4254,-0.08181 -0.89988,-0.08181 -1.12894,0 -1.58706,0.539931 -0.45812,0.523568 -0.45812,1.488895 v 1.243472 z m 3.15777,18.29215 v -18.29215 h 4.74484 v 3.190493 h 0.19633 q 0.50721,-1.685235 1.68524,-2.552394 1.19439,-0.883522 2.73237,-0.883522 0.83443,0 1.58706,0.163618 v 4.384879 q -0.32723,-0.09817 -0.96532,-0.163614 -0.62174,-0.08181 -1.16167,-0.08181 -1.7016,0 -2.81418,1.063499 -1.09622,1.063495 -1.09622,2.76509 v 10.40591 z m 21.00816,0.359954 q -2.74873,0 -4.76119,-1.178026 -2.01247,-1.19439 -3.10869,-3.305025 -1.07986,-2.126994 -1.07986,-4.941169 0,-2.830539 1.07986,-4.957533 1.09622,-2.126994 3.10869,-3.305021 2.01246,-1.194389 4.76119,-1.194389 2.74873,0 4.76119,1.194389 2.01247,1.178027 3.09233,3.305021 1.09622,2.126994 1.09622,4.957533 0,2.814175 -1.09622,4.941169 -1.07986,2.110635 -3.09233,3.305025 -2.01246,1.178026 -4.76119,1.178026 z m 0,-3.861311 q 1.96338,0 2.96143,-1.587067 0.99805,-1.587066 0.99805,-3.992205 0,-2.421499 -0.99805,-3.992203 -0.99805,-1.587066 -2.96143,-1.587066 -1.96338,0 -2.96143,1.587066 -0.98169,1.570704 -0.98169,3.992203 0,2.405139 0.98169,3.992205 0.99805,1.587067 2.96143,1.587067 z m 12.36929,3.501357 v -18.29215 h 4.5485 l 0.19633,3.550447 q 0.73627,-1.996103 2.15971,-2.912348 1.42347,-0.916244 3.05961,-0.916244 3.46863,0 4.71213,4.106737 0.76897,-2.110634 2.37239,-3.108684 1.61979,-0.998053 3.50136,-0.998053 2.51968,0 4.17219,1.636149 1.66887,1.619789 1.66887,4.597582 v 12.336564 h -4.9248 v -11.40396 q 0,-1.537981 -0.83443,-2.290608 -0.83447,-0.76899 -2.06158,-0.76899 -1.39071,0 -2.2088,0.883518 -0.8017,0.883522 -0.8017,2.323334 v 11.256706 h -4.74482 V 51.668511 q 0,-1.341644 -0.80174,-2.126994 -0.78533,-0.801713 -2.04516,-0.801713 -1.29257,0 -2.17607,0.883518 -0.88354,0.867159 -0.88354,2.519671 v 11.060369 z" />
+ <path d="m 137.08165,105.4651 q -2.69965,0 -4.66302,-1.16166 -1.96338,-1.16167 -3.02688,-3.27231 -1.04714,-2.110626 -1.04714,-4.957528 0,-2.814176 1.03078,-4.957529 1.04714,-2.143357 2.94507,-3.337747 1.89793,-1.210749 4.45032,-1.210749 2.07791,0 3.94312,0.932604 1.88158,0.916244 3.04324,2.94507 1.17803,2.012462 1.17803,5.317483 v 1.276199 h -12.97466 q 0.0982,2.650561 1.50525,4.057647 1.40709,1.39073 3.64862,1.39073 1.50525,0 2.58511,-0.65446 1.09622,-0.65446 1.5707,-1.930656 l 3.38683,0.801716 q -0.65445,2.14335 -2.65056,3.45227 -1.9961,1.30892 -4.92481,1.30892 z m -5.10478,-11.109452 h 9.39149 q -0.19633,-2.159717 -1.358,-3.484998 -1.1453,-1.32528 -3.22322,-1.32528 -2.15971,0 -3.41955,1.423449 -1.24347,1.407086 -1.39072,3.386829 z m 14.69262,10.733142 6.25009,-9.391502 -5.87378,-8.900652 h 4.05765 l 2.06155,3.321384 q 0.58901,0.965327 1.0635,1.865212 0.47448,0.883518 0.91624,1.717954 0.44176,-0.834436 0.88352,-1.717954 0.45812,-0.899885 1.0635,-1.865212 l 2.11063,-3.321384 h 3.99221 l -5.95559,9.031547 6.23373,9.260607 h -4.04129 l -2.45422,-3.89404 q -0.57265,-0.91624 -1.04714,-1.767041 -0.45812,-0.850796 -0.89988,-1.668872 -0.40904,0.818076 -0.8508,1.668872 -0.44176,0.850801 -1.01441,1.767041 l -2.48695,3.89404 z m 28.56717,-18.292154 v 2.928707 h -3.64862 v 10.422277 q 0,1.09621 0.45812,1.61978 0.47449,0.50721 1.53798,0.50721 0.29451,0 0.73627,-0.0654 0.45812,-0.0654 0.78536,-0.1309 l 0.63809,2.87963 q -0.57265,0.19633 -1.24347,0.27814 -0.65446,0.0982 -1.2762,0.0982 -2.48694,0 -3.86131,-1.2762 -1.37436,-1.29255 -1.37436,-3.61589 V 89.725343 h -2.66693 v -2.928707 h 2.66693 V 82.44448 h 3.59952 v 4.352156 z m 11.14217,18.668464 q -2.69964,0 -4.66302,-1.16166 -1.96338,-1.16167 -3.02688,-3.27231 -1.04713,-2.110626 -1.04713,-4.957528 0,-2.814176 1.03077,-4.957529 1.04713,-2.143357 2.94507,-3.337747 1.89793,-1.210749 4.45033,-1.210749 2.0779,0 3.94312,0.932604 1.88157,0.916244 3.04323,2.94507 1.17803,2.012462 1.17803,5.317483 v 1.276199 h -12.97467 q 0.0982,2.650561 1.50526,4.057647 1.40709,1.39073 3.64862,1.39073 1.50526,0 2.58511,-0.65446 1.09622,-0.65446 1.57071,-1.930656 l 3.38683,0.801716 q -0.65447,2.14335 -2.65057,3.45227 -1.9961,1.30892 -4.92481,1.30892 z m -5.10478,-11.109452 h 9.3915 q -0.19635,-2.159717 -1.35801,-3.484998 -1.1453,-1.32528 -3.22321,-1.32528 -2.15972,0 -3.41956,1.423449 -1.24347,1.407086 -1.39072,3.386829 z M 201.775,94.25748 v 10.83131 h -3.59953 V 86.796636 h 3.43591 l 0.0164,3.51772 q 0.85079,-1.930653 2.27425,-2.830535 1.4398,-0.916244 3.37046,-0.916244 2.79782,0 4.49941,1.76704 1.71796,1.75068 1.71796,5.137509 v 11.616664 h -3.59953 V 93.913885 q 0,-1.979739 -1.03077,-3.09232 -1.03078,-1.112582 -2.83054,-1.112582 -1.83249,0 -3.04324,1.19439 -1.21075,1.178027 -1.21075,3.354107 z m 23.11879,11.20762 q -2.97779,0 -4.94117,-1.2762 -1.94702,-1.29255 -2.43786,-3.73042 l 3.38683,-0.70354 q 0.73626,2.79782 4.02492,2.79782 1.75068,0 2.76509,-0.71991 1.03078,-0.73627 1.03078,-1.75068 0,-1.73432 -2.56876,-2.30697 l -3.07596,-0.703545 q -5.03934,-1.128944 -5.03934,-5.055701 0,-1.636149 0.89989,-2.863261 0.91624,-1.227113 2.5033,-1.897935 1.60343,-0.687181 3.68134,-0.687181 2.96143,0 4.64667,1.276194 1.68523,1.259836 2.27424,3.288662 l -3.22321,0.703544 q -0.34359,-0.965327 -1.19439,-1.685235 -0.8508,-0.736267 -2.47059,-0.736267 -1.48889,0 -2.48694,0.670822 -0.99805,0.670822 -0.99805,1.701594 0,0.916245 0.65446,1.488899 0.67082,0.55629 2.17607,0.899881 l 2.94507,0.654459 q 4.99026,1.128944 4.99026,4.941173 0,1.668867 -0.96533,2.961427 -0.94897,1.2762 -2.65056,2.01247 -1.7016,0.7199 -3.92676,0.7199 z m 11.48577,-0.37631 V 86.796636 h 3.59953 v 18.292154 z m 1.81612,-21.08997 q -0.9326,0 -1.60342,-0.621736 -0.65446,-0.621736 -0.65446,-1.505258 0,-0.899881 0.65446,-1.521617 0.67082,-0.621737 1.60342,-0.621737 0.93261,0 1.60343,0.621737 0.67082,0.621736 0.67082,1.521617 0,0.883522 -0.67082,1.505258 -0.67082,0.621736 -1.60343,0.621736 z m 14.31631,21.46628 q -2.56875,0 -4.49941,-1.17803 -1.91429,-1.17802 -2.97779,-3.28866 -1.0635,-2.126992 -1.0635,-4.957531 0,-2.846898 1.0635,-4.973892 1.0635,-2.143357 2.97779,-3.321384 1.93066,-1.178026 4.49941,-1.178026 2.58512,0 4.49941,1.178026 1.93066,1.178027 2.99415,3.321384 1.0635,2.126994 1.0635,4.973892 0,2.830539 -1.0635,4.957531 -1.06349,2.11064 -2.99415,3.28866 -1.91429,1.17803 -4.49941,1.17803 z m 0,-3.04324 q 1.66887,0 2.74873,-0.86716 1.09622,-0.88352 1.61979,-2.323328 0.53993,-1.456172 0.53993,-3.190493 0,-1.750676 -0.53993,-3.206852 -0.52357,-1.472535 -1.61979,-2.339694 -1.07986,-0.883518 -2.74873,-0.883518 -1.65251,0 -2.73237,0.883518 -1.07986,0.867159 -1.61979,2.339694 -0.52356,1.456176 -0.52356,3.206852 0,1.734321 0.52356,3.190493 0.53993,1.439808 1.61979,2.323328 1.07986,0.86716 2.73237,0.86716 z m 16.14879,-8.16438 v 10.83131 h -3.59953 V 86.796636 h 3.43592 l 0.0163,3.51772 q 0.8508,-1.930653 2.27425,-2.830535 1.43981,-0.916244 3.37047,-0.916244 2.79782,0 4.49941,1.76704 1.71796,1.75068 1.71796,5.137509 v 11.616664 h -3.59953 V 93.913885 q 0,-1.979739 -1.03078,-3.09232 -1.03077,-1.112582 -2.83054,-1.112582 -1.83248,0 -3.04323,1.19439 -1.21075,1.178027 -1.21075,3.354107 z m 23.1188,11.20762 q -2.9778,0 -4.94117,-1.2762 -1.94702,-1.29255 -2.43787,-3.73042 l 3.38683,-0.70354 q 0.73627,2.79782 4.02493,2.79782 1.75068,0 2.76509,-0.71991 1.03077,-0.73627 1.03077,-1.75068 0,-1.73432 -2.56875,-2.30697 l -3.07596,-0.703545 q -5.03934,-1.128944 -5.03934,-5.055701 0,-1.636149 0.89988,-2.863261 0.91624,-1.227113 2.50331,-1.897935 1.60343,-0.687181 3.68134,-0.687181 2.96143,0 4.64666,1.276194 1.68523,1.259836 2.27425,3.288662 l -3.22322,0.703544 q -0.34359,-0.965327 -1.19438,-1.685235 -0.8508,-0.736267 -2.47059,-0.736267 -1.4889,0 -2.48695,0.670822 -0.99805,0.670822 -0.99805,1.701594 0,0.916245 0.65446,1.488899 0.67082,0.55629 2.17608,0.899881 l 2.94507,0.654459 q 4.99025,1.128944 4.99025,4.941173 0,1.668867 -0.96532,2.961427 -0.94897,1.2762 -2.65057,2.01247 -1.70159,0.7199 -3.92675,0.7199 z m 14.15269,-0.13089 q -1.01441,0 -1.71796,-0.68718 -0.70354,-0.70355 -0.70354,-1.71796 0,-1.01441 0.70354,-1.71796 0.70355,-0.70354 1.71796,-0.70354 1.01441,0 1.70159,0.70354 0.70355,0.70355 0.70355,1.71796 0,1.01441 -0.70355,1.71796 -0.68718,0.68718 -1.70159,0.68718 z m 15.15074,6.98636 q -3.17413,0 -5.08842,-1.16167 -1.9143,-1.16166 -2.68329,-2.81418 l 3.01052,-1.42344 q 0.32722,0.52356 0.86716,1.09621 0.55629,0.58902 1.47253,0.99806 0.9326,0.40903 2.40514,0.40903 2.07791,0 3.38683,-0.99805 1.30892,-0.98169 1.30892,-3.09232 v -3.56681 h -0.31087 q -0.32723,0.60538 -0.91624,1.30892 -0.57266,0.70355 -1.61979,1.22712 -1.03078,0.5072 -2.69965,0.5072 -2.15972,0 -3.89403,-1.01441 -1.71796,-1.01441 -2.73237,-2.99415 -1.01442,-1.996107 -1.01442,-4.924815 0,-2.912343 0.99806,-4.990255 1.01441,-2.094271 2.74873,-3.206852 1.73431,-1.112581 3.94312,-1.112581 1.68523,0 2.73237,0.57265 1.06349,0.55629 1.65251,1.308921 0.60537,0.752627 0.91624,1.325281 h 0.26178 v -2.977793 h 3.51773 v 18.553934 q 0,2.40514 -1.09622,3.94312 -1.09622,1.53798 -2.96143,2.27425 -1.86522,0.75263 -4.20491,0.75263 z m -0.0327,-10.50408 q 2.29061,0 3.50136,-1.58707 1.22712,-1.587061 1.22712,-4.401237 0,-2.748734 -1.21075,-4.466691 -1.19439,-1.734317 -3.51773,-1.734317 -1.58706,0 -2.66692,0.834435 -1.0635,0.818077 -1.60342,2.225166 -0.52357,1.390727 -0.52357,3.141407 0,2.683285 1.21075,4.335797 1.22711,1.65251 3.58316,1.65251 z m 16.73781,-7.55901 v 10.83131 h -3.59953 V 86.796636 h 3.43592 l 0.0163,3.51772 q 0.8508,-1.930653 2.27425,-2.830535 1.43981,-0.916244 3.37047,-0.916244 2.79781,0 4.49941,1.76704 1.71796,1.75068 1.71796,5.137509 v 11.616664 h -3.59953 V 93.913885 q 0,-1.979739 -1.03078,-3.09232 -1.03077,-1.112582 -2.83053,-1.112582 -1.83249,0 -3.04324,1.19439 -1.21075,1.178027 -1.21075,3.354107 z m 24.24776,11.20762 q -2.56879,0 -4.49943,-1.17803 -1.91429,-1.17802 -2.97781,-3.28866 -1.06348,-2.126992 -1.06348,-4.957531 0,-2.846898 1.06348,-4.973892 1.06352,-2.143357 2.97781,-3.321384 1.93064,-1.178026 4.49943,-1.178026 2.58509,0 4.49939,1.178026 1.93067,1.178027 2.99415,3.321384 1.06352,2.126994 1.06352,4.973892 0,2.830539 -1.06352,4.957531 -1.06348,2.11064 -2.99415,3.28866 -1.9143,1.17803 -4.49939,1.17803 z m 0,-3.04324 q 1.66886,0 2.74872,-0.86716 1.09621,-0.88352 1.6198,-2.323328 0.53989,-1.456172 0.53989,-3.190493 0,-1.750676 -0.53989,-3.206852 -0.52359,-1.472535 -1.6198,-2.339694 -1.07986,-0.883518 -2.74872,-0.883518 -1.65252,0 -2.73238,0.883518 -1.07987,0.867159 -1.6198,2.339694 -0.52358,1.456176 -0.52358,3.206852 0,1.734321 0.52358,3.190493 0.53993,1.439808 1.6198,2.323328 1.07986,0.86716 2.73238,0.86716 z m 12.54924,2.66693 V 86.796636 h 3.41957 l 0.0818,3.419552 q 0.70357,-1.897931 2.11062,-2.814176 1.40709,-0.916244 3.04326,-0.916244 1.78339,0 2.96143,1.014413 1.17801,1.014413 1.71794,2.830538 0.68718,-1.848848 2.2579,-2.846898 1.58707,-0.998053 3.53409,-0.998053 1.61979,0 2.9287,0.703545 1.30891,0.703544 2.07789,2.094271 0.78536,1.390726 0.78536,3.468638 V 105.08879 H 395.8878 V 93.112172 q 0,-1.832485 -1.01441,-2.650562 -1.01441,-0.818072 -2.40515,-0.818072 -1.70159,0 -2.68328,1.047135 -0.96534,1.047136 -0.96534,2.683285 v 11.714832 h -3.55043 V 92.883113 q 0,-1.472535 -0.94895,-2.356057 -0.93261,-0.883518 -2.38878,-0.883518 -1.50526,0 -2.6342,1.047135 -1.11259,1.030773 -1.11259,3.026876 v 11.371241 z m 37.64781,0.37631 q -2.69965,0 -4.66302,-1.16166 -1.9634,-1.16167 -3.02688,-3.27231 -1.04713,-2.110626 -1.04713,-4.957528 0,-2.814176 1.03075,-4.957529 1.04713,-2.143357 2.94508,-3.337747 1.89792,-1.210749 4.45032,-1.210749 2.07793,0 3.94311,0.932604 1.88157,0.916244 3.04327,2.94507 1.178,2.012462 1.178,5.317483 v 1.276199 h -12.97465 q 0.0982,2.650561 1.50527,4.057647 1.40709,1.39073 3.64861,1.39073 1.50523,0 2.58509,-0.65446 1.09625,-0.65446 1.57073,-1.930656 l 3.38683,0.801716 q -0.65449,2.14335 -2.65058,3.45227 -1.99609,1.30892 -4.9248,1.30892 z m -5.10481,-11.109452 h 9.3915 q -0.19632,-2.159717 -1.35798,-3.484998 -1.14532,-1.32528 -3.22321,-1.32528 -2.15972,0 -3.41956,1.423449 -1.24349,1.407086 -1.39075,3.386829 z m 19.56835,10.978562 q -1.01441,0 -1.71793,-0.68718 -0.70357,-0.70355 -0.70357,-1.71796 0,-1.01441 0.70357,-1.71796 0.70352,-0.70354 1.71793,-0.70354 1.01441,0 1.70159,0.70354 0.70357,0.70355 0.70357,1.71796 0,1.01441 -0.70357,1.71796 -0.68718,0.68718 -1.70159,0.68718 z m 15.18349,0.13089 q -2.56875,0 -4.49943,-1.17803 -1.91429,-1.17802 -2.97777,-3.28866 -1.06352,-2.126992 -1.06352,-4.957531 0,-2.846898 1.06352,-4.973892 1.06348,-2.143357 2.97777,-3.321384 1.93068,-1.178026 4.49943,-1.178026 2.5851,0 4.4994,1.178026 1.93067,1.178027 2.99415,3.321384 1.06352,2.126994 1.06352,4.973892 0,2.830539 -1.06352,4.957531 -1.06348,2.11064 -2.99415,3.28866 -1.9143,1.17803 -4.4994,1.17803 z m 0,-3.04324 q 1.66886,0 2.74874,-0.86716 1.0962,-0.88352 1.61979,-2.323328 0.53993,-1.456172 0.53993,-3.190493 0,-1.750676 -0.53993,-3.206852 -0.52359,-1.472535 -1.61979,-2.339694 -1.07988,-0.883518 -2.74874,-0.883518 -1.65252,0 -2.73238,0.883518 -1.07987,0.867159 -1.6198,2.339694 -0.52355,1.456176 -0.52355,3.206852 0,1.734321 0.52355,3.190493 0.53993,1.439808 1.6198,2.323328 1.07986,0.86716 2.73238,0.86716 z m 12.54925,2.66693 V 86.796636 h 3.48502 v 2.94507 h 0.19632 q 0.49086,-1.488895 1.7507,-2.339694 1.27619,-0.867158 2.87963,-0.867158 0.34358,0 0.78533,0.03273 0.45813,0.03273 0.73629,0.06545 v 3.435915 q -0.19636,-0.04909 -0.75264,-0.114531 -0.55631,-0.08181 -1.12893,-0.08181 -1.88161,0 -3.12506,1.161667 -1.22711,1.145304 -1.22711,2.945067 V 105.0888 Z m 19.97742,7.23178 q -3.17414,0 -5.08843,-1.16167 -1.9143,-1.16166 -2.68331,-2.81418 l 3.01054,-1.42344 q 0.32722,0.52356 0.86715,1.09621 0.55628,0.58902 1.47255,0.99806 0.93257,0.40903 2.40511,0.40903 2.07793,0 3.38684,-0.99805 1.30891,-0.98169 1.30891,-3.09232 v -3.56681 h -0.31084 q -0.32723,0.60538 -0.91627,1.30892 -0.57266,0.70355 -1.61979,1.22712 -1.03076,0.5072 -2.69962,0.5072 -2.15973,0 -3.89404,-1.01441 -1.71798,-1.01441 -2.73239,-2.99415 -1.0144,-1.996107 -1.0144,-4.924815 0,-2.912343 0.99806,-4.990255 1.01441,-2.094271 2.74873,-3.206852 1.73431,-1.112581 3.94311,-1.112581 1.68524,0 2.73238,0.57265 1.06348,0.55629 1.65248,1.308921 0.60539,0.752627 0.91627,1.325281 h 0.26177 v -2.977793 h 3.51771 v 18.553934 q 0,2.40514 -1.09621,3.94312 -1.0962,1.53798 -2.96143,2.27425 -1.86522,0.75263 -4.20488,0.75263 z m -0.0328,-10.50408 q 2.2906,0 3.50136,-1.58707 1.22712,-1.587061 1.22712,-4.401237 0,-2.748734 -1.21077,-4.466691 -1.19439,-1.734317 -3.51771,-1.734317 -1.58706,0 -2.66693,0.834435 -1.06351,0.818077 -1.60344,2.225166 -0.52355,1.390727 -0.52355,3.141407 0,2.683285 1.21073,4.335797 1.22711,1.65251 3.58319,1.65251 z" />
+ </g>
+</svg>
+
diff --git a/extensions/45/middleclickclose/src/extension.js b/extensions/47/middleclickclose/src/extension.js
index 0b0d562..69f4c7e 100644
--- a/extensions/45/middleclickclose/src/extension.js
+++ b/extensions/47/middleclickclose/src/extension.js
@@ -19,9 +19,13 @@
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
+import Meta from 'gi://Meta';
-import { Extension, InjectionManager } from 'resource:///org/gnome/shell/extensions/extension.js';
+import { Extension, InjectionManager }
+ from 'resource:///org/gnome/shell/extensions/extension.js';
import { Workspace } from 'resource:///org/gnome/shell/ui/workspace.js';
+import { WindowPreview } from 'resource:///org/gnome/shell/ui/windowPreview.js';
+import { ControlsState } from 'resource:///org/gnome/shell/ui/overviewControls.js';
import { SettingsWatch } from './settingsWatch.js';
@@ -29,21 +33,29 @@ export default class MiddleClickClose extends Extension {
#settings;
#injectionManager;
+ #refocusOnClose;
+
enable() {
this.#settings = new SettingsWatch(this.getSettings(), {
close_button: { get: v => v.value, },
rearrange_delay: {},
+ keyboard_close: {},
});
+ this.#refocusOnClose = new WeakSet();
+
this.#injectionManager = new InjectionManager();
this.#patchClickHandler();
this.#patchWindowRepositioningDelay();
+ this.#patchKeyClose();
}
disable() {
this.#injectionManager.clear();
this.#injectionManager = null;
+ this.#refocusOnClose = null;
+
this.#settings.clear();
this.#settings = null;
}
@@ -81,23 +93,90 @@ export default class MiddleClickClose extends Extension {
// apparently that is impossible with the switch to ESM. Instead, we'll monkey-patch
// _doRemoveWindow() and change the timeout after the fact.
const settings = this.#settings;
+ const refocusOnClose = this.#refocusOnClose;
const lastLayoutFrozenIds = new WeakMap();
+
this.#injectionManager.overrideMethod(Workspace.prototype, '_doRemoveWindow',
- original => function () {
+ original => function (metaWin) {
+
+ // Grab the old window's focus chain index.
+ let focus_idx = this.get_focus_chain()
+ .findIndex(clone => clone.metaWindow == metaWin);
+
+ // Call the original method.
const ret = original.apply(this, arguments);
+ if (refocusOnClose.has(metaWin)) {
+ // Find a "nearby" window to refocus to, based on the old index
+ const chain = this.get_focus_chain();
+ if (focus_idx >= chain.length) {
+ focus_idx = chain.length - 1;
+ }
+
+ // Focus on the selected window.
+ if (focus_idx >= 0) {
+ global.stage.key_focus = chain[focus_idx];
+ }
+ }
+
// Adjust the freeze delay.
if (this._layoutFrozenId > 0
&& this._layoutFrozenId != lastLayoutFrozenIds.get(this)
) {
- const source = GLib.MainContext.default().find_source_by_id(this._layoutFrozenId);
- source.set_ready_time(source.get_time() + settings.rearrange_delay * 1000);
+ const src = GLib.MainContext.default().find_source_by_id(this._layoutFrozenId);
+ src.set_ready_time(src.get_time() + settings.rearrange_delay * 1000);
}
- // Need to keep the last id to avoid adjusting the layout freeze delay more than once.
+ // Need to keep the last id to avoid adjusting the layout freeze delay more than
+ // once.
lastLayoutFrozenIds.set(this, this._layoutFrozenId);
-
return ret;
})
}
+
+ #patchKeyClose() {
+ // If Meta.KeyBindingAction.CLOSE is fired in while a WindowPreview is focused, close it.
+ const settings = this.#settings;
+ const refocusOnClose = this.#refocusOnClose;
+
+ function handleKeyPress(event) {
+
+ // Keyboard close disabled in settings.
+ if (!settings.keyboard_close) {
+ return false;
+ }
+
+ // We only care about window picker mode.
+ if (this._workspace._overviewAdjustment.value !== ControlsState.WINDOW_PICKER) {
+ return false;
+ }
+
+ const action = global.display.get_keybinding_action(
+ event.get_key_code(), event.get_state());
+ if (action == Meta.KeyBindingAction.CLOSE) {
+
+ if (this._workspace.metaWorkspace?.active) {
+ // Imediately refocus on another window when closing via keyboard.
+ refocusOnClose.add(this.metaWindow);
+
+ // Close the window.
+ this._deleteAll();
+ } else {
+ // Switch to the workspace the focused window is in.
+ this._workspace.metaWorkspace?.activate(global.get_current_time())
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ this.#injectionManager.overrideMethod(WindowPreview.prototype, 'vfunc_key_press_event',
+ original => function () {
+ return handleKeyPress.apply(this, arguments)
+ || original.apply(this, arguments);
+ }
+ )
+ }
};
diff --git a/extensions/45/middleclickclose/src/metadata.json b/extensions/47/middleclickclose/src/metadata.json
index 01234b9..23bc0ed 100644
--- a/extensions/45/middleclickclose/src/metadata.json
+++ b/extensions/47/middleclickclose/src/metadata.json
@@ -3,7 +3,9 @@
"description": "Close windows with a button click (the middle one by default) when in overview mode",
"url": "https://github.com/p91paul/middleclickclose",
"shell-version": [
- "45"
+ "45",
+ "46",
+ "47"
],
"uuid": "middleclickclose@paolo.tranquilli.gmail.com",
"settings-schema": "org.gnome.shell.extensions.middleclickclose",
diff --git a/extensions/45/middleclickclose/src/po/de.po b/extensions/47/middleclickclose/src/po/de.po
index 4fb4821..cf12acc 100644
--- a/extensions/45/middleclickclose/src/po/de.po
+++ b/extensions/47/middleclickclose/src/po/de.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:29+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2019-06-17 20:44+0200\n"
"Last-Translator: Onno Giesmann <nutzer3105@gmail.com>\n"
"Language-Team: German <--->\n"
@@ -18,39 +18,39 @@ msgstr ""
"X-Generator: Gtranslator 3.32.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Linke"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Mittlere"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Rechte"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Taste 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Taste 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Taste 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Taste 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Taste 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Taste 9"
@@ -62,11 +62,19 @@ msgstr "Maustaste zum Schließen"
msgid "Which mouse button triggers closing in overview."
msgstr "Gibt an, welche Maustaste das Schließen in der Übersicht auslöst."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Verzögerung bis zur Neuanordnung"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/el.po b/extensions/47/middleclickclose/src/po/el.po
index d032228..cc5f21e 100644
--- a/extensions/45/middleclickclose/src/po/el.po
+++ b/extensions/47/middleclickclose/src/po/el.po
@@ -7,49 +7,49 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:33+0300\n"
-"PO-Revision-Date: 2023-08-30 18:41+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
+"PO-Revision-Date: 2024-07-09 16:01+0300\n"
"Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n"
"Language-Team: \n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.3.2\n"
+"X-Generator: Poedit 3.4.2\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Αριστερό"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Μεσαίο"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Δεξί"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Κουμπί 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Κουμπί 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Κουμπί 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Κουμπί 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Κουμπί 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Κουμπί 9"
@@ -61,14 +61,24 @@ msgstr "Κουμπί ποντικιού για κλείσιμο"
msgid "Which mouse button triggers closing in overview."
msgstr "Ποιό κουμπί του ποντικιού κλείνει παράθυρα στην επισκόπηση."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr "Κλείσιμο με πληκτρολόγιο"
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+"Επιτρέπει το κλείσιμο παραθύρων στην επισκόπηση μέσω συντομεύσεων "
+"πληκτρολογίου."
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Καθυστέρηση ανακατονομής"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
msgstr ""
-"Πόσος χρόνος πρέπει να περάσει με τον κέρσορα αδρανή στην επισκόπηση μετά "
-"το κλείσιμο ενός παραθύρου για να γίνει ανακατανομή."
+"Πόσος χρόνος πρέπει να περάσει με τον κέρσορα αδρανή στην επισκόπηση μετά το "
+"κλείσιμο ενός παραθύρου για να γίνει ανακατανομή."
diff --git a/extensions/45/middleclickclose/src/po/fr.po b/extensions/47/middleclickclose/src/po/fr.po
index e762a40..f7acb45 100644
--- a/extensions/45/middleclickclose/src/po/fr.po
+++ b/extensions/47/middleclickclose/src/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:29+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2015-12-30 07:08+0100\n"
"Last-Translator: DAEM Q.\n"
"Language-Team: \n"
@@ -18,39 +18,39 @@ msgstr ""
"X-Generator: Poedit 1.8.5\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Gauche"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Milieu"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Droit"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Bouton 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Bouton 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Bouton 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Bouton 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Bouton 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Bouton 9"
@@ -64,11 +64,19 @@ msgstr ""
"Le bouton de la souris qui déclenche la fermeture d'une fenêtre dans la Vue "
"d'ensemble."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Délai avant réarrangement"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/it.po b/extensions/47/middleclickclose/src/po/it.po
index 4b20c55..dbb0a96 100644
--- a/extensions/45/middleclickclose/src/po/it.po
+++ b/extensions/47/middleclickclose/src/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:29+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2017-04-21 10:06+0200\n"
"Last-Translator: Jimmy Scionti <jimmy.scionti@gmail.com>\n"
"Language-Team: Jimmy Scionti <jimmy.scionti@gmail.com>\n"
@@ -18,39 +18,39 @@ msgstr ""
"X-Generator: Poedit 1.8.7.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Sinistro"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Centrale"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Destro"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Pulsante 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Pulsante 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Pulsante 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Pulsante 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Pulsante 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Pulsante 9"
@@ -62,11 +62,19 @@ msgstr "Pulsante del mouse per chiudere la finestra"
msgid "Which mouse button triggers closing in overview."
msgstr "Seleziona quale pulsante del mouse premere per chiudere una finestra."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Ritardo del riordinamento"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/nl.po b/extensions/47/middleclickclose/src/po/nl.po
index fe9c6e9..39aa13c 100644
--- a/extensions/45/middleclickclose/src/po/nl.po
+++ b/extensions/47/middleclickclose/src/po/nl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:29+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2019-09-15 20:17+0200\n"
"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\n"
"Language-Team: Dutch <kde-i18n-doc@kde.org>\n"
@@ -17,39 +17,39 @@ msgstr ""
"X-Generator: Poedit 2.2.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Links"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Scrollwiel"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Rechts"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Knop 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Knop 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Knop 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Knop 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Knop 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Knop 9"
@@ -61,11 +61,19 @@ msgstr "Muisknop om vensters mee te sluiten"
msgid "Which mouse button triggers closing in overview."
msgstr "Met welke muisknop je vensters kunt sluiten op het overzicht."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Vertraging bij herschikken"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/pt.po b/extensions/47/middleclickclose/src/po/pt.po
index 7f35be1..1dd92d9 100644
--- a/extensions/45/middleclickclose/src/po/pt.po
+++ b/extensions/47/middleclickclose/src/po/pt.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-10-11 23:56+0100\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2023-10-11 23:56+0100\n"
"Last-Translator: Tomás Marques <tomasm576@gmail.com>\n"
"Language-Team: \n"
@@ -15,39 +15,39 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Esquerda"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Meio"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Direita"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Botão 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Botão 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Botão 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Botão 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Botão 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Botão 9"
@@ -59,14 +59,22 @@ msgstr "Botão do meio do rato"
msgid "Which mouse button triggers closing in overview."
msgstr "Qual o botão do rato que fecha uma janela na vista geral."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Duração de reorganizar"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
msgstr ""
-"Quanto tempo tem de passar sem que o cursor se mova para que as janelas na visão geral "
-"se reorganizem depois de uma ter sido fechada."
+"Quanto tempo tem de passar sem que o cursor se mova para que as janelas na "
+"visão geral se reorganizem depois de uma ter sido fechada."
diff --git a/extensions/45/middleclickclose/src/po/sk.po b/extensions/47/middleclickclose/src/po/sk.po
index d9c250a..c9e79a8 100644
--- a/extensions/45/middleclickclose/src/po/sk.po
+++ b/extensions/47/middleclickclose/src/po/sk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-08-30 18:29+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2015-10-30 07:08+0100\n"
"Last-Translator: Juraj Fiala <doctorjellyface@riseup.net>\n"
"Language-Team: \n"
@@ -18,39 +18,39 @@ msgstr ""
"X-Generator: Poedit 1.8.5\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Ľavé"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Stredné"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Pravé"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Tlačidlo 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Tlačidlo 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Tlačidlo 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Tlačidlo 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Tlačidlo 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Tlačidlo 9"
@@ -62,11 +62,19 @@ msgstr "Tlačidlo myši na zavretie"
msgid "Which mouse button triggers closing in overview."
msgstr "Ktoré tlačidlo myši spustí zavretie v prehľade aktivít."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Oneskorenie preskúpenia"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/sr.po b/extensions/47/middleclickclose/src/po/sr.po
index 514194c..037eb5c 100644
--- a/extensions/45/middleclickclose/src/po/sr.po
+++ b/extensions/47/middleclickclose/src/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-02 18:28+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2023-10-15 18:51+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -17,39 +17,39 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Лево"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Средње"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Десно"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Дугме 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Дугме 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Дугме 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Дугме 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Дугме 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Дугме 9"
@@ -61,11 +61,19 @@ msgstr "Дугме на мишу за затварање апликација"
msgid "Which mouse button triggers closing in overview."
msgstr "Које дугме на мишу затвара апликацију у прегледнику."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Задршка у распоређивању"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/sr@latin.po b/extensions/47/middleclickclose/src/po/sr@latin.po
index 7ec468e..e6bc7f0 100644
--- a/extensions/45/middleclickclose/src/po/sr@latin.po
+++ b/extensions/47/middleclickclose/src/po/sr@latin.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-02 18:28+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2023-10-15 18:52+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -17,39 +17,39 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Levo"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Srednje"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Desno"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Dugme 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Dugme 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Dugme 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Dugme 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Dugme 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Dugme 9"
@@ -61,15 +61,23 @@ msgstr "Dugme na mišu za zatvaranje aplikacija"
msgid "Which mouse button triggers closing in overview."
msgstr "Koje dugme na mišu zatvara aplikaciju u pregledniku."
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Zadrška u raspoređivanju"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
msgstr ""
-"Koliko vremena mora da prođe prilikom nepomeranja pokazivača miša za "
-"prozore aplikacija u pregledniku, kako bi se prozori rasporedili nakon "
-"zatvaranja aplikacije."
+"Koliko vremena mora da prođe prilikom nepomeranja pokazivača miša za prozore "
+"aplikacija u pregledniku, kako bi se prozori rasporedili nakon zatvaranja "
+"aplikacije."
diff --git a/extensions/45/middleclickclose/src/po/template.pot b/extensions/47/middleclickclose/src/po/template.pot
index 02cdf11..38cf0e2 100644
--- a/extensions/45/middleclickclose/src/po/template.pot
+++ b/extensions/47/middleclickclose/src/po/template.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-02 18:28+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,39 +17,39 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr ""
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr ""
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr ""
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr ""
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr ""
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr ""
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr ""
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr ""
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr ""
@@ -61,11 +61,19 @@ msgstr ""
msgid "Which mouse button triggers closing in overview."
msgstr ""
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr ""
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
diff --git a/extensions/45/middleclickclose/src/po/uk.po b/extensions/47/middleclickclose/src/po/uk.po
index dedc32b..5224afc 100644
--- a/extensions/45/middleclickclose/src/po/uk.po
+++ b/extensions/47/middleclickclose/src/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions-middleclickclose\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-10-22 00:00+0300\n"
+"POT-Creation-Date: 2024-07-09 15:57+0300\n"
"PO-Revision-Date: 2023-10-22 00:00+0300\n"
"Last-Translator: Artem Prokop <artem.prokop.dev@gmail.com>\n"
"Language-Team: \n"
@@ -16,39 +16,39 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/prefs.js:30
+#: src/prefs.js:31
msgid "Left"
msgstr "Ліва"
-#: src/prefs.js:31
+#: src/prefs.js:32
msgid "Middle"
msgstr "Середня"
-#: src/prefs.js:32
+#: src/prefs.js:33
msgid "Right"
msgstr "Права"
-#: src/prefs.js:33
+#: src/prefs.js:34
msgid "Button 4"
msgstr "Кнопка 4"
-#: src/prefs.js:34
+#: src/prefs.js:35
msgid "Button 5"
msgstr "Кнопка 5"
-#: src/prefs.js:35
+#: src/prefs.js:36
msgid "Button 6"
msgstr "Кнопка 6"
-#: src/prefs.js:36
+#: src/prefs.js:37
msgid "Button 7"
msgstr "Кнопка 7"
-#: src/prefs.js:37
+#: src/prefs.js:38
msgid "Button 8"
msgstr "Кнопка 8"
-#: src/prefs.js:38
+#: src/prefs.js:39
msgid "Button 9"
msgstr "Кнопка 9"
@@ -60,14 +60,22 @@ msgstr "Кнопка миші для закриття"
msgid "Which mouse button triggers closing in overview."
msgstr "Яка кнопка миші закриває вікно в оверв'ю"
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:22
+msgid "Close with keyboard"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:23
+msgid "Allow closing windows in overview via keyboard shortcuts."
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:28
msgid "Rearrange delay"
msgstr "Затримка перерозташування"
-#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:24
+#: src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml:29
msgid ""
"How much time must pass with the pointer not moving for windows in overview "
"to rearrange after one was closed."
msgstr ""
-"Скільки часу курсор має не рухатись щоб вікна в оверв'ю перерозташувалися"
-" після закриття вікна."
+"Скільки часу курсор має не рухатись щоб вікна в оверв'ю перерозташувалися "
+"після закриття вікна."
diff --git a/extensions/45/middleclickclose/src/prefs.js b/extensions/47/middleclickclose/src/prefs.js
index 91d9f13..99d8858 100644
--- a/extensions/45/middleclickclose/src/prefs.js
+++ b/extensions/47/middleclickclose/src/prefs.js
@@ -18,7 +18,8 @@ import Gtk from 'gi://Gtk';
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
-import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
+import { ExtensionPreferences, gettext as _ }
+ from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
export default class MiddleClickClosePreferences extends ExtensionPreferences {
getPreferencesWidget() {
@@ -43,6 +44,8 @@ export default class MiddleClickClosePreferences extends ExtensionPreferences {
step: 50,
}));
+ group.add(this.buildPreference("keyboard-close"))
+
page.add(group);
return page;
}
@@ -70,7 +73,7 @@ export default class MiddleClickClosePreferences extends ExtensionPreferences {
});
row.connect('notify::selected', () => {
- setting.activate(GLib.Variant.new_string(range[row.selected]));
+ setting.change_state(GLib.Variant.new_string(range[row.selected]));
});
return row;
@@ -79,7 +82,20 @@ export default class MiddleClickClosePreferences extends ExtensionPreferences {
opts.upper ??= range[1]
}
- if (["i"].includes(ty)) {
+ if (ty == "b") {
+ let row = new Adw.SwitchRow({
+ title: opts.title,
+ subtitle: opts.subtitle,
+ active: setting.state.unpack()
+ });
+
+ row.connect('notify::active', () => {
+ setting.change_state(GLib.Variant.new_boolean(row.active));
+ });
+
+ return row;
+
+ } else if (ty == "i") {
let adjustment = new Gtk.Adjustment({
lower: opts.lower,
upper: opts.upper,
@@ -95,7 +111,7 @@ export default class MiddleClickClosePreferences extends ExtensionPreferences {
});
adjustment.connect("value-changed", adj => {
- setting.activate(GLib.Variant.new_int32(adj.value));
+ setting.change_state(GLib.Variant.new_int32(adj.value));
});
return row;
diff --git a/extensions/45/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml b/extensions/47/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml
index ebe6dc9..93f3793 100644
--- a/extensions/45/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml
+++ b/extensions/47/middleclickclose/src/schemas/org.gnome.shell.extensions.middleclickclose.gschema.xml
@@ -17,6 +17,11 @@
<summary>Mouse button to close</summary>
<description>Which mouse button triggers closing in overview.</description>
</key>
+ <key type="b" name="keyboard-close">
+ <default>true</default>
+ <summary>Close with keyboard</summary>
+ <description>Allow closing windows in overview via keyboard shortcuts.</description>
+ </key>
<key type="i" name="rearrange-delay">
<default>750</default>
<range min="0" max="5000" />
diff --git a/extensions/45/middleclickclose/src/settingsWatch.js b/extensions/47/middleclickclose/src/settingsWatch.js
index fd8b8bd..fd8b8bd 100644
--- a/extensions/45/middleclickclose/src/settingsWatch.js
+++ b/extensions/47/middleclickclose/src/settingsWatch.js
diff --git a/extensions/45/no-overview.mk b/extensions/47/no-overview.mk
index f59ce6f..e2a604c 100644
--- a/extensions/45/no-overview.mk
+++ b/extensions/47/no-overview.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/no-overview/LICENSE b/extensions/47/no-overview/LICENSE
index f288702..f288702 100644
--- a/extensions/45/no-overview/LICENSE
+++ b/extensions/47/no-overview/LICENSE
diff --git a/extensions/45/no-overview/README.md b/extensions/47/no-overview/README.md
index 25fb2aa..25fb2aa 100644
--- a/extensions/45/no-overview/README.md
+++ b/extensions/47/no-overview/README.md
diff --git a/extensions/47/no-overview/extension.js b/extensions/47/no-overview/extension.js
new file mode 100644
index 0000000..f0a6f28
--- /dev/null
+++ b/extensions/47/no-overview/extension.js
@@ -0,0 +1,26 @@
+/*
+ No overview at start-up
+ GNOME Shell 45+ extension
+ Contributors: @fthx
+ License: GPL v3
+*/
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+
+export default class NoOverviewExtension {
+ enable() {
+ if (!Main.layoutManager._startingUp) {
+ return;
+ }
+
+ Main.layoutManager.connectObject(
+ 'startup-complete',
+ () => Main.overview.hide(),
+ this
+ );
+ }
+
+ disable() {
+ Main.layoutManager.disconnectObject(this);
+ }
+}
diff --git a/extensions/45/no-overview/metadata.json b/extensions/47/no-overview/metadata.json
index 0c95c9e..1926a58 100644
--- a/extensions/45/no-overview/metadata.json
+++ b/extensions/47/no-overview/metadata.json
@@ -2,12 +2,8 @@
"_generated": "Generated by SweetTooth, do not edit",
"description": "No overview at start-up. Nothing more.",
"name": "No overview at start-up",
- "original-authors": [
- "fthx"
- ],
- "shell-version": [
- "45"
- ],
+ "original-authors": ["fthx"],
+ "shell-version": ["46", "47"],
"url": "https://github.com/fthx/no-overview",
"uuid": "no-overview@fthx",
"version": 999
diff --git a/extensions/45/vertical-workspaces.mk b/extensions/47/vertical-workspaces.mk
index 3dd5bd0..db823e4 100644
--- a/extensions/45/vertical-workspaces.mk
+++ b/extensions/47/vertical-workspaces.mk
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md b/extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md
index 74daf6a..74daf6a 100644
--- a/extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/bug_report.md
diff --git a/extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md b/extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md
index f455865..f455865 100644
--- a/extensions/45/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/extensions/47/vertical-workspaces/.github/ISSUE_TEMPLATE/feature_request.md
diff --git a/extensions/45/vertical-workspaces/CHANGELOG.md b/extensions/47/vertical-workspaces/CHANGELOG.md
index 0ea09cc..ac557c0 100644
--- a/extensions/45/vertical-workspaces/CHANGELOG.md
+++ b/extensions/47/vertical-workspaces/CHANGELOG.md
@@ -1,5 +1,110 @@
## Changelog:
-### v45.2 for GNOME 45.2+, v44.10 for GNOME 42-44 (2023-12-03)
+### v46.4 for GNOME 45.2+ (), v44.14 for GNOME 42-44 (not yet released)
+**Fixed:**
+- App grid: Inconsistent grid size on the same monitor when switching monitors (#160)
+- App grid: The grid layout manager's current page being out of sync with the grid's current page causes page shifts while dragging app icons and incorrect page navigation controls (#160, upstream bug)
+- App grid: After dragging an icon out of a multi-page folder, the folder view shows navigation hints the next time it is opened (#160, upstream bug)
+- App grid: Grid page switches to the page with selected icon when user starts dragging an icon on another page
+- App grid: Page indicators don't accept drop, so the app icon can't be moved to a new page
+- App grid: Keyboard navigation inside a folder doesn't work (upstream bug, fixed in GS 47)
+- App grid: Workspace thumbnails not re-scaling after switching workspace outside of the overview using a trackpad
+- Vertical dash: Running dot position in GNOME 46.0 (Ubuntu 24.04)
+
+**Added:**
+- GNOME 47 support
+- *Adaptive* options for the maximum dash and app search icon size that supports low resolution and highly scaled displays
+- Search view scroll bar style to make it visible
+- App grid: Drag-and-drop between folders
+- App grid: Added an option *App Grid Search Mode* that can be set to *Filter App Grid View*, which filters the app grid icons while you're typing, instead of switching to the default search view
+- App grid: Added *Alphabet* sorting option that sorts folders along with apps
+
+
+### v46.3.1 for GNOME 45.2+ (2024-06-10), v44.14 for GNOME 42-44 (not yet released)
+**Fixed:**
+- *App Grid Page Height Scale* option affects folder icon size
+- *Smooth App Grid Animations* options has no effect
+
+
+### v46.3 for GNOME 45.2+ (2024-06-08), v44.14 for GNOME 42-44 (not yet released)
+**Fixed:**
+- App grid icon order and grid dimensions issues (#160)
+- App grid partially visible after login
+- Vertical dash running app indicator position in GNOME 46.2 (#150)
+- Dash label border radius is set too high for multiline labels
+- Search entry position in some overview configurations (#161)
+- Window attention handler options don't work properly
+
+**Added**
+- App grid *App Grid Page Height Scale* option
+- Separated *Folder Grid Spacing* option
+
+
+### v46.2 for GNOME 45.2+ (2024-05-15), v44.13 for GNOME 42-44 (2024-05-15)
+**Fixed:**
+- Inconsistent behavior of dash icons and app grid icons (#152)
+- Sorting option doesn't work for app folders (#154)
+- V-Shell overrides Dash to Dock's background opacity setting (#155)
+- Conflicts with Dash2Dock Animated (#153)
+- When the main panel is set to show only in the overview, its content might be unclickable (#157)
+- Workspace thumbnails DND can be difficult to use when creating new workspaces (#128)
+
+
+### v46.1 for GNOME 45.2+ (2024-05-09), v44.12 for GNOME 42-44 (2024-05-09)
+**Fixed:**
+- Fixed conflicts with Dash to Dock that could cause GNOME to crash at startup
+- Resolved issue where V-Shell affected Dash to Dock icon highlighting
+- Corrected search entry and results allocation to consider Dash to Dock
+- Adjusted app folder dialogs for proper sizing and positioning
+- Aligned secondary monitor overview with the primary one (option)
+- Removed all code related to previously removed modules
+- Fixed GNOME Shell recovery when V-Shell is disabled
+- The *App Grid Page Width Scale* option now works for all configurations
+
+**Added:**
+- Added *Delay at Startup* option to allow delaying activation of V-Shell after login. Automatically enabled when Dash to Dock, Ubuntu Dock, or Dash to Panel is detected
+- Added *Click Empty Space To Close* option
+- Added close button to the app folder dialog
+
+**Changed**
+- Refactored the app grid module for improved efficiency and reliability
+- Removed the 32px option for app grid icon size
+- Moved the *Remove* folder button to the left side of the folder dialog
+- Adjusted folder grid columns and rows settings to serve as maximum limits rather than fixed page size, allowing for better control over the default adaptive algorithm
+- Relocated all app grid settings to a separate tab for better organization
+
+
+### v46.0 for GNOME 45.2+ (2024-03-30 ego), v44.12 for GNOME 42-44 (not released)
+**Added**
+- Support for GNOME 46
+- Option *Fix New Window Not On Current Monitor* tries to work around that issue. However, success rate is not 100%
+
+**Changed**
+- Windows and Extensions search providers have been removed from the V-Shell and released as a standalone WSP and ESP extensions. Respective module switches has been replaced in Settings by the links to these new extensions
+- Window thumbnails (PiP) module moved to the standalone extension WTMB, link added to the *Modules* tab of Settings window
+- Shortcuts in the overview - `Ctrl+Space` - Extensions Search Provider, `Shift+Space` - Recent Files Search Provider, `Ctrl+Shift+Space` - V-Shell Settings
+- Bottom OSD position moved so it's not overlapping dock, if used
+- Active folder icons hover animation from scale, which makes icons blurry, to the move 3px up
+
+**Fixed:**
+- Running app indicators too close to the app name on the app grid
+- OverlayKey module deactivates itself even if its configuration isn't consistent with the default GNOME Shell behavior
+
+
+### v45.3 for GNOME 45.2+, v44.11 for GNOME 42-44 (2023-12-20)
+**Added:**
+- Option *Workspace Switcher Mode (Isolate Monitors)* can simulate independent switching of workspaces on any monitor
+- Improved *Extensions Search Provider* allows seamless extension de/activation
+
+**Fixed:**
+- DtD breaks overview on the primary monitor because of incorrect dash/dock position readings
+- *Window Switcher > Ignore Last (empty) Workspace* should work only for dynamic workspaces mode
+- *OverlayKey* module should remain disabled when the overlay-key functionality is set to default to minimize conflicts with other extensions
+- Errors from parental manager when registering search provider modules
+- Extension settings window sometimes fails to open when another extension settings window is already open
+- Vertically oriented dash items should be selectable even with the mouse pointer at the edge of the screen
+
+
+### v45.2 for GNOME 45.2+, v44.10 for GNOME 42-44 (2023-12-02)
**Added:**
- *Dash* option *Isolate Workspaces* on *Behavior* tab
- *Brightness for Search View* option allows adjusting background wallpaper brightness in overview search view
diff --git a/extensions/45/vertical-workspaces/LICENSE b/extensions/47/vertical-workspaces/LICENSE
index f288702..f288702 100644
--- a/extensions/45/vertical-workspaces/LICENSE
+++ b/extensions/47/vertical-workspaces/LICENSE
diff --git a/extensions/45/vertical-workspaces/Makefile b/extensions/47/vertical-workspaces/Makefile
index b0afba4..b0afba4 100644
--- a/extensions/45/vertical-workspaces/Makefile
+++ b/extensions/47/vertical-workspaces/Makefile
diff --git a/extensions/47/vertical-workspaces/README.md b/extensions/47/vertical-workspaces/README.md
new file mode 100644
index 0000000..f094027
--- /dev/null
+++ b/extensions/47/vertical-workspaces/README.md
@@ -0,0 +1,190 @@
+# V-Shell (Vertical Workspaces)
+
+A GNOME Shell extension that lets you customize your GNOME Shell UX to suit your workflow, whether you like horizontally or vertically stacked workspaces.
+
+Currently supported GNOME versions: 42 - 46
+
+[<img alt="" height="100" src="https://raw.githubusercontent.com/andyholmes/gnome-shell-extensions-badge/master/get-it-on-ego.svg?sanitize=true">](https://extensions.gnome.org/extension/5177/vertical-workspaces/)
+
+![Custom Overview Layout](screenshots/screenshot.jpg)
+
+## Features
+- Supports both vertically and horizontally stacked workspaces
+- Customizable overview layout, appearance, behavior, shortcuts
+- Customizable secondary monitor overview
+- Static overview modes minimize screen content movement
+- Customizable app grid and app folders - icon size, dimensions, sorting, active folder previews
+- Customizable dash - icon size, appearance and behavior, workspace isolation, click and scroll actions
+- Customizable search - results width, number of results, improved searching
+- Customizable workspace switcher - static background
+- Notification and OSD positions and behavior
+- Window attention handler behavior
+- Hot corner/edge position
+- Customizable Super key behavior
+- Keyboard and mouse shortcuts allow advanced workspace and window control
+- 4 predefined and fully customizable profiles
+- Supports Dash to Dock / Ubuntu Dock / Dash to Panel
+
+
+## Added functionality
+This section explains some of the less obvious or less visible additions to the Shell's behavior.
+
+### Overview - keyboard and mouse shortcuts
+|Shortcut| Description|
+|--------|------------|
+|`Shift + click on app icon in dash` | Move all windows of the application to the current workspace|
+|`Secondary mouse click on the activities indicator` | Open app grid|
+|`Shift + Scroll`, `Shift + Page Up/Down` | Reorder current workspace|
+|`Shift + Ctrl + Space` | Open V-Shell *Settings* window|
+|`Space` | Activate window search with all open windows if *WSP (Window Search Provider)* is installed and enabled|
+|`Ctrl + Space` | Activate extensions search with all installed extensions if *ESP (Extensions Search Provider)* is installed and enabled|
+|`Alt + Space` | Focus dash so you can use arrow keys to select app icon and `Space`/`Enter` to activate it
+
+
+ ### New buttons
+|Button| Description|
+|------|------------|
+| *Close button in workspace thumbnail* | Close all windows on the workspace. Default setting requires double-click |
+| *Trash button in app folder* | Remove folder - move all icons to the main grid. Requires double-click |
+
+### Active icons in app folder previews
+To enhance the efficiency of the application menu, V-Shell offers the 'Active Icons in Folder Preview' option. When enabled, icons in the folder preview (folder icon) behave like regular app icons, allowing users to interact with them without opening the folder. V-Shell allows you to increase the number of icons in the preview from 4 to 9, as well as adjust the size of the app grid icons. This feature enables the folder icons to divide the main app grid into sections, with the most frequently used apps readily accessible while others remain hidden deeper within folders.
+
+![Custom Overview Layout](screenshots/screenshot0.jpg)
+
+### Open all apps in the folder at once
+Simply drag-and-drop folder onto a workspace thumbnail to open all containing applications.
+
+## Known issues
+### Workspace navigation shortcuts
+The default GNOME Shell configuration includes predefined shortcuts for workspaces oriented in both axis:
+`(Shift)+Ctrl+Alt+ Arrow Keys`
+and for horizontal only:
+`(Shift)+Super+PageUp/Down`
+
+The default GNOME *Settings* application only offers options to configure keyboard shortcuts for horizontally oriented workspaces. However, the `gSettings` configuration scheme provides keys for shortcuts for vertically oriented workspaces as well. You can access and configure these shortcuts using the **dconf Editor**.
+
+When V-Shell is configured to use vertically stacked workspaces, the `(Shift)+Super+PageUp/Down` shortcuts for switching workspaces stop working.
+V-Shell provides the option `Override Page Up/Down Shortcuts` to automatically switch the default `Super+PageUp/Down` and `Shift+Super+PageUp/Down` shortcuts for the current workspace orientation. If enabled, this option will move the shortcuts between following gSettings keys:
+| Horizontal orientation | Vertical orientation |
+|------------------------|----------------------|
+| `switch-to-workspace-left` | `switch-to-workspace-up`|
+| `switch-to-workspace-right` | `switch-to-workspace-down`|
+| `move-to-workspace-left` | `move-to-workspace-up`|
+| `move-to-workspace-right` | `move-to-workspace-down`|
+
+Note that unlike the GNOME *Settings* application, *dconf Editor* allows you to add more than one keyboard shortcut to each action. V-Shell preserves all other shortcuts, only moves following strings between related gSetting keys:
+- `<Super>Page_Up`
+- `<Super>Page_Down`
+- `<Super><Shift>Page_Up`
+- `<Super><Shift>Page_Down`
+
+The key order follows the order in which GNOME Settings stores the shortcuts. If you add the same shortcut but with a different key order, V-Shell will not recognize it, and you might end up with the same shortcut assigned to two actions.
+
+
+### Stuttering overview animations
+On weaker hardware, you may experience stuttering in overview animations. This usually occurs due to blur effect transitions. In this scenario, you should avoid configurations where blur transitions are needed. Here are some tips on how to use the blur effect without affecting overview animations:
+- Enable `Show Workspace Preview Background`, which removes the need for blur transitions between desktop view and overview.
+- Set the same amount of blur for *Window Picker View* and *App Grid*
+- If your configuration requires blur transitions, keep the `Smooth Blur Transitions` option disabled
+
+
+### Compatibility with other extensions
+V-Shell overrides parts of the GNOME Shell's UI code, and many extensions do the same, so conflicts are inevitable. V-Shell tries to mitigate the consequences of conflicts with the most popular extensions, which includes disabling its own modules. This means that some of V-Shell's settings may not function when conflicting extensions are enabled. V-Shell also provides manual control over its modules so the user can disable problematic ones if needed.
+
+Please, report any incompatibility, you encounter while using V-Shell.
+
+#### Incompatible extensions
+- *Search Light* - You can achieve similar behavior by switching V-Shell to the `Static Workspace` `Overview mode`
+
+#### V-Shell modules automatically disabled when conflicting extensions are detected
+| Module | Extensions causing module to disable |
+|-----------------------|--------------------------------------|
+| Dash | *Dash to Dock*, *Ubuntu Dock*, *Dash to Panel*, *Dash2Dock Animated* |
+| Panel | *Dash to Panel*, *Hide Top Bar* |
+| Layout | *Dash to Panel*, *CHC-E*, |
+| WorkspaceSwitcherPopup| *WSM (Workspace Switcher Manager)* |
+
+#### Extensions causing V-Shell to automatically delay its activation
+to prevent crashes upon GNOME Shell starting up:
+- *Dash to Dock*
+- *Ubuntu Dock*
+- *Dash to Panel*
+- *Dash2Dock Animated*
+
+You can enable this option manually if needed, using the `Delay at Startup` option on the *Misc* tab of the *Settings* window.
+
+#### Extensions whose functionality is included in V-Shell
+and should be disabled or restricted by the user:
+- Partially *Blur My Shell* - V-Shell provides a basic settings for the overview background, including brightness and blur effects. If you want to use *Blur My Shell*, consider disabling its options for the overview, including app folders, to prevent visual glitches and inconsistency during transitions between overview states.
+- *Alphabetical App Grid* - V-Shell provides much more options than alphabetical sorting
+- *Grand Theft Focus* and other extensions preventing showing notification instead of immediately focusing the window that demands attention
+- *Hot Edge* - V-Shell provides this functionality as an option of the `Hot Corner Position` setting
+- Some of the *Just Perfection* options including notifications/OSD positions, hiding main panel, animation speed, dash icon size and more
+- *Impatience* and extensions adjusting animation speed
+- *Click to close overview* - V-Shell provides the `Click Empty Space To Close` option
+
+
+## Changelog
+See what's changed in recent versions
+[CHANGELOG.md](CHANGELOG.md)
+
+
+## Installation
+
+### Installation from extensions.gnome.org
+The easiest way to install the latest stable release of V-Shell: go to [extensions.gnome.org](https://extensions.gnome.org/extension/5177/vertical-workspaces/) and toggle the switch.
+
+### Installation from the latest Github release
+Download the latest release archive using following command:
+
+ wget https://github.com/G-dH/vertical-workspaces/releases/latest/download/vertical-workspaces@G-dH.github.com.zip
+
+Install the extension (`--force` switch needs to be used only if some version of the extension is already installed):
+
+ gnome-extensions install --force vertical-workspaces@G-dH.github.com.zip
+
+### Installation from GitHub repository
+The most recent version in the repository is the one I'm currently using and developing on my own systems, problems may occur, but usually nothing serious. The repository version may change often and doesn't updates automatically on your system. If you want to help me, use this latest version and report bugs.
+You may need to install `git`, `make`, `gettext` and `glib2.0` for successful installation.
+Navigate to the directory you want to download the source code and execute following commands in the terminal:
+
+**GNOME 45+:**
+
+ git clone https://github.com/G-dH/vertical-workspaces.git
+ cd vertical-workspaces
+ make install
+
+**GNOME 42 - 44:**
+
+ git clone https://github.com/G-dH/vertical-workspaces.git
+ cd vertical-workspaces
+ git checkout gnome-42-44
+ make install
+
+If you get `Can't recursively copy directory` error, take a look at issue [#51](https://github.com/G-dH/vertical-workspaces/issues/51).
+
+### Enabling the extension
+After installation you need to enable the extension and access its settings.
+
+- First restart GNOME Shell (`ALt` + `F2`, `r`, `Enter`, or Log Out/Log In if you use Wayland)
+- Now you should see *Vertical Workspaces* extension in *Extensions* application (re-open the app if needed to load new data), where you can enable it and access its Preferences window by pressing `Settings` button.
+
+## Credits
+V-Shell contains modified GNOME Shell source code and was originally based on parts of [Vertical Overview extension](https://github.com/RensAlthuis/vertical-overview).
+
+
+## Contribution
+If you want to help with V-Shell development, please provide feedback, whether it's positive, negative, a bug report, or a feature request. Even if I don't agree with you, it can help improve V-Shell.
+
+
+## Donations
+If you enjoy using my extensions, you can help me with my coffee expenses:
+
+[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png)](https://www.buymeacoffee.com/georgdh)
+
+Any support is greatly appreciated!
+
+
+## License
+This program is distributed under the terms of the GNU General Public License, version 3 or later. See [LICENSE](./LICENSE) file for details.
diff --git a/extensions/45/vertical-workspaces/extension.js b/extensions/47/vertical-workspaces/extension.js
index 44ea42b..64336f0 100644
--- a/extensions/45/vertical-workspaces/extension.js
+++ b/extensions/47/vertical-workspaces/extension.js
@@ -3,21 +3,18 @@
* extension.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
'use strict';
-import Clutter from 'gi://Clutter';
import GLib from 'gi://GLib';
-import GObject from 'gi://GObject';
import Meta from 'gi://Meta';
import St from 'gi://St';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js';
import * as Config from 'resource:///org/gnome/shell/misc/config.js';
@@ -50,10 +47,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,13 +66,17 @@ 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);
+ opt = Me.opt;
Me.Util.init(Me);
+
+ Me.updateMessageDialog = new Me.Util.RestartMessage();
}
_cleanGlobals() {
@@ -90,14 +87,28 @@ export default class VShell extends Extension.Extension {
enable() {
this._init();
- // flag for Util.getEnabledExtensions()
- Me.extensionsLoadIncomplete = Main.layoutManager._startingUp;
- opt = Me.opt;
-
this._initModules();
- this.activateVShell();
- Me.extensionsLoadIncomplete = false;
+ // prevent conflicts during startup
+ let skipStartup = Me.gSettings.get_boolean('delay-startup') ||
+ Me.Util.getEnabledExtensions('ubuntu-dock').length ||
+ Me.Util.getEnabledExtensions('dash-to-dock').length ||
+ Me.Util.getEnabledExtensions('dash2dock').length ||
+ Me.Util.getEnabledExtensions('dash-to-panel').length;
+ if (skipStartup && Main.layoutManager._startingUp) {
+ this._startupConId = Main.layoutManager.connect('startup-complete', () => {
+ this._delayedStartup = true;
+ this._activateVShell();
+ // Since VShell has been activated with a delay, move it in extensionOrder
+ let extensionOrder = Main.extensionManager._extensionOrder;
+ const idx = extensionOrder.indexOf(this.metadata.uuid);
+ extensionOrder.push(extensionOrder.splice(idx, 1)[0]);
+ Main.layoutManager.disconnect(this._startupConId);
+ this._startupConId = 0;
+ });
+ } else {
+ this._activateVShell();
+ }
console.debug(`${Me.metadata.name}: enabled`);
}
@@ -105,14 +116,14 @@ export default class VShell extends Extension.Extension {
// Reason for using "unlock-dialog" session mode:
// Updating the "appDisplay" content every time the screen is locked/unlocked takes quite a lot of time and affects the user experience.
disable() {
+ if (this._startupConId)
+ Main.layoutManager.disconnect(this._startupConId);
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`);
-
+ Me.updateMessageDialog.destroy();
+ Me.updateMessageDialog = null;
this._cleanGlobals();
}
@@ -144,10 +155,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,19 +167,28 @@ export default class VShell extends Extension.Extension {
}
Me.Util.cleanGlobals();
-
Me.Modules = null;
- opt = null;
}
- activateVShell() {
+ _activateVShell() {
this._enabled = true;
+ if (!this._delayedStartup && !Main.sessionMode.isLocked) {
+ Me.updateMessageDialog.showMessage();
+ this._delayedStartup = false;
+ }
+
this._originalGetNeighbor = Meta.Workspace.prototype.get_neighbor;
this._removeTimeouts();
this._timeouts = {};
+ if (!Main.layoutManager._startingUp)
+ this._ensureOverviewIsHidden();
+
+ // store dash _workId so we will be able to detect replacement when entering overview
+ this._storeDashId();
+
// load VShell configuration
this._updateSettings();
@@ -195,14 +211,18 @@ export default class VShell extends Extension.Extension {
this._updateSettingsConnection();
- // store dash _workId so we will be able to detect replacement when entering overview
- this._storeDashId();
-
// 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 +237,49 @@ 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);
+ this._prevDash = 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;
-
Meta.Workspace.prototype.get_neighbor = this._originalGetNeighbor;
}
+ _ensureOverviewIsHidden() {
+ if (Main.overview._shown) {
+ Main.overview._shown = false;
+ 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;
+ // layoutManager._dash retains reference to the default dash even when DtD is enabled
+ const dash = controls.layoutManager._dash;
+ // Restore default dash background style
+ dash._background.set_style('');
+
+ dash.translation_x = 0;
+ 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;
+ }
+
_removeTimeouts() {
if (this._timeouts) {
Object.values(this._timeouts).forEach(id => {
@@ -270,13 +312,12 @@ 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() {
if (!this._monitorsChangedConId)
- this._monitorsChangedConId = Main.layoutManager.connect('monitors-changed', () => this._updateVShell(2000));
-
+ this._monitorsChangedConId = Main.layoutManager.connect('monitors-changed', () => this._adaptToSystemChange());
if (!this._showingOverviewConId)
this._showingOverviewConId = Main.overview.connect('showing', this._onShowingOverview.bind(this));
@@ -289,15 +330,15 @@ 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;
}
);
} else if (session.currentMode === 'unlock-dialog') {
- Me.Modules.panelModule.update(true);
- Me.Modules.winTmbModule.hideThumbnails();
+ Me.Modules.panelModule.update();
+ Main.layoutManager.panelBox.translation_y = 0;
+ Main.panel.opacity = 255;
}
});
}
@@ -321,17 +362,51 @@ export default class VShell extends Extension.Extension {
// UNINSTALLED: 99,
// };
// no need to restart on disable/remove
- // - if DtD was enabled before VShell, VShell will be rebased by extensionSystem
- // - if DtD was enabled after VShell, the first _showingOverview detect replacement of the dash and repair VShell
+ // - if DtD was enabled before VShell, VShell will be rebased by the extensionSystem
+ // - If DtD was enabled after VShell, the first _showingOverview detects the replacement of the dash and repairs VShell
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._adaptToSystemChange(2000);
}
);
}
+
+ 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 +429,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) {
@@ -368,54 +448,14 @@ export default class VShell extends Extension.Extension {
Me.Modules.layoutModule.update(reset);
Me.Modules.dashModule.update(reset);
- // avoid enabling panel module when session is locked
- if (reset || (!reset && !Main.sessionMode.isLocked))
- Me.Modules.panelModule.update(reset);
- // the panel must be visible when screen is locked
- // at startup time, panel will be updated from the startupAnimation after allocation
- if (!reset && Main.sessionMode.isLocked && !Main.layoutManager._startingUp)
- Me.Modules.panelModule._showPanel(true);
- // PanelModule._showPanel(true);
- // hide panel so it appears directly on the final place
- /* else if (Main.layoutManager._startingUp && !Meta.is_restart())
- Main.panel.opacity = 0;*/
+ Me.Modules.panelModule.update(reset);
Me.Modules.workspaceAnimationModule.update(reset);
Me.Modules.workspaceSwitcherPopupModule.update(reset);
-
Me.Modules.swipeTrackerModule.update(reset);
-
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
- // when screen lock is activated for the first time
- // because every first disable of each extension rebases
- // the entire extensions stack that was enabled later
- if (Main.sessionMode.isLocked)
- this._sessionLockActive = true;
-
- // This covers unnecessary enable/disable cycles during first screen lock when extensions are rebased, but is not allowed by the EGO rules
- if (!this._sessionLockActive || !Main.extensionManager._getEnabledExtensions().includes(Me.metadata.uuid)) {
- // iconGridModule will be updated from appDisplayModule
- Me.Modules.appDisplayModule.update(reset);
- }
-
- if (!this._sessionLockActive && !Main.layoutManager._startingUp && opt.APP_GRID_PERFORMANCE) {
- // Avoid showing status at startup, can cause freeze
- this._showStatusMessage();
- }
-
- if (!Main.sessionMode.isLocked)
- this._sessionLockActive = false;
-
- // iconGridModule will be updated from appDisplayModule
- // Me.Modules.appDisplayModule.update(reset);
+ Me.Modules.appDisplayModule.update(reset);
Me.Modules.windowAttentionHandlerModule.update(reset);
Me.Modules.appFavoritesModule.update(reset);
@@ -423,34 +463,35 @@ 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 (Main.sessionMode.isLocked)
+ this._sessionLockActive = true;
+
+ if (!Main.sessionMode.isLocked)
+ this._sessionLockActive = false;
if (!reset && !Main.layoutManager._startingUp)
Main.overview._overview.controls.setInitialTranslations();
+ if (this._sessionLockActive) {
+ Main.layoutManager.panelBox.translation_y = 0;
+ Main.panel.opacity = 255;
+ }
}
_onShowingOverview() {
if (Main.layoutManager._startingUp)
return;
- Main.overview._overview.controls.opacity = 255;
-
- // store pointer X coordinate for OVERVIEW_MODE 1 window spread - if mouse pointer is steady, don't spread
- opt.showingPointerX = global.get_pointer()[0];
-
- 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) {
- // 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
+ if (this._watchDashToDock) {
+ // Workaround for Dash to Dock (Ubuntu Dock) breaking overview allocations after enabling and changing its position
+ // DtD replaces its _workId on every position change
const dash = Main.overview.dash;
if (this._prevDash !== dash._workId)
- this._updateVShell(0);
+ this._adaptToSystemChange(0);
}
}
- _updateVShell(timeout = 200) {
+ _adaptToSystemChange(timeout = 200, full = false) {
if (!this._enabled || Main.layoutManager._startingUp)
return;
@@ -464,18 +505,17 @@ export default class VShell extends Extension.Extension {
return GLib.SOURCE_REMOVE;
const dash = Main.overview.dash;
- if (timeout < 2000) { // timeout < 2000 for partial update
+ if (!full) {
+ console.warn(`[${Me.metadata.name}] Warning: Updating overrides ...`);
this._prevDash = dash._workId;
- console.warn(`[${Me.metadata.name}]: Dash has been replaced, updating extension ...`);
Me._resetInProgress = true;
- // update only necessary modules if dash has been replaced
+ // Only update modules that might be affected by the dock extension
this._repairOverrides();
Me._resetInProgress = false;
} else {
- console.warn(`[${Me.metadata.name}]: Updating extension ...`);
- // for case the monitor configuration has been changed, update all
+ console.warn(`[${Me.metadata.name}] Warning: Rebuilding V-Shell ...`);
Me._resetInProgress = true;
- this.activateVShell();
+ this._activateVShell();
Me._resetInProgress = false;
}
this._timeouts.reset = 0;
@@ -484,7 +524,7 @@ export default class VShell extends Extension.Extension {
);
}
- // the key modules that can be affected by the supported incompatible extensions
+ // Modules possibly affected by supported but incompatible extensions
_repairOverrides() {
Me.Modules.overviewModule.update();
Me.Modules.overviewControlsModule.update();
@@ -494,6 +534,7 @@ export default class VShell extends Extension.Extension {
Me.Modules.panelModule.update();
Me.Modules.dashModule.update();
this._updateSettings();
+ Main.overview._overview.controls._setBackground();
}
_updateSettings(settings, key) {
@@ -503,16 +544,17 @@ export default class VShell extends Extension.Extension {
// avoid overload while loading profile - update only once
// delayed gsettings writes are processed alphabetically
if (key === 'aaa-loading-profile') {
- this._showStatusMessage();
if (this._timeouts.loadingProfile)
GLib.source_remove(this._timeouts.loadingProfile);
this._timeouts.loadingProfile = GLib.timeout_add(
GLib.PRIORITY_DEFAULT,
100, () => {
- this.activateVShell();
+ this._activateVShell();
this._timeouts.loadingProfile = 0;
return GLib.SOURCE_REMOVE;
- });
+ }
+ );
+ Me.updateMessageDialog.showMessage();
}
if (this._timeouts.loadingProfile)
return;
@@ -536,16 +578,6 @@ export default class VShell extends Extension.Extension {
opt.DASH_VISIBLE = opt.DASH_VISIBLE && !Me.Util.getEnabledExtensions('dash-to-panel@jderose9.github.com').length;
- const monitorWidth = global.display.get_monitor_geometry(global.display.get_primary_monitor()).width;
- if (monitorWidth < 1600) {
- opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 128 : 64;
- opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 64;
- }
-
- /* if (!Me.Util.dashIsDashToDock()) { // DtD has its own opacity control
- Me.Modules.dashModule.updateStyle(dash);
- }*/
-
// adjust search entry style for OM2
if (opt.OVERVIEW_MODE2)
Main.overview.searchEntry.add_style_class_name('search-entry-om2');
@@ -561,18 +593,18 @@ export default class VShell extends Extension.Extension {
Main.overview.searchEntry.opacity = 255;
St.Settings.get().slow_down_factor = opt.ANIMATION_TIME_FACTOR;
- opt.START_Y_OFFSET = (opt.get('panelModule') && opt.PANEL_OVERVIEW_ONLY && opt.PANEL_POSITION_TOP) ||
- // better to add unnecessary space than to have a panel overlapping other objects
- Me.Util.getEnabledExtensions('hidetopbar').length
- ? Main.panel.height
- : 0;
-
// Options for workspace switcher, apply custom function only if needed
if (opt.WS_WRAPAROUND || opt.WS_IGNORE_LAST)
Meta.Workspace.prototype.get_neighbor = this._getNeighbor;
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);
}
@@ -581,15 +613,12 @@ export default class VShell extends Extension.Extension {
if (key?.endsWith('-module')) {
for (let module of this._getModuleList()) {
if (opt.options[module] && key === opt.options[module][1]) {
- if (key === 'app-display-module')
- this._showStatusMessage();
Me.Modules[module].update();
break;
}
}
}
- Main.overview._overview.controls._setBackground();
this._switchPageShortcuts();
if (key?.includes('panel'))
@@ -601,6 +630,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 +658,17 @@ 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;
+ case 'click-empty-close':
+ Me.Modules.overviewControlsModule.update();
}
if (key?.includes('app-grid') ||
@@ -639,10 +676,8 @@ export default class VShell extends Extension.Extension {
key?.includes('dot-style') ||
key === 'show-search-entry' ||
key === 'ws-thumbnail-scale' ||
- key === 'ws-thumbnail-scale-appgrid') {
- this._showStatusMessage();
+ key === 'ws-thumbnail-scale-appgrid')
Me.Modules.appDisplayModule.update();
- }
}
_switchPageShortcuts() {
@@ -728,54 +763,10 @@ export default class VShell extends Extension.Extension {
settings.set_strv(keyMoveDown, moveDown);
}
- // Status dialog that appears during updating V-Shell configuration and blocks inputs
- _showStatusMessage(show = true) {
- if ((show && Me._resetInProgress) || Main.layoutManager._startingUp || !Main.overview._overview.controls._appDisplay._sortOrderedItemsAlphabetically)
- return;
-
- if (Me._vShellMessageTimeoutId) {
- GLib.source_remove(Me._vShellMessageTimeoutId);
- Me._vShellMessageTimeoutId = 0;
- }
-
- if (Me._vShellStatusMessage && !show) {
- Me._vShellStatusMessage.close();
- Me._vShellStatusMessage.destroy();
- Me._vShellStatusMessage = null;
- }
-
- if (!show)
- return;
-
- if (!Me._vShellStatusMessage) {
- const sm = new /* Main.*/RestartMessage(_('Updating V-Shell...'));
- sm.set_style('background-color: rgba(0,0,0,0.3);');
- sm.open();
- Me._vShellStatusMessage = sm;
- }
-
- // just for case the message wasn't removed from appDisplay after App Grid realization
- Me._vShellMessageTimeoutId = GLib.timeout_add_seconds(
- GLib.PRIORITY_DEFAULT,
- 5,
- () => {
- if (Me._vShellStatusMessage) {
- Me._vShellStatusMessage.close();
- Me._vShellStatusMessage.destroy();
- Me._vShellStatusMessage = null;
- Me._resetInProgress = false;
- }
-
- Me._vShellMessageTimeoutId = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- }
-
_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;
@@ -819,24 +810,3 @@ export default class VShell extends Extension.Extension {
return global.workspace_manager.get_workspace_by_index(neighborExists || wraparound ? index : activeIndex);
}
}
-
-const RestartMessage = GObject.registerClass(
-class RestartMessage extends ModalDialog.ModalDialog {
- _init(message) {
- super._init({
- shellReactive: true,
- styleClass: 'restart-message headline',
- shouldFadeIn: false,
- destroyOnClose: true,
- });
-
- let label = new St.Label({
- text: message,
- x_align: Clutter.ActorAlign.CENTER,
- y_align: Clutter.ActorAlign.CENTER,
- });
-
- this.contentLayout.add_child(label);
- this.buttonLayout.hide();
- }
-});
diff --git a/extensions/47/vertical-workspaces/lib/appDisplay.js b/extensions/47/vertical-workspaces/lib/appDisplay.js
new file mode 100644
index 0000000..d94f7df
--- /dev/null
+++ b/extensions/47/vertical-workspaces/lib/appDisplay.js
@@ -0,0 +1,2014 @@
+/**
+ * V-Shell (Vertical Workspaces)
+ * appDisplay.js
+ *
+ * @author GdH <G-dH@github.com>
+ * @copyright 2022 - 2024
+ * @license GPL-3.0
+ *
+ */
+
+'use strict';
+
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Graphene from 'gi://Graphene';
+import Meta from 'gi://Meta';
+import Pango from 'gi://Pango';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js';
+import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
+import * as PageIndicators from 'resource:///org/gnome/shell/ui/pageIndicators.js';
+
+import { IconSize } from './iconGrid.js';
+
+let Me;
+let opt;
+// gettext
+let _;
+
+let _appDisplay;
+let _timeouts;
+
+const APP_ICON_TITLE_EXPAND_TIME = 200;
+const APP_ICON_TITLE_COLLAPSE_TIME = 100;
+
+const shellVersion46 = !Clutter.Container; // Container has been removed in 46
+
+function _getCategories(info) {
+ let categoriesStr = info.get_categories();
+ if (!categoriesStr)
+ return [];
+ return categoriesStr.split(';');
+}
+
+function _listsIntersect(a, b) {
+ for (let itemA of a) {
+ if (b.includes(itemA))
+ return true;
+ }
+ return false;
+}
+
+export const AppDisplayModule = class {
+ constructor(me) {
+ Me = me;
+ opt = Me.opt;
+ _ = Me.gettext;
+
+ _appDisplay = Main.overview._overview.controls._appDisplay;
+
+ this._firstActivation = true;
+ this.moduleEnabled = false;
+ this._overrides = null;
+
+ this._appSystemStateConId = 0;
+ this._appGridLayoutConId = 0;
+ this._origAppViewItemAcceptDrop = null;
+ this._updateFolderIcons = 0;
+ }
+
+ cleanGlobals() {
+ Me = null;
+ opt = null;
+ _ = null;
+ _appDisplay = null;
+ }
+
+ update(reset) {
+ this._removeTimeouts();
+ this.moduleEnabled = opt.get('appDisplayModule');
+ const conflict = false;
+
+ reset = reset || !this.moduleEnabled || conflict;
+
+ // don't touch the original code if module disabled
+ if (reset && !this._firstActivation) {
+ this._disableModule();
+ this.moduleEnabled = false;
+ } else if (!reset) {
+ this._firstActivation = false;
+ this._activateModule();
+ }
+ if (reset && this._firstActivation) {
+ this.moduleEnabled = false;
+ console.debug(' AppDisplayModule - Keeping untouched');
+ }
+ }
+
+ _activateModule() {
+ Me.Modules.iconGridModule.update();
+
+ if (!this._overrides)
+ this._overrides = new Me.Util.Overrides();
+
+ _timeouts = {};
+
+ this._applyOverrides();
+ this._updateAppDisplay();
+ _appDisplay.add_style_class_name('app-display-46');
+
+ console.debug(' AppDisplayModule - Activated');
+ }
+
+ _disableModule() {
+ Me.Modules.iconGridModule.update(true);
+
+ if (this._overrides)
+ this._overrides.removeAll();
+ this._overrides = null;
+
+ const reset = true;
+ this._updateAppDisplay(reset);
+ this._restoreOverviewGroup();
+
+ _appDisplay.remove_style_class_name('app-display-46');
+
+ console.debug(' AppDisplayModule - Disabled');
+ }
+
+ _removeTimeouts() {
+ if (_timeouts) {
+ Object.values(_timeouts).forEach(t => {
+ if (t)
+ GLib.source_remove(t);
+ });
+ _timeouts = null;
+ }
+ }
+
+ _applyOverrides() {
+ // Common/appDisplay
+ // this._overrides.addOverride('BaseAppViewCommon', AppDisplay.BaseAppView.prototype, BaseAppViewCommon);
+ // instead of overriding inaccessible BaseAppView class, we override its subclasses - AppDisplay and FolderView
+ this._overrides.addOverride('BaseAppViewCommonApp', AppDisplay.AppDisplay.prototype, BaseAppViewCommon);
+ this._overrides.addOverride('AppDisplay', AppDisplay.AppDisplay.prototype, AppDisplayCommon);
+ this._overrides.addOverride('AppViewItem', AppDisplay.AppViewItem.prototype, AppViewItemCommon);
+ this._overrides.addOverride('AppGridCommon', AppDisplay.AppGrid.prototype, AppGridCommon);
+ this._overrides.addOverride('AppIcon', AppDisplay.AppIcon.prototype, AppIcon);
+ if (opt.ORIENTATION) {
+ this._overrides.removeOverride('AppGridLayoutHorizontal');
+ this._overrides.addOverride('AppGridLayoutVertical', _appDisplay._appGridLayout, BaseAppViewGridLayoutVertical);
+ } else {
+ this._overrides.removeOverride('AppGridLayoutVertical');
+ this._overrides.addOverride('AppGridLayoutHorizontal', _appDisplay._appGridLayout, BaseAppViewGridLayoutHorizontal);
+ }
+
+ // Custom folders
+ this._overrides.addOverride('BaseAppViewCommonFolder', AppDisplay.FolderView.prototype, BaseAppViewCommon);
+ this._overrides.addOverride('FolderView', AppDisplay.FolderView.prototype, FolderView);
+ this._overrides.addOverride('AppFolderDialog', AppDisplay.AppFolderDialog.prototype, AppFolderDialog);
+ this._overrides.addOverride('FolderIcon', AppDisplay.FolderIcon.prototype, FolderIcon);
+
+ // Prevent changing grid page size when showing/hiding _pageIndicators
+ this._overrides.addOverride('PageIndicators', PageIndicators.PageIndicators.prototype, PageIndicatorsCommon);
+ }
+
+ _updateAppDisplay(reset) {
+ const orientation = reset ? Clutter.Orientation.HORIZONTAL : opt.ORIENTATION;
+ BaseAppViewCommon._adaptForOrientation.bind(_appDisplay)(orientation);
+
+ this._updateFavoritesConnection(reset);
+
+ _appDisplay.visible = true;
+ if (reset) {
+ _appDisplay._grid.layoutManager.fixedIconSize = -1;
+ _appDisplay._grid.layoutManager.allow_incomplete_pages = true;
+ _appDisplay._grid._currentMode = -1;
+ _appDisplay._grid.setGridModes();
+ _appDisplay._grid.set_style('');
+ _appDisplay._prevPageArrow.set_scale(1, 1);
+ _appDisplay._nextPageArrow.set_scale(1, 1);
+ if (this._appGridLayoutConId) {
+ global.settings.disconnect(this._appGridLayoutConId);
+ this._appGridLayoutConId = 0;
+ }
+ this._repopulateAppDisplay(reset);
+ } else {
+ _appDisplay._grid._currentMode = -1;
+ // update grid on layout reset
+ if (!this._appGridLayoutConId)
+ this._appGridLayoutConId = global.settings.connect('changed::app-picker-layout', this._updateLayout.bind(this));
+
+ // avoid resetting appDisplay before startup animation
+ // x11 shell restart skips startup animation
+ if (!Main.layoutManager._startingUp) {
+ this._repopulateAppDisplay();
+ } else if (Main.layoutManager._startingUp && Meta.is_restart()) {
+ _timeouts.three = GLib.idle_add(GLib.PRIORITY_LOW, () => {
+ this._repopulateAppDisplay();
+ _timeouts.three = 0;
+ return GLib.SOURCE_REMOVE;
+ });
+ }
+ }
+ }
+
+ _updateFavoritesConnection(reset) {
+ if (!reset) {
+ if (!this._appSystemStateConId && opt.APP_GRID_INCLUDE_DASH >= 3) {
+ this._appSystemStateConId = Shell.AppSystem.get_default().connect(
+ 'app-state-changed',
+ () => {
+ this._updateFolderIcons = true;
+ _appDisplay._redisplay();
+ }
+ );
+ }
+ } else if (this._appSystemStateConId) {
+ Shell.AppSystem.get_default().disconnect(this._appSystemStateConId);
+ this._appSystemStateConId = 0;
+ }
+ }
+
+ _restoreOverviewGroup() {
+ Main.overview.dash.showAppsButton.checked = false;
+ Main.layoutManager.overviewGroup.opacity = 255;
+ Main.layoutManager.overviewGroup.scale_x = 1;
+ Main.layoutManager.overviewGroup.scale_y = 1;
+ Main.layoutManager.overviewGroup.hide();
+ _appDisplay.translation_x = 0;
+ _appDisplay.translation_y = 0;
+ _appDisplay.visible = true;
+ _appDisplay.opacity = 255;
+ }
+
+ _updateLayout(settings, key) {
+ // Reset the app grid only if the user layout has been completely removed
+ if (!settings.get_value(key).deep_unpack().length) {
+ this._repopulateAppDisplay();
+ }
+ }
+
+ _repopulateAppDisplay(reset = false, callback) {
+ // Remove all icons so they can be re-created with the current configuration
+ // Updating appGrid content while rebasing extensions when session is locked makes no sense (relevant for GS version < 46)
+ if (!Main.sessionMode.isLocked)
+ AppDisplayCommon.removeAllItems.bind(_appDisplay)();
+
+ // appDisplay disabled
+ if (reset) {
+ _appDisplay._redisplay();
+ return;
+ }
+
+ _appDisplay._readyToRedisplay = true;
+ _appDisplay._redisplay();
+
+ // Setting OffscreenRedirect should improve performance when opacity transitions are used
+ _appDisplay.offscreen_redirect = Clutter.OffscreenRedirect.ALWAYS;
+
+ if (opt.APP_GRID_PERFORMANCE)
+ this._realizeAppDisplay(callback);
+ else if (callback)
+ callback();
+ }
+
+ _realizeAppDisplay(callback) {
+ // Workaround - silently realize appDisplay
+ // The realization takes some time and affects animations during the first use
+ // If we do it invisibly before the user needs the app grid, it can improve the user's experience
+ _appDisplay.opacity = 1;
+
+ this._exposeAppGrid();
+ _appDisplay._redisplay();
+ this._exposeAppFolders();
+
+ // Let the main loop process our changes before we continue
+ _timeouts.updateAppGrid = GLib.idle_add(GLib.PRIORITY_LOW, () => {
+ this._restoreAppGrid();
+ Me._resetInProgress = false;
+
+ if (callback)
+ callback();
+
+ _timeouts.updateAppGrid = 0;
+ return GLib.SOURCE_REMOVE;
+ });
+ }
+
+ _exposeAppGrid() {
+ const overviewGroup = Main.layoutManager.overviewGroup;
+ if (!overviewGroup.visible) {
+ // scale down the overviewGroup so it don't cover uiGroup
+ overviewGroup.scale_y = 0.001;
+ // make it invisible to the eye, but visible for the renderer
+ overviewGroup.opacity = 1;
+ // if overview is hidden, show it
+ overviewGroup.visible = true;
+ }
+ }
+
+ _restoreAppGrid() {
+ if (opt.APP_GRID_PERFORMANCE)
+ this._hideAppFolders();
+
+ const overviewGroup = Main.layoutManager.overviewGroup;
+ if (!Main.overview._shown)
+ overviewGroup.hide();
+ overviewGroup.scale_y = 1;
+ overviewGroup.opacity = 255;
+ _appDisplay.opacity = 0;
+ _appDisplay.visible = false;
+ }
+
+ _exposeAppFolders() {
+ _appDisplay._folderIcons.forEach(d => {
+ d._ensureFolderDialog();
+ d._dialog.scale_y = 0.0001;
+ d._dialog.show();
+ d._dialog._updateFolderSize();
+ });
+ }
+
+ _hideAppFolders() {
+ _appDisplay._folderIcons.forEach(d => {
+ if (d._dialog) {
+ d._dialog.hide();
+ d._dialog.scale_y = 1;
+ }
+ });
+ }
+};
+
+function _getViewFromIcon(icon) {
+ icon = icon._sourceItem ? icon._sourceItem : icon;
+ for (let parent = icon.get_parent(); parent; parent = parent.get_parent()) {
+ if (parent instanceof AppDisplay.AppDisplay || parent instanceof AppDisplay.FolderView) {
+ return parent;
+ }
+ }
+ return null;
+}
+
+const AppDisplayCommon = {
+ _ensureDefaultFolders() {
+ // disable creation of default folders if user deleted them
+ },
+
+ removeAllItems() {
+ this._orderedItems.slice().forEach(item => {
+ if (item._dialog)
+ Main.layoutManager.overviewGroup.remove_child(item._dialog);
+
+ this._removeItem(item);
+ item.destroy();
+ });
+ this._folderIcons = [];
+ },
+
+ // apps load adapted for custom sorting and including dash items
+ _loadApps() {
+ let appIcons = [];
+ const runningApps = Shell.AppSystem.get_default().get_running().map(a => a.id);
+
+ this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
+ try {
+ appInfo.get_id(); // catch invalid file encodings
+ } catch (e) {
+ return false;
+ }
+
+ const appIsRunning = runningApps.includes(appInfo.get_id());
+ const appIsFavorite = this._appFavorites.isFavorite(appInfo.get_id());
+ const excludeApp = (opt.APP_GRID_EXCLUDE_RUNNING && appIsRunning) || (opt.APP_GRID_EXCLUDE_FAVORITES && appIsFavorite);
+
+ return this._parentalControlsManager.shouldShowApp(appInfo) && !excludeApp;
+ });
+
+ let apps = this._appInfoList.map(app => app.get_id());
+
+ let appSys = Shell.AppSystem.get_default();
+
+ const appsInsideFolders = new Set();
+ this._folderIcons = [];
+ if (!opt.APP_GRID_USAGE) {
+ let folders = this._folderSettings.get_strv('folder-children');
+ folders.forEach(id => {
+ let path = `${this._folderSettings.path}folders/${id}/`;
+ let icon = this._items.get(id);
+ if (!icon) {
+ icon = new AppDisplay.FolderIcon(id, path, this);
+ icon.connect('apps-changed', () => {
+ this._redisplay();
+ this._savePages();
+ });
+ icon.connect('notify::pressed', () => {
+ if (icon.pressed)
+ this.updateDragFocus(icon);
+ });
+ } else if (this._updateFolderIcons && opt.APP_GRID_EXCLUDE_RUNNING) {
+ // if any app changed its running state, update folder icon
+ icon.icon.update();
+ }
+
+ // remove empty folder icons
+ if (!icon.visible) {
+ icon.destroy();
+ return;
+ }
+
+ appIcons.push(icon);
+ this._folderIcons.push(icon);
+
+ icon.getAppIds().forEach(appId => appsInsideFolders.add(appId));
+ });
+ }
+
+ // reset request to update active icon
+ this._updateFolderIcons = false;
+
+ // Allow dragging of the icon only if the Dash would accept a drop to
+ // change favorite-apps. There are no other possible drop targets from
+ // the app picker, so there's no other need for a drag to start,
+ // at least on single-monitor setups.
+ // This also disables drag-to-launch on multi-monitor setups,
+ // but we hope that is not used much.
+ const isDraggable =
+ global.settings.is_writable('favorite-apps') ||
+ global.settings.is_writable('app-picker-layout');
+
+ apps.forEach(appId => {
+ if (!opt.APP_GRID_USAGE && appsInsideFolders.has(appId))
+ return;
+
+ let icon = this._items.get(appId);
+ if (!icon) {
+ let app = appSys.lookup_app(appId);
+ icon = new AppDisplay.AppIcon(app, { isDraggable });
+ icon.connect('notify::pressed', () => {
+ if (icon.pressed)
+ this.updateDragFocus(icon);
+ });
+ }
+
+ appIcons.push(icon);
+ });
+
+ // At last, if there's a placeholder available, add it
+ if (this._placeholder)
+ appIcons.push(this._placeholder);
+
+ return appIcons;
+ },
+
+ _onDragBegin(overview, source) {
+ // let sourceId;
+ // support active preview icons
+ if (source._sourceItem) {
+ // sourceId = source._sourceFolder._id;
+ source = source._sourceItem;
+ } /* else {
+ sourceId = source.id;
+ }*/
+ // Prevent switching page when an item on another page is selected
+ // by removing the focus from all icons
+ // This is an upstream bug
+ // this.selectApp(sourceId);
+ this.grab_key_focus();
+
+ this._dragMonitor = {
+ dragMotion: this._onDragMotion.bind(this),
+ dragDrop: this._onDragDrop.bind(this),
+ };
+ DND.addDragMonitor(this._dragMonitor);
+
+ this._appGridLayout.showPageIndicators();
+ this._dragFocus = null;
+ this._swipeTracker.enabled = false;
+
+ // When dragging from a folder dialog, the dragged app icon doesn't
+ // exist in AppDisplay. We work around that by adding a placeholder
+ // icon that is either destroyed on cancel, or becomes the effective
+ // new icon when dropped.
+ if (/* AppDisplay.*/_getViewFromIcon(source) instanceof AppDisplay.FolderView ||
+ (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(source.id)))
+ this._ensurePlaceholder(source);
+ },
+
+ _ensurePlaceholder(source) {
+ if (this._placeholder)
+ return;
+
+ if (source._sourceItem)
+ source = source._sourceItem;
+
+ const appSys = Shell.AppSystem.get_default();
+ const app = appSys.lookup_app(source.id);
+
+ const isDraggable =
+ global.settings.is_writable('favorite-apps') ||
+ global.settings.is_writable('app-picker-layout');
+
+ this._placeholder = new AppDisplay.AppIcon(app, { isDraggable });
+ this._placeholder.connect('notify::pressed', () => {
+ if (this._placeholder?.pressed)
+ this.updateDragFocus(this._placeholder);
+ });
+ this._placeholder.scaleAndFade();
+ this._redisplay();
+ },
+
+ // accept source from active folder preview
+ acceptDrop(source) {
+ if (opt.APP_GRID_USAGE)
+ return false;
+ if (source._sourceItem)
+ source = source._sourceItem;
+ if (!this._acceptDropCommon(source))
+ return false;
+
+ this._savePages();
+
+ const view = /* AppDisplay.*/_getViewFromIcon(source);
+ if (view instanceof AppDisplay.FolderView)
+ view.removeApp(source.app);
+
+ if (this._currentDialog)
+ this._currentDialog.popdown();
+
+ if (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(source.id))
+ this._appFavorites.removeFavorite(source.id);
+ return true;
+ },
+
+ _savePages() {
+ // Skip saving pages when search app grid mode is active
+ // and the grid is showing search results
+ if (Main.overview._overview.controls._origAppGridContent)
+ return;
+
+ const pages = [];
+
+ for (let i = 0; i < this._grid.nPages; i++) {
+ const pageItems =
+ this._grid.getItemsAtPage(i).filter(c => c.visible);
+ const pageData = {};
+
+ pageItems.forEach((item, index) => {
+ pageData[item.id] = {
+ position: GLib.Variant.new_int32(index),
+ };
+ });
+ pages.push(pageData);
+ }
+
+ this._pageManager.pages = pages;
+ },
+};
+
+const BaseAppViewCommon = {
+ after__init() {
+ // Only folders can run this init
+ this._isFolder = true;
+
+ this._adaptForOrientation(opt.ORIENTATION, true);
+
+ // Because the original class prototype is not exported, we need to inject every instance
+ const overrides = new Me.Util.Overrides();
+ if (opt.ORIENTATION) {
+ overrides.addOverride('FolderGridLayoutVertical', this._appGridLayout, BaseAppViewGridLayoutVertical);
+ this._pageIndicators.set_style('margin-right: 12px;');
+ } else {
+ overrides.addOverride('FolderGridLayoutHorizontal', this._appGridLayout, BaseAppViewGridLayoutHorizontal);
+ this._pageIndicators.set_style('margin-bottom: 12px;');
+ }
+ },
+
+ _adaptForOrientation(orientation, folder) {
+ const vertical = !!orientation;
+
+ this._grid.layoutManager.fixedIconSize = folder ? opt.APP_GRID_FOLDER_ICON_SIZE : opt.APP_GRID_ICON_SIZE;
+ this._grid.layoutManager._orientation = orientation;
+ this._orientation = orientation;
+ this._swipeTracker.orientation = orientation;
+ this._swipeTracker._reset();
+
+ this._adjustment = vertical
+ ? this._scrollView.get_vscroll_bar().adjustment
+ : this._scrollView.get_hscroll_bar().adjustment;
+
+ this._prevPageArrow.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 });
+ this._prevPageArrow.rotation_angle_z = vertical ? 90 : 0;
+
+ this._nextPageArrow.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 });
+ this._nextPageArrow.rotation_angle_z = vertical ? 90 : 0;
+
+ const pageIndicators = this._pageIndicators;
+ pageIndicators.vertical = vertical;
+ this._box.vertical = !vertical;
+ pageIndicators.x_expand = !vertical;
+ pageIndicators.y_align = vertical ? Clutter.ActorAlign.CENTER : Clutter.ActorAlign.START;
+ pageIndicators.x_align = vertical ? Clutter.ActorAlign.START : Clutter.ActorAlign.CENTER;
+
+ this._grid.layoutManager.allow_incomplete_pages = folder ? false : opt.APP_GRID_ALLOW_INCOMPLETE_PAGES;
+ const spacing = folder ? opt.APP_GRID_FOLDER_SPACING : opt.APP_GRID_SPACING;
+ this._grid.set_style(`column-spacing: ${spacing}px; row-spacing: ${spacing}px;`);
+
+ if (vertical) {
+ this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.EXTERNAL);
+ if (!this._scrollConId) {
+ this._scrollConId = this._adjustment.connect('notify::value', adj => {
+ const value = adj.value / adj.page_size;
+ this._pageIndicators.setCurrentPosition(value);
+ });
+ }
+ pageIndicators.remove_style_class_name('page-indicators-horizontal');
+ pageIndicators.add_style_class_name('page-indicators-vertical');
+ this._prevPageIndicator.add_style_class_name('prev-page-indicator');
+ this._nextPageIndicator.add_style_class_name('next-page-indicator');
+ this._nextPageArrow.translationY = 0;
+ this._prevPageArrow.translationY = 0;
+ this._nextPageIndicator.translationX = 0;
+ this._prevPageIndicator.translationX = 0;
+ } else {
+ this._scrollView.set_policy(St.PolicyType.EXTERNAL, St.PolicyType.NEVER);
+ if (this._scrollConId) {
+ this._adjustment.disconnect(this._scrollConId);
+ this._scrollConId = 0;
+ }
+ pageIndicators.remove_style_class_name('page-indicators-vertical');
+ pageIndicators.add_style_class_name('page-indicators-horizontal');
+ this._prevPageIndicator.remove_style_class_name('prev-page-indicator');
+ this._nextPageIndicator.remove_style_class_name('next-page-indicator');
+ this._nextPageArrow.translationX = 0;
+ this._prevPageArrow.translationX = 0;
+ this._nextPageIndicator.translationY = 0;
+ this._prevPageIndicator.translationY = 0;
+ }
+
+ const scale = opt.APP_GRID_SHOW_PAGE_ARROWS ? 1 : 0;
+ this._prevPageArrow.set_scale(scale, scale);
+ this._nextPageArrow.set_scale(scale, scale);
+ },
+
+ _sortItemsByName(items) {
+ items.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
+ },
+
+ _updateItemPositions(icons, allowIncompletePages = false) {
+ // Avoid recursion when relocating icons
+ this._grid.layoutManager._skipRelocateSurplusItems = true;
+
+ const { itemsPerPage } = this._grid;
+
+ icons.slice().forEach((icon, index) => {
+ const [currentPage, currentPosition] = this._grid.layoutManager.getItemPosition(icon);
+
+ let page, position;
+ if (allowIncompletePages) {
+ [page, position] = this._getItemPosition(icon);
+ } else {
+ page = Math.floor(index / itemsPerPage);
+ position = index % itemsPerPage;
+ }
+
+ if (currentPage !== page || currentPosition !== position) {
+ this._moveItem(icon, page, position);
+ }
+ });
+
+ this._grid.layoutManager._skipRelocateSurplusItems = false;
+ // Disable animating the icons to their new positions
+ // since it can cause glitches when the app grid search mode is active
+ // and many icons are repositioning at once
+ this._grid.layoutManager._shouldEaseItems = false;
+ },
+
+ // Adds sorting options
+ _redisplay() {
+ // different options for main app grid and app folders
+ const thisIsFolder = this instanceof AppDisplay.FolderView;
+ const thisIsAppDisplay = !thisIsFolder;
+
+ // When an app was dragged from a folder and dropped to the main grid
+ // folders (if exist) need to be redisplayed even if we temporary block it for the appDisplay
+ this._folderIcons?.forEach(icon => {
+ icon.view._redisplay();
+ });
+
+ // Avoid unwanted updates
+ if (thisIsAppDisplay && !this._readyToRedisplay)
+ return;
+
+ const oldApps = this._orderedItems.slice();
+ const oldAppIds = oldApps.map(icon => icon.id);
+
+ const newApps = this._loadApps();
+ const newAppIds = newApps.map(icon => icon.id);
+
+ const addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id));
+ const removedApps = oldApps.filter(icon => !newAppIds.includes(icon.id));
+
+ // Don't update folder without dialog if its content didn't change
+ if (!addedApps.length && !removedApps.length && thisIsFolder && !this.get_parent())
+ return;
+
+ // Remove old app icons
+ removedApps.forEach(icon => {
+ this._removeItem(icon);
+ icon.destroy();
+ });
+
+ // For the main app grid only
+ let allowIncompletePages = thisIsAppDisplay && opt.APP_GRID_ALLOW_INCOMPLETE_PAGES;
+
+ const customOrder = !((opt.APP_GRID_ORDER && thisIsAppDisplay) || (opt.APP_FOLDER_ORDER && thisIsFolder));
+ if (!customOrder) {
+ allowIncompletePages = false;
+
+ // Sort by name
+ this._sortItemsByName(newApps);
+
+ // Sort by usage
+ if ((opt.APP_GRID_USAGE && thisIsAppDisplay) ||
+ (opt.APP_FOLDER_USAGE && thisIsFolder)) {
+ newApps.sort((a, b) => Shell.AppUsage.get_default().compare(a.app?.id, b.app?.id));
+ }
+
+ // Sort favorites first
+ if (!opt.APP_GRID_EXCLUDE_FAVORITES && opt.APP_GRID_DASH_FIRST) {
+ const fav = Object.keys(this._appFavorites._favorites);
+ newApps.sort((a, b) => {
+ let aFav = fav.indexOf(a.id);
+ if (aFav < 0)
+ aFav = 999;
+ let bFav = fav.indexOf(b.id);
+ if (bFav < 0)
+ bFav = 999;
+ return bFav < aFav;
+ });
+ }
+
+ // Sort running first
+ if (!opt.APP_GRID_EXCLUDE_RUNNING && opt.APP_GRID_DASH_FIRST) {
+ newApps.sort((a, b) => a.app?.get_state() !== Shell.AppState.RUNNING && b.app?.get_state() === Shell.AppState.RUNNING);
+ }
+
+ // Sort folders first
+ if (thisIsAppDisplay && opt.APP_GRID_FOLDERS_FIRST)
+ newApps.sort((a, b) => b._folder && !a._folder);
+
+ // Sort folders last
+ else if (thisIsAppDisplay && opt.APP_GRID_FOLDERS_LAST)
+ newApps.sort((a, b) => a._folder && !b._folder);
+ } else {
+ // Sort items according to the custom order stored in pageManager
+ newApps.sort(this._compareItems.bind(this));
+ }
+
+ // Add new app icons to the grid
+ newApps.forEach(icon => {
+ const [page, position] = this._grid.getItemPosition(icon);
+ if (page === -1 && position === -1)
+ this._addItem(icon, -1, -1);
+ });
+ // When a placeholder icon was added to the custom sorted grid during DND from a folder
+ // update its initial position on the page
+ if (customOrder)
+ newApps.sort(this._compareItems.bind(this));
+
+ this._orderedItems = newApps;
+
+ // Update icon positions if needed
+ this._updateItemPositions(this._orderedItems, allowIncompletePages);
+
+ // Relocate items with invalid positions
+ if (thisIsAppDisplay) {
+ const nPages = this._grid.layoutManager.nPages;
+ for (let pageIndex = 0; pageIndex < nPages; pageIndex++)
+ this._grid.layoutManager._relocateSurplusItems(pageIndex);
+ }
+
+ this.emit('view-loaded');
+ },
+
+ _canAccept(source) {
+ return source instanceof AppDisplay.AppViewItem;
+ },
+
+ // this method is replacing BaseAppVew.acceptDrop which can't be overridden directly
+ _acceptDropCommon(source) {
+ const dropTarget = this._dropTarget;
+ delete this._dropTarget;
+ if (!this._canAccept(source))
+ return false;
+
+ if (dropTarget === this._prevPageIndicator ||
+ dropTarget === this._nextPageIndicator) {
+ let increment;
+ increment = dropTarget === this._prevPageIndicator ? -1 : 1;
+ const { currentPage, nPages } = this._grid;
+ const page = Math.min(currentPage + increment, nPages);
+ const position = page < nPages ? -1 : 0;
+
+ this._moveItem(source, page, position);
+ this.goToPage(page);
+ } else if (this._delayedMoveData) {
+ // Dropped before the icon was moved
+ const { page, position } = this._delayedMoveData;
+ try {
+ this._moveItem(source, page, position);
+ } catch (e) {
+ console.warn(`Warning:${e}`);
+ }
+ this._removeDelayedMove();
+ }
+
+ return true;
+ },
+
+ // support active preview icons
+ _onDragMotion(dragEvent) {
+ if (!(dragEvent.source instanceof AppDisplay.AppViewItem))
+ return DND.DragMotionResult.CONTINUE;
+
+ if (dragEvent.source._sourceItem)
+ dragEvent.source = dragEvent.source._sourceItem;
+
+ const appIcon = dragEvent.source;
+
+ if (appIcon instanceof AppDisplay.AppViewItem) {
+ if (!this._dragMaybeSwitchPageImmediately(dragEvent)) {
+ // Two ways of switching pages during DND:
+ // 1) When "bumping" the cursor against the monitor edge, we switch
+ // page immediately.
+ // 2) When hovering over the next-page indicator for a certain time,
+ // we also switch page.
+
+ const { targetActor } = dragEvent;
+
+ if (targetActor === this._prevPageIndicator ||
+ targetActor === this._nextPageIndicator)
+ this._maybeSetupDragPageSwitchInitialTimeout(dragEvent);
+ else
+ this._resetDragPageSwitch();
+ }
+ }
+
+ const thisIsFolder = this instanceof AppDisplay.FolderView;
+ const thisIsAppDisplay = !thisIsFolder;
+
+ // Prevent reorganizing the main app grid icons when an app folder is open and when sorting is not custom
+ // For some reason in V-Shell the drag motion events propagate from folder to main grid, which is not a problem in default code - so test the open dialog
+ if (!this._currentDialog && (!opt.APP_GRID_ORDER && thisIsAppDisplay) || (!opt.APP_FOLDER_ORDER && thisIsFolder))
+ this._maybeMoveItem(dragEvent);
+
+ return DND.DragMotionResult.CONTINUE;
+ },
+};
+
+const BaseAppViewGridLayoutHorizontal = {
+ _getIndicatorsWidth(box) {
+ const [width, height] = box.get_size();
+ const arrows = [
+ this._nextPageArrow,
+ this._previousPageArrow,
+ ];
+
+ let minArrowsWidth;
+
+ minArrowsWidth = arrows.reduce(
+ (previousWidth, accessory) => {
+ const [min] = accessory.get_preferred_width(height);
+ return Math.max(previousWidth, min);
+ }, 0);
+
+ minArrowsWidth = opt.APP_GRID_SHOW_PAGE_ARROWS ? minArrowsWidth : 0;
+
+ const indicatorWidth = !this._grid._isFolder
+ ? minArrowsWidth + ((width - minArrowsWidth) * (1 - opt.APP_GRID_PAGE_WIDTH_SCALE)) / 2
+ : minArrowsWidth + 6;
+
+ return Math.round(indicatorWidth);
+ },
+
+ vfunc_allocate(container, box) {
+ const ltr = container.get_text_direction() !== Clutter.TextDirection.RTL;
+ const indicatorsWidth = this._getIndicatorsWidth(box);
+
+ const pageIndicatorsHeight = 20; // _appDisplay._pageIndicators.height is unstable, 20 is determined by the style
+ const availHeight = box.get_height() - pageIndicatorsHeight;
+ const vPadding = Math.round((availHeight - availHeight * opt.APP_GRID_PAGE_HEIGHT_SCALE) / 2);
+ this._grid.indicatorsPadding = new Clutter.Margin({
+ left: indicatorsWidth,
+ right: indicatorsWidth,
+ top: vPadding + pageIndicatorsHeight,
+ bottom: vPadding,
+ });
+
+ this._scrollView.allocate(box);
+
+ const leftBox = box.copy();
+ leftBox.x2 = leftBox.x1 + indicatorsWidth;
+
+ const rightBox = box.copy();
+ rightBox.x1 = rightBox.x2 - indicatorsWidth;
+
+ this._previousPageIndicator.allocate(ltr ? leftBox : rightBox);
+ this._previousPageArrow.allocate_align_fill(ltr ? leftBox : rightBox,
+ 0.5, 0.5, false, false);
+ this._nextPageIndicator.allocate(ltr ? rightBox : leftBox);
+ this._nextPageArrow.allocate_align_fill(ltr ? rightBox : leftBox,
+ 0.5, 0.5, false, false);
+
+ this._pageWidth = box.get_width();
+
+ // Center page arrow buttons
+ this._previousPageArrow.translationY = pageIndicatorsHeight / 2;
+ this._nextPageArrow.translationY = pageIndicatorsHeight / 2;
+ // Reset page indicators vertical position
+ this._nextPageIndicator.translationY = 0;
+ this._previousPageIndicator.translationY = 0;
+ },
+};
+
+const BaseAppViewGridLayoutVertical = {
+ _getIndicatorsHeight(box) {
+ const [width, height] = box.get_size();
+ const arrows = [
+ this._nextPageArrow,
+ this._previousPageArrow,
+ ];
+
+ let minArrowsHeight;
+
+ minArrowsHeight = arrows.reduce(
+ (previousHeight, accessory) => {
+ const [min] = accessory.get_preferred_height(width);
+ return Math.max(previousHeight, min);
+ }, 0);
+
+ minArrowsHeight = opt.APP_GRID_SHOW_PAGE_ARROWS ? minArrowsHeight : 0;
+
+ const indicatorHeight = !this._grid._isFolder
+ ? minArrowsHeight + ((height - minArrowsHeight) * (1 - opt.APP_GRID_PAGE_HEIGHT_SCALE)) / 2
+ : minArrowsHeight + 6;
+
+ return Math.round(indicatorHeight);
+ },
+
+ _syncPageIndicators() {
+ if (!this._container)
+ return;
+
+ const { value } = this._pageIndicatorsAdjustment;
+
+ const { top, bottom } = this._grid.indicatorsPadding;
+ const topIndicatorOffset = -top * (1 - value);
+ const bottomIndicatorOffset = bottom * (1 - value);
+
+ this._previousPageIndicator.translationY =
+ topIndicatorOffset;
+ this._nextPageIndicator.translationY =
+ bottomIndicatorOffset;
+
+ const leftArrowOffset = -top * value;
+ const rightArrowOffset = bottom * value;
+
+ this._previousPageArrow.translationY =
+ leftArrowOffset;
+ this._nextPageArrow.translationY =
+ rightArrowOffset;
+
+ // Page icons
+ this._translatePreviousPageIcons(value);
+ this._translateNextPageIcons(value);
+
+ if (this._grid.nPages > 0) {
+ this._grid.getItemsAtPage(this._currentPage).forEach(icon => {
+ icon.translationY = 0;
+ });
+ }
+ },
+
+ _translatePreviousPageIcons(value) {
+ if (this._currentPage === 0)
+ return;
+
+ const pageHeight = this._grid.layoutManager._pageHeight;
+ const previousPage = this._currentPage - 1;
+ const icons = this._grid.getItemsAtPage(previousPage).filter(i => i.visible);
+ if (icons.length === 0)
+ return;
+
+ const { top } = this._grid.indicatorsPadding;
+ const { rowSpacing } = this._grid.layoutManager;
+ const endIcon = icons[icons.length - 1];
+ let iconOffset;
+
+ const currentPageOffset = pageHeight * this._currentPage;
+ iconOffset = currentPageOffset - endIcon.allocation.y1 - endIcon.width + top - rowSpacing;
+
+ for (const icon of icons)
+ icon.translationY = iconOffset * value;
+ },
+
+ _translateNextPageIcons(value) {
+ if (this._currentPage >= this._grid.nPages - 1)
+ return;
+
+ const nextPage = this._currentPage + 1;
+ const icons = this._grid.getItemsAtPage(nextPage).filter(i => i.visible);
+ if (icons.length === 0)
+ return;
+
+ const { bottom } = this._grid.indicatorsPadding;
+ const { rowSpacing } = this._grid.layoutManager;
+ let iconOffset;
+
+ const pageOffset = this._pageHeight * nextPage;
+ iconOffset = pageOffset - icons[0].allocation.y1 - bottom + rowSpacing;
+
+ for (const icon of icons)
+ icon.translationY = iconOffset * value;
+ },
+
+ vfunc_allocate(container, box) {
+ const indicatorsHeight = this._getIndicatorsHeight(box);
+
+ const pageIndicatorsWidth = 20; // _appDisplay._pageIndicators.width is not stable, 20 is determined by the style
+ const availWidth = box.get_width() - pageIndicatorsWidth;
+ const hPadding = Math.round((availWidth - availWidth * opt.APP_GRID_PAGE_WIDTH_SCALE) / 2);
+
+ this._grid.indicatorsPadding = new Clutter.Margin({
+ top: indicatorsHeight,
+ bottom: indicatorsHeight,
+ left: hPadding + pageIndicatorsWidth,
+ right: hPadding,
+ });
+
+ this._scrollView.allocate(box);
+
+ const topBox = box.copy();
+ topBox.y2 = topBox.y1 + indicatorsHeight;
+
+ const bottomBox = box.copy();
+ bottomBox.y1 = bottomBox.y2 - indicatorsHeight;
+
+ this._previousPageIndicator.allocate(topBox);
+ this._previousPageArrow.allocate_align_fill(topBox,
+ 0.5, 0.5, false, false);
+ this._nextPageIndicator.allocate(bottomBox);
+ this._nextPageArrow.allocate_align_fill(bottomBox,
+ 0.5, 0.5, false, false);
+
+ this._pageHeight = box.get_height();
+
+ // Center page arrow buttons
+ this._previousPageArrow.translationX = pageIndicatorsWidth / 2;
+ this._nextPageArrow.translationX = pageIndicatorsWidth / 2;
+ // Reset page indicators vertical position
+ this._nextPageIndicator.translationX = 0;
+ this._previousPageIndicator.translationX = 0;
+ },
+};
+
+const AppGridCommon = {
+ _updatePadding() {
+ const { rowSpacing, columnSpacing } = this.layoutManager;
+
+ const padding = this._indicatorsPadding.copy();
+
+ padding.left += rowSpacing;
+ padding.right += rowSpacing;
+ padding.top += columnSpacing;
+ padding.bottom += columnSpacing;
+
+ this.layoutManager.pagePadding = padding;
+ },
+};
+
+const FolderIcon = {
+ after__init() {
+ this.button_mask = St.ButtonMask.ONE | St.ButtonMask.TWO;
+ if (shellVersion46)
+ this.add_style_class_name('app-folder-46');
+ else
+ this.add_style_class_name('app-folder-45');
+ },
+
+ open() {
+ // Prevent switching page when an item on another page is selected
+ GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
+ // Select folder icon to prevent switching page to the one with currently selected icon
+ this._parentView._selectAppInternal(this._id);
+ // Remove key focus from the selected icon to prevent switching page after dropping the removed folder icon on another page of the main grid
+ this._parentView.grab_key_focus();
+ this._ensureFolderDialog();
+ this._dialog.popup();
+ });
+ },
+
+ vfunc_clicked() {
+ this.open();
+ },
+
+ _canAccept(source) {
+ if (!(source instanceof AppDisplay.AppIcon))
+ return false;
+
+ const view = _getViewFromIcon(source);
+ if (!view /* || !(view instanceof AppDisplay.AppDisplay)*/)
+ return false;
+
+ // Disable this test to allow the user to cancel the current DND by dropping the icon on its original source
+ /* if (this._folder.get_strv('apps').includes(source.id))
+ return false;*/
+
+ return true;
+ },
+
+ acceptDrop(source) {
+ if (source._sourceItem)
+ source = source._sourceItem;
+
+ const accepted = AppViewItemCommon.acceptDrop.bind(this)(source);
+
+ if (!accepted)
+ return false;
+
+ // If the icon is already in the folder (user dropped it back on the same folder), skip re-adding it
+ if (this._folder.get_strv('apps').includes(source.id))
+ return true;
+
+ this._onDragEnd();
+
+ this.view.addApp(source.app);
+
+ return true;
+ },
+};
+
+const FolderView = {
+ _createGrid() {
+ let grid = new FolderGrid();
+ grid._view = this;
+ return grid;
+ },
+
+ createFolderIcon(size) {
+ const layout = new Clutter.GridLayout({
+ row_homogeneous: true,
+ column_homogeneous: true,
+ });
+
+ let icon = new St.Widget({
+ layout_manager: layout,
+ x_align: Clutter.ActorAlign.CENTER,
+ style: `width: ${size}px; height: ${size}px;`,
+ });
+
+ const numItems = this._orderedItems.length;
+ // decide what number of icons switch to 3x3 grid
+ // APP_GRID_FOLDER_ICON_GRID: 3 -> more than 4
+ // : 4 -> more than 8
+ const threshold = opt.APP_GRID_FOLDER_ICON_GRID % 3 ? 8 : 4;
+ const gridSize = opt.APP_GRID_FOLDER_ICON_GRID > 2 && numItems > threshold ? 3 : 2;
+ const FOLDER_SUBICON_FRACTION = gridSize === 2 ? 0.4 : 0.27;
+
+ let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
+ let rtl = icon.get_text_direction() === Clutter.TextDirection.RTL;
+ for (let i = 0; i < gridSize * gridSize; i++) {
+ const style = `width: ${subSize}px; height: ${subSize}px;`;
+ let bin = new St.Bin({ style, reactive: true });
+ bin.pivot_point = new Graphene.Point({ x: 0.5, y: 0.5 });
+ if (i < numItems) {
+ if (!opt.APP_GRID_ACTIVE_PREVIEW) {
+ bin.child = this._orderedItems[i].app.create_icon_texture(subSize);
+ } else {
+ const app = this._orderedItems[i].app;
+ const child = new AppDisplay.AppIcon(app, {
+ setSizeManually: true,
+ showLabel: false,
+ });
+
+ child._sourceItem = this._orderedItems[i];
+ child._sourceFolder = this;
+ child.icon.style_class = '';
+ child.set_style_class_name('');
+ child.icon.set_style('margin: 0; padding: 0;');
+ child._dot.set_style('margin-bottom: 1px;');
+ child.icon.setIconSize(subSize);
+ child._canAccept = () => false;
+
+ bin.child = child;
+
+ bin.connect('enter-event', () => {
+ bin.ease({
+ duration: 100,
+ translation_y: -3,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ });
+ bin.connect('leave-event', () => {
+ bin.ease({
+ duration: 100,
+ translation_y: 0,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ });
+ }
+ }
+
+ layout.attach(bin, rtl ? (i + 1) % gridSize : i % gridSize, Math.floor(i / gridSize), 1, 1);
+ }
+
+ return icon;
+ },
+
+ _loadApps() {
+ this._apps = [];
+ const excludedApps = this._folder.get_strv('excluded-apps');
+ const appSys = Shell.AppSystem.get_default();
+ const addAppId = appId => {
+ if (excludedApps.includes(appId))
+ return;
+
+ if (opt.APP_GRID_EXCLUDE_FAVORITES && this._appFavorites.isFavorite(appId))
+ return;
+
+ const app = appSys.lookup_app(appId);
+ if (!app)
+ return;
+
+ if (opt.APP_GRID_EXCLUDE_RUNNING) {
+ const runningApps = Shell.AppSystem.get_default().get_running().map(a => a.id);
+ if (runningApps.includes(appId))
+ return;
+ }
+
+ if (!this._parentalControlsManager.shouldShowApp(app.get_app_info()))
+ return;
+
+ if (this._apps.indexOf(app) !== -1)
+ return;
+
+ this._apps.push(app);
+ };
+
+ const folderApps = this._folder.get_strv('apps');
+ folderApps.forEach(addAppId);
+
+ const folderCategories = this._folder.get_strv('categories');
+ const appInfos = this._parentView.getAppInfos();
+ appInfos.forEach(appInfo => {
+ let appCategories = /* AppDisplay.*/_getCategories(appInfo);
+ if (!_listsIntersect(folderCategories, appCategories))
+ return;
+
+ addAppId(appInfo.get_id());
+ });
+
+ let items = [];
+ this._apps.forEach(app => {
+ let icon = this._items.get(app.get_id());
+ if (!icon)
+ icon = new AppDisplay.AppIcon(app);
+
+ items.push(icon);
+ });
+
+ return items;
+ },
+
+ acceptDrop(source) {
+ /* if (!BaseAppViewCommon.acceptDrop.bind(this)(source))
+ return false;*/
+ if (opt.APP_FOLDER_ORDER)
+ return false;
+ if (source._sourceItem)
+ source = source._sourceItem;
+
+ if (!this._acceptDropCommon(source))
+ return false;
+
+ const folderApps = this._orderedItems.map(item => item.id);
+ this._folder.set_strv('apps', folderApps);
+
+ return true;
+ },
+};
+
+const FolderGrid = GObject.registerClass({
+ // Registered name should be unique
+ GTypeName: `FolderGrid${Math.floor(Math.random() * 1000)}`,
+}, class FolderGrid extends AppDisplay.AppGrid {
+ _init() {
+ super._init({
+ allow_incomplete_pages: false,
+ // For adaptive size (0), set the numbers high enough to fit all the icons
+ // to avoid splitting the icons to pages upon creating the grid
+ columns_per_page: 20,
+ rows_per_page: 20,
+ page_halign: Clutter.ActorAlign.CENTER,
+ page_valign: Clutter.ActorAlign.CENTER,
+ });
+ this.layoutManager._isFolder = true;
+ this._isFolder = true;
+ const spacing = opt.APP_GRID_FOLDER_SPACING;
+ this.set_style(`column-spacing: ${spacing}px; row-spacing: ${spacing}px;`);
+ this.layoutManager.fixedIconSize = opt.APP_GRID_FOLDER_ICON_SIZE;
+
+ this.setGridModes([
+ {
+ columns: 20,
+ rows: 20,
+ },
+ ]);
+ }
+
+ _updatePadding() {
+ const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
+ const padding = this._indicatorsPadding.copy();
+ const pageIndicatorSize = opt.ORIENTATION
+ ? this._view._pageIndicators.get_preferred_width(1000)[1] / scaleFactor
+ : this._view._pageIndicators.get_preferred_height(1000)[1] / scaleFactor;
+ Math.round(Math.min(...this._view._pageIndicators.get_size()));// / scaleFactor);// ~28;
+ padding.left = opt.ORIENTATION ? pageIndicatorSize : 0;
+ padding.right = 0;
+ padding.top = opt.ORIENTATION ? 0 : pageIndicatorSize;
+ padding.bottom = 0;
+ this.layoutManager.pagePadding = padding;
+ }
+});
+
+
+const FOLDER_DIALOG_ANIMATION_TIME = 200; // AppDisplay.FOLDER_DIALOG_ANIMATION_TIME
+const AppFolderDialog = {
+ // injection to _init()
+ after__init() {
+ // GS 46 changed the aligning to CENTER which restricts max folder dialog size
+ this._viewBox.set({
+ x_align: Clutter.ActorAlign.FILL,
+ y_align: Clutter.ActorAlign.FILL,
+ });
+
+ // delegate this dialog to the FolderIcon._view
+ // so its _createFolderIcon function can update the dialog if folder content changed
+ this._view._dialog = this;
+
+ // right click into the folder popup should close it
+ this.child.reactive = true;
+ const clickAction = new Clutter.ClickAction();
+ clickAction.connect('clicked', act => {
+ if (act.get_button() === Clutter.BUTTON_PRIMARY)
+ return Clutter.EVENT_STOP;
+ const [x, y] = clickAction.get_coords();
+ const actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
+ // if it's not entry for editing folder title
+ if (actor !== this._entry)
+ this.popdown();
+ return Clutter.EVENT_STOP;
+ });
+
+ this.child.add_action(clickAction);
+ },
+
+ after__addFolderNameEntry() {
+ // edit-folder-button class has been replaced with icon-button class which is not transparent in 46
+ this._editButton.add_style_class_name('edit-folder-button');
+
+ // Edit button
+ this._removeButton = new St.Button({
+ style_class: 'icon-button edit-folder-button',
+ button_mask: St.ButtonMask.ONE,
+ toggle_mode: false,
+ reactive: true,
+ can_focus: true,
+ x_align: Clutter.ActorAlign.END,
+ y_align: Clutter.ActorAlign.CENTER,
+ child: new St.Icon({
+ icon_name: 'user-trash-symbolic',
+ icon_size: 16,
+ }),
+ });
+
+ this._removeButton.connect('clicked', () => {
+ if (Date.now() - this._removeButton._lastClick < Clutter.Settings.get_default().double_click_time) {
+ // Close dialog to avoid crashes
+ this._isOpen = false;
+ this._grabHelper.ungrab({ actor: this });
+ this.emit('open-state-changed', false);
+ this.hide();
+ this._popdownCallbacks.forEach(func => func());
+ this._popdownCallbacks = [];
+ _appDisplay.ease({
+ opacity: 255,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+
+ // Reset all keys to delete the relocatable schema
+ this._view._deletingFolder = true; // Upstream property
+ let keys = this._folder.settings_schema.list_keys();
+ for (const key of keys)
+ this._folder.reset(key);
+
+ let settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
+ let folders = settings.get_strv('folder-children');
+ folders.splice(folders.indexOf(this._view._id), 1);
+
+ // remove all abandoned folders (usually my own garbage and unwanted default folders...)
+ /* const appFolders = _appDisplay._folderIcons.map(icon => icon._id);
+ folders.forEach(folder => {
+ if (!appFolders.includes(folder)) {
+ folders.splice(folders.indexOf(folder._id), 1);
+ }
+ });*/
+ settings.set_strv('folder-children', folders);
+
+ this._view._deletingFolder = false;
+ return;
+ }
+ this._removeButton._lastClick = Date.now();
+ });
+
+ this._entryBox.add_child(this._removeButton);
+ this._entryBox.set_child_at_index(this._removeButton, 0);
+
+ this._closeButton = new St.Button({
+ style_class: 'icon-button edit-folder-button',
+ button_mask: St.ButtonMask.ONE,
+ toggle_mode: false,
+ reactive: true,
+ can_focus: true,
+ x_align: Clutter.ActorAlign.END,
+ y_align: Clutter.ActorAlign.CENTER,
+ child: new St.Icon({
+ icon_name: 'window-close-symbolic',
+ icon_size: 16,
+ }),
+ });
+
+ this._closeButton.connect('clicked', () => {
+ this.popdown();
+ });
+
+ this._entryBox.add_child(this._closeButton);
+ },
+
+ popup() {
+ if (this._isOpen)
+ return;
+
+ this._isOpen = this._grabHelper.grab({
+ actor: this,
+ focus: this._editButton,
+ onUngrab: () => this.popdown(),
+ });
+
+ if (!this._isOpen)
+ return;
+
+ this.get_parent().set_child_above_sibling(this, null);
+
+ // _zoomAndFadeIn() is called from the dialog's allocate()
+ this._needsZoomAndFade = true;
+
+ this.show();
+ // force update folder size
+ this._folderAreaBox = null;
+ this._updateFolderSize();
+
+ this.emit('open-state-changed', true);
+ },
+
+ _setupPopdownTimeout() {
+ if (this._popdownTimeoutId > 0)
+ return;
+
+ // This timeout is handled in the original code and removed in _onDestroy()
+ // All dialogs are destroyed on extension disable()
+ this._popdownTimeoutId =
+ GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => {
+ this._popdownTimeoutId = 0;
+ // Following line fixes upstream bug
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6164
+ this._view._onDragEnd();
+ this.popdown();
+ return GLib.SOURCE_REMOVE;
+ });
+ },
+
+ vfunc_allocate(box) {
+ this._updateFolderSize();
+
+ // super.allocate(box)
+ St.Bin.prototype.vfunc_allocate.bind(this)(box);
+
+ // Override any attempt to resize the folder dialog, that happens when some child gets wild
+ // Re-allocate the child only if necessary, because it terminates grid animations
+ if (this._width && this._height && (this._width !== this.child.width || this._height !== this.child.height))
+ this._allocateChild();
+
+ // We can only start zooming after receiving an allocation
+ if (this._needsZoomAndFade)
+ this._zoomAndFadeIn();
+ },
+
+ _allocateChild() {
+ const childBox = new Clutter.ActorBox();
+ childBox.set_size(this._width, this._height);
+ this.child.allocate(childBox);
+ },
+
+ // Note that the appDisplay may be off-screen so its coordinates may be shifted
+ // However, for _updateFolderSize() it doesn't matter
+ // and when _zoomAndFadeIn() is called, appDisplay is on the right place
+ _getFolderAreaBox() {
+ const appDisplay = this._source._parentView;
+ const folderAreaBox = appDisplay.get_allocation_box().copy();
+ const searchEntryHeight = opt.SHOW_SEARCH_ENTRY ? Main.overview._overview.controls._searchEntryBin.height : 0;
+ folderAreaBox.y1 -= searchEntryHeight;
+
+ // _zoomAndFadeIn() needs an absolute position within a multi-monitor workspace
+ const monitorGeometry = global.display.get_monitor_geometry(global.display.get_primary_monitor());
+ folderAreaBox.x1 += monitorGeometry.x;
+ folderAreaBox.x2 += monitorGeometry.x;
+ folderAreaBox.y1 += monitorGeometry.y;
+ folderAreaBox.y2 += monitorGeometry.y;
+
+ return folderAreaBox;
+ },
+
+ _updateFolderSize() {
+ const view = this._view;
+ const nItems = view._orderedItems.length;
+ const [firstItem] = view._grid.layoutManager._container;
+ if (!firstItem)
+ return;
+
+ const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
+ const margin = 18; // see stylesheet .app-folder-dialog-container;
+
+ const folderAreaBox = this._getFolderAreaBox();
+
+ const maxDialogWidth = folderAreaBox.get_width() / scaleFactor;
+ const maxDialogHeight = folderAreaBox.get_height() / scaleFactor;
+
+ // We can't build folder if the available space is not available
+ if (!isFinite(maxDialogWidth) || !isFinite(maxDialogHeight) || !maxDialogWidth || !maxDialogHeight)
+ return;
+
+ // We don't need to recalculate grid if nothing changed
+ if (
+ this._folderAreaBox?.get_width() === folderAreaBox.get_width() &&
+ this._folderAreaBox?.get_height() === folderAreaBox.get_height() &&
+ nItems === this._nItems
+ )
+ return;
+
+ const layoutManager = view._grid.layoutManager;
+ const spacing = opt.APP_GRID_FOLDER_SPACING;
+ const padding = 40;
+
+ const titleBoxHeight =
+ Math.round(this._entryBox.get_preferred_height(-1)[1] / scaleFactor); // ~75
+ const minDialogWidth = Math.max(640,
+ Math.round(this._entryBox.get_preferred_width(-1)[1] / scaleFactor + 2 * margin));
+ const navigationArrowsSize = // padding + one arrow width is sufficient for both arrows
+ Math.round(view._nextPageArrow.get_preferred_width(-1)[1] / scaleFactor);
+ const pageIndicatorSize =
+ Math.round(Math.min(...view._pageIndicators.get_size()) / scaleFactor);// ~28;
+ const horizontalNavigation = opt.ORIENTATION ? pageIndicatorSize : navigationArrowsSize; // either add padding or arrows
+ const verticalNavigation = opt.ORIENTATION ? navigationArrowsSize : pageIndicatorSize;
+
+ // Horizontal size
+ const baseWidth = horizontalNavigation + 3 * padding + 2 * margin;
+ const maxGridPageWidth = maxDialogWidth - baseWidth;
+ // Vertical size
+ const baseHeight = titleBoxHeight + verticalNavigation + 2 * padding + 2 * margin;
+ const maxGridPageHeight = maxDialogHeight - baseHeight;
+
+ // Will be updated to the actual value later
+ let itemPadding = 55;
+ const minItemSize = 48 + itemPadding;
+
+ let columns = opt.APP_GRID_FOLDER_COLUMNS;
+ let rows = opt.APP_GRID_FOLDER_ROWS;
+ const maxColumns = columns ? columns : 100;
+ const maxRows = rows ? rows : 100;
+
+ // Find best icon size
+ let iconSize = opt.APP_GRID_FOLDER_ICON_SIZE < 0 ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT : opt.APP_GRID_FOLDER_ICON_SIZE;
+ if (opt.APP_GRID_FOLDER_ICON_SIZE === -1) {
+ let maxIconSize;
+ if (columns) {
+ const maxItemWidth = (maxGridPageWidth - (columns - 1) * opt.APP_GRID_FOLDER_SPACING) / columns;
+ maxIconSize = maxItemWidth - itemPadding;
+ }
+ if (rows) {
+ const maxItemHeight = (maxGridPageHeight - (rows - 1) * spacing) / rows;
+ maxIconSize = Math.min(maxItemHeight - itemPadding, maxIconSize);
+ }
+
+ if (maxIconSize) {
+ // We only need sizes from the default to the smallest
+ let iconSizes = Object.values(IconSize).sort((a, b) => b - a);
+ iconSizes = iconSizes.slice(iconSizes.indexOf(iconSize));
+ for (const size of iconSizes) {
+ iconSize = size;
+ if (iconSize <= maxIconSize)
+ break;
+ }
+ }
+ }
+
+ if ((!columns && !rows) || opt.APP_GRID_FOLDER_ICON_SIZE !== -1) {
+ columns = Math.ceil(Math.sqrt(nItems));
+ rows = columns;
+ if (columns * (columns - 1) >= nItems) {
+ rows = columns - 1;
+ } else if ((columns + 1) * (columns - 1) >= nItems) {
+ rows = columns - 1;
+ columns += 1;
+ }
+ } else if (columns && !rows) {
+ rows = Math.ceil(nItems / columns);
+ } else if (rows && !columns) {
+ columns = Math.ceil(nItems / rows);
+ }
+
+ columns = Math.clamp(columns, 1, maxColumns);
+ columns = Math.min(nItems, columns);
+ rows = Math.clamp(rows, 1, maxRows);
+
+ let itemSize = iconSize + itemPadding;
+ // First run sets the grid before we can read the real icon size
+ // so we estimate the size from default properties
+ // and correct it in the second run
+ if (this.realized) {
+ firstItem.icon.setIconSize(iconSize);
+ // Item height is inconsistent because it depends on its label height
+ const [, firstItemWidth] = firstItem.get_preferred_width(-1);
+ const realSize = firstItemWidth / scaleFactor;
+ itemSize = realSize;
+ itemPadding = realSize - iconSize;
+ }
+
+ const gridWidth = columns * (itemSize + spacing);
+ let width = gridWidth + baseWidth;
+ const gridHeight = rows * (itemSize + spacing);
+ let height = gridHeight + baseHeight;
+
+ // Folder must fit the appDisplay area plus searchEntryBin if visible
+ // reduce columns/rows if needed
+ while (height > maxDialogHeight && rows > 1) {
+ height -= itemSize + spacing;
+ rows -= 1;
+ }
+
+ while (width > maxDialogWidth && columns > 1) {
+ width -= itemSize + spacing;
+ columns -= 1;
+ }
+
+ // Try to compensate for the previous reduction if there is a space
+ while ((nItems > columns * rows) && ((width + (itemSize + spacing)) <= maxDialogWidth) && (columns < maxColumns)) {
+ width += itemSize + spacing;
+ columns += 1;
+ }
+
+ // remove columns that cannot be displayed
+ if (((columns * minItemSize + (columns - 1) * spacing)) > maxDialogWidth)
+ columns = Math.floor(maxDialogWidth / (minItemSize + spacing));
+
+ while ((nItems > columns * rows) && ((height + (itemSize + spacing)) <= maxDialogHeight) && (rows < maxRows)) {
+ height += itemSize + spacing;
+ rows += 1;
+ }
+ // remove rows that cannot be displayed
+ if ((((rows * minItemSize + (rows - 1) * spacing))) > maxDialogHeight)
+ rows = Math.floor(maxDialogWidth / (minItemSize + spacing));
+
+ // remove size for rows that are empty
+ const rowsNeeded = Math.ceil(nItems / columns);
+ if (rows > rowsNeeded) {
+ height -= (rows - rowsNeeded) * (itemSize + spacing);
+ rows -= rows - rowsNeeded;
+ }
+
+ // Remove space reserved for page controls and indicator if not used
+ if (rows * columns >= nItems) {
+ width -= horizontalNavigation;
+ height -= verticalNavigation;
+ }
+
+ width = Math.clamp(width, minDialogWidth, maxDialogWidth);
+ height = Math.min(height, maxDialogHeight);
+
+ layoutManager.columns_per_page = columns;
+ layoutManager.rows_per_page = rows;
+
+ layoutManager.fixedIconSize = iconSize;
+
+
+ // Store data for further use
+ this._width = width * scaleFactor;
+ this._height = height * scaleFactor;
+ this._folderAreaBox = folderAreaBox;
+ this._nItems = nItems;
+
+ // Set fixed dialog size to prevent size instability
+ this.child.set_size(this._width, this._height);
+ this._viewBox.set_style(`width: ${this._width - 2 * margin}px; height: ${this._height - 2 * margin}px;`);
+ this._viewBox.set_size(this._width - 2 * margin, this._height - 2 * margin);
+
+ view._redisplay();
+ },
+
+ _zoomAndFadeIn() {
+ let [sourceX, sourceY] =
+ this._source.get_transformed_position();
+ let [dialogX, dialogY] =
+ this.child.get_transformed_position();
+
+ const sourceCenterX = sourceX + this._source.width / 2;
+ const sourceCenterY = sourceY + this._source.height / 2;
+
+ // this. covers the whole screen
+ let dialogTargetX = dialogX;
+ let dialogTargetY = dialogY;
+
+ const appDisplay = this._source._parentView;
+
+ const folderAreaBox = this._getFolderAreaBox();
+
+ let folderAreaX = folderAreaBox.x1;
+ let folderAreaY = folderAreaBox.y1;
+ const folderAreaWidth = folderAreaBox.get_width();
+ const folderAreaHeight = folderAreaBox.get_height();
+ const folder = this.child;
+
+ if (opt.APP_GRID_FOLDER_CENTER) {
+ dialogTargetX = folderAreaX + folderAreaWidth / 2 - folder.width / 2;
+ dialogTargetY = folderAreaY + (folderAreaHeight / 2 - folder.height / 2) / 2;
+ } else {
+ const { pagePadding } = appDisplay._grid.layoutManager;
+ const hPadding = (pagePadding.left + pagePadding.right) / 2;
+ const vPadding = (pagePadding.top + pagePadding.bottom) / 2;
+ const minX = Math.min(folderAreaX + hPadding, folderAreaX + (folderAreaWidth - folder.width) / 2);
+ const maxX = Math.max(folderAreaX + folderAreaWidth - hPadding - folder.width, folderAreaX + folderAreaWidth / 2 - folder.width / 2);
+ const minY = Math.min(folderAreaY + vPadding, folderAreaY + (folderAreaHeight - folder.height) / 2);
+ const maxY = Math.max(folderAreaY + folderAreaHeight - vPadding - folder.height, folderAreaY + folderAreaHeight / 2 - folder.height / 2);
+
+ dialogTargetX = sourceCenterX - folder.width / 2;
+ dialogTargetX = Math.clamp(dialogTargetX, minX, maxX);
+ dialogTargetY = sourceCenterY - folder.height / 2;
+ dialogTargetY = Math.clamp(dialogTargetY, minY, maxY);
+
+ // keep the dialog in the appDisplay area
+ dialogTargetX = Math.clamp(
+ dialogTargetX,
+ folderAreaX,
+ folderAreaX + folderAreaWidth - folder.width
+ );
+
+ dialogTargetY = Math.clamp(
+ dialogTargetY,
+ folderAreaY,
+ folderAreaY + folderAreaHeight - folder.height
+ );
+ }
+
+ const dialogOffsetX = Math.round(dialogTargetX - dialogX);
+ const dialogOffsetY = Math.round(dialogTargetY - dialogY);
+
+ this.child.set({
+ translation_x: sourceX - dialogX,
+ translation_y: sourceY - dialogY,
+ scale_x: this._source.width / this.child.width,
+ scale_y: this._source.height / this.child.height,
+ opacity: 0,
+ });
+
+ this.child.ease({
+ translation_x: dialogOffsetX,
+ translation_y: dialogOffsetY,
+ scale_x: 1,
+ scale_y: 1,
+ opacity: 255,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+
+ appDisplay.ease({
+ opacity: 0,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+
+ if (opt.SHOW_SEARCH_ENTRY) {
+ Main.overview.searchEntry.ease({
+ opacity: 0,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ }
+
+ this._needsZoomAndFade = false;
+
+ if (this._sourceMappedId === 0) {
+ this._sourceMappedId = this._source.connect(
+ 'notify::mapped', this._zoomAndFadeOut.bind(this));
+ }
+ },
+
+ _zoomAndFadeOut() {
+ if (!this._isOpen)
+ return;
+
+ if (!this._source.mapped) {
+ this.hide();
+ return;
+ }
+
+ // if the dialog was shown silently, skip animation
+ if (this.scale_y < 1) {
+ this._needsZoomAndFade = false;
+ this.hide();
+ this._popdownCallbacks.forEach(func => func());
+ this._popdownCallbacks = [];
+ return;
+ }
+
+ let [sourceX, sourceY] =
+ this._source.get_transformed_position();
+ let [dialogX, dialogY] =
+ this.child.get_transformed_position();
+
+ this.child.ease({
+ translation_x: sourceX - dialogX + this.child.translation_x,
+ translation_y: sourceY - dialogY + this.child.translation_y,
+ scale_x: this._source.width / this.child.width,
+ scale_y: this._source.height / this.child.height,
+ opacity: 0,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_IN_QUAD,
+ onComplete: () => {
+ this.child.set({
+ translation_x: 0,
+ translation_y: 0,
+ scale_x: 1,
+ scale_y: 1,
+ opacity: 255,
+ });
+ this.hide();
+
+ this._popdownCallbacks.forEach(func => func());
+ this._popdownCallbacks = [];
+ },
+ });
+
+ const appDisplay = this._source._parentView;
+ appDisplay.ease({
+ opacity: 255,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_IN_QUAD,
+ });
+
+ if (opt.SHOW_SEARCH_ENTRY) {
+ Main.overview.searchEntry.ease({
+ opacity: 255,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_IN_QUAD,
+ });
+ }
+
+ this._needsZoomAndFade = false;
+ },
+
+ _setLighterBackground(lighter) {
+ let opacity = 255;
+ if (this._isOpen)
+ opacity = lighter ? 20 : 0;
+
+ _appDisplay.ease({
+ opacity,
+ duration: FOLDER_DIALOG_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ },
+
+ vfunc_key_press_event(event) {
+ if (global.focus_manager.navigate_from_event(event))
+ return Clutter.EVENT_STOP;
+ return Clutter.EVENT_PROPAGATE;
+ },
+
+ _showFolderLabel() {
+ if (this._editButton.checked)
+ this._editButton.checked = false;
+
+ this._maybeUpdateFolderName();
+ this._switchActor(this._entry, this._folderNameLabel);
+ // This line has been added in 47 to fix focus after editing the folder name
+ this.navigate_focus(this, St.DirectionType.TAB_FORWARD, false);
+ },
+};
+
+const AppIcon = {
+ after__init() {
+ // update the app label behavior
+ this._updateMultiline();
+ },
+
+ // avoid accepting by placeholder when dragging active preview
+ // and also by icon if usage sorting is used
+ _canAccept(source) {
+ if (source._sourceItem)
+ source = source._sourceItem;
+
+ // Folders in folder are not supported
+ if (!(_getViewFromIcon(this) instanceof AppDisplay.AppDisplay) || !this.opacity)
+ return false;
+
+ const view = /* AppDisplay.*/_getViewFromIcon(source);
+ return source !== this &&
+ (source instanceof this.constructor) &&
+ // Include drops from folders
+ // (view instanceof AppDisplay.AppDisplay &&
+ (view &&
+ !opt.APP_GRID_USAGE);
+ },
+};
+
+const AppViewItemCommon = {
+ _updateMultiline() {
+ const { label } = this.icon;
+ if (label)
+ label.opacity = 255;
+ if (!this._expandTitleOnHover || !this.icon.label)
+ return;
+
+ const { clutterText } = label;
+
+ const isHighlighted = this.has_key_focus() || this.hover || this._forcedHighlight;
+
+ if (opt.APP_GRID_NAMES_MODE === 2 && this._expandTitleOnHover) { // !_expandTitleOnHover indicates search result icon
+ label.opacity = isHighlighted || !this.app ? 255 : 0;
+ }
+ if (isHighlighted)
+ this.get_parent()?.set_child_above_sibling(this, null);
+
+ if (!opt.APP_GRID_NAMES_MODE) {
+ const layout = clutterText.get_layout();
+ if (!layout.is_wrapped() && !layout.is_ellipsized())
+ return;
+ }
+
+ label.remove_transition('allocation');
+
+ const id = label.connect('notify::allocation', () => {
+ label.restore_easing_state();
+ label.disconnect(id);
+ });
+
+ const expand = opt.APP_GRID_NAMES_MODE === 1 || this._forcedHighlight || this.hover || this.has_key_focus();
+
+ label.save_easing_state();
+ label.set_easing_duration(expand
+ ? APP_ICON_TITLE_EXPAND_TIME
+ : APP_ICON_TITLE_COLLAPSE_TIME);
+ clutterText.set({
+ line_wrap: expand,
+ line_wrap_mode: expand ? Pango.WrapMode.WORD_CHAR : Pango.WrapMode.NONE,
+ ellipsize: expand ? Pango.EllipsizeMode.NONE : Pango.EllipsizeMode.END,
+ });
+ },
+
+ // support active preview icons
+ acceptDrop(source, _actor, x) {
+ if (opt.APP_GRID_USAGE)
+ return DND.DragMotionResult.NO_DROP;
+
+ this._setHoveringByDnd(false);
+
+ if (!this._canAccept(source))
+ return false;
+
+ if (this._withinLeeways(x))
+ return false;
+
+ // added - remove app from the source folder after dnd to other folder
+ let view = /* AppDisplay.*/_getViewFromIcon(source);
+ if (view instanceof AppDisplay.FolderView)
+ view.removeApp(source.app);
+
+ return true;
+ },
+
+};
+
+const PageIndicatorsCommon = {
+ after_setNPages() {
+ this.visible = true;
+ this.opacity = this._nPages > 1 ? 255 : 0;
+ },
+};
diff --git a/extensions/45/vertical-workspaces/lib/appFavorites.js b/extensions/47/vertical-workspaces/lib/appFavorites.js
index 94f67e2..977e65a 100644
--- a/extensions/45/vertical-workspaces/lib/appFavorites.js
+++ b/extensions/47/vertical-workspaces/lib/appFavorites.js
@@ -3,7 +3,7 @@
* appFavorites.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/dash.js b/extensions/47/vertical-workspaces/lib/dash.js
index f26151d..c7ebbff 100644
--- a/extensions/45/vertical-workspaces/lib/dash.js
+++ b/extensions/47/vertical-workspaces/lib/dash.js
@@ -3,10 +3,9 @@
* dash.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022-2023
+ * @copyright 2022-2024
* @license GPL-3.0
- * modified dash module of https://github.com/RensAlthuis/vertical-overview extension
- */
+ */
'use strict';
@@ -23,7 +22,6 @@ import * as AppFavorites from 'resource:///org/gnome/shell/ui/appFavorites.js';
import * as AppMenu from 'resource:///org/gnome/shell/ui/appMenu.js';
import * as BoxPointer from 'resource:///org/gnome/shell/ui/boxpointer.js';
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
-import * as IconGrid from 'resource:///org/gnome/shell/ui/iconGrid.js';
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
let Me;
@@ -39,6 +37,8 @@ export const BaseIconSizes = [16, 24, 32, 40, 44, 48, 56, 64, 72, 80, 96, 112, 1
const DASH_ITEM_LABEL_SHOW_TIME = 150;
+const shellVersion46 = !Clutter.Container; // Container has been removed in 46
+
export const DashModule = class {
constructor(me) {
Me = me;
@@ -64,6 +64,7 @@ export const DashModule = class {
this.moduleEnabled = opt.get('dashModule');
const conflict = !!(Me.Util.getEnabledExtensions('dash-to-dock').length ||
+ Me.Util.getEnabledExtensions('dash2dock').length ||
Me.Util.getEnabledExtensions('ubuntu-dock').length ||
Me.Util.getEnabledExtensions('dash-to-panel').length);
@@ -130,32 +131,54 @@ export const DashModule = class {
this._overrides.addOverride('DashIcon', Dash.DashIcon.prototype, DashIconCommon);
this._overrides.addOverride('AppMenu', AppMenu.AppMenu.prototype, AppMenuCommon);
+ if (shellVersion46)
+ dash.add_style_class_name('dash-46');
+
if (opt.DASH_VERTICAL) {
// this._overrides.addOverride('Dash', Dash.Dash.prototype, DashVerticalOverride);
- dash.add_style_class_name('vertical');
+ dash.add_style_class_name(shellVersion46
+ ? 'vertical-46'
+ : 'vertical'
+ );
+
this._setOrientation(Clutter.Orientation.VERTICAL);
} else {
this._setOrientation(Clutter.Orientation.HORIZONTAL);
}
+ if (opt.DASH_VERTICAL && opt.DASH_BG_GS3_STYLE) {
+ if (opt.DASH_LEFT) {
+ dash.add_style_class_name(shellVersion46
+ ? 'vertical-46-gs3-left'
+ : 'vertical-gs3-left');
+ } else if (opt.DASH_RIGHT) {
+ dash.add_style_class_name(shellVersion46
+ ? 'vertical-46-gs3-right'
+ : 'vertical-gs3-right');
+ }
+ } else {
+ dash.remove_style_class_name('vertical-gs3-left');
+ dash.remove_style_class_name('vertical-gs3-right');
+ dash.remove_style_class_name('vertical-46-gs3-left');
+ dash.remove_style_class_name('vertical-46-gs3-right');
+ }
+
if (!this._customWorkId)
this._customWorkId = Main.initializeDeferredWork(dash._box, dash._redisplay.bind(dash));
dash._workId = this._customWorkId;
- this._updateSearchWindowsIcon();
- this._updateRecentFilesIcon();
- this._updateExtensionsIcon();
this._moveDashAppGridIcon();
this._connectShowAppsIcon();
dash.visible = opt.DASH_VISIBLE;
- dash._background.add_style_class_name('dash-background-reduced');
+ // dash._background.add_style_class_name('dash-background-reduced');
dash._queueRedisplay();
if (opt.DASH_ISOLATE_WS && !this._wmSwitchWsConId) {
this._wmSwitchWsConId = global.windowManager.connect('switch-workspace', () => dash._queueRedisplay());
this._newWindowConId = global.display.connect_after('window-created', () => dash._queueRedisplay());
}
+
console.debug(' DashModule - Activated');
}
@@ -181,9 +204,7 @@ export const DashModule = class {
this._setOrientation(Clutter.Orientation.HORIZONTAL);
this._moveDashAppGridIcon(reset);
this._connectShowAppsIcon(reset);
- this._updateSearchWindowsIcon(false);
- this._updateRecentFilesIcon(false);
- this._updateExtensionsIcon(false);
+
this._resetStyle(dash);
dash.visible = !this._conflict;
dash._background.opacity = 255;
@@ -193,9 +214,13 @@ export const DashModule = class {
}
_resetStyle(dash) {
+ dash.remove_style_class_name('dash-46');
dash.remove_style_class_name('vertical');
+ dash.remove_style_class_name('vertical-46');
dash.remove_style_class_name('vertical-gs3-left');
dash.remove_style_class_name('vertical-gs3-right');
+ dash.remove_style_class_name('vertical-46-gs3-left');
+ dash.remove_style_class_name('vertical-46-gs3-right');
dash.remove_style_class_name('vertical-left');
dash.remove_style_class_name('vertical-right');
dash._background.remove_style_class_name('dash-background-light');
@@ -237,16 +262,6 @@ export const DashModule = class {
dash._separator = null;
dash._queueRedisplay();
dash._adjustIconSize();
-
- if (orientation && opt.DASH_BG_GS3_STYLE) {
- if (opt.DASH_LEFT)
- dash.add_style_class_name('vertical-gs3-left');
- else if (opt.DASH_RIGHT)
- dash.add_style_class_name('vertical-gs3-right');
- } else {
- dash.remove_style_class_name('vertical-gs3-left');
- dash.remove_style_class_name('vertical-gs3-right');
- }
}
_moveDashAppGridIcon(reset = false) {
@@ -295,141 +310,6 @@ export const DashModule = class {
dash._showAppsIcon.reactive = false;
}
}
-
- _updateSearchWindowsIcon(show = opt.SHOW_WINDOWS_ICON, dash) {
- dash = dash ?? Main.overview._overview._controls.layoutManager._dash;
- const dashContainer = dash._dashContainer;
-
- if (dash._showWindowsIcon) {
- dashContainer.remove_child(dash._showWindowsIcon);
- if (dash._showWindowsIconClickedId) {
- dash._showWindowsIcon.toggleButton.disconnect(dash._showWindowsIconClickedId);
- dash._showWindowsIconClickedId = 0;
- }
- delete dash._showWindowsIconClickedId;
- if (dash._showWindowsIcon)
- dash._showWindowsIcon.destroy();
- delete dash._showWindowsIcon;
- }
-
- if (!show || !opt.get('windowSearchProviderModule'))
- return;
-
- if (!dash._showWindowsIcon) {
- dash._showWindowsIcon = new Dash.DashItemContainer();
- new Me.Util.Overrides().addOverride('showWindowsIcon', dash._showWindowsIcon, ShowWindowsIcon);
- dash._showWindowsIcon._afterInit();
- dash._showWindowsIcon.show(false);
- dashContainer.add_child(dash._showWindowsIcon);
- dash._hookUpLabel(dash._showWindowsIcon);
- }
-
- dash._showWindowsIcon.icon.setIconSize(dash.iconSize);
- if (opt.SHOW_WINDOWS_ICON === 1) {
- dashContainer.set_child_at_index(dash._showWindowsIcon, 0);
- } else if (opt.SHOW_WINDOWS_ICON === 2) {
- const index = dashContainer.get_children().length - 1;
- dashContainer.set_child_at_index(dash._showWindowsIcon, index);
- }
-
- Main.overview._overview._controls.layoutManager._dash._adjustIconSize();
-
- if (dash._showWindowsIcon && !dash._showWindowsIconClickedId) {
- dash._showWindowsIconClickedId = dash._showWindowsIcon.toggleButton.connect('clicked', () => {
- Me.Util.activateSearchProvider(Me.WSP_PREFIX);
- });
- }
- }
-
- _updateRecentFilesIcon(show = opt.SHOW_RECENT_FILES_ICON, dash) {
- dash = dash ?? Main.overview._overview._controls.layoutManager._dash;
- const dashContainer = dash._dashContainer;
-
- if (dash._recentFilesIcon) {
- dashContainer.remove_child(dash._recentFilesIcon);
- if (dash._recentFilesIconClickedId) {
- dash._recentFilesIcon.toggleButton.disconnect(dash._recentFilesIconClickedId);
- dash._recentFilesIconClickedId = 0;
- }
- delete dash._recentFilesIconClickedId;
- if (dash._recentFilesIcon)
- dash._recentFilesIcon.destroy();
- delete dash._recentFilesIcon;
- }
-
- if (!show || !opt.get('recentFilesSearchProviderModule'))
- return;
-
- if (!dash._recentFilesIcon) {
- dash._recentFilesIcon = new Dash.DashItemContainer();
- new Me.Util.Overrides().addOverride('recentFilesIcon', dash._recentFilesIcon, ShowRecentFilesIcon);
- dash._recentFilesIcon._afterInit();
- dash._recentFilesIcon.show(false);
- dashContainer.add_child(dash._recentFilesIcon);
- dash._hookUpLabel(dash._recentFilesIcon);
- }
-
- dash._recentFilesIcon.icon.setIconSize(dash.iconSize);
- if (opt.SHOW_RECENT_FILES_ICON === 1) {
- dashContainer.set_child_at_index(dash._recentFilesIcon, 0);
- } else if (opt.SHOW_RECENT_FILES_ICON === 2) {
- const index = dashContainer.get_children().length - 1;
- dashContainer.set_child_at_index(dash._recentFilesIcon, index);
- }
-
- Main.overview._overview._controls.layoutManager._dash._adjustIconSize();
-
- if (dash._recentFilesIcon && !dash._recentFilesIconClickedId) {
- dash._recentFilesIconClickedId = dash._recentFilesIcon.toggleButton.connect('clicked', () => {
- Me.Util.activateSearchProvider(Me.RFSP_PREFIX);
- });
- }
- }
-
- _updateExtensionsIcon(show = opt.SHOW_EXTENSIONS_ICON, dash) {
- dash = dash ?? Main.overview._overview._controls.layoutManager._dash;
- const dashContainer = dash._dashContainer;
-
- if (dash._extensionsIcon) {
- dashContainer.remove_child(dash._extensionsIcon);
- if (dash._extensionsIconClickedId) {
- dash._extensionsIcon.toggleButton.disconnect(dash._extensionsIconClickedId);
- dash._extensionsIconClickedId = 0;
- }
- delete dash._extensionsIconClickedId;
- if (dash._extensionsIcon)
- dash._extensionsIcon.destroy();
- delete dash._extensionsIcon;
- }
-
- if (!show || !opt.get('extensionsSearchProviderModule'))
- return;
-
- if (!dash._extensionsIcon) {
- dash._extensionsIcon = new Dash.DashItemContainer();
- new Me.Util.Overrides().addOverride('extensionsIcon', dash._extensionsIcon, ShowExtensionsIcon);
- dash._extensionsIcon._afterInit();
- dash._extensionsIcon.show(false);
- dashContainer.add_child(dash._extensionsIcon);
- dash._hookUpLabel(dash._extensionsIcon);
- }
-
- dash._extensionsIcon.icon.setIconSize(dash.iconSize);
- if (opt.SHOW_EXTENSIONS_ICON === 1) {
- dashContainer.set_child_at_index(dash._extensionsIcon, 0);
- } else if (opt.SHOW_EXTENSIONS_ICON === 2) {
- const index = dashContainer.get_children().length - 1;
- dashContainer.set_child_at_index(dash._extensionsIcon, index);
- }
-
- Main.overview._overview._controls.layoutManager._dash._adjustIconSize();
-
- if (dash._extensionsIcon && !dash._extensionsIconClickedId) {
- dash._extensionsIconClickedId = dash._extensionsIcon.toggleButton.connect('clicked', () => {
- Me.Util.activateSearchProvider(Me.ESP_PREFIX);
- });
- }
- }
};
function getAppFromSource(source) {
@@ -475,20 +355,20 @@ const DashItemContainerCommon = {
let y;
if (opt.DASH_TOP) {
- const yOffset = 0.75 * itemHeight + 3 * node.get_length('-y-offset');
+ const yOffset = itemHeight + (shellVersion46 ? 0 : -3);
y = stageY + yOffset;
} else if (opt.DASH_BOTTOM) {
const yOffset = node.get_length('-y-offset');
y = stageY - this.label.height - yOffset;
} else if (opt.DASH_RIGHT) {
const yOffset = Math.floor((itemHeight - labelHeight) / 2);
- xOffset = 4;
+ xOffset = shellVersion46 ? 8 : 4;
x = stageX - xOffset - this.label.width;
y = Math.clamp(stageY + yOffset, 0, global.stage.height - labelHeight);
} else if (opt.DASH_LEFT) {
const yOffset = Math.floor((itemHeight - labelHeight) / 2);
- xOffset = 4;
+ xOffset = shellVersion46 ? 8 : 4;
x = stageX + this.width + xOffset;
y = Math.clamp(stageY + yOffset, 0, global.stage.height - labelHeight);
@@ -744,15 +624,15 @@ const DashCommon = {
if (this._showAppsIcon.visible)
iconChildren.push(this._showAppsIcon);
+
+ // showWindowsIcon and extensionsIcon can be provided by the WSP and ESP extensions
if (this._showWindowsIcon)
iconChildren.push(this._showWindowsIcon);
- if (this._recentFilesIcon)
- iconChildren.push(this._recentFilesIcon);
-
if (this._extensionsIcon)
iconChildren.push(this._extensionsIcon);
+
if (!iconChildren.length)
return;
@@ -785,7 +665,14 @@ const DashCommon = {
const [, , buttonWidth, buttonHeight] = firstButton.get_preferred_size();
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
- let availWidth, availHeight, maxIconSize;
+ let maxIconSize = opt.MAX_ICON_SIZE;
+ if (!maxIconSize) {
+ maxIconSize = Me.Util.monitorHasLowResolution()
+ ? 48
+ : 64;
+ }
+
+ let availWidth, availHeight;
if (dashHorizontal) {
availWidth = maxContent.x2 - maxContent.x1;
// Subtract icon padding and box spacing from the available width
@@ -799,7 +686,7 @@ const DashCommon = {
availHeight -= themeNode.get_vertical_padding();
availHeight -= buttonHeight - iconHeight;
- maxIconSize = Math.min(availWidth / iconChildren.length, availHeight, opt.MAX_ICON_SIZE * scaleFactor);
+ maxIconSize = Math.min(availWidth / iconChildren.length, availHeight, maxIconSize * scaleFactor);
} else {
availWidth = this._maxWidth;
availWidth -= this._background.get_theme_node().get_horizontal_padding();
@@ -811,7 +698,7 @@ const DashCommon = {
(iconChildren.length - 1) * spacing +
2 * this._background.get_theme_node().get_vertical_padding();
- maxIconSize = Math.min(availWidth, availHeight / iconChildren.length, opt.MAX_ICON_SIZE * scaleFactor);
+ maxIconSize = Math.min(availWidth, availHeight / iconChildren.length, maxIconSize * scaleFactor);
}
let iconSizes = BaseIconSizes.map(s => s * scaleFactor);
@@ -961,206 +848,6 @@ const DashCommon = {
},
};
-const DashIconCommon = {
- after__init() {
- if (opt.DASH_ICON_SCROLL && !Me.Util.dashNotDefault()) {
- this._scrollConId = this.connect('scroll-event', DashExtensions.onScrollEvent.bind(this));
- this._leaveConId = this.connect('leave-event', DashExtensions.onLeaveEvent.bind(this));
- }
- },
-
- popupMenu() {
- const side = opt.DASH_VERTICAL ? St.Side.LEFT : St.Side.BOTTOM;
- AppIconCommon.popupMenu.bind(this)(side);
- },
-
- _updateRunningStyle() {
- const currentWs = global.workspace_manager.get_active_workspace();
- const show = opt.DASH_ISOLATE_WS
- ? this.app.get_windows().filter(w => w.get_workspace() === currentWs).length
- : this.app.state !== Shell.AppState.STOPPED;
-
- if (show)
- this._dot.show();
- else
- this._dot.hide();
- },
-};
-
-const DashExtensions = {
- onScrollEvent(source, event) {
- if ((this.app && !opt.DASH_ICON_SCROLL) || (this._isSearchWindowsIcon && !opt.SEARCH_WINDOWS_ICON_SCROLL)) {
- if (this._scrollConId) {
- this.disconnect(this._scrollConId);
- this._scrollConId = 0;
- }
- if (this._leaveConId) {
- this.disconnect(this._leaveConId);
- this._leaveConId = 0;
- }
- return Clutter.EVENT_PROPAGATE;
- }
-
- if (Main.overview._overview.controls._stateAdjustment.value > 1)
- return Clutter.EVENT_PROPAGATE;
-
- let direction = Me.Util.getScrollDirection(event);
- if (direction === Clutter.ScrollDirection.UP)
- direction = 1;
- else if (direction === Clutter.ScrollDirection.DOWN)
- direction = -1;
- else
- return Clutter.EVENT_STOP;
-
- // avoid uncontrollable switching if smooth scroll wheel or trackpad is used
- if (this._lastScroll && Date.now() - this._lastScroll < 160)
- return Clutter.EVENT_STOP;
-
- this._lastScroll = Date.now();
-
- DashExtensions.switchWindow.bind(this)(direction);
- return Clutter.EVENT_STOP;
- },
-
- onLeaveEvent() {
- if (!this._selectedMetaWin || this.has_pointer || this.toggleButton?.has_pointer)
- return;
-
- this._selectedPreview._activateSelected = false;
- this._selectedMetaWin = null;
- this._scrolledWindows = null;
- DashExtensions.showWindowPreview.bind(this)(null);
- },
-
-
- switchWindow(direction) {
- if (!this._scrolledWindows) {
- this._initialSelection = true;
- // source is app icon
- if (this.app) {
- this._scrolledWindows = this.app.get_windows();
- if (opt.DASH_ISOLATE_WS) {
- const currentWs = global.workspaceManager.get_active_workspace();
- this._scrolledWindows = this._scrolledWindows.filter(w => w.get_workspace() === currentWs);
- }
-
- const wsList = [];
- this._scrolledWindows.forEach(w => {
- const ws = w.get_workspace();
- if (!wsList.includes(ws))
- wsList.push(ws);
- });
-
- // sort windows by workspaces in MRU order
- this._scrolledWindows.sort((a, b) => wsList.indexOf(a.get_workspace()) > wsList.indexOf(b.get_workspace()));
- // source is Search Windows icon
- } else if (this._isSearchWindowsIcon) {
- if (opt.SEARCH_WINDOWS_ICON_SCROLL === 1) // all windows
- this._scrolledWindows = Me.Util.getWindows(null);
- else
- this._scrolledWindows = Me.Util.getWindows(global.workspace_manager.get_active_workspace());
- }
- }
-
- let windows = this._scrolledWindows;
-
- if (!windows.length)
- return;
-
- // if window selection is in the process, the previewed window must be the current one
- let currentWin = this._selectedMetaWin ? this._selectedMetaWin : windows[0];
-
- const currentIdx = windows.indexOf(currentWin);
- let targetIdx = currentIdx;
- // const focusWindow = Me.Util.getWindows(null)[0]; // incompatible 45
- const focusWindow = Me.Util.getWindows(null)[0];
- const appFocused = this._scrolledWindows[0] === focusWindow && this._scrolledWindows[0].get_workspace() === global.workspace_manager.get_active_workspace();
- // only if the app has focus, immediately switch to the previous window
- // otherwise just set the current window above others
- if (!this._initialSelection || appFocused)
- targetIdx += direction;
- else
- this._initialSelection = false;
-
- if (targetIdx > windows.length - 1)
- targetIdx = 0;
- else if (targetIdx < 0)
- targetIdx = windows.length - 1;
-
- const metaWin = windows[targetIdx];
- DashExtensions.showWindowPreview.bind(this)(metaWin);
- this._selectedMetaWin = metaWin;
- },
-
- showWindowPreview(metaWin) {
- const views = Main.overview._overview.controls._workspacesDisplay._workspacesViews;
- const viewsIter = [views[0]];
- // secondary monitors use different structure
- views.forEach(v => {
- if (v._workspacesView)
- viewsIter.push(v._workspacesView);
- });
-
- viewsIter.forEach(view => {
- // if workspaces are on primary monitor only
- if (!view || !view._workspaces)
- return;
-
- view._workspaces.forEach(ws => {
- ws._windows.forEach(windowPreview => {
- // metaWin === null resets opacity
- let opacity = metaWin ? 50 : 255;
- windowPreview._activateSelected = false;
-
- // minimized windows are invisible if windows are not exposed (WORKSPACE_MODE === 0)
- if (!windowPreview.opacity)
- windowPreview.opacity = 255;
-
- // app windows set to lower opacity, so they can be recognized
- if (this._scrolledWindows && this._scrolledWindows.includes(windowPreview.metaWindow)) {
- if (opt.DASH_ICON_SCROLL === 2)
- opacity = 254;
- }
- if (windowPreview.metaWindow === metaWin) {
- if (metaWin && metaWin.get_workspace() !== global.workspace_manager.get_active_workspace()) {
- Main.wm.actionMoveWorkspace(metaWin.get_workspace());
- if (_timeouts.wsSwitcherAnimation)
- GLib.source_remove(_timeouts.wsSwitcherAnimation);
- // setting window preview above siblings before workspace switcher animation has no effect
- // we need to set the window above after the ws preview become visible on the screen
- // the default switcher animation time is 250, 200 ms delay should be enough
- _timeouts.wsSwitcherAnimation = GLib.timeout_add(0, 200 * St.Settings.get().slow_down_factor, () => {
- windowPreview.get_parent().set_child_above_sibling(windowPreview, null);
- _timeouts.wsSwitcherAnimation = 0;
- return GLib.SOURCE_REMOVE;
- });
- } else {
- windowPreview.get_parent().set_child_above_sibling(windowPreview, null);
- }
-
- opacity = 255;
- this._selectedPreview = windowPreview;
- windowPreview._activateSelected = true;
- }
-
- // if windows are exposed, highlight selected using opacity
- if ((opt.OVERVIEW_MODE && opt.WORKSPACE_MODE) || !opt.OVERVIEW_MODE) {
- if (metaWin && opacity === 255)
- windowPreview.showOverlay(true);
- else
- windowPreview.hideOverlay(true);
- windowPreview.ease({
- duration: 200,
- opacity,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- });
- }
- });
- });
- });
- },
-};
-
const AppIconCommon = {
after__init() {
if (this._updateRunningDotStyle)
@@ -1169,9 +856,9 @@ const AppIconCommon = {
_updateRunningDotStyle() {
if (opt.RUNNING_DOT_STYLE)
- this._dot.add_style_class_name('app-well-app-running-dot-custom');
+ this._dot.add_style_class_name('app-grid-running-dot-custom');
else
- this._dot.remove_style_class_name('app-well-app-running-dot-custom');
+ this._dot.remove_style_class_name('app-grid-running-dot-custom');
},
activate(button) {
@@ -1277,7 +964,7 @@ const AppIconCommon = {
this._hidingSigId = Main.overview.connect('hiding',
() => this._menu.close(), this);
- Main.uiGroup.add_actor(this._menu.actor);
+ Main.uiGroup.add_child(this._menu.actor);
this._menuManager.addMenu(this._menu);
}
@@ -1311,9 +998,10 @@ const AppIconCommon = {
}
popupItems.push([_('Move App to Current Workspace ( Shift + Click )'), this._moveAppToCurrentWorkspace]);
- if (opt.WINDOW_THUMBNAIL_ENABLED) {
- popupItems.push([_('Create Window Thumbnail - PIP'), () => {
- Me.Modules.winTmbModule.createThumbnail(this.app.get_windows()[0]);
+ // WTMB (Windows Thumbnails) extension required
+ if (global.windowThumbnails) {
+ popupItems.push([_('Create Window Thumbnail/PiP'), () => {
+ global.windowThumbnails?.createThumbnail(this.app.get_windows()[0]);
}]);
}
}
@@ -1362,115 +1050,219 @@ const AppIconCommon = {
},
};
-const ShowWindowsIcon = {
- _afterInit() {
- this._isSearchWindowsIcon = true;
- this._labelText = _('Search Open Windows (Hotkey: Space)');
- this.toggleButton = new St.Button({
- style_class: 'show-apps',
- track_hover: true,
- can_focus: true,
- toggle_mode: false,
- });
+const DashIconCommon = {
+ after__init() {
+ if (opt.DASH_ICON_SCROLL && !Me.Util.dashNotDefault()) {
+ this._scrollConId = this.connect('scroll-event', DashExtensions.onScrollEvent.bind(this));
+ this._leaveConId = this.connect('leave-event', DashExtensions.onLeaveEvent.bind(this));
+ }
+ },
- this._iconActor = null;
- this.icon = new IconGrid.BaseIcon(this.labelText, {
- setSizeManually: true,
- showLabel: false,
- createIcon: this._createIcon.bind(this),
- });
- this.icon.y_align = Clutter.ActorAlign.CENTER;
+ popupMenu() {
+ const side = opt.DASH_VERTICAL ? St.Side.LEFT : St.Side.BOTTOM;
+ AppIconCommon.popupMenu.bind(this)(side);
+ },
- this.toggleButton.add_actor(this.icon);
- this.toggleButton._delegate = this;
+ _updateRunningDotStyle() {
+ if (opt.RUNNING_DOT_STYLE)
+ this._dot.add_style_class_name('app-grid-running-dot-custom');
+ else
+ this._dot.remove_style_class_name('app-grid-running-dot-custom');
- this.setChild(this.toggleButton);
+ this._dot.translation_x = 0;
+ // _updateDotStyle() has been added in GS 46.2 to apply translation_y value from the CSS on style change
+ if (shellVersion46 && !this._updateDotStyle && !opt.DASH_VERTICAL)
+ this._dot.translation_y = 8;
- if (opt.SEARCH_WINDOWS_ICON_SCROLL) {
- this.reactive = true;
- this._scrollConId = this.connect('scroll-event', DashExtensions.onScrollEvent.bind(this));
- this._leaveConId = this.connect('leave-event', DashExtensions.onLeaveEvent.bind(this));
- }
+ // GS 46.0 (Ubuntu) only
+ if (opt.DASH_VERTICAL)
+ this._dot.translationY = 0;
},
- _createIcon(size) {
- this._iconActor = new St.Icon({
- icon_name: 'focus-windows-symbolic',
- icon_size: size,
- style_class: 'show-apps-icon',
- track_hover: true,
- });
- return this._iconActor;
+ _updateRunningStyle() {
+ const currentWs = global.workspace_manager.get_active_workspace();
+ const show = opt.DASH_ISOLATE_WS
+ ? this.app.get_windows().filter(w => w.get_workspace() === currentWs).length
+ : this.app.state !== Shell.AppState.STOPPED;
+
+ if (show)
+ this._dot.show();
+ else
+ this._dot.hide();
},
};
-const ShowRecentFilesIcon = {
- _afterInit() {
- this._labelText = _('Search Recent Files (Hotkey: Ctrl + Space)');
- this.toggleButton = new St.Button({
- style_class: 'show-apps',
- track_hover: true,
- can_focus: true,
- toggle_mode: false,
- });
+const DashExtensions = {
+ onScrollEvent(source, event) {
+ if ((this.app && !opt.DASH_ICON_SCROLL) || (this._isSearchWindowsIcon && !opt.SEARCH_WINDOWS_ICON_SCROLL)) {
+ if (this._scrollConId) {
+ this.disconnect(this._scrollConId);
+ this._scrollConId = 0;
+ }
+ if (this._leaveConId) {
+ this.disconnect(this._leaveConId);
+ this._leaveConId = 0;
+ }
+ return Clutter.EVENT_PROPAGATE;
+ }
- this._iconActor = null;
- this.icon = new IconGrid.BaseIcon(this.labelText, {
- setSizeManually: true,
- showLabel: false,
- createIcon: this._createIcon.bind(this),
- });
- this.icon.y_align = Clutter.ActorAlign.CENTER;
+ if (Main.overview._overview.controls._stateAdjustment.value > 1)
+ return Clutter.EVENT_PROPAGATE;
+
+ let direction = Me.Util.getScrollDirection(event);
+ if (direction === Clutter.ScrollDirection.UP)
+ direction = 1;
+ else if (direction === Clutter.ScrollDirection.DOWN)
+ direction = -1;
+ else
+ return Clutter.EVENT_STOP;
- this.toggleButton.add_actor(this.icon);
- this.toggleButton._delegate = this;
+ // avoid uncontrollable switching if smooth scroll wheel or trackpad is used
+ if (this._lastScroll && Date.now() - this._lastScroll < 160)
+ return Clutter.EVENT_STOP;
+
+ this._lastScroll = Date.now();
- this.setChild(this.toggleButton);
+ DashExtensions.switchWindow.bind(this)(direction);
+ return Clutter.EVENT_STOP;
},
- _createIcon(size) {
- this._iconActor = new St.Icon({
- icon_name: 'document-open-recent-symbolic',
- icon_size: size,
- style_class: 'show-apps-icon',
- track_hover: true,
- });
- return this._iconActor;
+ onLeaveEvent() {
+ if (!this._selectedMetaWin || this.has_pointer || this.toggleButton?.has_pointer)
+ return;
+
+ this._selectedPreview._activateSelected = false;
+ this._selectedMetaWin = null;
+ this._scrolledWindows = null;
+ DashExtensions.showWindowPreview.bind(this)(null);
},
-};
-const ShowExtensionsIcon = {
- _afterInit() {
- this._labelText = _('Search Extensions (Hotkey: Ctrl + Shift + Space)');
- this.toggleButton = new St.Button({
- style_class: 'show-apps',
- track_hover: true,
- can_focus: true,
- toggle_mode: false,
- });
- this._iconActor = null;
- this.icon = new IconGrid.BaseIcon(this.labelText, {
- setSizeManually: true,
- showLabel: false,
- createIcon: this._createIcon.bind(this),
- });
- this.icon.y_align = Clutter.ActorAlign.CENTER;
+ switchWindow(direction) {
+ if (!this._scrolledWindows) {
+ this._initialSelection = true;
+ // source is app icon
+ if (this.app) {
+ this._scrolledWindows = this.app.get_windows();
+ if (opt.DASH_ISOLATE_WS) {
+ const currentWs = global.workspaceManager.get_active_workspace();
+ this._scrolledWindows = this._scrolledWindows.filter(w => w.get_workspace() === currentWs);
+ }
+
+ const wsList = [];
+ this._scrolledWindows.forEach(w => {
+ const ws = w.get_workspace();
+ if (!wsList.includes(ws))
+ wsList.push(ws);
+ });
+
+ // sort windows by workspaces in MRU order
+ this._scrolledWindows.sort((a, b) => wsList.indexOf(a.get_workspace()) > wsList.indexOf(b.get_workspace()));
+ // source is Search Windows icon
+ } else if (this._isSearchWindowsIcon) {
+ if (opt.SEARCH_WINDOWS_ICON_SCROLL === 1) // all windows
+ this._scrolledWindows = Me.Util.getWindows(null);
+ else
+ this._scrolledWindows = Me.Util.getWindows(global.workspace_manager.get_active_workspace());
+ }
+ }
+
+ let windows = this._scrolledWindows;
+
+ if (!windows.length)
+ return;
- this.toggleButton.add_actor(this.icon);
- this.toggleButton._delegate = this;
+ // if window selection is in the process, the previewed window must be the current one
+ let currentWin = this._selectedMetaWin ? this._selectedMetaWin : windows[0];
- this.setChild(this.toggleButton);
+ const currentIdx = windows.indexOf(currentWin);
+ let targetIdx = currentIdx;
+ // const focusWindow = Me.Util.getWindows(null)[0]; // incompatible 45
+ const focusWindow = Me.Util.getWindows(null)[0];
+ const appFocused = this._scrolledWindows[0] === focusWindow && this._scrolledWindows[0].get_workspace() === global.workspace_manager.get_active_workspace();
+ // only if the app has focus, immediately switch to the previous window
+ // otherwise just set the current window above others
+ if (!this._initialSelection || appFocused)
+ targetIdx += direction;
+ else
+ this._initialSelection = false;
+
+ if (targetIdx > windows.length - 1)
+ targetIdx = 0;
+ else if (targetIdx < 0)
+ targetIdx = windows.length - 1;
+
+ const metaWin = windows[targetIdx];
+ DashExtensions.showWindowPreview.bind(this)(metaWin);
+ this._selectedMetaWin = metaWin;
},
- _createIcon(size) {
- this._iconActor = new St.Icon({
- icon_name: 'application-x-addon-symbolic',
- icon_size: size,
- style_class: 'show-apps-icon',
- track_hover: true,
+ showWindowPreview(metaWin) {
+ const views = Main.overview._overview.controls._workspacesDisplay._workspacesViews;
+ const viewsIter = [views[0]];
+ // secondary monitors use different structure
+ views.forEach(v => {
+ if (v._workspacesView)
+ viewsIter.push(v._workspacesView);
+ });
+
+ viewsIter.forEach(view => {
+ // if workspaces are on primary monitor only
+ if (!view || !view._workspaces)
+ return;
+
+ view._workspaces.forEach(ws => {
+ ws._windows.forEach(windowPreview => {
+ // metaWin === null resets opacity
+ let opacity = metaWin ? 50 : 255;
+ windowPreview._activateSelected = false;
+
+ // minimized windows are invisible if windows are not exposed (WORKSPACE_MODE === 0)
+ if (!windowPreview.opacity)
+ windowPreview.opacity = 255;
+
+ // app windows set to lower opacity, so they can be recognized
+ if (this._scrolledWindows && this._scrolledWindows.includes(windowPreview.metaWindow)) {
+ if (opt.DASH_ICON_SCROLL === 2)
+ opacity = 254;
+ }
+ if (windowPreview.metaWindow === metaWin) {
+ if (metaWin && metaWin.get_workspace() !== global.workspace_manager.get_active_workspace()) {
+ Main.wm.actionMoveWorkspace(metaWin.get_workspace());
+ if (_timeouts.wsSwitcherAnimation)
+ GLib.source_remove(_timeouts.wsSwitcherAnimation);
+ // setting window preview above siblings before workspace switcher animation has no effect
+ // we need to set the window above after the ws preview become visible on the screen
+ // the default switcher animation time is 250, 200 ms delay should be enough
+ _timeouts.wsSwitcherAnimation = GLib.timeout_add(0, 200 * St.Settings.get().slow_down_factor, () => {
+ windowPreview.get_parent().set_child_above_sibling(windowPreview, null);
+ _timeouts.wsSwitcherAnimation = 0;
+ return GLib.SOURCE_REMOVE;
+ });
+ } else {
+ windowPreview.get_parent().set_child_above_sibling(windowPreview, null);
+ }
+
+ opacity = 255;
+ this._selectedPreview = windowPreview;
+ windowPreview._activateSelected = true;
+ }
+
+ // if windows are exposed, highlight selected using opacity
+ if ((opt.OVERVIEW_MODE && opt.WORKSPACE_MODE) || !opt.OVERVIEW_MODE) {
+ if (metaWin && opacity === 255)
+ windowPreview.showOverlay(true);
+ else
+ windowPreview.hideOverlay(true);
+ windowPreview.ease({
+ duration: 200,
+ opacity,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ }
+ });
+ });
});
- return this._iconActor;
},
};
diff --git a/extensions/45/vertical-workspaces/lib/iconGrid.js b/extensions/47/vertical-workspaces/lib/iconGrid.js
index 09ec25e..f0c6b18 100644
--- a/extensions/45/vertical-workspaces/lib/iconGrid.js
+++ b/extensions/47/vertical-workspaces/lib/iconGrid.js
@@ -3,7 +3,7 @@
* iconGrid.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -11,14 +11,16 @@
'use strict';
import St from 'gi://St';
+import GLib from 'gi://GLib';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as IconGrid from 'resource:///org/gnome/shell/ui/iconGrid.js';
let Me;
let opt;
// added sizes for better scaling
-const IconSize = {
+export const IconSize = {
LARGEST: 256,
224: 224,
208: 208,
@@ -34,8 +36,6 @@ const IconSize = {
TINY: 48,
};
-const PAGE_WIDTH_CORRECTION = 100;
-
export const IconGridModule = class {
constructor(me) {
Me = me;
@@ -90,39 +90,52 @@ const IconGridCommon = {
return layoutManager.getItemsAtPage(page);
},
+ _shouldUpdateGrid(width, height) {
+ if (this.layoutManager._isFolder)
+ return false;
+ else if (this._currentMode === -1)
+ return true;
+
+ // Update if page size changed
+ // Page dimensions may change within a small range
+ const range = 5;
+ return (Math.abs(width - (this._gridForWidth ?? 0)) > range) ||
+ (Math.abs(height - (this._gridForHeight ?? 0)) > range);
+ },
+
_findBestModeForSize(width, height) {
// this function is for main grid only, folder grid calculation is in appDisplay.AppFolderDialog class
- if (this._currentMode > -1 || this.layoutManager._isFolder)
+ if (!this._shouldUpdateGrid(width, height))
return;
+
+ this._gridForWidth = width;
+ this._gridForHeight = height;
+
+ this._updateDefaultIconSize();
const { pagePadding } = this.layout_manager;
const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
- const iconPadding = 51 * scaleFactor;
- // provided width is usually about 100px wider in horizontal orientation with prev/next page indicators
- const pageIndicatorCompensation = opt.ORIENTATION ? 0 : PAGE_WIDTH_CORRECTION;
+ const itemPadding = 55;
- width -= pagePadding.left + pagePadding.right + pageIndicatorCompensation;
- width *= opt.APP_GRID_PAGE_WIDTH_SCALE;
+ // pagePadding is already affected by the scaleFactor
+ width -= pagePadding.left + pagePadding.right;
height -= pagePadding.top + pagePadding.bottom;
- // store grid max dimensions for icon size algorithm
+ // Sync with _findBestIconSize()
+ this.layoutManager._gridSizeChanged = true;
this.layoutManager._gridWidth = width;
this.layoutManager._gridHeight = height;
- width -= 80; // compensation for default padding
- height -= 80;
+ // All widgets are affected by the scaleFactor so we need to apply it also on the page size
+ width /= scaleFactor;
+ height /= scaleFactor;
const spacing = opt.APP_GRID_SPACING;
- // set the icon size as fixed to avoid changes in size later
const iconSize = opt.APP_GRID_ICON_SIZE > 0 ? opt.APP_GRID_ICON_SIZE : opt.APP_GRID_ICON_SIZE_DEFAULT;
- // this.layout_manager.fixedIconSize = iconSize;
- const itemSize = iconSize * scaleFactor + iconPadding;
- // if this._gridModes.length === 1, custom grid should be used
- // if (iconSize > 0 && this._gridModes.length > 1) {
+ const itemSize = iconSize + itemPadding;
let columns = opt.APP_GRID_COLUMNS;
let rows = opt.APP_GRID_ROWS;
// 0 means adaptive size
let unusedSpaceH = -1;
- let unusedSpaceV = -1;
if (!columns) {
// calculate #columns + 1 without spacing
columns = Math.floor(width / itemSize) + 1;
@@ -133,6 +146,7 @@ const IconGridCommon = {
unusedSpaceH = width - columns * itemSize - (columns - 1) * spacing;
}
}
+ let unusedSpaceV = -1;
if (!rows) {
rows = Math.floor(height / itemSize) + 1;
while (unusedSpaceV < 0) {
@@ -142,9 +156,45 @@ const IconGridCommon = {
}
this._gridModes = [{ columns, rows }];
- // }
-
+ this._currentMode = -1;
this._setGridMode(0);
+ this.layoutManager.updateIconSize();
+ // Call _redisplay() from timeout to avoid allocation errors
+ GLib.idle_add(GLib.PRIORITY_LOW, () =>
+ Main.overview._overview.controls.appDisplay._redisplay()
+ );
+ },
+
+ _updateDefaultIconSize() {
+ // Reduce default icon size for low resolution screens and high screen scales
+ if (Me.Util.monitorHasLowResolution()) {
+ opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 128 : 64;
+ opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 64;
+ } else {
+ opt.APP_GRID_ICON_SIZE_DEFAULT = opt.APP_GRID_ACTIVE_PREVIEW && !opt.APP_GRID_USAGE ? 192 : 96;
+ }
+ },
+
+ // Workaround for the upstream bug
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5753
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5240
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6892
+ // The appGridLayout._currentPage is not updated when the page is changed in the grid
+ // For example, when user navigates app icons using a keyboard
+ // Related issues open on GNOME's gitlab:
+ after_goToPage() {
+ if (this._delegate._appGridLayout._currentPage !== this._currentPage)
+ this._delegate._appGridLayout.goToPage(this._currentPage);
+ },
+
+ // Workaround for the upstream bug
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7700
+ // Return INVALID target if x or y is out of the grid view to prevent pages[page] undefined error (horizontal orientation only)
+ getDropTarget(x, y) {
+ if (x < 0 || y < 0)
+ return [0, 0, 0]; // [0, 0, DragLocation.INVALID]
+ const layoutManager = this.layout_manager;
+ return layoutManager.getDropTarget(x, y, this._currentPage);
},
};
@@ -153,45 +203,45 @@ const IconGridLayoutCommon = {
if (this.fixedIconSize !== -1)
return this.fixedIconSize;
+ if (!this._isFolder && !this._gridSizeChanged)
+ return this._iconSize;
+ this._gridSizeChanged = false;
+
+
const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
const nColumns = this.columnsPerPage;
const nRows = this.rowsPerPage;
- // if grid is not defined return default icon size
+ // If grid is not defined, return default icon size
if (nColumns < 1 && nRows < 1) {
- let iconSize;
- if (this._isFolder)
- iconSize = opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT;
- else
- iconSize = opt.APP_GRID_ICON_SIZE_DEFAULT;
-
- return iconSize;
+ return this._isFolder
+ ? opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT
+ : opt.APP_GRID_ICON_SIZE_DEFAULT;
}
- const columnSpacingPerPage = /* opt.APP_GRID_SPACING*/ 1 * (nColumns - 1);
- const rowSpacingPerPage = /* opt.APP_GRID_SPACING*/ 1 * (nRows - 1);
- const iconPadding = 55 * scaleFactor;
+ const spacing = this._isFolder
+ ? opt.APP_GRID_FOLDER_SPACING
+ : opt.APP_GRID_SPACING;
- const paddingH = this._isFolder ? this.pagePadding.left + this.pagePadding.right : 0;
- const paddingV = this._isFolder ? this.pagePadding.top + this.pagePadding.bottom : 0;
+ const columnSpacingPerPage = spacing * (nColumns - 1);
+ const rowSpacingPerPage = spacing * (nRows - 1);
+ const itemPadding = 55;
+
+ const width = (this._gridWidth ? this._gridWidth : this._pageWidth) / scaleFactor;
+ let height = (this._gridHeight ? this._gridHeight : this._pageHeight) / scaleFactor;
- const width = this._gridWidth ? this._gridWidth : this._pageWidth;
- const height = this._gridHeight ? this._gridHeight : this._pageHeight;
if (!width || !height)
return opt.APP_GRID_ICON_SIZE_DEFAULT;
const [firstItem] = this._container;
- /* if (opt.APP_GRID_ADAPTIVE && !this._isFolder)
- return opt.APP_GRID_ICON_SIZE_DEFAULT;*/
-
let iconSizes = Object.values(IconSize).sort((a, b) => b - a);
- // limit max icon size for folders and fully adaptive folder grids, the whole range is for the main grid with active folders
- if (this._isFolder && opt.APP_GRID_FOLDER_ADAPTIVE && opt.APP_GRID_FOLDER_ICON_SIZE < 0)
+ // Limit max icon size for folders and fully adaptive folder grids, the whole range is for the main grid with active folders
+ if (this._isFolder && opt.APP_GRID_FOLDER_ICON_SIZE < 0)
iconSizes = iconSizes.slice(iconSizes.indexOf(opt.APP_GRID_FOLDER_ICON_SIZE_DEFAULT), -1);
else if (this._isFolder)
iconSizes = iconSizes.slice(iconSizes.indexOf(IconSize.LARGE), -1);
- else if (opt.APP_GRID_ADAPTIVE && opt.APP_GRID_ICON_SIZE < 0)
+ else if (opt.APP_GRID_ICON_SIZE < 0)
iconSizes = iconSizes.slice(iconSizes.indexOf(opt.APP_GRID_ICON_SIZE_DEFAULT), -1);
let sizeInvalid = false;
@@ -202,7 +252,7 @@ const IconGridLayoutCommon = {
firstItem.icon.setIconSize(size);
const [firstItemWidth] = firstItem.get_preferred_size();
- const itemSize = firstItemWidth;
+ const itemSize = firstItemWidth / scaleFactor;
if (itemSize < size)
sizeInvalid = true;
@@ -211,19 +261,16 @@ const IconGridLayoutCommon = {
}
if (!firstItem || sizeInvalid) {
- usedWidth = (size + iconPadding) * nColumns;
- usedHeight = (size + iconPadding) * nRows;
+ usedWidth = (size + itemPadding) * nColumns;
+ usedHeight = (size + itemPadding) * nRows;
}
const emptyHSpace =
- width - usedWidth - columnSpacingPerPage - paddingH;
- // this.pagePadding.left - this.pagePadding.right;
+ width - usedWidth - columnSpacingPerPage;
const emptyVSpace =
- height - usedHeight - rowSpacingPerPage - paddingV;
- // this.pagePadding.top - this.pagePadding.bottom;
+ height - usedHeight - rowSpacingPerPage;
- if (emptyHSpace >= 0 && emptyVSpace >= 0) {
+ if (emptyHSpace >= 0 && emptyVSpace >= 0)
return size;
- }
}
return IconSize.TINY;
@@ -266,7 +313,9 @@ const IconGridLayoutCommon = {
page = this._findBestPageToAppend(page);
this._shouldEaseItems = true;
- this._container.add_child(item);
+
+ if (!this._container.get_children().includes(item))
+ this._container.add_child(item);
this._addItemToPage(item, page, index);
},
@@ -331,6 +380,28 @@ const IconGridLayoutCommon = {
this._relocateSurplusItems(pageIndex);
},
+ _relocateSurplusItems(pageIndex) {
+ // Avoid recursion during relocations in _redisplay()
+ if (this._skipRelocateSurplusItems)
+ return;
+
+ const visiblePageItems = this._pages[pageIndex].visibleChildren;
+ const itemsPerPage = this.columnsPerPage * this.rowsPerPage;
+
+ // No overflow
+ if (visiblePageItems.length <= itemsPerPage)
+ return;
+
+ const nExtraItems = visiblePageItems.length - itemsPerPage;
+ for (let i = 0; i < nExtraItems; i++) {
+ const overflowIndex = visiblePageItems.length - i - 1;
+ const overflowItem = visiblePageItems[overflowIndex];
+
+ this._removeItemData(overflowItem);
+ this._addItemToPage(overflowItem, pageIndex + 1, 0);
+ }
+ },
+
_findBestPageToAppend(startPage) {
const itemsPerPage = this.columnsPerPage * this.rowsPerPage;
@@ -343,4 +414,16 @@ const IconGridLayoutCommon = {
return this._pages.length;
},
+
+ updateIconSize() {
+ const iconSize = this._findBestIconSize();
+ if (this._iconSize !== iconSize) {
+ this._iconSize = iconSize;
+
+ for (const child of this._container)
+ child.icon.setIconSize(iconSize);
+
+ this.notify('icon-size');
+ }
+ },
};
diff --git a/extensions/45/vertical-workspaces/lib/layout.js b/extensions/47/vertical-workspaces/lib/layout.js
index d8f8fdc..807f9e0 100644
--- a/extensions/45/vertical-workspaces/lib/layout.js
+++ b/extensions/47/vertical-workspaces/lib/layout.js
@@ -3,7 +3,7 @@
* layout.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -127,23 +127,30 @@ const LayoutManagerCommon = {
return;
if (this.panelBox.height) {
+ const backend = !!Meta.Barrier.prototype.backend;
+ let params = {};
+ if (backend)
+ params['backend'] = global.backend;
+ else
+ params['display'] = global.display;
+
let primary = this.primaryMonitor;
if ([0, 1, 3].includes(opt.HOT_CORNER_POSITION)) {
- this._rightPanelBarrier = new Meta.Barrier({
- display: global.display,
+ params = Object.assign({}, params, {
x1: primary.x + primary.width, y1: this.panelBox.allocation.y1,
x2: primary.x + primary.width, y2: this.panelBox.allocation.y2,
directions: Meta.BarrierDirection.NEGATIVE_X,
});
+ this._rightPanelBarrier = new Meta.Barrier(params);
}
if ([2, 4].includes(opt.HOT_CORNER_POSITION)) {
- this._leftPanelBarrier = new Meta.Barrier({
- display: global.display,
+ params = Object.assign({}, params, {
x1: primary.x, y1: this.panelBox.allocation.y1,
x2: primary.x, y2: this.panelBox.allocation.y2,
directions: Meta.BarrierDirection.POSITIVE_X,
});
+ this._leftPanelBarrier = new Meta.Barrier(params);
}
}
},
@@ -276,50 +283,65 @@ const HotCornerCommon = {
const extendV = opt && opt.HOT_CORNER_ACTION && opt.HOT_CORNER_EDGE && opt.DASH_VERTICAL && monitor.index === primaryMonitor;
const extendH = opt && opt.HOT_CORNER_ACTION && opt.HOT_CORNER_EDGE && !opt.DASH_VERTICAL && monitor.index === primaryMonitor;
+ const backend = !!Meta.Barrier.prototype.backend;
+ let params = {};
+ if (backend)
+ params['backend'] = global.backend;
+ else
+ params['display'] = global.display;
+
if (opt.HOT_CORNER_POSITION <= 1) {
- this._verticalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x, y1: this._y, y2: this._y + (extendV ? monitor.height : size),
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x,
+ y1: this._y, y2: this._y + (extendV ? monitor.height : size),
directions: Meta.BarrierDirection.POSITIVE_X,
});
- this._horizontalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x + (extendH ? monitor.width : size), y1: this._y, y2: this._y,
+ this._verticalBarrier = new Meta.Barrier(params);
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x + (extendH ? monitor.width : size),
+ y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y,
});
+ this._horizontalBarrier = new Meta.Barrier(params);
} else if (opt.HOT_CORNER_POSITION === 2) {
- this._verticalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x, y1: this._y, y2: this._y + (extendV ? monitor.height : size),
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x,
+ y1: this._y, y2: this._y + (extendV ? monitor.height : size),
directions: Meta.BarrierDirection.NEGATIVE_X,
});
- this._horizontalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x - size, x2: this._x, y1: this._y, y2: this._y,
+ this._verticalBarrier = new Meta.Barrier(params);
+ params = Object.assign({}, params, {
+ x1: this._x - size, x2: this._x,
+ y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y,
});
+ this._horizontalBarrier = new Meta.Barrier(params);
} else if (opt.HOT_CORNER_POSITION === 3) {
- this._verticalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x, y1: this._y, y2: this._y - size,
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x,
+ y1: this._y, y2: this._y - size,
directions: Meta.BarrierDirection.POSITIVE_X,
});
- this._horizontalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x + (extendH ? monitor.width : size), y1: this._y, y2: this._y,
+ this._verticalBarrier = new Meta.Barrier(params);
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x + (extendH ? monitor.width : size),
+ y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.NEGATIVE_Y,
});
+ this._horizontalBarrier = new Meta.Barrier(params);
} else if (opt.HOT_CORNER_POSITION === 4) {
- this._verticalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x, y1: this._y, y2: this._y - size,
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x,
+ y1: this._y, y2: this._y - size,
directions: Meta.BarrierDirection.NEGATIVE_X,
});
- this._horizontalBarrier = new Meta.Barrier({
- display: global.display,
- x1: this._x, x2: this._x - size, y1: this._y, y2: this._y,
+ this._verticalBarrier = new Meta.Barrier(params);
+ params = Object.assign({}, params, {
+ x1: this._x, x2: this._x - size,
+ y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.NEGATIVE_Y,
});
+ this._horizontalBarrier = new Meta.Barrier(params);
}
this._pressureBarrier.addBarrier(this._verticalBarrier);
@@ -431,7 +453,7 @@ const HotCornerCommon = {
},
_toggleWindowSearchProvider() {
- if (!Main.overview._overview._controls._searchController._searchActive) {
+ if (!Main.overview.searchController._searchActive) {
opt.OVERVIEW_MODE = 2;
opt.OVERVIEW_MODE2 = true;
opt.WORKSPACE_MODE = 0;
diff --git a/extensions/45/vertical-workspaces/lib/messageTray.js b/extensions/47/vertical-workspaces/lib/messageTray.js
index 07f9541..28d6b1d 100644
--- a/extensions/45/vertical-workspaces/lib/messageTray.js
+++ b/extensions/47/vertical-workspaces/lib/messageTray.js
@@ -3,7 +3,7 @@
* messageTray.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/optionsFactory.js b/extensions/47/vertical-workspaces/lib/optionsFactory.js
index c20885e..7284085 100644
--- a/extensions/45/vertical-workspaces/lib/optionsFactory.js
+++ b/extensions/47/vertical-workspaces/lib/optionsFactory.js
@@ -3,7 +3,7 @@
* optionsFactory.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*/
@@ -130,7 +130,7 @@ export const ItemFactory = class ItemFactory {
for (let i = 0; i < options.length; i++) {
const text = options[i][0];
const id = options[i][1];
- model.append(new DropDownItemVW({ text, id }));
+ model.append(new DropDownItem({ text, id }));
if (id === currentValue)
widget.set_selected(i);
}
@@ -205,7 +205,7 @@ export const ItemFactory = class ItemFactory {
newDropDown() {
const dropDown = new Gtk.DropDown({
model: new Gio.ListStore({
- item_type: DropDownItemVW,
+ item_type: DropDownItem,
}),
halign: Gtk.Align.END,
valign: Gtk.Align.CENTER,
@@ -300,10 +300,10 @@ export const ItemFactory = class ItemFactory {
function setName() {
const ProfileNames = [
- _('GNOME 3'),
- _('GNOME 40+ - Bottom Hot Edge'),
- _('Hot Corner Centric - Top Left Hot Corner'),
- _('Dock Overview - Bottom Hot Edge'),
+ _('GNOME 3 Layout (Vertical WS)'),
+ _('GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)'),
+ _('Top Left Hot Corner Centric (Vertical WS)'),
+ _('Dock-Like Overview, Bottom Hot Edge (Horizontal WS)'),
];
let name = opt.get(`profileName${profileIndex}`, true);
@@ -457,8 +457,9 @@ export const AdwPrefs = class {
}
};
-const DropDownItemVW = GObject.registerClass({
- GTypeName: 'DropDownItemVW',
+const DropDownItem = GObject.registerClass({
+ // Registered name should be unique
+ GTypeName: `DropDownItem${Math.floor(Math.random() * 1000)}`,
Properties: {
'text': GObject.ParamSpec.string(
'text',
@@ -476,7 +477,7 @@ const DropDownItemVW = GObject.registerClass({
-2147483648, 2147483647, 0
),
},
-}, class DropDownItemVW extends GObject.Object {
+}, class DropDownItem extends GObject.Object {
get text() {
return this._text;
}
diff --git a/extensions/45/vertical-workspaces/lib/osdWindow.js b/extensions/47/vertical-workspaces/lib/osdWindow.js
index 2298c34..a06a331 100644
--- a/extensions/45/vertical-workspaces/lib/osdWindow.js
+++ b/extensions/47/vertical-workspaces/lib/osdWindow.js
@@ -3,7 +3,7 @@
* osdWindow.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/overlayKey.js b/extensions/47/vertical-workspaces/lib/overlayKey.js
index 77264c1..5ffd973 100644
--- a/extensions/45/vertical-workspaces/lib/overlayKey.js
+++ b/extensions/47/vertical-workspaces/lib/overlayKey.js
@@ -3,7 +3,7 @@
* overlayKey.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -40,8 +40,10 @@ export const OverlayKeyModule = class {
update(reset) {
this.moduleEnabled = opt.get('overlayKeyModule');
const conflict = false;
+ // Avoid modifying the overlay key if its configuration is consistent with the GNOME default
+ const defaultConfig = opt.OVERVIEW_MODE === 0 && opt.OVERLAY_KEY_PRIMARY === 2 && opt.OVERLAY_KEY_SECONDARY === 1;
- reset = reset || !this.moduleEnabled || conflict;
+ reset = reset || !this.moduleEnabled || conflict || defaultConfig;
if (reset && !this._firstActivation) {
this._disableModule();
@@ -135,7 +137,7 @@ export const OverlayKeyModule = class {
opt.OVERVIEW_MODE2 = false;
opt.WORKSPACE_MODE = 1;
break;
- case 3: // Default overview
+ case 3: // App grid
if (Main.overview._shown)
Main.overview.hide();
else
diff --git a/extensions/45/vertical-workspaces/lib/overview.js b/extensions/47/vertical-workspaces/lib/overview.js
index 449e9c8..30cc5db 100644
--- a/extensions/45/vertical-workspaces/lib/overview.js
+++ b/extensions/47/vertical-workspaces/lib/overview.js
@@ -3,7 +3,7 @@
* overview.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/overviewControls.js b/extensions/47/vertical-workspaces/lib/overviewControls.js
index df5b371..c5a74f1 100644
--- a/extensions/45/vertical-workspaces/lib/overviewControls.js
+++ b/extensions/47/vertical-workspaces/lib/overviewControls.js
@@ -3,23 +3,21 @@
* overviewControls.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
'use strict';
-import GLib from 'gi://GLib';
import Clutter from 'gi://Clutter';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
import St from 'gi://St';
-import Meta from 'gi://Meta';
import Shell from 'gi://Shell';
-import GObject from 'gi://GObject';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as Overview from 'resource:///org/gnome/shell/ui/overview.js';
-import * as Layout from 'resource:///org/gnome/shell/ui/layout.js';
import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js';
import * as WorkspacesView from 'resource:///org/gnome/shell/ui/workspacesView.js';
import * as Background from 'resource:///org/gnome/shell/ui/background.js';
@@ -33,11 +31,10 @@ let _;
const ControlsState = OverviewControls.ControlsState;
const FitMode = WorkspacesView.FitMode;
+const STARTUP_ANIMATION_TIME = 500;
const ANIMATION_TIME = Overview.ANIMATION_TIME;
-const DASH_MAX_SIZE_RATIO = 0.25;
+const DASH_MAX_SIZE_RATIO = 0.35;
-let _originalSearchControllerSigId;
-let _searchControllerSigId;
let _timeouts;
export const OverviewControlsModule = class {
@@ -84,13 +81,18 @@ export const OverviewControlsModule = class {
this._replaceOnSearchChanged();
this._overrides.addOverride('ControlsManager', OverviewControls.ControlsManager.prototype, ControlsManagerCommon);
-
+ this._overrides.addOverride('ControlsManagerLayoutCommon', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutCommon);
if (opt.ORIENTATION === Clutter.Orientation.VERTICAL)
this._overrides.addOverride('ControlsManagerLayout', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutVertical);
else
this._overrides.addOverride('ControlsManagerLayout', Main.overview._overview.controls.layoutManager, ControlsManagerLayoutHorizontal);
- this._overrides.addOverride('LayoutManager', Layout.LayoutManager.prototype, LayoutManager);
+ // Allow user to close the overview by clicking on an empty space on the primary monitor's overview
+ // Secondary monitors are handled in workspacesView
+ this._addClickToCloseOverview();
+
+ // Update custom workAreaBox
+ Main.overview._overview.controls.layoutManager._updateWorkAreaBox();
console.debug(' OverviewControlsModule - Activated');
}
@@ -103,6 +105,7 @@ export const OverviewControlsModule = class {
const reset = true;
this._replaceOnSearchChanged(reset);
Main.overview._overview._controls._appDisplay.opacity = 255;
+ this._addClickToCloseOverview(reset);
console.debug(' OverviewControlsModule - Disabled');
}
@@ -118,31 +121,57 @@ export const OverviewControlsModule = class {
}
_replaceOnSearchChanged(reset) {
- const searchController = Main.overview._overview.controls._searchController;
+ const searchController = Main.overview.searchController;
if (reset) {
- if (_searchControllerSigId) {
- searchController.disconnect(_searchControllerSigId);
- _searchControllerSigId = 0;
+ if (this._searchControllerSigId) {
+ searchController.disconnect(this._searchControllerSigId);
+ this._searchControllerSigId = 0;
}
- if (_originalSearchControllerSigId) {
- searchController.unblock_signal_handler(_originalSearchControllerSigId);
- _originalSearchControllerSigId = 0;
+ if (this._originalSearchControllerSigId) {
+ searchController.unblock_signal_handler(this._originalSearchControllerSigId);
+ this._originalSearchControllerSigId = 0;
}
- Main.overview._overview._controls.layoutManager._searchController._searchResults.translation_x = 0;
- Main.overview._overview._controls.layoutManager._searchController._searchResults.translation_y = 0;
+ searchController._searchResults.translation_x = 0;
+ searchController._searchResults.translation_y = 0;
Main.overview.searchEntry.visible = true;
Main.overview.searchEntry.opacity = 255;
} else {
// reconnect signal to use custom function (callbacks cannot be overridden in class prototype, they are already in memory as a copy for the given callback)
- if (!_originalSearchControllerSigId)
- _originalSearchControllerSigId = GObject.signal_handler_find(searchController, { signalId: 'notify', detail: 'search-active' });
- if (_originalSearchControllerSigId)
- searchController.block_signal_handler(_originalSearchControllerSigId);
+ if (!this._originalSearchControllerSigId) {
+ this._originalSearchControllerSigId = GObject.signal_handler_find(searchController, { signalId: 'notify', detail: 'search-active' });
+ if (this._originalSearchControllerSigId)
+ searchController.block_signal_handler(this._originalSearchControllerSigId);
+ }
- if (!_searchControllerSigId)
- _searchControllerSigId = searchController.connect('notify::search-active', ControlsManagerCommon._onSearchChanged.bind(Main.overview._overview.controls));
+ if (!this._searchControllerSigId)
+ this._searchControllerSigId = searchController.connect('notify::search-active', () => Main.overview._overview.controls._onSearchChanged());
}
}
+
+ _addClickToCloseOverview(reset) {
+ const overview = Main.overview._overview;
+
+ overview.reactive = false;
+ if (this._clickEmptyConId) {
+ overview.disconnect(this._clickEmptyConId);
+ this._clickEmptyConId = 0;
+ }
+
+ if (reset || !opt.CLICK_EMPTY_CLOSE)
+ return;
+
+ overview.reactive = true;
+ this._clickEmptyConId = overview.connect('button-release-event', (actor, event) => {
+ const button = event.get_button();
+ const overviewState = overview.controls._stateAdjustment.value;
+ const buttonPrimary = button === Clutter.BUTTON_PRIMARY;
+ const buttonSecondary = button === Clutter.BUTTON_SECONDARY;
+ const buttonAny = buttonPrimary || buttonSecondary;
+
+ if ((overviewState === 1 && buttonAny) || (overviewState === 2 && buttonSecondary))
+ Main.overview.hide();
+ });
+ }
};
const ControlsManagerCommon = {
@@ -151,19 +180,32 @@ const ControlsManagerCommon = {
...
}*/
+ prepareToEnterOverview() {
+ this._searchController.prepareToEnterOverview();
+ this._workspacesDisplay.prepareToEnterOverview();
+ // Workaround for thumbnailsBox not re-scaling after switching workspace outside of overview using a trackpad
+ this._thumbnailsBox._updateIndicator();
+
+ Main.overview._overview.controls.opacity = 255;
+
+ // Ensure that overview backgrounds are ready when needed
+ if (!this._bgManagers && (opt.SHOW_BG_IN_OVERVIEW || !opt.SHOW_WS_PREVIEW_BG))
+ this._setBackground();
+ else if (this._bgManagers && !(opt.SHOW_BG_IN_OVERVIEW || !opt.SHOW_WS_PREVIEW_BG))
+ this._setBackground(true);
+
+ // store pointer X coordinate for OVERVIEW_MODE 1 - to prevent immediate switch to WORKSPACE_MODE 1 if the mouse pointer is steady
+ opt.showingPointerX = global.get_pointer()[0];
+ },
+
// this function has duplicate in WorkspaceView so we use one function for both to avoid issues with syncing them
_getFitModeForState(state) {
return _getFitModeForState(state);
},
_updateThumbnailsBox() {
- const { currentState } = this._stateAdjustment.getStateTransitionParams();
const { shouldShow } = this._thumbnailsBox;
- const thumbnailsBoxVisible = shouldShow &&
- ((currentState < ControlsState.APP_GRID && opt.SHOW_WS_TMB) ||
- (currentState > ControlsState.WINDOW_PICKER && opt.SHOW_WS_TMB_APPGRID) ||
- (currentState > ControlsState.WINDOW_PICKER && this._searchController.searchActive && opt.SHOW_WS_TMB)
- );
+ const thumbnailsBoxVisible = shouldShow;
this._thumbnailsBox.visible = thumbnailsBoxVisible;
// this call should be directly in _update(), but it's used as a callback function and it would require to reconnect the signal
@@ -210,13 +252,18 @@ const ControlsManagerCommon = {
if (currentState === 0 && opt.OVERVIEW_MODE && opt.WORKSPACE_MODE)
opt.WORKSPACE_MODE = 0;
- if (!opt.WS_ANIMATION || !opt.SHOW_WS_TMB) {
+ if (!opt.WS_ANIMATION || (!opt.SHOW_WS_TMB && opt.SHOW_WS_PREVIEW_BG)) {
this._workspacesDisplay.opacity = opacity;
- } else if (!opt.SHOW_WS_TMB_BG) {
+ } else if (!opt.SHOW_WS_TMB_BG && opt.SHOW_WS_PREVIEW_BG) {
// fade out ws wallpaper during transition to ws switcher if ws switcher background disabled
- const ws = this._workspacesDisplay._workspacesViews[global.display.get_primary_monitor()]?._workspaces[this._workspaceAdjustment.value];
- if (ws)
- ws._background.opacity = opacity;
+ const workspaces = this._workspacesDisplay._workspacesViews[global.display.get_primary_monitor()]?._workspaces;
+ // Speed up the workspace background opacity transition
+ if (opt.WORKSPACE_MAX_SPACING < opt.WS_MAX_SPACING_OFF_SCREEN && workspaces)
+ // If workspacesDisplay max spacing is set so adjacent workspaces could be visible on the screen
+ workspaces.forEach(w => w._background.set_opacity(Math.max(0, opacity - (255 - opacity))));
+ else if (workspaces)
+ // If adjacent workspaces should not be visible on the screen, set the opacity only for the visible one
+ workspaces[this._workspaceAdjustment.value]?._background.set_opacity(Math.max(0, opacity - (255 - opacity)));
}
// if ws preview background is disabled, animate tmb box and dash
@@ -229,7 +276,7 @@ const ControlsManagerCommon = {
// OVERVIEW_MODE 2 should animate dash and wsTmbBox only if WORKSPACE_MODE === 0 (windows not spread)
const animateOverviewMode2 = opt.OVERVIEW_MODE2 && !(finalState === 1 && opt.WORKSPACE_MODE);
if (!Main.layoutManager._startingUp && ((!opt.SHOW_WS_PREVIEW_BG && !opt.OVERVIEW_MODE2) || animateOverviewMode2)) {
- if (!tmbBox._translationOriginal || Math.abs(tmbBox._translationOriginal[0]) > 500) { // swipe gesture can call this calculation before tmbBox is finalized, giving nonsense width
+ if (!tmbBox._translationOriginal || Math.abs(tmbBox._translationOriginal[0]) > 500) { // swipe gesture can call this calculation before tmbBox is realized, giving nonsense width
const [dashTranslationX, dashTranslationY, tmbTranslationX, tmbTranslationY, searchTranslationY] = this._getOverviewTranslations(dash, tmbBox, searchEntryBin);
tmbBox._translationOriginal = [tmbTranslationX, tmbTranslationY];
dash._translationOriginal = [dashTranslationX, dashTranslationY];
@@ -275,6 +322,10 @@ const ControlsManagerCommon = {
} else {
this._workspacesDisplay.scale_x = 1;
}
+ if (opt.LEAVING_SEARCH && currentState <= ControlsState.WINDOW_PICKER) {
+ opt.LEAVING_SEARCH = false;
+ }
+
this._workspacesDisplay.setPrimaryWorkspaceVisible(workspacesDisplayVisible);
if (!this.dash._isAbove && progress > 0 && opt.OVERVIEW_MODE2) {
@@ -292,11 +343,14 @@ const ControlsManagerCommon = {
this.set_child_above_sibling(this._searchEntryBin, null);
if (!Me.Util.dashNotDefault())
this.set_child_above_sibling(this.dash, null);
-
+ if (Main.layoutManager.panelBox.get_parent() === Main.layoutManager.overviewGroup)
+ Main.layoutManager.overviewGroup.set_child_above_sibling(Main.layoutManager.panelBox, Main.overview._overview);
this.dash._isAbove = true;
} else if (this.dash._isAbove && progress < 1) {
// keep dash below for ws transition between the overview and hidden state
this.set_child_above_sibling(this._workspacesDisplay, null);
+ if (Main.layoutManager.panelBox.get_parent() === Main.layoutManager.overviewGroup)
+ Main.layoutManager.overviewGroup.set_child_below_sibling(Main.layoutManager.panelBox, Main.overview._overview);
this.dash._isAbove = false;
}
},
@@ -319,7 +373,45 @@ const ControlsManagerCommon = {
!this._searchTransition;
},
+ _activateSearchAppGridMode() {
+ if (!this._origAppGridContent) {
+ this._origAppGridContent = {
+ usage: opt.APP_GRID_USAGE,
+ favorites: opt.APP_GRID_EXCLUDE_FAVORITES,
+ running: opt.APP_GRID_EXCLUDE_RUNNING,
+ incompletePages: this._appDisplay._grid.layoutManager.allowIncompletePages,
+ order: opt.APP_GRID_ORDER,
+ };
+ opt.APP_GRID_ORDER = 3;
+ opt.APP_GRID_USAGE = true;
+ opt.APP_GRID_EXCLUDE_FAVORITES = false;
+ opt.APP_GRID_EXCLUDE_RUNNING = false;
+ this._appDisplay._grid.layoutManager.allowIncompletePages = false;
+ this._appDisplay._redisplay();
+ }
+ },
+
+ _deactivateSearchAppGridMode() {
+ if (this._origAppGridContent) {
+ const icons = this._appDisplay._orderedItems;
+ icons.forEach(icon => {
+ icon.visible = true;
+ });
+
+ opt.APP_GRID_ORDER = this._origAppGridContent.order;
+ opt.APP_GRID_USAGE = this._origAppGridContent.usage;
+ opt.APP_GRID_EXCLUDE_FAVORITES = this._origAppGridContent.favorites;
+ opt.APP_GRID_EXCLUDE_RUNNING = this._origAppGridContent.running;
+ this._appDisplay._grid.layoutManager.allowIncompletePages = this._origAppGridContent.incompletePages;
+ this._origAppGridContent = null;
+ this._appDisplay._redisplay();
+ }
+ },
+
_onSearchChanged() {
+ // something is somewhere setting the opacity to 0 if V-Shell is rebased while in overview / search
+ this._searchController.opacity = 255;
+
const { finalState, currentState } = this._stateAdjustment.getStateTransitionParams();
const { searchActive } = this._searchController;
@@ -348,9 +440,20 @@ const ControlsManagerCommon = {
return;
if (!searchActive) {
+ if (!this.dash.showAppsButton.checked)
+ opt.LEAVING_SEARCH = true;
+
+ if (this._origAppGridContent)
+ this._deactivateSearchAppGridMode();
+
this._workspacesDisplay.reactive = true;
this._workspacesDisplay.setPrimaryWorkspaceVisible(true);
} else {
+ if (opt.SEARCH_APP_GRID_MODE && this.dash.showAppsButton.checked) {
+ this._activateSearchAppGridMode();
+ return;
+ }
+
if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)
this._searchController._searchResults._statusText.add_style_class_name('search-statustext-om2');
else
@@ -358,6 +461,7 @@ const ControlsManagerCommon = {
this._searchController.show();
entry.visible = true;
entry.opacity = 255;
+ opt.LEAVING_SEARCH = false;
}
if (opt.SHOW_BG_IN_OVERVIEW && this._bgManagers)
@@ -366,14 +470,12 @@ const ControlsManagerCommon = {
this._searchController._searchResults.translation_x = 0;
this._searchController._searchResults.translation_y = 0;
- this._searchController.opacity = 255;
this._searchController.visible = true;
if (opt.SEARCH_VIEW_ANIMATION && ![4, 8].includes(opt.WS_TMB_POSITION)) {
this._updateAppDisplayVisibility();
- this.layoutManager._searchController._searchResults._statusBin.opacity = 1;
+ this._searchController._searchResults._statusBin.opacity = 1;
- this._searchController.opacity = searchActive ? 255 : 0;
let translationX = 0;
let translationY = 0;
const geometry = global.display.get_monitor_geometry(global.display.get_primary_monitor());
@@ -407,6 +509,8 @@ const ControlsManagerCommon = {
}
this._searchController._searchResults.ease({
+ delay: 150, // wait for results
+ opacity: searchActive ? 255 : 0,
translation_x: searchActive ? 0 : translationX,
translation_y: searchActive ? 0 : translationY,
duration: SIDE_CONTROLS_ANIMATION_TIME,
@@ -414,7 +518,7 @@ const ControlsManagerCommon = {
onComplete: () => {
this._searchController.visible = searchActive;
this._searchTransition = false;
- this.layoutManager._searchController._searchResults._statusBin.opacity = 255;
+ this._searchController._searchResults._statusBin.opacity = 255;
},
});
@@ -431,10 +535,9 @@ const ControlsManagerCommon = {
this._workspacesDisplay.setPrimaryWorkspaceVisible(true);
- this._searchController.opacity = searchActive ? 0 : 255;
- this._searchController.ease({
+ this._searchController._searchResults.ease({
opacity: searchActive ? 255 : 0,
- duration: searchActive ? SIDE_CONTROLS_ANIMATION_TIME : 0,
+ duration: searchActive ? SIDE_CONTROLS_ANIMATION_TIME / 2 : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => (this._searchController.visible = searchActive),
});
@@ -442,10 +545,9 @@ const ControlsManagerCommon = {
// reuse already tuned overview transition, just replace APP_GRID with the search view
if (!(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) && !Main.overview._animationInProgress && finalState !== ControlsState.HIDDEN && !this.dash.showAppsButton.checked) {
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2');
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.add_style_class_name('search-section-content-bg');
- Main.overview.searchEntry.remove_style_class_name('search-entry-om2');
- const duration = opt.SEARCH_VIEW_ANIMATION ? 150 : 0;
+ this._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2');
+ this._searchEntry.remove_style_class_name('search-entry-om2');
+ const duration = opt.SEARCH_VIEW_ANIMATION ? 140 : 0;
this._stateAdjustment.ease(searchActive ? ControlsState.APP_GRID : ControlsState.WINDOW_PICKER, {
// shorter animation time when entering search view can avoid stuttering in transition
// collecting search results take some time and the problematic part is the realization of the object on the screen
@@ -455,17 +557,18 @@ const ControlsManagerCommon = {
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
this._workspacesDisplay.setPrimaryWorkspaceVisible(!searchActive);
+ // Set the delay before processing a new search entry to 150 on deactivation, so search providers can't make make the workspace animation stuttering
+ // set it back to 0 after in-animation, so the search can be snappy
+ opt.SEARCH_DELAY = searchActive || !opt.SEARCH_VIEW_ANIMATION ? 0 : 150;
},
});
} else if (opt.OVERVIEW_MODE2 && !(opt.WORKSPACE_MODE || this.dash.showAppsButton.checked)) {
// add background to search results and make searchEntry border thicker for better visibility
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.remove_style_class_name('search-section-content-bg');
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.add_style_class_name('search-section-content-bg-om2');
- Main.overview.searchEntry.add_style_class_name('search-entry-om2');
+ this._searchController._searchResults._content.add_style_class_name('search-section-content-bg-om2');
+ this._searchEntry.add_style_class_name('search-entry-om2');
} else {
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.add_style_class_name('search-section-content-bg');
- Main.overview._overview._controls.layoutManager._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2');
- Main.overview.searchEntry.remove_style_class_name('search-entry-om2');
+ this._searchController._searchResults._content.remove_style_class_name('search-section-content-bg-om2');
+ this._searchEntry.remove_style_class_name('search-entry-om2');
}
},
@@ -491,18 +594,14 @@ const ControlsManagerCommon = {
await this.layout_manager.ensureAllocation();
this._setBackground();
+ Me.Modules.panelModule.update();
Main.panel.opacity = 255;
- const STARTUP_ANIMATION_TIME = 500;
// Opacity
this.ease({
opacity: opt.STARTUP_STATE === 1 ? 0 : 255,
duration: STARTUP_ANIMATION_TIME,
mode: Clutter.AnimationMode.LINEAR,
- onComplete: () => {
- // part of the workaround for stuttering first app grid animation
- this._appDisplay.visible = true;
- },
});
const dash = this.dash;
@@ -555,7 +654,6 @@ const ControlsManagerCommon = {
STARTUP_ANIMATION_TIME * 2 * St.Settings.get().slow_down_factor,
() => {
onComplete();
- Main.overview._startupInitComplete = true;
_timeouts.startupAnim2 = 0;
return GLib.SOURCE_REMOVE;
}
@@ -617,16 +715,13 @@ const ControlsManagerCommon = {
_realizeAppDisplayAndFinishSequence() {
const appDisplayModule = Me.Modules.appDisplayModule;
// realize app grid for smoother first animation
- appDisplayModule._updateAppGrid(false, this._finishStartupSequence.bind(this));
+ appDisplayModule._repopulateAppDisplay(false, this._finishStartupSequence.bind(this));
},
_finishStartupSequence() {
if (!this._bgManagers)
this._setBackground();
- /* if (Me.Util.dashIsDashToDock())
- return;*/
-
_timeouts.finishStartup = GLib.idle_add(
GLib.PRIORITY_LOW, () => {
this._appDisplay.opacity = 255;
@@ -661,8 +756,7 @@ const ControlsManagerCommon = {
},
_getOverviewTranslations(dash, tmbBox, searchEntryBin) {
- // const tmbBox = Main.overview._overview._controls._thumbnailsBox;
- const animationsDisabled = !St.Settings.get().enable_animations || (opt.SHOW_WS_PREVIEW_BG && !opt.OVERVIEW_MODE2);
+ const animationsDisabled = !St.Settings.get().enable_animations || ((opt.SHOW_WS_PREVIEW_BG && !opt.OVERVIEW_MODE2) && !Main.layoutManager._startingUp);
if (animationsDisabled)
return [0, 0, 0, 0, 0];
@@ -770,7 +864,7 @@ const ControlsManagerCommon = {
_setBackground(reset = false) {
if (this._bgManagers) {
this._bgManagers.forEach(bg => {
- Main.overview._overview._controls._stateAdjustment.disconnect(bg._fadeSignal);
+ this._stateAdjustment.disconnect(bg._fadeSignal);
bg.destroy();
});
}
@@ -792,8 +886,7 @@ const ControlsManagerCommon = {
bgManager.backgroundActor.content.vignette_sharpness = 0;
bgManager.backgroundActor.content.brightness = 1;
-
- bgManager._fadeSignal = Main.overview._overview._controls._stateAdjustment.connect('notify::value', v => {
+ bgManager._fadeSignal = this._stateAdjustment.connect('notify::value', v => {
this._updateBackground(bgManager, v.value, v);
});
@@ -808,10 +901,10 @@ const ControlsManagerCommon = {
},
_updateBackground(bgManager, stateValue = 2, stateAdjustment = null) {
- // Blur My Shell extension destroys all background actors in the overview and doesn't care about consequences
+ // Just in case something destroys our background (like older versions of Blur My Shell)
if (this._bgManagers[0] && !Main.layoutManager.overviewGroup.get_children().includes(this._bgManagers[0].backgroundActor)) {
- Main.notifyError(`[${Me.metadata.name}]`, _('Overview background crashed!\nIf you are using Blur My Shell, disable overview blur in its settings and re-enable V-Shell Overview Background to avoid visual glitches.'));
- // remove and disconnect our destroyed backgrounds to avoid more errors
+ console.error(`[${Me.metadata.name}]`, 'Error: The overview background has been destroyed, possibly by another incompatible extension');
+ // remove and disconnect our destroyed backgrounds to avoid further errors
this._setBackground(true);
return;
}
@@ -819,9 +912,12 @@ const ControlsManagerCommon = {
const finalState = stateAdjustment?.getStateTransitionParams().finalState;
if (!opt.SHOW_BG_IN_OVERVIEW && !opt.SHOW_WS_PREVIEW_BG) {
// if no bg shown in the overview, fade out the wallpaper
+ if (bgManager.backgroundActor.get_effect('blur'))
+ bgManager.backgroundActor.remove_effect_by_name('blur');
if (!(opt.OVERVIEW_MODE2 && opt.WORKSPACE_MODE && finalState === 1))
bgManager.backgroundActor.opacity = Util.lerp(255, 0, Math.min(stateValue, 1));
} else {
+ bgManager.backgroundActor.opacity = 255;
let VIGNETTE, BRIGHTNESS, bgValue;
if (opt.OVERVIEW_MODE2 && stateValue <= 1 && !opt.WORKSPACE_MODE) {
VIGNETTE = 0;
@@ -840,13 +936,15 @@ const ControlsManagerCommon = {
if (!blurEffect) {
blurEffect = new Shell.BlurEffect({
brightness: 1,
- sigma: 0,
mode: Shell.BlurMode.ACTOR,
});
bgManager.backgroundActor.add_effect_with_name('blur', blurEffect);
}
- const searchActive = Main.overview._overview.controls._searchController.searchActive;
+ // In GNOME 46 the "sigma" property has been renamed to "radius"
+ const radius = blurEffect.sigma !== undefined ? 'sigma' : 'radius';
+
+ const searchActive = this._searchController.searchActive;
if (searchActive)
BRIGHTNESS = opt.SEARCH_BG_BRIGHTNESS;
@@ -877,177 +975,165 @@ const ControlsManagerCommon = {
const step = opt.SMOOTH_BLUR_TRANSITIONS ? 0.05 : 0.2;
const progress = stateValue - (stateValue % step);
if (opt.SHOW_WS_PREVIEW_BG && stateValue < 1 && !searchActive) { // no need to animate transition, unless appGrid state is involved, static bg is covered by the ws preview bg
- if (blurEffect.sigma !== opt.OVERVIEW_BG_BLUR_SIGMA)
- blurEffect.sigma = opt.OVERVIEW_BG_BLUR_SIGMA;
+ if (blurEffect[radius] !== opt.OVERVIEW_BG_BLUR_SIGMA)
+ blurEffect[radius] = opt.OVERVIEW_BG_BLUR_SIGMA;
} else if (stateValue < 1 && !searchActive && !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)) {
const sigma = Math.round(Util.lerp(0, opt.OVERVIEW_BG_BLUR_SIGMA, progress));
- if (sigma !== blurEffect.sigma)
- blurEffect.sigma = sigma;
- } else if (stateValue < 1 && !searchActive && (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE && blurEffect.sigma)) {
+ if (sigma !== blurEffect[radius])
+ blurEffect[radius] = sigma;
+ } else if (stateValue < 1 && !searchActive && (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE && blurEffect[radius])) {
const sigma = Math.round(Util.lerp(0, opt.OVERVIEW_BG_BLUR_SIGMA, progress));
- if (sigma !== blurEffect.sigma)
- blurEffect.sigma = sigma;
+ if (sigma !== blurEffect[radius])
+ blurEffect[radius] = sigma;
} else if (stateValue > 1 && !searchActive && (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE && finalState === 1)) {
const sigma = Math.round(Util.lerp(0, opt.OVERVIEW_BG_BLUR_SIGMA, progress % 1));
- if (sigma !== blurEffect.sigma)
- blurEffect.sigma = sigma;
+ if (sigma !== blurEffect[radius])
+ blurEffect[radius] = sigma;
} else if ((stateValue > 1 && bgManager._primary) || searchActive) {
const sigma = Math.round(Util.lerp(opt.OVERVIEW_BG_BLUR_SIGMA, opt.APP_GRID_BG_BLUR_SIGMA, progress % 1));
- if (sigma !== blurEffect.sigma)
- blurEffect.sigma = sigma;
+ if (sigma !== blurEffect[radius])
+ blurEffect[radius] = sigma;
} else if (stateValue === 1 && !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)) {
- blurEffect.sigma = opt.OVERVIEW_BG_BLUR_SIGMA;
+ blurEffect[radius] = opt.OVERVIEW_BG_BLUR_SIGMA;
} else if (stateValue === 0 || (stateValue === 1 && (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE))) {
- blurEffect.sigma = 0;
+ blurEffect[radius] = 0;
}
}
}
},
};
-const ControlsManagerLayoutVertical = {
- _computeWorkspacesBoxForState(state, box, workAreaBox, dashWidth, dashHeight, thumbnailsWidth, thumbnailsHeight, searchHeight, startY) {
- // in case the function is called from the DtD
- if (startY === undefined) {
- workAreaBox = box;
+const ControlsManagerLayoutCommon = {
+ after__updateWorkAreaBox() {
+ const workArea = this._workAreaBox.copy();
+
+ // opt.PANEL_OVERVIEW_ONLY removes affectsStruts panel property
+ if (opt.get('panelModule') && opt.PANEL_OVERVIEW_ONLY) {
+ let offsetY = 0;
+ let reduction = 0;
+ reduction = Main.panel.height;
+ offsetY = opt.PANEL_POSITION_TOP ? reduction : 0;
+
+ const startX = workArea.x1;
+ const startY = workArea.y1 + offsetY;
+ const width = workArea.get_width();
+ const height = workArea.get_height() - reduction;
+
+ workArea.set_origin(startX, startY);
+ workArea.set_size(width, height);
}
- const workspaceBox = box.copy();
- let [width, height] = workspaceBox.get_size();
- const { spacing } = this;
+ this._workAreaBoxForVShellConfig = workArea;
+ },
+
+ _updatePositionFromDashToDock() {
+ // update variables that cannot be processed within settings
const dash = Main.overview.dash;
- // including Dash to Dock and clones properties for compatibility
+ opt.DASH_POSITION = dash._position;
+ opt.DASH_TOP = opt.DASH_POSITION === 0;
+ opt.DASH_RIGHT = opt.DASH_POSITION === 1;
+ opt.DASH_BOTTOM = opt.DASH_POSITION === 2;
+ opt.DASH_LEFT = opt.DASH_POSITION === 3;
+ opt.DASH_VERTICAL = opt.DASH_LEFT || opt.DASH_RIGHT;
+ },
- if (Me.Util.dashIsDashToDock()) {
- // Dash to Dock also always affects workAreaBox
- Main.layoutManager._trackedActors.forEach(actor => {
- if (actor.affectsStruts && actor.actor.width === dash.width) {
- if (dash._isHorizontal) {
- // disabled inteli-hide don't needs compensation
- // startY needs to be corrected in allocate()
- if (dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled)
- height += dash.height;
- } else {
- width += dash.width;
- }
- }
- });
- }
+ _dashToDockAffectsWorkArea() {
+ const dash = Main.overview.dash;
+ const dtd = dash.get_parent()?.get_parent()?.get_parent();
+ const layoutManager = Main.layoutManager;
+ const index = layoutManager._findActor(dtd);
+ const data = index > -1 ? layoutManager._trackedActors[index] : null;
+ const affectsStruts = data?.affectsStruts;
+ return !!affectsStruts;
+ },
+};
+
+const ControlsManagerLayoutVertical = {
+ _computeWorkspacesBoxForState(state, box, wsTmbWidth, wsTmbHeight, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset, centeredBoxOffset) {
+ const workspaceBox = box.copy();
+ let [width, height] = this._workAreaBoxForVShellConfig.get_size();
+ const startX = this._workAreaBoxForVShellConfig.x1;
+ const startY = this._workAreaBoxForVShellConfig.y1;
- let wWidth;
- let wHeight;
- let wsBoxY;
+ let wsBoxWidth, wsBoxHeight, wsBoxY, wsBoxX;
switch (state) {
case ControlsState.HIDDEN:
- // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering
- // therefore we added panel height to startY for the overview allocation,
- // but here we need to remove the correction because the panel will be in the hidden state
- if (opt.START_Y_OFFSET) {
- let [x, y] = workAreaBox.get_origin();
- y -= opt.START_Y_OFFSET;
- workspaceBox.set_origin(x, y);
- } else {
- workspaceBox.set_origin(...workAreaBox.get_origin());
- }
- workspaceBox.set_size(...workAreaBox.get_size());
+ workspaceBox.set_origin(...this._workAreaBox.get_origin());
+ workspaceBox.set_size(...this._workAreaBox.get_size());
break;
case ControlsState.WINDOW_PICKER:
case ControlsState.APP_GRID:
if (opt.WS_ANIMATION && opt.SHOW_WS_TMB && state === ControlsState.APP_GRID) {
workspaceBox.set_origin(...this._workspacesThumbnails.get_position());
- workspaceBox.set_size(thumbnailsWidth, thumbnailsHeight);
+ workspaceBox.set_size(wsTmbWidth, wsTmbHeight);
} else if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) {
- if (opt.START_Y_OFFSET) {
- let [x, y] = workAreaBox.get_origin();
- y -= opt.START_Y_OFFSET;
- workspaceBox.set_origin(x, y);
- } else {
- workspaceBox.set_origin(...workAreaBox.get_origin());
- }
- workspaceBox.set_size(...workAreaBox.get_size());
+ workspaceBox.set_origin(...this._workAreaBox.get_origin());
+ workspaceBox.set_size(...this._workAreaBox.get_size());
} else {
- // if PANEL_OVERVIEW_ONLY, panel doesn't affect workArea height (affectStruts === false), it is necessary to compensate
- height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height;
- searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0;
- wWidth = width -
- (opt.DASH_VERTICAL ? dashWidth : 0) -
- thumbnailsWidth -
- 4 * spacing;
- wHeight = height -
- (opt.DASH_VERTICAL ? 0 : dashHeight) -
- searchHeight -
- 4 * spacing;
+ wsBoxWidth = width - leftBoxOffset - rightBoxOffset;
+ wsBoxHeight = height - topBoxOffset - bottomBoxOffset;
const ratio = width / height;
- let wRatio = wWidth / wHeight;
+ let wRatio = wsBoxWidth / wsBoxHeight;
let scale = ratio / wRatio;
if (scale > 1) {
- wHeight /= scale;
- wWidth = wHeight * ratio;
+ wsBoxHeight /= scale;
+ wsBoxWidth = wsBoxHeight * ratio;
} else {
- wWidth *= scale;
- wHeight = wWidth / ratio;
+ wsBoxWidth *= scale;
+ wsBoxHeight = wsBoxWidth / ratio;
}
- // height decides the actual size, ratio is given by the workarea
- wHeight *= opt.WS_PREVIEW_SCALE;
- wWidth *= opt.WS_PREVIEW_SCALE;
+ // height decides the actual size, ratio is given by the workArea
+ wsBoxHeight = Math.round(wsBoxHeight * opt.WS_PREVIEW_SCALE);
+ wsBoxWidth = Math.round(wsBoxWidth * opt.WS_PREVIEW_SCALE);
let xOffset = 0;
let yOffset = 0;
- const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + searchHeight;
- const yOffsetB = opt.DASH_BOTTOM ? dashHeight : 0;
- const yAvailableSpace = (height - yOffsetT - wHeight - yOffsetB) / 2;
- yOffset = yOffsetT + yAvailableSpace;
+ const yAvailableSpace = Math.round((height - topBoxOffset - wsBoxHeight - bottomBoxOffset) / 2);
+ yOffset = topBoxOffset + yAvailableSpace;
- const centeredBoxX = (width - wWidth) / 2;
-
- const xOffsetL = (opt.DASH_LEFT ? dashWidth : 0) + (opt.WS_TMB_LEFT ? thumbnailsWidth : 0) + 2 * spacing;
- const xOffsetR = (opt.DASH_RIGHT ? dashWidth : 0) + (opt.WS_TMB_RIGHT ? thumbnailsWidth : 0) + 2 * spacing;
+ const centeredBoxX = Math.round((width - wsBoxWidth) / 2);
this._xAlignCenter = false;
- if (centeredBoxX < Math.max(xOffsetL, xOffsetR)) {
- xOffset = xOffsetL + spacing + (width - xOffsetL - wWidth - xOffsetR - 2 * spacing) / 2;
+ if (centeredBoxX < centeredBoxOffset) {
+ xOffset = Math.round(leftBoxOffset + (width - leftBoxOffset - wsBoxWidth - rightBoxOffset) / 2);
} else {
xOffset = centeredBoxX;
this._xAlignCenter = true;
}
- const wsBoxX = /* startX + */xOffset;
+ wsBoxX = startX + xOffset;
wsBoxY = startY + yOffset;
- workspaceBox.set_origin(Math.round(wsBoxX), Math.round(wsBoxY));
- workspaceBox.set_size(Math.round(wWidth), Math.round(wHeight));
+ workspaceBox.set_origin(wsBoxX, wsBoxY);
+ workspaceBox.set_size(wsBoxWidth, wsBoxHeight);
}
}
return workspaceBox;
},
- _getAppDisplayBoxForState(state, box, workAreaBox, searchHeight, dashWidth, dashHeight, thumbnailsWidth, startY) {
- // in case the function is called from the DtD
- if (startY === undefined) {
- workAreaBox = box;
- }
- const [width] = box.get_size();
- const { x1: startX } = workAreaBox;
- // const { y1: startY } = workAreaBox;
- let height = workAreaBox.get_height();
+ _getAppDisplayBoxForState(state, box, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset) {
const appDisplayBox = new Clutter.ActorBox();
- const { spacing } = this;
- searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0;
-
- const xOffsetL = (opt.WS_TMB_LEFT ? thumbnailsWidth : 0) + (opt.DASH_LEFT ? dashWidth : 0);
- const xOffsetR = (opt.WS_TMB_RIGHT ? thumbnailsWidth : 0) + (opt.DASH_RIGHT ? dashWidth : 0);
- const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + (opt.SHOW_SEARCH_ENTRY ? searchHeight : 0);
- const yOffsetB = opt.DASH_BOTTOM ? dashHeight : 0;
- const adWidth = opt.CENTER_APP_GRID ? width - 2 * Math.max(xOffsetL, xOffsetR) - 2 * spacing : width - xOffsetL - xOffsetR - 2 * spacing;
- const adHeight = height - yOffsetT - yOffsetB;
-
- const appDisplayX = opt.CENTER_APP_GRID ? (width - adWidth) / 2 : xOffsetL + 2 * spacing;
- const appDisplayY = startY + yOffsetT;
+ const startX = this._workAreaBoxForVShellConfig.x1;
+ const startY = this._workAreaBoxForVShellConfig.y1;
+ let [width, height] = this._workAreaBoxForVShellConfig.get_size();
+ const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset);
+
+ const adWidth = opt.CENTER_APP_GRID
+ ? width - 2 * centeredBoxOffset
+ : width - leftBoxOffset - rightBoxOffset;
+ const adHeight = height - topBoxOffset - bottomBoxOffset;
+
+ const appDisplayX = startX +
+ (opt.CENTER_APP_GRID
+ ? Math.round((width - adWidth) / 2)
+ : leftBoxOffset
+ );
+ const appDisplayY = startY + topBoxOffset;
switch (state) {
case ControlsState.HIDDEN:
@@ -1055,71 +1141,64 @@ const ControlsManagerLayoutVertical = {
// 1 - left, 2 - right, 3 - bottom, 5 - top
switch (opt.APP_GRID_ANIMATION) {
case 0:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY));
+ appDisplayBox.set_origin(appDisplayX, appDisplayY);
break;
case 1:
- appDisplayBox.set_origin(Math.round(startX + width), Math.round(appDisplayY));
+ appDisplayBox.set_origin(startX + width, appDisplayY);
break;
case 2:
- appDisplayBox.set_origin(Math.round(startX - adWidth), Math.round(appDisplayY));
+ appDisplayBox.set_origin(box.x1 - adWidth, appDisplayY);
break;
case 3:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y2));
+ appDisplayBox.set_origin(appDisplayX, box.y2);
break;
case 5:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y1 - adHeight));
+ appDisplayBox.set_origin(appDisplayX, box.y1 - adHeight);
break;
}
break;
case ControlsState.APP_GRID:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY));
+ appDisplayBox.set_origin(appDisplayX, appDisplayY);
break;
}
- appDisplayBox.set_size(Math.round(adWidth), Math.round(adHeight));
+ appDisplayBox.set_size(adWidth, adHeight);
return appDisplayBox;
},
vfunc_allocate(container, box) {
const childBox = new Clutter.ActorBox();
+ const startX = this._workAreaBoxForVShellConfig.x1;
+ const startY = this._workAreaBoxForVShellConfig.y1;
+ let [width, height] = this._workAreaBoxForVShellConfig.get_size();
+
const transitionParams = this._stateAdjustment.getStateTransitionParams();
- const { spacing } = this;
- const halfSpacing = spacing / 2;
- const monitor = Main.layoutManager.findMonitorForActor(this._container);
- const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index);
- const startX = workArea.x - monitor.x;
- // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering
- // therefore we need to add panel height to startY
- let startY = workArea.y - monitor.y + opt.START_Y_OFFSET;
- const workAreaBox = new Clutter.ActorBox();
- workAreaBox.set_origin(startX, startY);
- workAreaBox.set_size(workArea.width, workArea.height);
- box.y1 += startY;
- box.x1 += startX;
- let [width, height] = box.get_size();
- // if panel is at bottom position,
- // compensate the height of the available box (the box size is calculated for top panel)
- height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height;
- let availableHeight = height;
+ const spacing = opt.SPACING;
// Dash
- const maxDashHeight = box.get_height() * DASH_MAX_SIZE_RATIO;
- const maxDashWidth = maxDashHeight * 0.8;
+ const maxDashHeight = Math.round(box.get_height() * DASH_MAX_SIZE_RATIO);
+ const maxDashWidth = Math.round(maxDashHeight * 0.8);
let dashHeight = 0;
let dashWidth = 0;
// dash cloud be overridden by the Dash to Dock clone
- const dash = Main.overview.dash;
if (Me.Util.dashIsDashToDock()) {
- // if Dash to Dock replaced the default dash and its inteli-hide is disabled we need to compensate for affected startY
- if (!Main.overview.dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) {
- if (Main.panel.y === monitor.y)
- startY = Main.panel.height + spacing;
+ this._updatePositionFromDashToDock();
+ // If DtD affects workArea, dash size needs to be 0 + spacing
+ const dash = Main.overview.dash;
+ if (this._dashToDockAffectsWorkArea()) {
+ if (opt.DASH_VERTICAL)
+ dashWidth = spacing;
+ else
+ dashHeight = spacing;
+ } else {
+ dashHeight = dash.height;
+ dashWidth = dash.width;
+ if (opt.DASH_VERTICAL)
+ dashWidth += spacing;
+ else
+ dashHeight += spacing;
}
- dashHeight = dash.height;
- dashWidth = dash.width;
- opt.DASH_VERTICAL = [1, 3].includes(dash._position);
- this._dash.allocate(childBox);
} else if (this._dash.visible) {
// default dock
if (opt.DASH_VERTICAL) {
@@ -1141,40 +1220,42 @@ const ControlsManagerLayoutVertical = {
let wsTmbWidth = 0;
let wsTmbHeight = 0;
- let maxWsTmbScale = opt.MAX_THUMBNAIL_SCALE;
if (opt.SHOW_WS_TMB) {
- const dashHeightReservation = !opt.WS_TMB_FULL && !opt.DASH_VERTICAL ? dashHeight : 0;
-
const searchActive = this._searchController.searchActive;
- if (!opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive) {
+ let maxWsTmbScale = this._dash.showAppsButton.checked && !(searchActive && !opt.SEARCH_APP_GRID_MODE)
+ ? opt.MAX_THUMBNAIL_SCALE_APPGRID
+ : opt.MAX_THUMBNAIL_SCALE;
+ if (transitionParams.currentState % 1 && !opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive && !opt.LEAVING_SEARCH) {
const initState = transitionParams.initialState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE;
const finalState = transitionParams.finalState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE;
maxWsTmbScale = Util.lerp(initState, finalState, transitionParams.progress);
}
+ wsTmbWidth = Math.round(width * maxWsTmbScale);
- wsTmbWidth = width * maxWsTmbScale;
let totalTmbSpacing;
[totalTmbSpacing, wsTmbHeight] = this._workspacesThumbnails.get_preferred_height(wsTmbWidth);
wsTmbHeight += totalTmbSpacing;
- const wsTmbHeightMax = opt.WS_TMB_FULL
- ? height - spacing
- : height - dashHeightReservation - 2 * spacing;
+ const wstTopOffset = !opt.WS_TMB_FULL && opt.DASH_TOP ? dashHeight : spacing;
+ const wstBottomOffset = !opt.WS_TMB_FULL && opt.DASH_BOTTOM ? dashHeight : spacing;
+ const wstLeftOffset = opt.DASH_LEFT ? dashWidth : spacing;
+ const wstRightOffset = opt.DASH_RIGHT ? dashWidth : spacing;
+
+ const wsTmbHeightMax = height - wstTopOffset - wstBottomOffset;
+ // Reduce size to fit wsTmb to the screen
if (wsTmbHeight > wsTmbHeightMax) {
wsTmbHeight = wsTmbHeightMax;
- wsTmbWidth = Math.round(this._workspacesThumbnails.get_preferred_width(wsTmbHeight)[1]);
+ wsTmbWidth = this._workspacesThumbnails.get_preferred_width(wsTmbHeight)[1];
}
- let wsTmbX;
- if (opt.WS_TMB_RIGHT)
- wsTmbX = Math.round(startX + width - (opt.DASH_RIGHT ? dashWidth : 0) - wsTmbWidth /* - halfSpacing*/); // this halfSpacing is a part od dash style
- else
- wsTmbX = Math.round(opt.DASH_LEFT ? dashWidth : 0/* + halfSpacing*/); // this halfSpacing is a part od dash style
+ let wsTmbX = opt.WS_TMB_LEFT
+ ? startX + wstLeftOffset
+ : startX + width - wstRightOffset - wsTmbWidth;
- let wstOffset = (height - wsTmbHeight - (opt.DASH_VERTICAL ? 0 : dashHeightReservation)) / 2;
- wstOffset -= opt.WS_TMB_POSITION_ADJUSTMENT * (wstOffset - halfSpacing);
- let wsTmbY = Math.round(startY + (dashHeightReservation && opt.DASH_TOP ? dashHeight : 0) + wstOffset);
+ let offset = (height - wstTopOffset - wsTmbHeight - wstBottomOffset) / 2;
+ offset = Math.round(offset - (opt.WS_TMB_POSITION_ADJUSTMENT * offset));
+ const wsTmbY = startY + wstTopOffset + offset;
childBox.set_origin(wsTmbX, wsTmbY);
childBox.set_size(Math.max(wsTmbWidth, 1), Math.max(wsTmbHeight, 1));
@@ -1192,50 +1273,72 @@ const ControlsManagerLayoutVertical = {
dashWidth = Math.min(dashWidth, wMaxWidth);
}
- let dashX, dashY, offset;
- if (opt.DASH_RIGHT)
- dashX = width - dashWidth;
- else if (opt.DASH_LEFT)
- dashX = 0;
-
- else if (opt.DASH_TOP)
- dashY = startY;
- else
- dashY = startY + height - dashHeight;
+ let dashX = opt.DASH_RIGHT ? width - dashWidth : 0;
+ let dashY = opt.DASH_TOP ? startY : startY + height - dashHeight;
if (!opt.DASH_VERTICAL) {
- offset = (width - ((opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && !this._xAlignCenter ? wsTmbWidth : 0) - dashWidth) / 2;
- offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing);
- dashX = offset;
-
- if ((opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && !this._xAlignCenter) {
- if (!opt.WS_TMB_RIGHT) {
- dashX = (wsTmbWidth ? wsTmbWidth : 0) + offset;
- dashX = Math.max(dashX, wsTmbWidth ? wsTmbWidth + spacing : 0);
- dashX = Math.min(dashX, width - dashWidth - spacing);
- }
- }
- if (opt.WS_TMB_FULL && !opt.CENTER_DASH_WS) {
- dashX = opt.WS_TMB_RIGHT
- ? Math.min(width - wsTmbWidth - dashWidth, dashX + wsTmbWidth / 2 * (1 - Math.abs(opt.DASH_POSITION_ADJUSTMENT)))
- : Math.max(wsTmbWidth, dashX - wsTmbWidth / 2 * (1 - Math.abs(opt.DASH_POSITION_ADJUSTMENT)));
- }
+ const dashLeftOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_LEFT ? wsTmbWidth + spacing : 0;
+ const dashRightOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_RIGHT ? wsTmbWidth + spacing : 0;
+ let offset = (width - dashWidth - (opt.CENTER_DASH_WS && !this._xAlignCenter ? dashLeftOffset + dashRightOffset : 0)) / 2;
+ offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - spacing);
+ dashX = startX + (opt.CENTER_DASH_WS ? dashLeftOffset : 0) + offset;
+ if (opt.WS_TMB_FULL) // Limit the adjustment while keeping the center of adjustment on the screen center
+ dashX = Math.clamp(startX + dashLeftOffset + spacing, dashX, startX + width - dashRightOffset - spacing - dashWidth);
} else {
- offset = (height - dashHeight) / 2;
- dashY = startY + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing));
+ const offset = (height - dashHeight) / 2;
+ dashY = startY + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - spacing));
}
+ dashY = Math.round(dashY);
- childBox.set_origin(Math.round(startX + dashX), Math.round(dashY));
- childBox.set_size(Math.round(dashWidth), Math.round(dashHeight));
+ childBox.set_origin(startX + dashX, dashY);
+ childBox.set_size(dashWidth, dashHeight);
this._dash.allocate(childBox);
}
- availableHeight -= opt.DASH_VERTICAL ? 0 : dashHeight + spacing;
+ // View box offsets
+ const leftBoxOffset = (opt.DASH_LEFT ? dashWidth : spacing) + (opt.WS_TMB_LEFT ? wsTmbWidth + spacing : 0);
+ const rightBoxOffset = (opt.DASH_RIGHT ? dashWidth : spacing) + (opt.WS_TMB_RIGHT ? wsTmbWidth + spacing : 0);
+ let topBoxOffset = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0);
+ const bottomBoxOffset = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0);
+ const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset);
+
+ // App grid needs to be calculated for the max wsTmbWidth in app grid, independently on the current wsTmb scale
+ const wsTmbWidthAppGrid = Math.round(width * opt.MAX_THUMBNAIL_SCALE_APPGRID);
+ const leftBoxOffsetAppGrid = (opt.DASH_LEFT ? dashWidth : spacing) + (opt.WS_TMB_LEFT ? wsTmbWidthAppGrid + spacing : 0);
+ const rightBoxOffsetAppGrid = (opt.DASH_RIGHT ? dashWidth : spacing) + (opt.WS_TMB_RIGHT ? wsTmbWidthAppGrid + spacing : 0);
+
+ // searchEntry
+ const [searchEntryHeight] = this._searchEntry.get_preferred_height(width - wsTmbWidth);
+ const searchEntryY = startY + topBoxOffset;
- let [searchHeight] = this._searchEntry.get_preferred_height(width - wsTmbWidth);
+ const searchX = startX +
+ (opt.CENTER_SEARCH_VIEW || this._xAlignCenter
+ ? centeredBoxOffset
+ : leftBoxOffset); // xAlignCenter is set by wsBox
- // Workspaces
- let params = [box, workAreaBox, dashWidth, dashHeight, wsTmbWidth, wsTmbHeight, searchHeight, startY];
+ const searchWidth =
+ width - (opt.CENTER_SEARCH_VIEW || this._xAlignCenter
+ ? 2 * centeredBoxOffset
+ : leftBoxOffset + rightBoxOffset);
+
+ childBox.set_origin(searchX, searchEntryY);
+ childBox.set_size(searchWidth, searchEntryHeight);
+
+ this._searchEntry.allocate(childBox);
+
+ // searchResults
+ const searchY = startY + topBoxOffset + searchEntryHeight + spacing;
+ const searchHeight = height - topBoxOffset - bottomBoxOffset - searchEntryHeight - 2 * spacing;
+
+ childBox.set_origin(searchX, searchY);
+ childBox.set_size(searchWidth, searchHeight);
+ this._searchController.allocate(childBox);
+
+ // Add searchEntry height if needed
+ topBoxOffset += opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0;
+
+ // workspace
+ let params = [box, wsTmbWidth, wsTmbHeight, leftBoxOffset, rightBoxOffset, topBoxOffset, bottomBoxOffset, centeredBoxOffset];
// Update cached boxes
for (const state of Object.values(ControlsState)) {
@@ -1255,38 +1358,14 @@ const ControlsManagerLayoutVertical = {
this._workspacesDisplay.allocate(workspacesBox);
- // Search entry
- const searchXoffset = (opt.DASH_LEFT ? dashWidth : 0) + spacing + (opt.WS_TMB_RIGHT ? 0 : wsTmbWidth + spacing);
-
- // Y position under top Dash
- let searchEntryX, searchEntryY;
- if (opt.DASH_TOP)
- searchEntryY = startY + dashHeight;
- else
- searchEntryY = startY;
-
- searchEntryX = searchXoffset;
- let searchWidth = width - 2 * spacing - wsTmbWidth - (opt.DASH_VERTICAL ? dashWidth : 0); // xAlignCenter is given by wsBox
- searchWidth = this._xAlignCenter ? width - 2 * (wsTmbWidth + spacing) : searchWidth;
-
- if (opt.CENTER_SEARCH_VIEW) {
- childBox.set_origin(0, Math.round(searchEntryY));
- childBox.set_size(Math.round(width), Math.round(searchHeight));
- } else {
- childBox.set_origin(Math.round(this._xAlignCenter ? 0 : searchEntryX), Math.round(searchEntryY));
- childBox.set_size(Math.round(this._xAlignCenter ? width : searchWidth - spacing), Math.round(searchHeight));
- }
-
- this._searchEntry.allocate(childBox);
-
- availableHeight -= searchHeight + spacing;
-
- // if (this._appDisplay.visible)... ? Can cause problems
- // Calculate appDisplay always for AppGrid state WsTmb scale
- let wsTmbWidthAppGrid = opt.MAX_THUMBNAIL_SCALE_APPGRID > 0
- ? wsTmbWidth / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE_APPGRID
- : wsTmbWidth / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE;
- params = [box, workAreaBox, searchHeight, dashWidth, dashHeight, wsTmbWidthAppGrid, startY]; // send startY, can be corrected
+ // appDisplay
+ params = [
+ box,
+ leftBoxOffsetAppGrid,
+ rightBoxOffsetAppGrid,
+ topBoxOffset,
+ bottomBoxOffset,
+ ];
let appDisplayBox;
if (!transitionParams.transitioning) {
appDisplayBox =
@@ -1301,238 +1380,48 @@ const ControlsManagerLayoutVertical = {
}
this._appDisplay.allocate(appDisplayBox);
- // Search
- if (opt.CENTER_SEARCH_VIEW) {
- const dashW = (opt.DASH_VERTICAL ? dashWidth : 0) + spacing;
- searchWidth = width - 2 * wsTmbWidth - 2 * dashW;
- childBox.set_origin(Math.round(wsTmbWidth + dashW), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + searchHeight));
- } else {
- childBox.set_origin(Math.round(this._xAlignCenter ? wsTmbWidth + spacing : searchXoffset), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + searchHeight));
- }
-
- childBox.set_size(Math.round(searchWidth), Math.round(availableHeight));
- this._searchController.allocate(childBox);
-
this._runPostAllocation();
},
};
const ControlsManagerLayoutHorizontal = {
- _computeWorkspacesBoxForState(state, box, workAreaBox, dashWidth, dashHeight, thumbnailWidth, thumbnailsHeight, searchHeight, startY) {
- // in case the function is called from the DtD
- if (startY === undefined) {
- workAreaBox = box;
- }
- const workspaceBox = box.copy();
- let [width, height] = workspaceBox.get_size();
- const { spacing } = this;
-
- const dash = Main.overview.dash;
- // including Dash to Dock and clones properties for compatibility
- if (Me.Util.dashIsDashToDock()) {
- // Dash to Dock always affects workAreaBox
- Main.layoutManager._trackedActors.forEach(actor => {
- if (actor.affectsStruts && actor.actor.width === dash.width) {
- if (dash._isHorizontal) {
- // disabled inteli-hide don't need compensation
- // startY needs to be corrected in allocate()
- if (dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled)
- height += dash.height;
- else if (opt.DASH_TOP)
- height += dash.height;
- } else {
- width += dash.width;
- }
- }
- });
- }
-
- let wWidth, wHeight, wsBoxY, wsBoxX;
-
- switch (state) {
- case ControlsState.HIDDEN:
- // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering
- // therefore we added panel height to startY for the overview allocation,
- // but here we need to remove the correction since the panel will be in the hidden state
- if (opt.START_Y_OFFSET) {
- let [x, y] = workAreaBox.get_origin();
- y -= opt.START_Y_OFFSET;
- workspaceBox.set_origin(x, y);
- } else {
- workspaceBox.set_origin(...workAreaBox.get_origin());
- }
- workspaceBox.set_size(...workAreaBox.get_size());
- break;
- case ControlsState.WINDOW_PICKER:
- case ControlsState.APP_GRID:
- if (opt.WS_ANIMATION && opt.SHOW_WS_TMB && state === ControlsState.APP_GRID) {
- workspaceBox.set_origin(...this._workspacesThumbnails.get_position());
- workspaceBox.set_size(thumbnailWidth, thumbnailsHeight);
- } else if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE) {
- if (opt.START_Y_OFFSET) {
- let [x, y] = workAreaBox.get_origin();
- y -= opt.START_Y_OFFSET;
- workspaceBox.set_origin(x, y);
- } else {
- workspaceBox.set_origin(...workAreaBox.get_origin());
- }
- workspaceBox.set_size(...workAreaBox.get_size());
- } else {
- // if PANEL_OVERVIEW_ONLY, panel doesn't affect workArea height (affectStruts === false), it is necessary to compensate
- height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height;
- searchHeight = opt.SHOW_SEARCH_ENTRY ? searchHeight : 0;
- wWidth = width -
- spacing -
- (opt.DASH_VERTICAL ? dashWidth : 0) -
- 4 * spacing;
- wHeight = height -
- (opt.DASH_VERTICAL ? spacing : dashHeight) -
- thumbnailsHeight -
- searchHeight -
- 4 * spacing;
-
- const ratio = width / height;
- let wRatio = wWidth / wHeight;
- let scale = ratio / wRatio;
-
- if (scale > 1) {
- wHeight /= scale;
- wWidth = wHeight * ratio;
- } else {
- wWidth *= scale;
- wHeight = wWidth / ratio;
- }
-
- // height decides the actual size, ratio is given by the workarea
- wHeight *= opt.WS_PREVIEW_SCALE;
- wWidth *= opt.WS_PREVIEW_SCALE;
-
- let xOffset = 0;
- let yOffset = 0;
-
- const yOffsetT = (opt.DASH_TOP ? dashHeight : 0) + (opt.WS_TMB_TOP ? thumbnailsHeight : 0) + searchHeight;
- const yOffsetB = (opt.DASH_BOTTOM ? dashHeight : 0) + (opt.WS_TMB_BOTTOM ? thumbnailsHeight : 0);
-
- const yAvailableSpace = (height - yOffsetT - wHeight - yOffsetB) / 2;
- yOffset = yOffsetT + yAvailableSpace;
+ _computeWorkspacesBoxForState: ControlsManagerLayoutVertical._computeWorkspacesBoxForState,
- const xOffsetL = (opt.DASH_LEFT ? dashWidth : 0) + spacing;
- const xOffsetR = (opt.DASH_RIGHT ? dashWidth : 0) + spacing;
- const centeredBoxX = (width - wWidth) / 2;
-
- this._xAlignCenter = false;
- if (centeredBoxX < Math.max(xOffsetL, xOffsetR)) {
- xOffset = xOffsetL + spacing + (width - xOffsetL - wWidth - xOffsetR) / 2;
- } else {
- xOffset = centeredBoxX;
- this._xAlignCenter = true;
- }
-
- wsBoxX = /* startX + */xOffset;
- wsBoxY = startY + yOffset;
- workspaceBox.set_origin(Math.round(wsBoxX), Math.round(wsBoxY));
- workspaceBox.set_size(Math.round(wWidth), Math.round(wHeight));
- }
- }
-
- return workspaceBox;
- },
-
- _getAppDisplayBoxForState(state, box, workAreaBox, searchHeight, dashWidth, dashHeight, thumbnailsHeight, startY) {
- // in case the function is called from the DtD
- if (startY === undefined) {
- workAreaBox = box;
- }
- const [width] = box.get_size();
- const { x1: startX } = workAreaBox;
- // const { y1: startY } = workAreaBox;
- let height = workAreaBox.get_height();
- const appDisplayBox = new Clutter.ActorBox();
- const { spacing } = this;
-
- const yOffsetT = (opt.WS_TMB_TOP ? thumbnailsHeight + spacing : 0) + (opt.DASH_TOP ? dashHeight : 0) + (opt.SHOW_SEARCH_ENTRY ? searchHeight : 0);
- const yOffsetB = (opt.WS_TMB_BOTTOM ? thumbnailsHeight + spacing : 0) + (opt.DASH_BOTTOM ? dashHeight : 0);
- const xOffsetL = opt.DASH_LEFT ? dashWidth : 0;
- const xOffsetR = opt.DASH_RIGHT ? dashWidth : 0;
- const hSpacing = xOffsetL + xOffsetR ? spacing : 0;
- const adWidth = opt.CENTER_APP_GRID ? width - 2 * Math.max(xOffsetL, xOffsetR) - 2 * hSpacing : width - xOffsetL - xOffsetR - 2 * hSpacing;
- const adHeight = height - yOffsetT - yOffsetB;
-
- const appDisplayX = opt.CENTER_APP_GRID ? (width - adWidth) / 2 : xOffsetL + hSpacing;
- const appDisplayY = startY + yOffsetT;
-
- switch (state) {
- case ControlsState.HIDDEN:
- case ControlsState.WINDOW_PICKER:
- // 1 - left, 2 - right, 3 - bottom, 5 - top
- switch (opt.APP_GRID_ANIMATION) {
- case 0:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY));
- break;
- case 1:
- appDisplayBox.set_origin(Math.round(startX + width), Math.round(appDisplayY));
- break;
- case 2:
- appDisplayBox.set_origin(Math.round(startX - adWidth), Math.round(appDisplayY));
- break;
- case 3:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y2));
- break;
- case 5:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(workAreaBox.y1 - adHeight));
- break;
- }
- break;
- case ControlsState.APP_GRID:
- appDisplayBox.set_origin(Math.round(appDisplayX), Math.round(appDisplayY));
- break;
- }
-
- appDisplayBox.set_size(Math.round(adWidth), Math.round(adHeight));
- return appDisplayBox;
- },
+ _getAppDisplayBoxForState: ControlsManagerLayoutVertical._getAppDisplayBoxForState,
vfunc_allocate(container, box) {
- const transitionParams = this._stateAdjustment.getStateTransitionParams();
const childBox = new Clutter.ActorBox();
- const { spacing } = this;
- const halfSpacing = spacing / 2;
- const monitor = Main.layoutManager.findMonitorForActor(this._container);
- const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index);
- const startX = workArea.x - monitor.x;
- // if PANEL_OVERVIEW_ONLY, the affectStruts property is set to false to avoid stuttering
- // therefore we need to add panel height to startY
- let startY = workArea.y - monitor.y + opt.START_Y_OFFSET;
- const workAreaBox = new Clutter.ActorBox();
- workAreaBox.set_origin(startX, startY);
- workAreaBox.set_size(workArea.width, workArea.height);
- box.y1 += startY;
- box.x1 += startX;
- let [width, height] = box.get_size();
- // if panel is at bottom position,
- // compensate for the height of the available box (the box size is calculated for top panel)
- height = opt.PANEL_POSITION_TOP ? height : height - Main.panel.height;
- let availableHeight = height;
+ const startX = this._workAreaBoxForVShellConfig.x1;
+ const startY = this._workAreaBoxForVShellConfig.y1;
+ let [width, height] = this._workAreaBoxForVShellConfig.get_size();
+
+ const transitionParams = this._stateAdjustment.getStateTransitionParams();
+ const spacing = opt.SPACING;
// Dash
- const maxDashHeight = box.get_height() * DASH_MAX_SIZE_RATIO;
- const maxDashWidth = maxDashHeight * 0.8;
+ const maxDashHeight = Math.round(box.get_height() * DASH_MAX_SIZE_RATIO);
+ const maxDashWidth = Math.round(maxDashHeight * 0.8);
let dashHeight = 0;
let dashWidth = 0;
// dash cloud be overridden by the Dash to Dock clone
- const dash = Main.overview.dash;
if (Me.Util.dashIsDashToDock()) {
- // if Dash to Dock replaced the default dash and its inteli-hide is disabled we need to compensate for affected startY
- if (!Main.overview.dash.get_parent()?.get_parent()?.get_parent()?._intellihideIsEnabled) {
- // if (Main.panel.y === monitor.y)
- // startY = Main.panel.height + spacing;
+ this._updatePositionFromDashToDock();
+ // If DtD affects workArea, dash size needs to be 0
+ const dash = Main.overview.dash;
+ if (this._dashToDockAffectsWorkArea()) {
+ if (opt.DASH_VERTICAL)
+ dashWidth = spacing;
+ else
+ dashHeight = spacing;
+ } else {
+ dashHeight = dash.height;
+ dashWidth = dash.width;
+ if (opt.DASH_VERTICAL)
+ dashWidth += spacing;
+ else
+ dashHeight += spacing;
}
- dashHeight = dash.height;
- dashWidth = dash.width;
- opt.DASH_TOP = dash._position === 0;
- opt.DASH_VERTICAL = [1, 3].includes(dash._position);
- this._dash.allocate(childBox);
} else if (this._dash.visible) {
// default dock
if (!opt.DASH_VERTICAL) {
@@ -1550,53 +1439,52 @@ const ControlsManagerLayoutHorizontal = {
}
}
- let [searchHeight] = this._searchEntry.get_preferred_height(width);
+ const [searchEntryHeight] = this._searchEntry.get_preferred_height(width);
// Workspace Thumbnails
let wsTmbWidth = 0;
let wsTmbHeight = 0;
- let maxWsTmbScale = opt.MAX_THUMBNAIL_SCALE;
if (opt.SHOW_WS_TMB) {
- const dashWidthReservation = !opt.WS_TMB_FULL && opt.DASH_VERTICAL ? dashWidth : 0;
-
const searchActive = this._searchController.searchActive;
- if (!opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive) {
+ let maxWsTmbScale = this._dash.showAppsButton.checked && !(searchActive && !opt.SEARCH_APP_GRID_MODE)
+ ? opt.MAX_THUMBNAIL_SCALE_APPGRID
+ : opt.MAX_THUMBNAIL_SCALE;
+ if (transitionParams.currentState % 1 && !opt.MAX_THUMBNAIL_SCALE_STABLE && !searchActive && !opt.LEAVING_SEARCH) {
const initState = transitionParams.initialState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE;
const finalState = transitionParams.finalState === ControlsState.APP_GRID ? opt.MAX_THUMBNAIL_SCALE_APPGRID : opt.MAX_THUMBNAIL_SCALE;
maxWsTmbScale = Util.lerp(initState, finalState, transitionParams.progress);
}
wsTmbHeight = Math.round(height * maxWsTmbScale);
+
let totalTmbSpacing;
[totalTmbSpacing, wsTmbWidth] = this._workspacesThumbnails.get_preferred_width(wsTmbHeight);
wsTmbWidth += totalTmbSpacing;
- const wsTmbWidthMax = opt.WS_TMB_FULL
- ? width - spacing
- : width - dashWidthReservation - 2 * spacing;
+ const wstLeftOffset = !opt.WS_TMB_FULL && opt.DASH_LEFT ? dashWidth : spacing;
+ const wstRightOffset = !opt.WS_TMB_FULL && opt.DASH_RIGHT ? dashWidth : spacing;
+ const wstTopOffset = opt.DASH_TOP ? dashHeight : spacing;
+ const wstBottomOffset = opt.DASH_BOTTOM ? dashHeight : spacing;
+ const wsTmbWidthMax = width - wstLeftOffset - wstRightOffset;
+ // Reduce size to fit wsTmb to the screen
if (wsTmbWidth > wsTmbWidthMax) {
wsTmbWidth = wsTmbWidthMax;
- wsTmbHeight = Math.round(this._workspacesThumbnails.get_preferred_height(wsTmbWidth)[1]);
+ wsTmbHeight = this._workspacesThumbnails.get_preferred_height(wsTmbWidth)[1];
}
- let wsTmbY;
- if (opt.WS_TMB_TOP)
- wsTmbY = Math.round(startY + (opt.DASH_TOP ? dashHeight : halfSpacing));
- else
- wsTmbY = Math.round(startY + height - (opt.DASH_BOTTOM ? dashHeight : halfSpacing) - wsTmbHeight);
+ let wsTmbY = opt.WS_TMB_TOP
+ ? startY + wstTopOffset
+ : startY + height - wstBottomOffset - wsTmbHeight;
- let wstOffset = (width - wsTmbWidth - dashWidthReservation) / 2;
- wstOffset -= opt.WS_TMB_POSITION_ADJUSTMENT * wstOffset;
- let wsTmbX = Math.round(startX + (opt.DASH_LEFT ? dashWidthReservation : 0) + wstOffset);
+ let offset = (width - wstLeftOffset - wsTmbWidth - wstRightOffset) / 2;
+ offset = Math.round(offset - (opt.WS_TMB_POSITION_ADJUSTMENT * offset));
+ const wsTmbX = startX + wstLeftOffset + offset;
childBox.set_origin(wsTmbX, wsTmbY);
childBox.set_size(Math.max(wsTmbWidth, 1), Math.max(wsTmbHeight, 1));
-
this._workspacesThumbnails.allocate(childBox);
-
- availableHeight -= wsTmbHeight + spacing;
}
if (this._dash.visible) {
@@ -1609,45 +1497,80 @@ const ControlsManagerLayoutHorizontal = {
dashHeight = Math.min(dashHeight, wMaxHeight);
}
- let dashX, dashY, offset;
- if (opt.DASH_RIGHT)
- dashX = width - dashWidth;
- else if (opt.DASH_LEFT)
- dashX = 0;
- else if (opt.DASH_TOP)
- dashY = startY;
- else
- dashY = startY + height - dashHeight;
+ let dashX = opt.DASH_RIGHT ? width - dashWidth : 0;
+ let dashY = opt.DASH_TOP ? startY : startY + height - dashHeight;
if (opt.DASH_VERTICAL) {
- if (opt.WS_TMB_FULL) {
- offset = (height - dashHeight - wsTmbHeight) / 2;
- if (opt.WS_TMB_TOP) {
- offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing);
- dashY = startY + offset + wsTmbHeight;
- } else {
- offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing);
- dashY = startY + offset;
- }
- } else {
- offset = (height - dashHeight) / 2;
- offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing);
- dashY = startY + offset;
- }
+ const dashTopOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0;
+ const dashBottomOffset = (opt.WS_TMB_FULL || opt.CENTER_DASH_WS) && opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0;
+ let offset = (height - dashHeight - (opt.CENTER_DASH_WS ? dashTopOffset + dashBottomOffset : 0)) / 2;
+ offset -= opt.DASH_POSITION_ADJUSTMENT * (offset - spacing);
+ dashY = startY + (opt.CENTER_DASH_WS ? dashTopOffset : 0) + offset;
+ if (opt.WS_TMB_FULL) // Limit the adjustment while keeping the center of adjustment on the screen center
+ dashY = Math.clamp(startY + dashTopOffset + spacing, dashY, startY + height - dashBottomOffset - spacing - dashHeight);
} else {
- offset = (width - dashWidth) / 2;
- dashX = startX + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - halfSpacing));
+ const offset = (width - dashWidth) / 2;
+ dashX = startX + (offset - opt.DASH_POSITION_ADJUSTMENT * (offset - spacing));
}
+ dashX = Math.round(dashX);
- childBox.set_origin(Math.round(startX + dashX), Math.round(dashY));
- childBox.set_size(Math.round(dashWidth), Math.round(dashHeight));
+ childBox.set_origin(startX + dashX, dashY);
+ childBox.set_size(dashWidth, dashHeight);
this._dash.allocate(childBox);
}
- availableHeight -= opt.DASH_VERTICAL ? 0 : dashHeight;
+ // Main view offsets
+ const leftBoxOffset = opt.DASH_LEFT ? dashWidth : spacing;
+ const rightBoxOffset = opt.DASH_RIGHT ? dashWidth : spacing;
+ let topBoxOffset = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0);
+ const bottomBoxOffset = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeight + spacing : 0);
+ const centeredBoxOffset = Math.max(leftBoxOffset, rightBoxOffset);
+
+ // App grid needs to be calculated for the max wsTmbWidth in app grid, independently on the current wsTmb scale
+ const wsTmbHeightAppGrid = Math.round(height * opt.MAX_THUMBNAIL_SCALE_APPGRID);
+ const topBoxOffsetAppGrid = (opt.DASH_TOP ? dashHeight : spacing) + (opt.WS_TMB_TOP ? wsTmbHeightAppGrid + spacing : 0) + (opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0);
+ const bottomBoxOffsetAppGrid = (opt.DASH_BOTTOM ? dashHeight : spacing) + (opt.WS_TMB_BOTTOM ? wsTmbHeightAppGrid + spacing : 0);
+
+ // searchEntry
+ const searchEntryY = startY + topBoxOffset;
- // Workspaces
- let params = [box, workAreaBox, dashWidth, dashHeight, wsTmbWidth, wsTmbHeight, searchHeight, startY];
+ const searchX = startX +
+ (opt.CENTER_SEARCH_VIEW || this._xAlignCenter
+ ? centeredBoxOffset
+ : leftBoxOffset); // xAlignCenter is set by wsBox
+
+ const searchWidth =
+ width - (opt.CENTER_SEARCH_VIEW || this._xAlignCenter
+ ? 2 * centeredBoxOffset
+ : leftBoxOffset + rightBoxOffset);
+
+ childBox.set_origin(searchX, searchEntryY);
+ childBox.set_size(searchWidth, searchEntryHeight);
+
+ this._searchEntry.allocate(childBox);
+
+ // searchResults
+ const searchY = startY + topBoxOffset + searchEntryHeight + spacing;
+ const searchHeight = height - topBoxOffset - bottomBoxOffset - searchEntryHeight - 2 * spacing;
+
+ childBox.set_origin(searchX, searchY);
+ childBox.set_size(searchWidth, searchHeight);
+ this._searchController.allocate(childBox);
+
+ // Add searchEntry height if needed
+ topBoxOffset += opt.SHOW_SEARCH_ENTRY ? searchEntryHeight + spacing : 0;
+
+ // Workspace
+ let params = [
+ box,
+ wsTmbWidth,
+ wsTmbHeight,
+ leftBoxOffset,
+ rightBoxOffset,
+ topBoxOffset,
+ bottomBoxOffset,
+ centeredBoxOffset,
+ ];
// Update cached boxes
for (const state of Object.values(ControlsState)) {
@@ -1667,39 +1590,14 @@ const ControlsManagerLayoutHorizontal = {
this._workspacesDisplay.allocate(workspacesBox);
- // Search entry
- const searchXoffset = (opt.DASH_LEFT ? dashWidth : 0) + spacing;
-
- // Y position under top Dash
- let searchEntryX, searchEntryY;
- if (opt.DASH_TOP)
- searchEntryY = startY + (opt.WS_TMB_TOP ? wsTmbHeight : 0) + dashHeight;
- else
- searchEntryY = startY + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0);
-
-
- searchEntryX = searchXoffset;
- let searchWidth = width - 2 * spacing - (opt.DASH_VERTICAL ? dashWidth : 0); // xAlignCenter is given by wsBox
- searchWidth = this._xAlignCenter ? width : searchWidth;
-
- if (opt.CENTER_SEARCH_VIEW) {
- childBox.set_origin(0, Math.round(searchEntryY));
- childBox.set_size(width, Math.round(searchHeight));
- } else {
- childBox.set_origin(Math.round(this._xAlignCenter ? 0 : searchEntryX), Math.round(searchEntryY));
- childBox.set_size(Math.round(this._xAlignCenter ? width : searchWidth - spacing), Math.round(searchHeight));
- }
-
- this._searchEntry.allocate(childBox);
-
- availableHeight -= searchHeight + spacing;
-
- // if (this._appDisplay.visible)... ? Can cause problems
- // Calculate appDisplay always for AppGrid state WsTmb scale
- let wsTmbHeightAppGrid = opt.MAX_THUMBNAIL_SCALE_APPGRID > 0
- ? wsTmbHeight / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE_APPGRID
- : wsTmbHeight / maxWsTmbScale * opt.MAX_THUMBNAIL_SCALE;
- params = [box, workAreaBox, searchHeight, dashWidth, dashHeight, wsTmbHeightAppGrid, startY];
+ // appDisplay
+ params = [
+ box,
+ leftBoxOffset === spacing ? 0 : leftBoxOffset,
+ rightBoxOffset === spacing ? 0 : rightBoxOffset,
+ topBoxOffsetAppGrid,
+ bottomBoxOffsetAppGrid,
+ ];
let appDisplayBox;
if (!transitionParams.transitioning) {
appDisplayBox =
@@ -1714,18 +1612,6 @@ const ControlsManagerLayoutHorizontal = {
}
this._appDisplay.allocate(appDisplayBox);
- // Search
- if (opt.CENTER_SEARCH_VIEW) {
- const dashW = (opt.DASH_VERTICAL ? dashWidth : 0) + spacing;
- searchWidth = width - 2 * dashW;
- childBox.set_origin(Math.round(dashW), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0) + searchHeight));
- } else {
- childBox.set_origin(Math.round(this._xAlignCenter ? spacing : searchXoffset), Math.round(startY + (opt.DASH_TOP ? dashHeight + spacing : spacing) + (opt.WS_TMB_TOP ? wsTmbHeight + spacing : 0) + searchHeight));
- }
-
- childBox.set_size(Math.round(searchWidth), Math.round(availableHeight));
- this._searchController.allocate(childBox);
-
this._runPostAllocation();
},
};
@@ -1745,20 +1631,3 @@ function _getFitModeForState(state) {
return FitMode.SINGLE;
}
}
-
-const LayoutManager = {
- _startupAnimation() {
- if (Me.Util.dashIsDashToDock() && !Meta.is_restart()) {
- // DtD breaks overview on startup
- // Skip animation to hide the mess
- this._startupAnimationComplete();
- Main.overview._overview.controls._finishStartupSequence();
- } else if (Meta.is_restart()) {
- this._startupAnimationComplete();
- } else if (Main.sessionMode.isGreeter) {
- this._startupAnimationGreeter();
- } else {
- this._startupAnimationSession();
- }
- },
-};
diff --git a/extensions/45/vertical-workspaces/lib/panel.js b/extensions/47/vertical-workspaces/lib/panel.js
index a148612..ba6d01a 100644
--- a/extensions/45/vertical-workspaces/lib/panel.js
+++ b/extensions/47/vertical-workspaces/lib/panel.js
@@ -3,7 +3,7 @@
* panel.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -47,7 +47,9 @@ export const PanelModule = class {
if (conflict && !reset)
console.warn(`[${Me.metadata.name}] Warning: "Panel" module disabled due to potential conflict with another extension`);
- reset = reset || !this.moduleEnabled || conflict || Main.sessionMode.isLocked;
+ reset = reset || !this.moduleEnabled || conflict;
+
+ this.moduleEnabled = !reset;
// don't touch original code if module disabled
if (reset && !this._firstActivation) {
@@ -69,13 +71,13 @@ export const PanelModule = class {
this._setPanelPosition();
this._updateStyleChangedConnection();
- if (opt.PANEL_MODE === 0) {
+ if (!opt.PANEL_MODE) {
this._updateOverviewConnection(true);
this._reparentPanel(false);
panelBox.translation_y = 0;
Main.panel.opacity = 255;
this._setPanelStructs(true);
- } else if (opt.PANEL_MODE === 1) {
+ } else if (opt.PANEL_OVERVIEW_ONLY) {
if (opt.SHOW_WS_PREVIEW_BG) {
this._reparentPanel(true);
if (opt.OVERVIEW_MODE2) {
@@ -83,8 +85,6 @@ export const PanelModule = class {
Main.layoutManager.overviewGroup.set_child_above_sibling(panelBox, null);
this._updateOverviewConnection();
} else {
- // otherwise move the panel below overviewGroup so it can get below workspacesDisplay
- Main.layoutManager.overviewGroup.set_child_below_sibling(panelBox, Main.overview._overview);
this._updateOverviewConnection(true);
}
this._showPanel(true);
@@ -95,13 +95,13 @@ export const PanelModule = class {
this._updateOverviewConnection();
}
// _connectPanel();
- } else if (opt.PANEL_MODE === 2) {
+ } else if (opt.PANEL_DISABLED) {
this._updateOverviewConnection(true);
this._reparentPanel(false);
this._showPanel(false);
// _connectPanel();
}
- this._setPanelStructs(opt.PANEL_MODE === 0);
+ this._setPanelStructs(!opt.PANEL_MODE);
Main.layoutManager._updateHotCorners();
this._overrides.addOverride('ActivitiesButton', Main.panel.statusArea.activities, ActivitiesButton);
@@ -147,7 +147,7 @@ export const PanelModule = class {
}
} else if (!this._styleChangedConId) {
this._styleChangedConId = Main.panel.connect('style-changed', () => {
- if (opt.PANEL_MODE === 1 && !opt.OVERVIEW_MODE2)
+ if (opt.PANEL_OVERVIEW_ONLY && !opt.OVERVIEW_MODE2)
Main.panel.add_style_pseudo_class('overview');
else if (opt.OVERVIEW_MODE2)
Main.panel.remove_style_pseudo_class('overview');
@@ -185,10 +185,10 @@ export const PanelModule = class {
_reparentPanel(reparent = false) {
const panel = Main.layoutManager.panelBox;
- if (reparent && panel.get_parent() === Main.layoutManager.uiGroup) {
+ if (reparent && panel.get_parent() === Main.layoutManager.uiGroup && !Main.sessionMode.isLocked) {
Main.layoutManager.uiGroup.remove_child(panel);
Main.layoutManager.overviewGroup.add_child(panel);
- } else if (!reparent && panel.get_parent() === Main.layoutManager.overviewGroup) {
+ } else if ((!reparent || Main.sessionMode.isLocked) && panel.get_parent() === Main.layoutManager.overviewGroup) {
Main.layoutManager.overviewGroup.remove_child(panel);
// return the panel at default position, panel shouldn't cover objects that should be above
Main.layoutManager.uiGroup.insert_child_at_index(panel, 4);
@@ -217,17 +217,17 @@ export const PanelModule = class {
duration: ANIMATION_TIME,
translation_y: 0,
onComplete: () => {
- this._setPanelStructs(opt.PANEL_MODE === 0);
+ this._setPanelStructs(!opt.PANEL_MODE);
},
});
- } else {
+ } else if (!Main.layoutManager._startingUp) {
const panelHeight = Main.panel.height;
Main.layoutManager.panelBox.ease({
duration: ANIMATION_TIME,
translation_y: opt.PANEL_POSITION_TOP ? -panelHeight + 1 : panelHeight - 1,
onComplete: () => {
Main.panel.opacity = 0;
- this._setPanelStructs(opt.PANEL_MODE === 0);
+ this._setPanelStructs(!opt.PANEL_MODE);
},
});
}
diff --git a/extensions/45/vertical-workspaces/lib/recentFilesSearchProvider.js b/extensions/47/vertical-workspaces/lib/recentFilesSearchProvider.js
index 6dfec0a..f050cf9 100644
--- a/extensions/45/vertical-workspaces/lib/recentFilesSearchProvider.js
+++ b/extensions/47/vertical-workspaces/lib/recentFilesSearchProvider.js
@@ -3,7 +3,7 @@
* recentFilesSearchProvider.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*/
@@ -12,7 +12,6 @@
import GLib from 'gi://GLib';
import St from 'gi://St';
import Gio from 'gi://Gio';
-import Shell from 'gi://Shell';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
@@ -25,6 +24,7 @@ let _;
// so it needs to be something less common
// needs to be accessible from vw module
export const PREFIX = 'fq//';
+const ID = 'recent-files';
export const RecentFilesSearchProviderModule = class {
// export for other modules
@@ -68,8 +68,8 @@ export const RecentFilesSearchProviderModule = class {
2000,
() => {
if (!this._recentFilesSearchProvider) {
- this._recentFilesSearchProvider = new RecentFilesSearchProvider(opt);
- this._getOverviewSearchResult()._registerProvider(this._recentFilesSearchProvider);
+ this._recentFilesSearchProvider = new RecentFilesSearchProvider();
+ this._registerProvider(this._recentFilesSearchProvider);
}
this._enableTimeoutId = 0;
return GLib.SOURCE_REMOVE;
@@ -81,7 +81,7 @@ export const RecentFilesSearchProviderModule = class {
_disableModule() {
if (this._recentFilesSearchProvider) {
- this._getOverviewSearchResult()._unregisterProvider(this._recentFilesSearchProvider);
+ this._unregisterProvider(this._recentFilesSearchProvider);
this._recentFilesSearchProvider = null;
}
if (this._enableTimeoutId) {
@@ -92,32 +92,44 @@ export const RecentFilesSearchProviderModule = class {
console.debug(' RecentFilesSearchProviderModule - Disabled');
}
- _getOverviewSearchResult() {
- return Main.overview._overview.controls._searchController._searchResults;
+ _registerProvider(provider) {
+ const searchResults = Main.overview.searchController._searchResults;
+ provider.searchInProgress = false;
+
+ searchResults._providers.push(provider);
+
+ // create results display and add it to the _content
+ searchResults._ensureProviderDisplay.bind(searchResults)(provider);
+ }
+
+ _unregisterProvider(provider) {
+ const searchResults = Main.overview.searchController._searchResults;
+ searchResults._unregisterProvider(provider);
}
};
class RecentFilesSearchProvider {
constructor() {
- this.id = 'recent-files';
- const appSystem = Shell.AppSystem.get_default();
- let appInfo = appSystem.lookup_app('org.gnome.Nautilus.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = Gio.AppInfo.create_from_commandline('/usr/bin/nautilus -w', _('Recent Files'), null);
- appInfo.get_description = () => _('Search recent files');
- appInfo.get_name = () => _('Recent Files');
- appInfo.get_id = () => 'org.gnome.Nautilus.desktop';
- appInfo.get_icon = () => Gio.icon_new_for_string('document-open-recent-symbolic');
- appInfo.should_show = () => true;
-
- this.appInfo = appInfo;
+ this.id = ID;
+ const appId = 'org.gnome.Nautilus.desktop';
+
+ // A real appInfo created from a commandline has often issues with overriding get_id() method, so we use dict instead
+ this.appInfo = {
+ get_id: () => appId,
+ get_name: () => _('Recent Files'),
+ get_icon: () => Gio.icon_new_for_string('focus-windows-symbolic'),
+ should_show: () => true,
+ get_commandline: () => '/usr/bin/nautilus -w recent:///',
+ launch: () => {},
+ };
+
this.canLaunchSearch = true;
this.isRemoteProvider = false;
this._recentFilesManager = new RecentFilesManager();
}
- getInitialResultSet(terms/* , callback*/) {
+ getInitialResultSet(terms/* , cancellable*/) {
const rfm = this._recentFilesManager;
rfm.loadFromFile();
@@ -215,13 +227,9 @@ class RecentFilesSearchProvider {
return results.slice(0, 20);
}
- getSubsearchResultSet(previousResults, terms/* , callback*/) {
+ getSubsearchResultSet(previousResults, terms/* , cancellable*/) {
return this.getInitialResultSet(terms);
}
-
- getSubsearchResultSet42(terms, callback) {
- callback(this._getResultSet(terms));
- }
}
class RecentFilesManager {
diff --git a/extensions/45/vertical-workspaces/lib/search.js b/extensions/47/vertical-workspaces/lib/search.js
index e961893..47198a7 100644
--- a/extensions/45/vertical-workspaces/lib/search.js
+++ b/extensions/47/vertical-workspaces/lib/search.js
@@ -3,13 +3,14 @@
* search.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
'use strict';
+import GLib from 'gi://GLib';
import Clutter from 'gi://Clutter';
import St from 'gi://St';
import Shell from 'gi://Shell';
@@ -20,13 +21,14 @@ import * as Search from 'resource:///org/gnome/shell/ui/search.js';
import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js';
import * as SystemActions from 'resource:///org/gnome/shell/misc/systemActions.js';
+import { Highlighter } from 'resource:///org/gnome/shell/misc/util.js';
let Me;
// gettext
let _;
let opt;
-let SEARCH_MAX_WIDTH;
+const SEARCH_MAX_WIDTH = 1092;
export const SearchModule = class {
constructor(me) {
@@ -72,41 +74,50 @@ export const SearchModule = class {
this._overrides.addOverride('SearchResult', Search.SearchResult.prototype, SearchResult);
this._overrides.addOverride('SearchResultsView', Search.SearchResultsView.prototype, SearchResultsView);
this._overrides.addOverride('ListSearchResults', Search.ListSearchResults.prototype, ListSearchResults);
- // this._overrides.addOverride('ProviderInfo', Search.ProviderInfo.prototype, ProviderInfo);
+ this._overrides.addOverride('ListSearchResult', Search.ListSearchResult.prototype, ListSearchResultOverride);
+ this._overrides.addOverride('Highlighter', Highlighter.prototype, HighlighterOverride);
// Don't expand the search view vertically and align it to the top
// this is important in the static workspace mode when the search view bg is not transparent
// also the "Searching..." and "No Results" notifications will be closer to the search entry, with the distance given by margin-top in the stylesheet
- Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.START;
+ Main.overview.searchController.y_align = Clutter.ActorAlign.START;
+ // Increase the maxResults for app search so that it can show more results in case the user decreases the size of the result icon
+ const appSearchDisplay = Main.overview.searchController._searchResults._providers.filter(p => p.id === 'applications')[0]?.display;
+ if (appSearchDisplay)
+ appSearchDisplay._maxResults = 12;
console.debug(' SearchModule - Activated');
}
_disableModule() {
const reset = true;
+
+ const searchResults = Main.overview.searchController._searchResults;
+ if (searchResults?._searchTimeoutId) {
+ GLib.source_remove(searchResults._searchTimeoutId);
+ searchResults._searchTimeoutId = 0;
+ }
+
this._updateSearchViewWidth(reset);
if (this._overrides)
this._overrides.removeAll();
this._overrides = null;
- Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.FILL;
-
+ Main.overview.searchController.y_align = Clutter.ActorAlign.FILL;
console.debug(' WorkspaceSwitcherPopupModule - Disabled');
}
_updateSearchViewWidth(reset = false) {
- const searchContent = Main.overview._overview._controls.layoutManager._searchController._searchResults._content;
- if (!SEARCH_MAX_WIDTH) { // just store original value;
- const themeNode = searchContent.get_theme_node();
- const width = themeNode.get_max_width();
- SEARCH_MAX_WIDTH = width;
- }
+ const searchContent = Main.overview.searchController._searchResults._content;
if (reset) {
searchContent.set_style('');
} else {
- let width = Math.round(SEARCH_MAX_WIDTH * opt.SEARCH_VIEW_SCALE);
+ let width = SEARCH_MAX_WIDTH;
+ if (Me.Util.monitorHasLowResolution())
+ width = Math.round(width * 0.8);
+ width = Math.round(width * opt.SEARCH_VIEW_SCALE);
searchContent.set_style(`max-width: ${width}px;`);
}
}
@@ -160,8 +171,8 @@ const AppSearchProvider = {
let dispName = appInfo.get_display_name() || '';
let gName = appInfo.get_generic_name() || '';
let description = appInfo.get_description() || '';
- let categories = appInfo.get_string('Categories') || '';
- let keywords = appInfo.get_string('Keywords') || '';
+ let categories = appInfo.get_string('Categories')?.replace(/;/g, ' ') || '';
+ let keywords = appInfo.get_string('Keywords')?.replace(/;/g, ' ') || '';
name = `${dispName} ${id}`;
string = `${dispName} ${gName} ${baseName} ${description} ${categories} ${keywords} ${id}`;
}
@@ -191,34 +202,53 @@ const AppSearchProvider = {
let results = appInfoList.map(app => app.get_id());
+ if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked)
+ this._filterAppGrid(results);
+
results = results.concat(this._systemActions.getMatchingActions(terms));
return new Promise(resolve => resolve(results));
},
+ _filterAppGrid(results) {
+ const icons = Main.overview._overview.controls._appDisplay._orderedItems;
+ icons.forEach(icon => {
+ icon.visible = results.includes(icon.id);
+ });
+ },
+
// App search result size
createResultObject(resultMeta) {
+ let iconSize = opt.SEARCH_ICON_SIZE;
+ if (!iconSize) {
+ iconSize = Me.Util.monitorHasLowResolution()
+ ? 64
+ : 96;
+ }
+
if (resultMeta.id.endsWith('.desktop')) {
const icon = new AppDisplay.AppIcon(this._appSys.lookup_app(resultMeta['id']), {
expandTitleOnHover: false,
});
- icon.icon.setIconSize(opt.SEARCH_ICON_SIZE);
+ icon.icon.setIconSize(iconSize);
return icon;
} else {
+ this._iconSize = iconSize;
return new SystemActionIcon(this, resultMeta);
- // icon.icon._setSizeManually = true;
- // icon.icon.setIconSize(opt.SEARCH_ICON_SIZE);
- // return icon;
}
},
};
-const SystemActionIcon = GObject.registerClass(
-class SystemActionIcon extends Search.GridSearchResult {
+const SystemActionIcon = GObject.registerClass({
+ // Registered name should be unique
+ GTypeName: `SystemAction${Math.floor(Math.random() * 1000)}`,
+}, class SystemActionIcon extends Search.GridSearchResult {
_init(provider, metaInfo, resultsView) {
super._init(provider, metaInfo, resultsView);
+ if (!Clutter.Container)
+ this.add_style_class_name('grid-search-result-46');
this.icon._setSizeManually = true;
- this.icon.setIconSize(opt.SEARCH_ICON_SIZE);
+ this.icon.setIconSize(provider._iconSize);
}
activate() {
@@ -242,22 +272,63 @@ const SearchResult = {
};
const SearchResultsView = {
+ setTerms(terms) {
+ // Check for the case of making a duplicate previous search before
+ // setting state of the current search or cancelling the search.
+ // This will prevent incorrect state being as a result of a duplicate
+ // search while the previous search is still active.
+ let searchString = terms.join(' ');
+ let previousSearchString = this._terms.join(' ');
+ if (searchString === previousSearchString)
+ return;
+
+ this._startingSearch = true;
+
+ this._cancellable.cancel();
+ this._cancellable.reset();
+
+ if (terms.length === 0) {
+ this._reset();
+ return;
+ }
+
+ let isSubSearch = false;
+ if (this._terms.length > 0)
+ isSubSearch = searchString.indexOf(previousSearchString) === 0;
+
+ this._terms = terms;
+ this._isSubSearch = isSubSearch;
+ this._updateSearchProgress();
+
+ if (!this._searchTimeoutId)
+ this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, opt.SEARCH_DELAY, this._onSearchTimeout.bind(this));
+
+ this._highlighter = new Highlighter(this._terms);
+
+ this.emit('terms-changed');
+ },
+
_doSearch() {
this._startingSearch = false;
let previousResults = this._results;
this._results = {};
+ const term0 = this._terms[0];
+ const onlySupportedProviders = term0.startsWith(Me.WSP_PREFIX) || term0.startsWith(Me.ESP_PREFIX) || term0.startsWith(Me.RFSP_PREFIX);
+
this._providers.forEach(provider => {
- const onlyVShellProviders = this._terms.includes('wq//') || this._terms.includes('fq//');
- if (!onlyVShellProviders || (onlyVShellProviders && (provider.id.includes('open-windows') || provider.id.includes('recent-files')))) {
+ const supportedProvider = ['open-windows', 'extensions', 'recent-files'].includes(provider.id);
+ if (!onlySupportedProviders || (onlySupportedProviders && supportedProvider)) {
let previousProviderResults = previousResults[provider.id];
this._doProviderSearch(provider, previousProviderResults);
+ } else {
+ // hide unwanted providers, they will show() automatically when needed
+ provider.display.visible = false;
}
});
this._updateSearchProgress();
-
this._clearSearchTimeout();
},
@@ -277,15 +348,127 @@ const SearchResultsView = {
this._statusText.set_text(_('No results.'));
}
},
+
+ _highlightFirstVisibleAppGridIcon() {
+ const appDisplay = Main.overview._overview.controls._appDisplay;
+ // appDisplay.grab_key_focus();
+ for (const icon of appDisplay._orderedItems) {
+ if (icon.visible) {
+ appDisplay.selectApp(icon.id);
+ break;
+ }
+ }
+ },
+
+ _maybeSetInitialSelection() {
+ if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked) {
+ this._highlightFirstVisibleAppGridIcon();
+ return;
+ }
+
+ let newDefaultResult = null;
+
+ let providers = this._providers;
+ for (let i = 0; i < providers.length; i++) {
+ let provider = providers[i];
+ let display = provider.display;
+
+ if (!display.visible)
+ continue;
+
+ let firstResult = display.getFirstResult();
+ if (firstResult) {
+ newDefaultResult = firstResult;
+ break; // select this one!
+ }
+ }
+
+ if (newDefaultResult !== this._defaultResult) {
+ this._setSelected(this._defaultResult, false);
+ this._setSelected(newDefaultResult, this._highlightDefault);
+
+ this._defaultResult = newDefaultResult;
+ }
+ },
+
+ highlightDefault(highlight) {
+ if (opt.SEARCH_APP_GRID_MODE && Main.overview.dash.showAppsButton.checked) {
+ if (highlight)
+ this._highlightFirstVisibleAppGridIcon();
+ } else {
+ this._highlightDefault = highlight;
+ this._setSelected(this._defaultResult, highlight);
+ }
+ },
};
-// fixes app is null error if search provider id is not a desktop app id.
-// is not accessible in 45
-/* const ProviderInfo = {
- animateLaunch() {
- let appSys = Shell.AppSystem.get_default();
- let app = appSys.lookup_app(this.provider.appInfo.get_id());
- if (app && app.state === Shell.AppState.STOPPED)
- IconGrid.zoomOutActor(this._content);
+// Add highlighting of the "name" part of the result for all providers
+const ListSearchResultOverride = {
+ _highlightTerms() {
+ let markup = this._resultsView.highlightTerms(this.metaInfo['name']);
+ this.label_actor.clutter_text.set_markup(markup);
+ markup = this._resultsView.highlightTerms(this.metaInfo['description'].split('\n')[0]);
+ this._descriptionLabel.clutter_text.set_markup(markup);
},
-};*/
+};
+
+const HighlighterOverride = {
+ /**
+ * @param {?string[]} terms - list of terms to highlight
+ */
+ /* constructor(terms) {
+ if (!terms)
+ return;
+
+ const escapedTerms = terms
+ .map(term => Shell.util_regex_escape(term))
+ .filter(term => term.length > 0);
+
+ if (escapedTerms.length === 0)
+ return;
+
+ this._highlightRegex = new RegExp(
+ `(${escapedTerms.join('|')})`, 'gi');
+ },*/
+
+ /**
+ * Highlight all occurences of the terms defined for this
+ * highlighter in the provided text using markup.
+ *
+ * @param {string} text - text to highlight the defined terms in
+ * @returns {string}
+ */
+ highlight(text, options) {
+ if (!this._highlightRegex)
+ return GLib.markup_escape_text(text, -1);
+
+ // force use local settings if the class is overridden by another extension (WSP, ESP)
+ const o = options || opt;
+ let escaped = [];
+ let lastMatchEnd = 0;
+ let match;
+ let style = ['', ''];
+ if (o.HIGHLIGHT_DEFAULT)
+ style = ['<b>', '</b>'];
+ // The default highlighting by the bold style causes text to be "randomly" ellipsized in cases where it's not necessary
+ // and also blurry
+ // Underscore doesn't affect label size and all looks better
+ else if (o.HIGHLIGHT_UNDERLINE)
+ style = ['<u>', '</u>'];
+
+ while ((match = this._highlightRegex.exec(text))) {
+ if (match.index > lastMatchEnd) {
+ let unmatched = GLib.markup_escape_text(
+ text.slice(lastMatchEnd, match.index), -1);
+ escaped.push(unmatched);
+ }
+ let matched = GLib.markup_escape_text(match[0], -1);
+ escaped.push(`${style[0]}${matched}${style[1]}`);
+ lastMatchEnd = match.index + match[0].length;
+ }
+ let unmatched = GLib.markup_escape_text(
+ text.slice(lastMatchEnd), -1);
+ escaped.push(unmatched);
+ return escaped.join('');
+ },
+};
diff --git a/extensions/45/vertical-workspaces/lib/searchController.js b/extensions/47/vertical-workspaces/lib/searchController.js
index e69bc90..1722f15 100644
--- a/extensions/45/vertical-workspaces/lib/searchController.js
+++ b/extensions/47/vertical-workspaces/lib/searchController.js
@@ -3,7 +3,7 @@
* searchController.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -51,15 +51,15 @@ export const SearchControllerModule = class {
_activateModule() {
if (!this._originalOnStageKeyPress)
- this._originalOnStageKeyPress = Main.overview._overview.controls._searchController._onStageKeyPress;
+ this._originalOnStageKeyPress = Main.overview.searchController._onStageKeyPress;
- Main.overview._overview.controls._searchController._onStageKeyPress = SearchControllerCommon._onStageKeyPress;
+ Main.overview.searchController._onStageKeyPress = SearchControllerCommon._onStageKeyPress;
console.debug(' SearchControllerModule - Activated');
}
_disableModule() {
if (this._originalOnStageKeyPress)
- Main.overview._overview.controls._searchController._onStageKeyPress = this._originalOnStageKeyPress;
+ Main.overview.searchController._onStageKeyPress = this._originalOnStageKeyPress;
this._originalOnStageKeyPress = null;
console.debug(' SearchControlerModule - Disabled');
diff --git a/extensions/45/vertical-workspaces/lib/settings.js b/extensions/47/vertical-workspaces/lib/settings.js
index d8bb99c..563063c 100644
--- a/extensions/45/vertical-workspaces/lib/settings.js
+++ b/extensions/47/vertical-workspaces/lib/settings.js
@@ -3,7 +3,7 @@
* settings.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*/
@@ -30,7 +30,7 @@ export const Options = class Options {
400,
() => {
this._gsettings.apply();
- this._updateCachedSettings();
+ this._updateSettings();
this._writeTimeoutId = 0;
return GLib.SOURCE_REMOVE;
}
@@ -52,9 +52,6 @@ export const Options = class Options {
closeWsButtonMode: ['int', 'close-ws-button-mode'],
secWsTmbPositionAdjust: ['int', 'sec-wst-position-adjust'],
dashMaxIconSize: ['int', 'dash-max-icon-size'],
- dashShowWindowsIcon: ['int', 'dash-show-windows-icon'],
- dashShowRecentFilesIcon: ['int', 'dash-show-recent-files-icon'],
- dashShowExtensionsIcon: ['int', 'dash-show-extensions-icon'],
centerDashToWs: ['boolean', 'center-dash-to-ws'],
showAppsIconPosition: ['int', 'show-app-icon-position'],
wsThumbnailScale: ['int', 'ws-thumbnail-scale'],
@@ -87,6 +84,7 @@ export const Options = class Options {
startupState: ['int', 'startup-state'],
overviewMode: ['int', 'overview-mode'],
workspaceSwitcherAnimation: ['int', 'workspace-switcher-animation'],
+ wsSwitcherMode: ['int', 'ws-switcher-mode'],
searchIconSize: ['int', 'search-icon-size'],
searchViewScale: ['int', 'search-width-scale'],
appGridIconSize: ['int', 'app-grid-icon-size'],
@@ -104,10 +102,14 @@ export const Options = class Options {
appGridActivePreview: ['boolean', 'app-grid-active-preview'],
appGridFolderCenter: ['boolean', 'app-grid-folder-center'],
appGridPageWidthScale: ['int', 'app-grid-page-width-scale'],
+ appGridPageHeightScale: ['int', 'app-grid-page-height-scale'],
appGridSpacing: ['int', 'app-grid-spacing'],
+ appGridFolderSpacing: ['int', 'app-grid-folder-spacing'],
+ appGridShowPageArrows: ['boolean', 'app-grid-show-page-arrows'],
searchWindowsOrder: ['int', 'search-windows-order'],
searchFuzzy: ['boolean', 'search-fuzzy'],
searchMaxResultsRows: ['int', 'search-max-results-rows'],
+ searchAppGridMode: ['int', 'search-app-grid-mode'],
dashShowWindowsBeforeActivation: ['int', 'dash-show-windows-before-activation'],
dashIconScroll: ['int', 'dash-icon-scroll'],
dashIsolateWorkspaces: ['boolean', 'dash-isolate-workspaces'],
@@ -135,9 +137,12 @@ export const Options = class Options {
overlayKeyPrimary: ['int', 'overlay-key-primary'],
overlayKeySecondary: ['int', 'overlay-key-secondary'],
overviewEscBehavior: ['int', 'overview-esc-behavior'],
+ clickEmptyClose: ['boolean', 'click-empty-close'],
newWindowFocusFix: ['boolean', 'new-window-focus-fix'],
+ newWindowMonitorFix: ['boolean', 'new-window-monitor-fix'],
appGridPerformance: ['boolean', 'app-grid-performance'],
- windowThumbnailScale: ['int', 'window-thumbnail-scale'],
+ highlightingStyle: ['int', 'highlighting-style'],
+ delayStartup: ['boolean', 'delay-startup'],
workspaceSwitcherPopupModule: ['boolean', 'workspace-switcher-popup-module'],
workspaceAnimationModule: ['boolean', 'workspace-animation-module'],
@@ -145,7 +150,6 @@ export const Options = class Options {
windowManagerModule: ['boolean', 'window-manager-module'],
windowPreviewModule: ['boolean', 'window-preview-module'],
windowAttentionHandlerModule: ['boolean', 'win-attention-handler-module'],
- windowThumbnailModule: ['boolean', 'window-thumbnail-module'],
swipeTrackerModule: ['boolean', 'swipe-tracker-module'],
searchControllerModule: ['boolean', 'search-controller-module'],
searchModule: ['boolean', 'search-module'],
@@ -157,9 +161,6 @@ export const Options = class Options {
dashModule: ['boolean', 'dash-module'],
appFavoritesModule: ['boolean', 'app-favorites-module'],
appDisplayModule: ['boolean', 'app-display-module'],
- windowSearchProviderModule: ['boolean', 'window-search-provider-module'],
- recentFilesSearchProviderModule: ['boolean', 'recent-files-search-provider-module'],
- extensionsSearchProviderModule: ['boolean', 'extensions-search-provider-module'],
profileName1: ['string', 'profile-name-1'],
profileName2: ['string', 'profile-name-2'],
@@ -167,6 +168,7 @@ export const Options = class Options {
profileName4: ['string', 'profile-name-4'],
};
this.cachedOptions = {};
+ this._updateSettings();
}
connect(name, callback) {
@@ -290,6 +292,10 @@ export const Options = class Options {
_updateSettings() {
this._updateCachedSettings();
+
+ // Basic spacing of the overview elements
+ this.SPACING = 12;
+
this.DASH_BG_ALPHA = this.get('dashBgOpacity') / 100;
this.DASH_BG_OPACITY = this.get('dashBgOpacity') * 2.5;
this.DASH_BG_COLOR = this.get('dashBgColor');
@@ -324,13 +330,12 @@ export const Options = class Options {
this.CENTER_DASH_WS = this.get('centerDashToWs');
this.MAX_ICON_SIZE = this.get('dashMaxIconSize');
- this.SHOW_WINDOWS_ICON = this.get('dashShowWindowsIcon');
- this.SHOW_RECENT_FILES_ICON = this.get('dashShowRecentFilesIcon');
- this.SHOW_EXTENSIONS_ICON = this.get('dashShowExtensionsIcon');
this.WS_TMB_POSITION = this.get('workspaceThumbnailsPosition');
this.ORIENTATION = this.WS_TMB_POSITION > 4 ? 0 : 1;
this.WORKSPACE_MAX_SPACING = this.get('wsMaxSpacing');
+ this.WS_MAX_SPACING_OFF_SCREEN = 350;
+ this.FORCE_SINGLE_WS_TRANSITION = false;
// ORIENTATION || DASH_LEFT || DASH_RIGHT ? 350 : 80;
this.SHOW_WS_TMB = ![4, 9].includes(this.WS_TMB_POSITION); // 4, 9 - disable
this.WS_TMB_FULL = this.get('wsThumbnailsFull');
@@ -355,29 +360,16 @@ export const Options = class Options {
this.SHOW_WST_LABELS_ON_HOVER = this.get('showWsTmbLabelsOnHover');
this.CLOSE_WS_BUTTON_MODE = this.get('closeWsButtonMode');
- this.MAX_THUMBNAIL_SCALE = this.get('wsThumbnailScale') / 100;
- if (this.MAX_THUMBNAIL_SCALE === 0) {
- this.MAX_THUMBNAIL_SCALE = 0.01;
- this.SHOW_WS_TMB = false;
- }
- this.MAX_THUMBNAIL_SCALE_APPGRID = this.get('wsThumbnailScaleAppGrid') / 100;
+ this.MAX_THUMBNAIL_SCALE = this.get('wsThumbnailScale') / 100 + 0.01;
+ this.MAX_THUMBNAIL_SCALE_APPGRID = this.get('wsThumbnailScaleAppGrid') / 100 + 0.01;
this.SHOW_WS_TMB_APPGRID = true;
- if (this.MAX_THUMBNAIL_SCALE_APPGRID === 0) {
- this.MAX_THUMBNAIL_SCALE_APPGRID = 0.01;
- this.SHOW_WS_TMB_APPGRID = false;
- }
this.MAX_THUMBNAIL_SCALE_STABLE = this.MAX_THUMBNAIL_SCALE === this.MAX_THUMBNAIL_SCALE_APPGRID;
-
- this.SEC_MAX_THUMBNAIL_SCALE = this.get('secWsThumbnailScale') / 100;
- if (this.SEC_MAX_THUMBNAIL_SCALE === 0) {
- this.SEC_MAX_THUMBNAIL_SCALE = 0.01;
- this.SHOW_SEC_WS_TMB = false;
- }
+ this.SEC_MAX_THUMBNAIL_SCALE = this.get('secWsThumbnailScale') / 100 + 0.01;
this.WS_PREVIEW_SCALE = this.get('wsPreviewScale') / 100;
this.SEC_WS_PREVIEW_SCALE = this.get('secWsPreviewScale') / 100;
// calculate number of possibly visible neighbor previews according to ws scale
- this.NUMBER_OF_VISIBLE_NEIGHBORS = Math.round(1 + (1 - this.WS_PREVIEW_SCALE) / 4);
+ this.NUMBER_OF_VISIBLE_NEIGHBORS = Math.round(2 + (1 - this.WS_PREVIEW_SCALE));
this.SHOW_WS_TMB_BG = this.get('showWsSwitcherBg') && this.SHOW_WS_TMB;
this.WS_PREVIEW_BG_RADIUS = this.get('wsPreviewBgRadius');
@@ -395,8 +387,6 @@ export const Options = class Options {
if (this.SEARCH_VIEW_ANIMATION === 4)
this.SEARCH_VIEW_ANIMATION = 3;
- this.WS_ANIMATION = this.get('workspaceAnimation');
-
this.WIN_PREVIEW_ICON_SIZE = [64, 48, 32, 22, 8][this.get('winPreviewIconSize')];
this.WIN_TITLES_POSITION = this.get('winTitlePosition');
this.ALWAYS_SHOW_WIN_TITLES = this.WIN_TITLES_POSITION === 1;
@@ -421,6 +411,8 @@ export const Options = class Options {
this.SEARCH_VIEW_SCALE = this.get('searchViewScale') / 100;
this.SEARCH_MAX_ROWS = this.get('searchMaxResultsRows');
this.SEARCH_FUZZY = this.get('searchFuzzy');
+ this.SEARCH_DELAY = 0;
+ this.SEARCH_APP_GRID_MODE = this.get('searchAppGridMode');
this.APP_GRID_ALLOW_INCOMPLETE_PAGES = this.get('appGridIncompletePages');
this.APP_GRID_ICON_SIZE = this.get('appGridIconSize');
@@ -429,7 +421,7 @@ export const Options = class Options {
this.APP_GRID_ADAPTIVE = !this.APP_GRID_COLUMNS && !this.APP_GRID_ROWS;
this.APP_GRID_ORDER = this.get('appGridOrder');
- this.APP_GRID_ALPHABET = [1, 2].includes(this.APP_GRID_ORDER);
+ this.APP_GRID_ALPHABET = [1, 2, 4].includes(this.APP_GRID_ORDER);
this.APP_GRID_FOLDERS_FIRST = this.APP_GRID_ORDER === 1;
this.APP_GRID_FOLDERS_LAST = this.APP_GRID_ORDER === 2;
this.APP_GRID_USAGE = this.APP_GRID_ORDER === 3;
@@ -457,24 +449,26 @@ export const Options = class Options {
this.APP_GRID_FOLDER_COLUMNS = this.get('appGridFolderColumns');
this.APP_GRID_FOLDER_ROWS = this.get('appGridFolderRows');
this.APP_GRID_SPACING = this.get('appGridSpacing');
+ this.APP_GRID_FOLDER_SPACING = this.get('appGridFolderSpacing');
this.APP_GRID_FOLDER_DEFAULT = this.APP_GRID_FOLDER_ROWS === 3 && this.APP_GRID_FOLDER_COLUMNS === 3;
this.APP_GRID_FOLDER_ADAPTIVE = !this.APP_GRID_FOLDER_COLUMNS && !this.APP_GRID_FOLDER_ROWS;
this.APP_GRID_ACTIVE_PREVIEW = this.get('appGridActivePreview');
this.APP_GRID_FOLDER_CENTER = this.get('appGridFolderCenter');
this.APP_GRID_PAGE_WIDTH_SCALE = this.get('appGridPageWidthScale') / 100;
+ this.APP_GRID_PAGE_HEIGHT_SCALE = this.get('appGridPageHeightScale') / 100;
+ this.APP_GRID_SHOW_PAGE_ARROWS = this.get('appGridShowPageArrows');
- this.APP_GRID_ICON_SIZE_DEFAULT = this.APP_GRID_ACTIVE_PREVIEW && !this.APP_GRID_USAGE ? 176 : 96;
+ // Default icon sizes updates in the IconGrid._findBestModeForSize()
+ this.APP_GRID_ICON_SIZE_DEFAULT = this.APP_GRID_ACTIVE_PREVIEW && !this.APP_GRID_USAGE ? 192 : 96;
this.APP_GRID_FOLDER_ICON_SIZE_DEFAULT = 96;
this.APP_GRID_PERFORMANCE = this.get('appGridPerformance');
- this.WINDOW_SEARCH_ORDER = this.get('searchWindowsOrder');
-
this.PANEL_POSITION_TOP = this.get('panelPosition') === 0;
+ this.PANEL_POSITION_BOTTOM = this.get('panelPosition') === 1;
this.PANEL_MODE = this.get('panelVisibility');
this.PANEL_DISABLED = this.PANEL_MODE === 2;
this.PANEL_OVERVIEW_ONLY = this.PANEL_MODE === 1;
- this.START_Y_OFFSET = 0; // set from main module
this.WINDOW_ATTENTION_MODE = this.get('windowAttentionMode');
this.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS = this.WINDOW_ATTENTION_MODE === 1;
@@ -484,8 +478,10 @@ export const Options = class Options {
this.WS_SW_POPUP_V_POSITION = this.get('wsSwPopupVPosition') / 100;
this.WS_SW_POPUP_MODE = this.get('wsSwPopupMode');
+ this.WS_ANIMATION = this.get('workspaceAnimation');
this.WS_WRAPAROUND = this.get('wsSwitcherWraparound');
this.WS_IGNORE_LAST = this.get('wsSwitcherIgnoreLast');
+ this.WS_SWITCHER_CURRENT_MONITOR = this.get('wsSwitcherMode') === 1;
this.SHOW_FAV_NOTIFICATION = this.get('favoritesNotify');
this.NOTIFICATION_POSITION = this.get('notificationPosition');
@@ -521,11 +517,17 @@ export const Options = class Options {
this.OVERLAY_KEY_SECONDARY = this.get('overlayKeySecondary');
this.ESC_BEHAVIOR = this.get('overviewEscBehavior');
-
- this.WINDOW_THUMBNAIL_ENABLED = this.get('windowThumbnailModule');
- this.WINDOW_THUMBNAIL_SCALE = this.get('windowThumbnailScale') / 100;
+ this.CLICK_EMPTY_CLOSE = this.get('clickEmptyClose');
this.FIX_NEW_WINDOW_FOCUS = this.get('newWindowFocusFix');
+ this.FIX_NEW_WINDOW_MONITOR = this.get('newWindowMonitorFix');
+
+ this.HIGHLIGHTING_STYLE = this.get('highlightingStyle');
+ this.HIGHLIGHT_DEFAULT = this.HIGHLIGHTING_STYLE === 0;
+ this.HIGHLIGHT_UNDERLINE = this.HIGHLIGHTING_STYLE === 1;
+ this.HIGHLIGHT_NONE = this.HIGHLIGHTING_STYLE === 2;
+
+ this.DELAY_STARTUP = this.get('delayStartup');
}
_getAnimationDirection() {
diff --git a/extensions/45/vertical-workspaces/lib/swipeTracker.js b/extensions/47/vertical-workspaces/lib/swipeTracker.js
index 354f1e0..560b296 100644
--- a/extensions/45/vertical-workspaces/lib/swipeTracker.js
+++ b/extensions/47/vertical-workspaces/lib/swipeTracker.js
@@ -3,7 +3,7 @@
* swipeTracker.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/util.js b/extensions/47/vertical-workspaces/lib/util.js
index 38ca6cd..0da67ce 100644
--- a/extensions/45/vertical-workspaces/lib/util.js
+++ b/extensions/47/vertical-workspaces/lib/util.js
@@ -3,31 +3,37 @@
* util.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
'use strict';
-import GLib from 'gi://GLib';
import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
import Meta from 'gi://Meta';
import Shell from 'gi://Shell';
-import Gio from 'gi://Gio';
+import St from 'gi://St';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js';
import { InjectionManager } from 'resource:///org/gnome/shell/extensions/extension.js';
let Me;
+let _;
let _installedExtensions;
export function init(me) {
Me = me;
+ _ = Me.gettext;
}
export function cleanGlobals() {
Me = null;
+ _ = null;
_installedExtensions = null;
}
@@ -285,9 +291,9 @@ export function isMoreRelevant(stringA, stringB, pattern) {
export function getEnabledExtensions(pattern = '') {
let result = [];
- // extensionManager is unreliable at startup (if not all extensions were loaded)
- // but gsettings key can contain removed extensions...
- // therefore we have to look into filesystem, what's really installed
+ // extensionManager is unreliable at startup because it is uncertain whether all extensions have been loaded
+ // also gsettings key can contain already removed extensions (user deleted them without disabling them first)
+ // therefore we have to check what's really installed in the filesystem
if (!_installedExtensions) {
const extensionFiles = [...collectFromDatadirs('extensions', true)];
_installedExtensions = extensionFiles.map(({ info }) => {
@@ -298,8 +304,19 @@ export function getEnabledExtensions(pattern = '') {
return uuid;
});
}
+ // _enabledExtensions contains content of the enabled-extensions key from gsettings, not actual state
const enabled = Main.extensionManager._enabledExtensions;
result = _installedExtensions.filter(ext => enabled.includes(ext));
+ // _extensions contains already loaded extensions, so we can try to filter out broken or incompatible extensions
+ const active = Main.extensionManager._extensions;
+ result = result.filter(ext => {
+ const extension = active.get(ext);
+ if (extension)
+ return ![3, 4].includes(extension.state); // 3 - ERROR, 4 - OUT_OF_TIME (not supported by shell-version in metadata)
+ // extension can be enabled but not yet loaded, we just cannot see its state at this moment, so let it pass as enabled
+ return true;
+ });
+ // return only extensions matching the search pattern
return result.filter(uuid => uuid !== null && uuid.includes(pattern));
}
@@ -362,3 +379,67 @@ export function getWindows(workspace) {
// ... and filter out skip-taskbar windows and duplicates
}).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) === i);
}
+
+export function monitorHasLowResolution(monitorIndex, resolutionLimit) {
+ resolutionLimit = resolutionLimit ?? 1200000;
+ monitorIndex = monitorIndex ?? global.display.get_primary_monitor();
+ const monitorGeometry = global.display.get_monitor_geometry(monitorIndex);
+ const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
+ const monitorResolution = monitorGeometry.width * monitorGeometry.height;
+ return (monitorResolution / scaleFactor) < resolutionLimit;
+}
+
+// /////////////////////////////////////////////////////////////////////////////////////////////
+// Status dialog that appears during updating V-Shell configuration and blocks inputs
+
+export const RestartMessage = GObject.registerClass({
+ // Registered name should be unique
+ GTypeName: `RestartMessage${Math.floor(Math.random() * 1000)}`,
+}, class RestartMessage extends ModalDialog.ModalDialog {
+ _init() {
+ super._init({
+ shellReactive: false,
+ styleClass: 'restart-message headline update-message',
+ shouldFadeIn: false,
+ destroyOnClose: false,
+ });
+
+ const label = new St.Label({
+ text: _('Updating V-Shell'),
+ x_align: Clutter.ActorAlign.CENTER,
+ y_align: Clutter.ActorAlign.CENTER,
+ });
+
+ this.contentLayout.add_child(label);
+ this.buttonLayout.hide();
+ this.connect('destroy', () => this.removeMessage());
+ }
+
+ showMessage(timeout = 500) {
+ if (this._timeoutId || Me._resetInProgress || Main.layoutManager._startingUp)
+ return;
+ this._removeTimeout();
+ this.open();
+ this._timeoutId = GLib.timeout_add(
+ GLib.PRIORITY_LOW,
+ timeout,
+ () => {
+ this._timeoutId = 0;
+ this.removeMessage();
+ return GLib.SOURCE_REMOVE;
+ }
+ );
+ }
+
+ _removeTimeout() {
+ if (this._timeoutId) {
+ GLib.source_remove(this._timeoutId);
+ this._timeoutId = 0;
+ }
+ }
+
+ removeMessage() {
+ this._removeTimeout();
+ this.close();
+ }
+});
diff --git a/extensions/45/vertical-workspaces/lib/windowAttentionHandler.js b/extensions/47/vertical-workspaces/lib/windowAttentionHandler.js
index d49c1ad..ae115ed 100644
--- a/extensions/45/vertical-workspaces/lib/windowAttentionHandler.js
+++ b/extensions/47/vertical-workspaces/lib/windowAttentionHandler.js
@@ -3,16 +3,20 @@
* windowAttentionHandler.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
'use strict';
+import Clutter from 'gi://Clutter';
+
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js';
+const shellVersion46 = !Clutter.Container;
+
let Me;
let opt;
@@ -86,30 +90,55 @@ const WindowAttentionHandlerCommon = {
}
const app = this._tracker.get_window_app(window);
- // const source = new WindowAttentionHandler.WindowAttentionSource(app, window);
- const source = new MessageTray.Source(app.get_name());
+ let args;
+ if (shellVersion46)
+ args = { title: app.get_name() };
+ else
+ args = app.get_name();
+
+ const source = new MessageTray.Source(args);
new Me.Util.Overrides().addOverride('MessageSource', source, WindowAttentionSourceCommon);
source._init(app, window);
Main.messageTray.add(source);
- let [title, banner] = this._getTitleAndBanner(app, window);
+ let [title, body] = this._getTitleAndBanner(app, window);
+ args = shellVersion46
+ ? [{ source, title, body, forFeedback: true }]
+ : [source, title, body];
+
+ const notification = new MessageTray.Notification(...args);
+ if (!shellVersion46)
+ notification.setForFeedback(true);
- const notification = new MessageTray.Notification(source, title, banner);
notification.connect('activated', () => {
source.open();
});
- notification.setForFeedback(true);
- if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS)
- // just push the notification to the message tray without showing notification
- source.pushNotification(notification);
- else
- source.showNotification(notification);
-
- window.connectObject('notify::title', () => {
- [title, banner] = this._getTitleAndBanner(app, window);
- notification.update(title, banner);
- }, source);
+ if (shellVersion46) {
+ notification.acknowledged = opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS;
+ source.addNotification(notification);
+ if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS) {
+ // just push the notification to the message tray without showing notification
+ notification.acknowledged = true;
+ Main.messageTray._notificationQueue.push(notification);
+ Main.panel.statusArea.dateMenu._indicator.show();
+ }
+ window.connectObject('notify::title', () => {
+ [title, body] = this._getTitleAndBanner(app, window);
+ notification.set({ title, body });
+ }, source);
+ } else {
+ if (opt.WINDOW_ATTENTION_DISABLE_NOTIFICATIONS)
+ // just push the notification to the message tray without showing notification
+ source.pushNotification(notification);
+ else
+ source.showNotification(notification);
+
+ window.connectObject('notify::title', () => {
+ [title, body] = this._getTitleAndBanner(app, window);
+ notification.update(title, body);
+ }, source);
+ }
},
};
diff --git a/extensions/47/vertical-workspaces/lib/windowManager.js b/extensions/47/vertical-workspaces/lib/windowManager.js
new file mode 100644
index 0000000..a6f9b09
--- /dev/null
+++ b/extensions/47/vertical-workspaces/lib/windowManager.js
@@ -0,0 +1,380 @@
+/**
+ * V-Shell (Vertical Workspaces)
+ * windowManager.js
+ *
+ * @author GdH <G-dH@github.com>
+ * @copyright 2022 - 2024
+ * @license GPL-3.0
+ *
+ */
+
+'use strict';
+
+import Clutter from 'gi://Clutter';
+import Meta from 'gi://Meta';
+import GObject from 'gi://GObject';
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as WindowManager from 'resource:///org/gnome/shell/ui/windowManager.js';
+import * as WorkspaceAnimation from 'resource:///org/gnome/shell/ui/workspaceAnimation.js';
+
+const MINIMIZE_WINDOW_ANIMATION_TIME = 400; // windowManager.MINIMIZE_WINDOW_ANIMATION_TIME
+const MINIMIZE_WINDOW_ANIMATION_MODE = Clutter.AnimationMode.EASE_OUT_EXPO; // WindowManager.MINIMIZE_WINDOW_ANIMATION_MODE
+
+let Me;
+let opt;
+
+export const WindowManagerModule = class {
+ constructor(me) {
+ Me = me;
+ opt = Me.opt;
+
+ this._firstActivation = true;
+ this.moduleEnabled = false;
+ this._overrides = null;
+
+ this._originalMinimizeSigId = 0;
+ this._minimizeSigId = 0;
+ this._originalUnminimizeSigId = 0;
+ this._unminimizeSigId = 0;
+ }
+
+ cleanGlobals() {
+ Me = null;
+ opt = null;
+ }
+
+ update(reset) {
+ this.moduleEnabled = opt.get('windowManagerModule');
+ const conflict = false;
+
+ reset = reset || !this.moduleEnabled || conflict;
+
+ // don't even touch the original code if module disabled
+ if (reset && !this._firstActivation) {
+ this._disableModule();
+ } else if (!reset) {
+ this._firstActivation = false;
+ this._activateModule();
+ }
+ if (reset && this._firstActivation)
+ console.debug(' WindowManagerModule - Keeping untouched');
+ }
+
+ _activateModule() {
+ if (!this._overrides)
+ this._overrides = new Me.Util.Overrides();
+
+ this._overrides.addOverride('WindowManager', WindowManager.WindowManager.prototype, WindowManagerCommon);
+ if (opt.WS_SWITCHER_CURRENT_MONITOR)
+ this._overrides.addOverride('WorkspaceAnimationController', WorkspaceAnimation.WorkspaceAnimationController.prototype, WorkspaceAnimationController);
+
+ if (!this._minimizeSigId) {
+ this._originalMinimizeSigId = GObject.signal_handler_find(Main.wm._shellwm, { signalId: 'minimize' });
+ if (this._originalMinimizeSigId) {
+ Main.wm._shellwm.block_signal_handler(this._originalMinimizeSigId);
+ this._minimizeSigId = Main.wm._shellwm.connect('minimize', WindowManagerCommon._minimizeWindow.bind(Main.wm));
+ }
+
+ this._originalUnminimizeSigId = GObject.signal_handler_find(Main.wm._shellwm, { signalId: 'unminimize' });
+ if (this._originalUnminimizeSigId) {
+ Main.wm._shellwm.block_signal_handler(this._originalUnminimizeSigId);
+ this._unminimizeSigId = Main.wm._shellwm.connect('unminimize', WindowManagerCommon._unminimizeWindow.bind(Main.wm));
+ }
+ }
+ console.debug(' WindowManagerModule - Activated');
+ }
+
+ _disableModule() {
+ if (this._overrides)
+ this._overrides.removeAll();
+ this._overrides = null;
+
+ if (this._minimizeSigId) {
+ Main.wm._shellwm.disconnect(this._minimizeSigId);
+ this._minimizeSigId = 0;
+ }
+ if (this._originalMinimizeSigId) {
+ Main.wm._shellwm.unblock_signal_handler(this._originalMinimizeSigId);
+ this._originalMinimizeSigId = 0;
+ }
+
+ if (this._unminimizeSigId) {
+ Main.wm._shellwm.disconnect(this._unminimizeSigId);
+ this._unminimizeSigId = 0;
+ }
+ if (this._originalUnminimizeSigId) {
+ Main.wm._shellwm.unblock_signal_handler(this._originalUnminimizeSigId);
+ this._originalUnminimizeSigId = 0;
+ }
+
+ console.debug(' WindowManagerModule - Disabled');
+ }
+};
+
+const WindowManagerCommon = {
+ actionMoveWorkspace(workspace) {
+ if (!Main.sessionMode.hasWorkspaces)
+ return;
+
+ if (opt.WS_SWITCHER_CURRENT_MONITOR)
+ this._switchWorkspaceCurrentMonitor(workspace);
+ else if (!workspace.active)
+ workspace.activate(global.get_current_time());
+ },
+
+ actionMoveWindow(window, workspace) {
+ if (!Main.sessionMode.hasWorkspaces)
+ return;
+
+ if (!workspace.active) {
+ // This won't have any effect for "always sticky" windows
+ // (like desktop windows or docks)
+
+ this._workspaceAnimation.movingWindow = window;
+ window.change_workspace(workspace);
+
+ global.display.clear_mouse_mode();
+
+ if (opt.SWITCH_ONLY_CURRENT_MONITOR_WS) {
+ this._switchWorkspaceCurrentMonitor(workspace, window.get_monitor());
+ window.activate(global.get_current_time());
+ } else {
+ workspace.activate_with_focus(window, global.get_current_time());
+ }
+ }
+ },
+
+ _switchWorkspaceCurrentMonitor(workspace, monitor) {
+ // const focusedWindow = global.display.get_focus_window();
+ // const currentMonitor = focusedWindow ? focusedWindow.get_monitor() : global.display.get_current_monitor();
+ // using focused window to determine the current monitor can lead to inconsistent behavior and switching monitors between switches
+ // depending on which window takes focus on each workspace
+ // mouse pointer is more stable and predictable source
+ const currentMonitor = monitor ? monitor : global.display.get_current_monitor();
+ const primaryMonitor = currentMonitor === Main.layoutManager.primaryIndex;
+ const nMonitors = Main.layoutManager.monitors.length;
+ const lastIndexCorrection = Meta.prefs_get_dynamic_workspaces() ? 2 : 1;
+ const lastIndex = global.workspaceManager.get_n_workspaces() - lastIndexCorrection;
+ const targetWsIndex = workspace.index();
+ const activeWs = global.workspaceManager.get_active_workspace();
+ const activeWsIndex = activeWs.index();
+ const diff = activeWsIndex - targetWsIndex;
+
+ let direction = diff > 0 ? Meta.MotionDirection.UP : Meta.MotionDirection.DOWN;
+ if (diff === 0) {
+ // no actual ws to switch, but secondary monitors are always in wraparound mode so we need to get direction
+ direction = activeWsIndex >= lastIndex ? Meta.MotionDirection.DOWN : Meta.MotionDirection.UP;
+ }
+ if (Math.abs(diff) > 1) {
+ // workspace is probably in wraparound mode and just wrapped so so we need to translate direction
+ direction = diff > 0 ? Meta.MotionDirection.DOWN : Meta.MotionDirection.UP;
+ }
+
+ if (!primaryMonitor) {
+ this._rotateWorkspaces(direction, currentMonitor);
+ return;
+ }
+
+ // avoid ws rotations if the last empty dynamic workspace is involved, but allow to rotate from the last to the first, if wraparound is enabled
+ if (workspace !== activeWs && !((targetWsIndex > lastIndex && direction === Meta.MotionDirection.DOWN) || (activeWsIndex > lastIndex && targetWsIndex >= lastIndex))) {
+ for (let i = 0; i < nMonitors; i++) {
+ if (i !== currentMonitor) {
+ const oppositeDirection = direction === Meta.MotionDirection.UP ? Meta.MotionDirection.DOWN : Meta.MotionDirection.UP;
+ this._rotateWorkspaces(oppositeDirection, i);
+ }
+ }
+ }
+ workspace.activate(global.get_current_time());
+ },
+
+ _rotateWorkspaces(direction = 0, monitorIndex = -1, step = 1) {
+ step = direction === Meta.MotionDirection.UP ? Number(step) : -step;
+ const monitor = monitorIndex > -1 ? monitorIndex : global.display.get_current_monitor();
+ // don't move windows to the last empty workspace if dynamic workspaces are enabled
+ const lastIndexCorrection = Meta.prefs_get_dynamic_workspaces() ? 2 : 1;
+ const lastIndex = global.workspaceManager.get_n_workspaces() - lastIndexCorrection;
+ let windows = Me.Util.getWindows(null);
+ for (let win of windows.reverse()) {
+ // avoid moving modal windows as they move with their parents (and vice versa) immediately, before we move the parent window.
+ if (win.get_monitor() === monitor && !win.is_always_on_all_workspaces() && !win.is_attached_dialog() && !win.get_transient_for()) {
+ let wWs = win.get_workspace().index();
+ wWs += step;
+ if (wWs < 0)
+ wWs = lastIndex;
+ if (wWs > lastIndex)
+ wWs = 0;
+ const ws = global.workspaceManager.get_workspace_by_index(wWs);
+ win.change_workspace(ws);
+ }
+ }
+ },
+
+ // fix for mainstream bug - fullscreen windows should minimize using opacity transition
+ // but its being applied directly on window actor and that doesn't work
+ // anyway, animation is better, even if the Activities button is not visible...
+ // and also add support for bottom position of the panel
+ _minimizeWindow(shellwm, actor) {
+ const types = [
+ Meta.WindowType.NORMAL,
+ Meta.WindowType.MODAL_DIALOG,
+ Meta.WindowType.DIALOG,
+ ];
+ if (!this._shouldAnimateActor(actor, types)) {
+ shellwm.completed_minimize(actor);
+ return;
+ }
+
+ actor.set_scale(1.0, 1.0);
+
+ this._minimizing.add(actor);
+
+ /* if (actor.meta_window.is_monitor_sized()) {
+ actor.get_first_child().ease({
+ opacity: 0,
+ duration: MINIMIZE_WINDOW_ANIMATION_TIME,
+ mode: MINIMIZE_WINDOW_ANIMATION_MODE,
+ onStopped: () => this._minimizeWindowDone(shellwm, actor),
+ });
+ } else { */
+ let xDest, yDest, xScale, yScale;
+ let [success, geom] = actor.meta_window.get_icon_geometry();
+ if (success) {
+ xDest = geom.x;
+ yDest = geom.y;
+ xScale = geom.width / actor.width;
+ yScale = geom.height / actor.height;
+ } else {
+ let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
+ if (!monitor) {
+ this._minimizeWindowDone();
+ return;
+ }
+ xDest = monitor.x;
+ yDest = opt.PANEL_POSITION_TOP ? monitor.y : monitor.y + monitor.height;
+ if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
+ xDest += monitor.width;
+ xScale = 0;
+ yScale = 0;
+ }
+
+ actor.ease({
+ scale_x: xScale,
+ scale_y: yScale,
+ x: xDest,
+ y: yDest,
+ duration: MINIMIZE_WINDOW_ANIMATION_TIME,
+ mode: MINIMIZE_WINDOW_ANIMATION_MODE,
+ onStopped: () => this._minimizeWindowDone(shellwm, actor),
+ });
+ // }
+ },
+
+ _minimizeWindowDone(shellwm, actor) {
+ if (this._minimizing.delete(actor)) {
+ actor.remove_all_transitions();
+ actor.set_scale(1.0, 1.0);
+ actor.get_first_child().set_opacity(255);
+ actor.set_pivot_point(0, 0);
+
+ shellwm.completed_minimize(actor);
+ }
+ },
+
+ _unminimizeWindow(shellwm, actor) {
+ const types = [
+ Meta.WindowType.NORMAL,
+ Meta.WindowType.MODAL_DIALOG,
+ Meta.WindowType.DIALOG,
+ ];
+ if (!this._shouldAnimateActor(actor, types)) {
+ shellwm.completed_unminimize(actor);
+ return;
+ }
+
+ this._unminimizing.add(actor);
+
+ /* if (false/* actor.meta_window.is_monitor_sized()) {
+ actor.opacity = 0;
+ actor.set_scale(1.0, 1.0);
+ actor.ease({
+ opacity: 255,
+ duration: MINIMIZE_WINDOW_ANIMATION_TIME,
+ mode: MINIMIZE_WINDOW_ANIMATION_MODE,
+ onStopped: () => this._unminimizeWindowDone(shellwm, actor),
+ });
+ } else { */
+ let [success, geom] = actor.meta_window.get_icon_geometry();
+ if (success) {
+ actor.set_position(geom.x, geom.y);
+ actor.set_scale(geom.width / actor.width,
+ geom.height / actor.height);
+ } else {
+ let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
+ if (!monitor) {
+ actor.show();
+ this._unminimizeWindowDone();
+ return;
+ }
+ actor.set_position(monitor.x, opt.PANEL_POSITION_TOP ? monitor.y : monitor.y + monitor.height);
+ if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
+ actor.x += monitor.width;
+ actor.set_scale(0, 0);
+ }
+
+ let rect = actor.meta_window.get_buffer_rect();
+ let [xDest, yDest] = [rect.x, rect.y];
+
+ actor.show();
+ actor.ease({
+ scale_x: 1,
+ scale_y: 1,
+ x: xDest,
+ y: yDest,
+ duration: MINIMIZE_WINDOW_ANIMATION_TIME,
+ mode: MINIMIZE_WINDOW_ANIMATION_MODE,
+ onStopped: () => this._unminimizeWindowDone(shellwm, actor),
+ });
+ // }
+ },
+};
+
+const WorkspaceAnimationController = {
+ _prepareWorkspaceSwitch(workspaceIndices) {
+ if (this._switchData)
+ return;
+
+ const workspaceManager = global.workspace_manager;
+ const nWorkspaces = workspaceManager.get_n_workspaces();
+
+ const switchData = {};
+
+ this._switchData = switchData;
+ switchData.monitors = [];
+
+ switchData.gestureActivated = false;
+ switchData.inProgress = false;
+
+ if (!workspaceIndices)
+ workspaceIndices = [...Array(nWorkspaces).keys()];
+
+ let monitors = opt.WS_SWITCHER_CURRENT_MONITOR
+ ? [Main.layoutManager.currentMonitor] : Main.layoutManager.monitors;
+ monitors = Meta.prefs_get_workspaces_only_on_primary()
+ ? [Main.layoutManager.primaryMonitor] : monitors;
+
+ for (const monitor of monitors) {
+ if (Meta.prefs_get_workspaces_only_on_primary() &&
+ monitor.index !== Main.layoutManager.primaryIndex)
+ continue;
+
+ const group = new WorkspaceAnimation.MonitorGroup(monitor, workspaceIndices, this.movingWindow);
+
+ Main.uiGroup.insert_child_above(group, global.window_group);
+
+ switchData.monitors.push(group);
+ }
+
+ Meta.disable_unredirect_for_display(global.display);
+ },
+};
diff --git a/extensions/45/vertical-workspaces/lib/windowPreview.js b/extensions/47/vertical-workspaces/lib/windowPreview.js
index c775d37..a529dc1 100644
--- a/extensions/45/vertical-workspaces/lib/windowPreview.js
+++ b/extensions/47/vertical-workspaces/lib/windowPreview.js
@@ -3,7 +3,7 @@
* windowPreview.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -32,6 +32,8 @@ const WINDOW_ACTIVE_SIZE_INC = 5;
const WINDOW_OVERLAY_FADE_TIME = 200;
const WINDOW_DND_SIZE = 256;
const DRAGGING_WINDOW_OPACITY = 100;
+const ICON_OVERLAP = 0.7;
+const ICON_TITLE_SPACING = 6;
const ControlsState = OverviewControls.ControlsState;
@@ -109,7 +111,6 @@ const WindowPreviewCommon = {
this._overviewAdjustment = overviewAdjustment;
const ICON_SIZE = opt.WIN_PREVIEW_ICON_SIZE;
- const ICON_OVERLAP = 0.7;
Shell.WindowPreview.prototype._init.bind(this)({
reactive: true,
@@ -173,9 +174,9 @@ const WindowPreviewCommon = {
} else if (opt.WIN_PREVIEW_SEC_BTN_ACTION === 2) {
this._searchAppWindowsAction();
return Clutter.EVENT_STOP;
- } else if (opt.WIN_PREVIEW_SEC_BTN_ACTION === 3 && opt.WINDOW_THUMBNAIL_ENABLED) {
+ } else if (opt.WIN_PREVIEW_SEC_BTN_ACTION === 3 && global.windowThumbnails) {
this._removeLaters();
- Me.Modules.winTmbModule.createThumbnail(metaWindow);
+ global.windowThumbnails?.createThumbnail(metaWindow);
return Clutter.EVENT_STOP;
}
} else if (button === Clutter.BUTTON_MIDDLE) {
@@ -185,9 +186,9 @@ const WindowPreviewCommon = {
} else if (opt.WIN_PREVIEW_MID_BTN_ACTION === 2) {
this._searchAppWindowsAction();
return Clutter.EVENT_STOP;
- } else if (opt.WIN_PREVIEW_SEC_BTN_ACTION === 3 && opt.WINDOW_THUMBNAIL_ENABLED) {
+ } else if (opt.WIN_PREVIEW_SEC_BTN_ACTION === 3 && global.windowThumbnails) {
this._removeLaters();
- Me.Modules.winTmbModule.createThumbnail(metaWindow);
+ global.windowThumbnails?.createThumbnail(metaWindow);
return Clutter.EVENT_STOP;
}
}
@@ -262,9 +263,9 @@ const WindowPreviewCommon = {
if (opt.WINDOW_ICON_CLICK_ACTION === 1) {
this._searchAppWindowsAction();
return Clutter.EVENT_STOP;
- } else if (opt.WINDOW_ICON_CLICK_ACTION === 2 && opt.WINDOW_THUMBNAIL_ENABLED) {
+ } else if (opt.WINDOW_ICON_CLICK_ACTION === 2 && global.windowThumbnails) {
this._removeLaters();
- Me.Modules.winTmbModule.createThumbnail(metaWindow);
+ global.windowThumbnails?.createThumbnail(metaWindow);
return Clutter.EVENT_STOP;
}
} /* else if (act.get_button() === Clutter.BUTTON_SECONDARY) {
@@ -458,12 +459,12 @@ const WindowPreviewCommon = {
// in static workspace mode show icon and title on windows expose
if (opt.OVERVIEW_MODE) {
if (currentState === 1)
- scale = opt.WORKSPACE_MODE;
- else if (finalState === 1 || (finalState === 0 && !opt.WORKSPACE_MODE))
+ scale = this._workspace._background._stateAdjustment.value;
+ else if ((finalState === 1 && !opt.WORKSPACE_MODE) || (finalState === 0 && !opt.WORKSPACE_MODE))
return;
}
- if (!opt.WS_ANIMATION && (Main.overview._overview.controls._searchController.searchActive ||
+ if (!opt.WS_ANIMATION && (Main.overview.searchController.searchActive ||
((initialState === ControlsState.WINDOW_PICKER && finalState === ControlsState.APP_GRID) ||
(initialState === ControlsState.APP_GRID && finalState === ControlsState.WINDOW_PICKER)))
)
@@ -589,6 +590,15 @@ const WindowPreviewCommon = {
}
},
+ overlapHeights() {
+ const [, titleHeight] = this._title.get_preferred_height(-1);
+
+ const topOverlap = 0;
+ const bottomOverlap = opt.WIN_TITLES_POSITION === 2 ? titleHeight + ICON_TITLE_SPACING : 0;
+
+ return [topOverlap, bottomOverlap];
+ },
+
_onDestroy() {
if (this._activateSelected)
this._activate();
diff --git a/extensions/45/vertical-workspaces/lib/workspace.js b/extensions/47/vertical-workspaces/lib/workspace.js
index 1ff81f1..9f1dbbc 100644
--- a/extensions/45/vertical-workspaces/lib/workspace.js
+++ b/extensions/47/vertical-workspaces/lib/workspace.js
@@ -3,7 +3,7 @@
* workspace.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -11,7 +11,7 @@
'use strict';
import St from 'gi://St';
-import Graphene from 'gi://Graphene';
+// import Graphene from 'gi://Graphene';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
@@ -108,7 +108,6 @@ const WorkspaceLayout = {
}
},
- // this fixes wrong size and position calculation of window clones while moving overview to the next (+1) workspace if vertical ws orientation is enabled in GS
_adjustSpacingAndPadding(rowSpacing, colSpacing, containerBox) {
if (this._sortedWindows.length === 0)
return [rowSpacing, colSpacing, containerBox];
@@ -120,36 +119,46 @@ const WorkspaceLayout = {
const [topOversize, bottomOversize] = window.chromeHeights();
const [leftOversize, rightOversize] = window.chromeWidths();
- const oversize = Math.max(topOversize, bottomOversize, leftOversize, rightOversize);
+ let oversize = Math.max(topOversize, bottomOversize, leftOversize, rightOversize);
if (rowSpacing !== null)
rowSpacing += oversize;
if (colSpacing !== null)
colSpacing += oversize;
- if (containerBox) {
- const vertical = global.workspaceManager.layout_rows === -1;
+ // Chrome highlights and window titles may exceed the workspace preview area
+ // and also the screen area if there is no overview element below/above/on_the_right of the workspace
+ // The original code tests whether window titles are out of the screen and applies correction accordingly
+ // That is a problem when workspaces are vertically stacked, because this method is called even during transitions between workspaces
+ // In V-Shell, this issue can be solved by reducing the workspace preview scale in the Settings
+ // Original code - horizontal orientation only
+ /* if (containerBox) {
const monitor = Main.layoutManager.monitors[this._monitorIndex];
- const bottomPoint = new Graphene.Point3D();
- if (vertical)
- bottomPoint.x = containerBox.x2;
- else
- bottomPoint.y = containerBox.y2;
-
-
+ const bottomPoint = new Graphene.Point3D({ y: containerBox.y2 });
const transformedBottomPoint =
this._container.apply_transform_to_point(bottomPoint);
- const bottomFreeSpace = vertical
- ? (monitor.x + monitor.height) - transformedBottomPoint.x
- : (monitor.y + monitor.height) - transformedBottomPoint.y;
+ const bottomFreeSpace =
+ (monitor.y + monitor.height) - transformedBottomPoint.y;
const [, bottomOverlap] = window.overlapHeights();
- if ((bottomOverlap + oversize) > bottomFreeSpace && !vertical)
+ if ((bottomOverlap + oversize) > bottomFreeSpace)
containerBox.y2 -= (bottomOverlap + oversize) - bottomFreeSpace;
- }
+ }*/
+
+ // Alternative code reducing the box size unconditionally
+ /* if (containerBox) {
+ const [, bottomOverlap] = window.overlapHeights();
+
+ // Adjusting x1/x2 here is pointless,
+ // x1 only moves window previews to the right and down, x2 has no effect
+ // Prevent window previews from overlapping a workspace preview
+ oversize *= 1.5;
+ containerBox.y1 += oversize;
+ containerBox.y2 -= bottomOverlap + oversize;
+ }*/
return [rowSpacing, colSpacing, containerBox];
},
diff --git a/extensions/45/vertical-workspaces/lib/workspaceAnimation.js b/extensions/47/vertical-workspaces/lib/workspaceAnimation.js
index 32c7df1..e29e3ef 100644
--- a/extensions/45/vertical-workspaces/lib/workspaceAnimation.js
+++ b/extensions/47/vertical-workspaces/lib/workspaceAnimation.js
@@ -3,7 +3,7 @@
* workspacesAnimation.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
diff --git a/extensions/45/vertical-workspaces/lib/workspaceSwitcherPopup.js b/extensions/47/vertical-workspaces/lib/workspaceSwitcherPopup.js
index 358bb1f..cf3d4c1 100644
--- a/extensions/45/vertical-workspaces/lib/workspaceSwitcherPopup.js
+++ b/extensions/47/vertical-workspaces/lib/workspaceSwitcherPopup.js
@@ -3,7 +3,7 @@
* workspacesSwitcherPopup.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -73,6 +73,7 @@ const WorkspaceSwitcherPopupCommon = {
after__init() {
if (opt.ORIENTATION) { // 1-VERTICAL, 0-HORIZONTAL
this._list.vertical = true;
+ this._list.add_style_class_name('ws-switcher-vertical');
}
this._list.set_style('margin: 0;');
if (this.get_constraints()[0])
@@ -89,13 +90,11 @@ const WorkspaceSwitcherPopupCommon = {
_setPopupPosition() {
let workArea;
- if (opt.WS_SW_POPUP_MODE === 1) {
- // workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);*/
+ if (opt.WS_SW_POPUP_MODE === 1)
workArea = global.display.get_monitor_geometry(Main.layoutManager.primaryIndex);
- } else {
- // workArea = Main.layoutManager.getWorkAreaForMonitor(global.display.get_current_monitor());
+ else
workArea = global.display.get_monitor_geometry(global.display.get_current_monitor());
- }
+
let [, natHeight] = this.get_preferred_height(global.screen_width);
let [, natWidth] = this.get_preferred_width(natHeight);
diff --git a/extensions/45/vertical-workspaces/lib/workspaceThumbnail.js b/extensions/47/vertical-workspaces/lib/workspaceThumbnail.js
index 75e5250..cce5046 100644
--- a/extensions/45/vertical-workspaces/lib/workspaceThumbnail.js
+++ b/extensions/47/vertical-workspaces/lib/workspaceThumbnail.js
@@ -3,7 +3,7 @@
* workspaceThumbnail.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -41,7 +41,7 @@ const ThumbnailState = {
const ControlsState = OverviewControls.ControlsState;
-const WORKSPACE_CUT_SIZE = 10;
+const WORKSPACE_CUT_SCALE = 0.15;
const WORKSPACE_KEEP_ALIVE_TIME = 100;
export const WorkspaceThumbnailModule = class {
@@ -85,6 +85,7 @@ export const WorkspaceThumbnailModule = class {
this._overrides.addOverride('WorkspaceThumbnail', WorkspaceThumbnail.WorkspaceThumbnail.prototype, WorkspaceThumbnailCommon);
this._overrides.addOverride('ThumbnailsBoxCommon', WorkspaceThumbnail.ThumbnailsBox.prototype, ThumbnailsBoxCommon);
+ this._overrides.addOverride('WindowClone', WorkspaceThumbnail.WindowClone.prototype, WindowClone);
// replacing opt.ORIENTATION local constant with boxOrientation internal variable allows external customers such as the AATWS extension to control the box orientation.
Main.overview._overview.controls._thumbnailsBox._boxOrientation = opt.ORIENTATION;
@@ -335,7 +336,7 @@ const WorkspaceThumbnailCommon = {
// in OVERVIEW MODE 2 windows are not spread and workspace is not scaled
// we need to repeat transition to the overview state 1 (window picker), but with spreading windows animation
if (this.metaWorkspace.active) {
- Main.overview._overview.controls._searchController._setSearchActive(false);
+ Main.overview.searchController._setSearchActive(false);
opt.WORKSPACE_MODE = 1;
// setting value to 0 would reset WORKSPACE_MODE
stateAdjustment.value = 0.01;
@@ -702,10 +703,19 @@ const ThumbnailsBoxCommon = {
},
};
+function _getWorkspaceCutSize(tmbSize, index) {
+ let cutSize = WORKSPACE_CUT_SCALE * tmbSize;
+ // Compensate for the missing thumbnail in front of the first one
+ if (index === 0)
+ cutSize *= 1.5;
+ return Math.floor(cutSize);
+}
+
const ThumbnailsBoxVertical = {
_getPlaceholderTarget(index, spacing, rtl) {
this._dropPlaceholder.add_style_class_name('placeholder-vertical');
const workspace = this._thumbnails[index];
+ const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.height, index);
let targetY1;
let targetY2;
@@ -740,6 +750,7 @@ const ThumbnailsBoxVertical = {
_withinWorkspace(y, index, rtl) {
const length = this._thumbnails.length;
const workspace = this._thumbnails[index];
+ const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.height, index);
let workspaceY1 = workspace.y + WORKSPACE_CUT_SIZE;
let workspaceY2 = workspace.y + workspace.height - WORKSPACE_CUT_SIZE;
@@ -788,12 +799,14 @@ const ThumbnailsBoxVertical = {
const ratio = this._porthole.width / this._porthole.height;
const tmbHeight = themeNode.adjust_for_width(forWidth) / ratio;
- const naturalheight = this._thumbnails.reduce((accumulator, thumbnail/* , index*/) => {
- const progress = 1 - thumbnail.collapse_fraction;
- const height = tmbHeight * progress;
- return accumulator + height;
- }, 0);
- return themeNode.adjust_preferred_width(totalSpacing, Math.round(naturalheight));
+ const naturalHeight = Math.round(
+ this._thumbnails.reduce((accumulator, thumbnail/* , index*/) => {
+ const progress = 1 - thumbnail.collapse_fraction;
+ const height = tmbHeight * progress;
+ return accumulator + height;
+ }, 0)
+ );
+ return themeNode.adjust_preferred_width(totalSpacing, naturalHeight);
},
// removes extra space (extraWidth in the original function), we need the box as accurate as possible
@@ -976,6 +989,7 @@ const ThumbnailsBoxVertical = {
const ThumbnailsBoxHorizontal = {
_getPlaceholderTarget(index, spacing, rtl) {
const workspace = this._thumbnails[index];
+ const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.width, index);
let targetX1;
let targetX2;
@@ -1010,6 +1024,7 @@ const ThumbnailsBoxHorizontal = {
_withinWorkspace(x, index, rtl) {
const length = this._thumbnails.length;
const workspace = this._thumbnails[index];
+ const WORKSPACE_CUT_SIZE = _getWorkspaceCutSize(workspace.width, index);
let workspaceX1 = workspace.x + WORKSPACE_CUT_SIZE;
let workspaceX2 = workspace.x + workspace.width - WORKSPACE_CUT_SIZE;
@@ -1060,11 +1075,13 @@ const ThumbnailsBoxHorizontal = {
const tmbWidth = themeNode.adjust_for_height(forHeight) / ratio;
- const naturalWidth = this._thumbnails.reduce((accumulator, thumbnail) => {
- const progress = 1 - thumbnail.collapse_fraction;
- const width = tmbWidth * progress;
- return accumulator + width;
- }, 0);
+ const naturalWidth = Math.round(
+ this._thumbnails.reduce((accumulator, thumbnail) => {
+ const progress = 1 - thumbnail.collapse_fraction;
+ const width = tmbWidth * progress;
+ return accumulator + width;
+ }, 0)
+ );
return themeNode.adjust_preferred_width(totalSpacing, naturalWidth);
},
@@ -1234,3 +1251,11 @@ const ThumbnailsBoxHorizontal = {
_updateShouldShow: ThumbnailsBoxVertical._updateShouldShow,
};
+
+const WindowClone = {
+ after__init() {
+ // Make it transparent and smaller than usual while dragging
+ this._draggable._dragActorOpacity = 200;
+ this._draggable._dragActorMaxSize = 150;
+ },
+};
diff --git a/extensions/45/vertical-workspaces/lib/workspacesView.js b/extensions/47/vertical-workspaces/lib/workspacesView.js
index 98b3062..5c0d36b 100644
--- a/extensions/45/vertical-workspaces/lib/workspacesView.js
+++ b/extensions/47/vertical-workspaces/lib/workspacesView.js
@@ -3,7 +3,7 @@
* workspacesView.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*
*/
@@ -69,6 +69,8 @@ export const WorkspacesViewModule = class {
if (!desktopCubeConflict)
this._overrides.addOverride('WorkspacesView', WorkspacesView.WorkspacesView.prototype, WorkspacesViewCommon);
+ else
+ this._overrides.removeOverride('WorkspacesView');
this._overrides.addOverride('WorkspacesDisplay', WorkspacesView.WorkspacesDisplay.prototype, WorkspacesDisplayCommon);
this._overrides.addOverride('ExtraWorkspaceView', WorkspacesView.ExtraWorkspaceView.prototype, ExtraWorkspaceViewCommon);
@@ -208,18 +210,26 @@ const WorkspacesViewCommon = {
// if we disable workspaces that we can't or don't need to see, transition animations will be noticeably smoother
// only the current ws needs to be visible during overview transition animations
// and only current and adjacent ws when switching ws
- w.visible = (this._animating && wsScrollProgress && distanceToCurrentWorkspace <= (opt.NUMBER_OF_VISIBLE_NEIGHBORS + 1)) || scaleProgress === 1 ||
- (opt.WORKSPACE_MAX_SPACING > 340 && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && currentState === ControlsState.WINDOW_PICKER) ||
- (this._monitorIndex !== primaryMonitor && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS) || (!opt.WS_ANIMATION && distanceToCurrentWorkspace < opt.NUMBER_OF_VISIBLE_NEIGHBORS) ||
- (opt.WORKSPACE_MAX_SPACING < 340 && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && currentState <= ControlsState.WINDOW_PICKER &&
- ((initialState < ControlsState.APP_GRID && finalState < ControlsState.APP_GRID))
- );
+ w.visible =
+ (this._animating && wsScrollProgress && distanceToCurrentWorkspace <= (opt.NUMBER_OF_VISIBLE_NEIGHBORS + 1)) ||
+ scaleProgress === 1 ||
+ (opt.WORKSPACE_MAX_SPACING >= opt.WS_MAX_SPACING_OFF_SCREEN &&
+ distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS &&
+ currentState === ControlsState.WINDOW_PICKER
+ ) ||
+ (this._monitorIndex !== primaryMonitor && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS) ||
+ (!opt.WS_ANIMATION && distanceToCurrentWorkspace < opt.NUMBER_OF_VISIBLE_NEIGHBORS) ||
+ (distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS &&
+ currentState <= ControlsState.WINDOW_PICKER &&
+ (initialState < ControlsState.APP_GRID && finalState < ControlsState.APP_GRID)
+ );
// after transition from APP_GRID to WINDOW_PICKER state,
// adjacent workspaces are hidden and we need them to show up
// make them visible during animation can impact smoothness of the animation
// so we show them after the animation finished, move them to their position from outside of the monitor
- if (!w.visible && distanceToCurrentWorkspace === 1 && initialState === ControlsState.APP_GRID && currentState === ControlsState.WINDOW_PICKER) {
+ if (currentState === ControlsState.WINDOW_PICKER && !w.visible && distanceToCurrentWorkspace <= opt.NUMBER_OF_VISIBLE_NEIGHBORS && initialState === ControlsState.APP_GRID) {
+ w.remove_all_transitions();
w.visible = true;
const directionNext = distance > 0;
if (!opt.ORIENTATION) {
@@ -263,6 +273,7 @@ const WorkspacesViewCommon = {
adjustments.push(this._workspaces[workspaceIndex]._background._stateAdjustment);
}
+ opt.WORKSPACE_MODE = 1;
adjustments.forEach(adj => {
if (adj.value === 0) {
adj.value = 0;
@@ -270,7 +281,6 @@ const WorkspacesViewCommon = {
duration: 200,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
- opt.WORKSPACE_MODE = 1;
if (callback)
callback();
},
@@ -315,114 +325,103 @@ const SecondaryMonitorDisplayVertical = {
return { opacity, scale, translationX };
},
- _getThumbnailsWidth(box, spacing) {
- if (opt.SEC_WS_TMB_HIDDEN)
- return 0;
+ _getWorkspacesBoxForState(state, box, workArea, wsTmbWidth, spacing) {
+ let workspaceBox = box.copy();
- const [width, height] = box.get_size();
- const { expandFraction } = this._thumbnails;
- const [, thumbnailsWidth] = this._thumbnails.get_preferred_width(height - 2 * spacing);
- let scaledWidth;
- if (opt.SEC_WS_PREVIEW_SHIFT && !opt.PANEL_DISABLED)
- scaledWidth = ((height - Main.panel.height) * opt.SEC_MAX_THUMBNAIL_SCALE) * (width / height);
- else
- scaledWidth = width * opt.SEC_MAX_THUMBNAIL_SCALE;
+ if (
+ (state === ControlsState.WINDOW_PICKER || state === ControlsState.APP_GRID) &&
+ !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)
+ ) {
+ workspaceBox = workArea.copy();
+ const [startX, startY] = workspaceBox.get_origin();
+ let [width, height] = workspaceBox.get_size();
- return Math.min(
- thumbnailsWidth * expandFraction,
- Math.round(scaledWidth));
- },
+ let wsBoxWidth = width - (wsTmbWidth ? wsTmbWidth + spacing : 0) - 2 * spacing;
+ let wsBoxHeight = height - 2 * spacing;
- _getWorkspacesBoxForState(state, box, padding, thumbnailsWidth, spacing) {
- // const { ControlsState } = OverviewControls;
- const workspaceBox = box.copy();
- const [width, height] = workspaceBox.get_size();
+ const ratio = width / height;
+ let wRatio = wsBoxWidth / wsBoxHeight;
+ let scale = ratio / wRatio;
- let wWidth, wHeight, wsbX, wsbY, offset, yShift;
- switch (state) {
- case ControlsState.HIDDEN:
- break;
- case ControlsState.WINDOW_PICKER:
- case ControlsState.APP_GRID:
- if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)
- break;
-
- yShift = 0;
- if (opt.SEC_WS_PREVIEW_SHIFT && !opt.PANEL_DISABLED) {
- if (opt.PANEL_POSITION_TOP)
- yShift = Main.panel.height;
- else
- yShift = -Main.panel.height;
+ if (scale > 1) {
+ wsBoxHeight /= scale;
+ wsBoxWidth = wsBoxHeight * ratio;
+ } else {
+ wsBoxWidth *= scale;
+ wsBoxHeight = wsBoxWidth / ratio;
}
- wWidth = width - thumbnailsWidth - 5 * spacing;
- wHeight = Math.min(wWidth / (width / height) - Math.abs(yShift), height - 4 * spacing);
- wWidth = Math.round(wWidth * opt.SEC_WS_PREVIEW_SCALE);
- wHeight = Math.round(wHeight * opt.SEC_WS_PREVIEW_SCALE);
+ // height decides the actual size, ratio is given by the workArea
+ wsBoxHeight = Math.round(wsBoxHeight * opt.SEC_WS_PREVIEW_SCALE);
+ wsBoxWidth = Math.round(wsBoxWidth * opt.SEC_WS_PREVIEW_SCALE);
- offset = Math.round(width - thumbnailsWidth - wWidth) / 2;
- if (opt.SEC_WS_TMB_LEFT)
- wsbX = thumbnailsWidth + offset;
- else
- wsbX = offset;
+ let offset = Math.round(width - wsTmbWidth - wsBoxWidth - spacing) / 2;
+
+ const wsbX = startX + opt.SEC_WS_TMB_LEFT
+ ? wsTmbWidth + spacing + offset
+ : offset;
- wsbY = Math.round((height - wHeight - Math.abs(yShift)) / 2 + yShift);
+ const wsbY = Math.round((startY + height - wsBoxHeight) / 2);
workspaceBox.set_origin(wsbX, wsbY);
- workspaceBox.set_size(wWidth, wHeight);
- break;
+ workspaceBox.set_size(wsBoxWidth, wsBoxHeight);
}
return workspaceBox;
},
+ _getWorkAreaBox(box) {
+ if (!opt.SEC_WS_PREVIEW_SHIFT || !Main.panel.visible)
+ return box;
+
+ const workArea = box.copy();
+ const panelHeight = Main.panel.height;
+ workArea.y1 += opt.PANEL_POSITION_TOP ? panelHeight : 0;
+ workArea.y2 -= opt.PANEL_POSITION_BOTTOM ? panelHeight : 0;
+
+ return workArea;
+ },
+
vfunc_allocate(box) {
this.set_allocation(box);
const themeNode = this.get_theme_node();
const contentBox = themeNode.get_content_box(box);
- const [width, height] = contentBox.get_size();
- const { expandFraction } = this._thumbnails;
- const spacing = themeNode.get_length('spacing') * expandFraction;
- const padding = Math.round(0.1 * height);
- let thumbnailsWidth = 0;
- let thumbnailsHeight = 0;
+ const workArea = this._getWorkAreaBox(contentBox);
+
+ let [width, height] = workArea.get_size();
+ let [startX, startY] = workArea.get_origin();
+
+ const spacing = opt.SPACING;
+
+ let wsTmbWidth = 0;
+ let wsTmbHeight = 0;
this._thumbnails.visible = !opt.SEC_WS_TMB_HIDDEN;
if (this._thumbnails.visible) {
- const reduceBoxHeight = opt.SEC_WS_PREVIEW_SHIFT && Main.panel.visible ? Main.panel.height : 0;
-
- thumbnailsWidth = width * opt.SEC_MAX_THUMBNAIL_SCALE;
+ wsTmbWidth = Math.round(width * opt.SEC_MAX_THUMBNAIL_SCALE);
let totalTmbSpacing;
- [totalTmbSpacing, thumbnailsHeight] = this._thumbnails.get_preferred_height(thumbnailsWidth);
- thumbnailsHeight = Math.round(thumbnailsHeight + totalTmbSpacing);
+ [totalTmbSpacing, wsTmbHeight] = this._thumbnails.get_preferred_height(wsTmbWidth);
+ wsTmbHeight += totalTmbSpacing;
- const thumbnailsHeightMax = height - spacing - reduceBoxHeight;
+ const thumbnailsHeightMax = height - spacing;
- if (thumbnailsHeight > thumbnailsHeightMax) {
- thumbnailsHeight = thumbnailsHeightMax;
- thumbnailsWidth = Math.round(this._thumbnails.get_preferred_width(thumbnailsHeight)[1]);
+ if (wsTmbHeight > thumbnailsHeightMax) {
+ wsTmbHeight = thumbnailsHeightMax;
+ wsTmbWidth = Math.round(this._thumbnails.get_preferred_width(wsTmbHeight)[1]);
}
- let wsTmbX;
- if (opt.SEC_WS_TMB_LEFT) { // left
- wsTmbX = spacing / 2;
- this._thumbnails._positionLeft = true;
- } else {
- wsTmbX = width - spacing / 2 - thumbnailsWidth;
- this._thumbnails._positionLeft = false;
- }
+ let wsTmbX = opt.SEC_WS_TMB_LEFT
+ ? startX + spacing
+ : startX + width - wsTmbWidth - spacing;
- const childBox = new Clutter.ActorBox();
- const availSpace = height - thumbnailsHeight;
+ let offset = (height - wsTmbHeight) / 2;
+ const wsTmbY = startY + Math.round(offset - opt.SEC_WS_TMB_POSITION_ADJUSTMENT * (offset - spacing));
- let wsTmbY = availSpace / 2;
- wsTmbY -= opt.SEC_WS_TMB_POSITION_ADJUSTMENT * wsTmbY;
- wsTmbY += opt.SEC_WS_PREVIEW_SHIFT && Main.panel.visible ? Main.panel.height : 0;
-
- childBox.set_origin(Math.round(wsTmbX), Math.round(wsTmbY));
- childBox.set_size(thumbnailsWidth, thumbnailsHeight);
+ const childBox = new Clutter.ActorBox();
+ childBox.set_origin(wsTmbX, wsTmbY);
+ childBox.set_size(wsTmbWidth, wsTmbHeight);
this._thumbnails.allocate(childBox);
}
@@ -431,7 +430,7 @@ const SecondaryMonitorDisplayVertical = {
} = this._overviewAdjustment.getStateTransitionParams();
let workspacesBox;
- const workspaceParams = [contentBox, padding, thumbnailsWidth, spacing];
+ const workspaceParams = [contentBox, workArea, wsTmbWidth, spacing];
if (!transitioning) {
workspacesBox =
this._getWorkspacesBoxForState(currentState, ...workspaceParams);
@@ -561,93 +560,93 @@ const SecondaryMonitorDisplayHorizontal = {
return { opacity, scale, translationY };
},
- _getWorkspacesBoxForState(state, box, padding, thumbnailsHeight, spacing) {
- // const { ControlsState } = OverviewControls;
- const workspaceBox = box.copy();
- const [width, height] = workspaceBox.get_size();
+ _getWorkspacesBoxForState(state, box, workArea, wsTmbHeight, spacing) {
+ let workspaceBox = box.copy();
- let wWidth, wHeight, wsbX, wsbY, offset, yShift;
- switch (state) {
- case ControlsState.HIDDEN:
- break;
- case ControlsState.WINDOW_PICKER:
- case ControlsState.APP_GRID:
- if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)
- break;
-
- yShift = 0;
- if (opt.SEC_WS_PREVIEW_SHIFT && !opt.PANEL_DISABLED) {
- if (opt.PANEL_POSITION_TOP)
- yShift = Main.panel.height;
- else
- yShift = -Main.panel.height;
+ if (
+ (state === ControlsState.WINDOW_PICKER || state === ControlsState.APP_GRID) &&
+ !(opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE)
+ ) {
+ workspaceBox = workArea.copy();
+ const [startX, startY] = workspaceBox.get_origin();
+ let [width, height] = workspaceBox.get_size();
+
+ let wsBoxWidth = width - 2 * spacing;
+ let wsBoxHeight = height - (wsTmbHeight ? wsTmbHeight + spacing : 0) - 2 * spacing;
+
+ const ratio = width / height;
+ let wRatio = wsBoxWidth / wsBoxHeight;
+ let scale = ratio / wRatio;
+
+ if (scale > 1) {
+ wsBoxHeight /= scale;
+ wsBoxWidth = wsBoxHeight * ratio;
+ } else {
+ wsBoxWidth *= scale;
+ wsBoxHeight = wsBoxWidth / ratio;
}
- wHeight = height - Math.abs(yShift) - (thumbnailsHeight ? thumbnailsHeight + 4 * spacing : padding);
- wWidth = Math.min(wHeight * (width / height), width - 5 * spacing);
- wWidth = Math.round(wWidth * opt.SEC_WS_PREVIEW_SCALE);
- wHeight = Math.round(wHeight * opt.SEC_WS_PREVIEW_SCALE);
+ // height decides the actual size, ratio is given by the workArea
+ wsBoxHeight = Math.round(wsBoxHeight * opt.SEC_WS_PREVIEW_SCALE);
+ wsBoxWidth = Math.round(wsBoxWidth * opt.SEC_WS_PREVIEW_SCALE);
- offset = Math.round((height - thumbnailsHeight - wHeight - Math.abs(yShift)) / 2);
- if (opt.SEC_WS_TMB_TOP)
- wsbY = thumbnailsHeight + offset;
- else
- wsbY = offset;
+ let offset = Math.round(height - wsTmbHeight - wsBoxHeight - spacing) / 2;
+
+ const wsbX = Math.round((startX + width - wsBoxWidth) / 2);
- wsbY += yShift;
- wsbX = Math.round((width - wWidth) / 2);
+ const wsbY = startY + opt.SEC_WS_TMB_TOP
+ ? wsTmbHeight + spacing + offset
+ : offset;
workspaceBox.set_origin(wsbX, wsbY);
- workspaceBox.set_size(wWidth, wHeight);
- break;
+ workspaceBox.set_size(wsBoxWidth, wsBoxHeight);
}
return workspaceBox;
},
+ _getWorkAreaBox: SecondaryMonitorDisplayVertical._getWorkAreaBox,
+
vfunc_allocate(box) {
this.set_allocation(box);
const themeNode = this.get_theme_node();
const contentBox = themeNode.get_content_box(box);
- const [width, height] = contentBox.get_size();
- const { expandFraction } = this._thumbnails;
- const spacing = themeNode.get_length('spacing') * expandFraction;
- const padding = Math.round(0.1 * height);
- let thumbnailsWidth = 0;
- let thumbnailsHeight = 0;
+ const workArea = this._getWorkAreaBox(contentBox);
+
+ let [width, height] = workArea.get_size();
+ let [startX, startY] = workArea.get_origin();
+
+ const spacing = opt.SPACING;
+
+ let wsTmbWidth = 0;
+ let wsTmbHeight = 0;
this._thumbnails.visible = !opt.SEC_WS_TMB_HIDDEN;
if (this._thumbnails.visible) {
- const reservedHeight = opt.SEC_WS_PREVIEW_SHIFT && Main.panel.visible ? Main.panel.height : 0;
-
- thumbnailsHeight = height * opt.SEC_MAX_THUMBNAIL_SCALE;
+ wsTmbHeight = Math.round(height * opt.SEC_MAX_THUMBNAIL_SCALE);
let totalTmbSpacing;
- [totalTmbSpacing, thumbnailsWidth] = this._thumbnails.get_preferred_width(thumbnailsHeight);
- thumbnailsWidth = Math.round(thumbnailsWidth + totalTmbSpacing);
+ [totalTmbSpacing, wsTmbWidth] = this._thumbnails.get_preferred_width(wsTmbHeight);
+ wsTmbWidth += totalTmbSpacing;
- const thumbnailsWidthMax = width - spacing;
+ const thumbnailsWidthMax = width - 2 * spacing;
- if (thumbnailsWidth > thumbnailsWidthMax) {
- thumbnailsWidth = thumbnailsWidthMax;
- thumbnailsHeight = Math.round(this._thumbnails.get_preferred_height(thumbnailsWidth)[1]);
+ if (wsTmbWidth > thumbnailsWidthMax) {
+ wsTmbWidth = thumbnailsWidthMax;
+ wsTmbHeight = Math.round(this._thumbnails.get_preferred_height(wsTmbWidth)[1]);
}
- let wsTmbY;
- if (opt.SEC_WS_TMB_TOP)
- wsTmbY = spacing / 2 + reservedHeight;
- else
- wsTmbY = height - spacing / 2 - thumbnailsHeight;
+ let wsTmbY = opt.SEC_WS_TMB_TOP
+ ? startY + spacing
+ : startY + height - wsTmbHeight - spacing;
- const childBox = new Clutter.ActorBox();
- const availSpace = width - thumbnailsWidth;
-
- let wsTmbX = availSpace / 2;
- wsTmbX -= opt.SEC_WS_TMB_POSITION_ADJUSTMENT * wsTmbX;
+ let offset = (width - wsTmbWidth) / 2;
+ const wsTmbX = startX + Math.round(offset - opt.SEC_WS_TMB_POSITION_ADJUSTMENT * (offset - spacing));
- childBox.set_origin(Math.round(wsTmbX), Math.round(wsTmbY));
- childBox.set_size(thumbnailsWidth, thumbnailsHeight);
+ const childBox = new Clutter.ActorBox();
+ childBox.set_origin(wsTmbX, wsTmbY);
+ childBox.set_size(wsTmbWidth, wsTmbHeight);
this._thumbnails.allocate(childBox);
}
@@ -656,7 +655,7 @@ const SecondaryMonitorDisplayHorizontal = {
} = this._overviewAdjustment.getStateTransitionParams();
let workspacesBox;
- const workspaceParams = [contentBox, padding, thumbnailsHeight, spacing];
+ const workspaceParams = [contentBox, workArea, wsTmbHeight, spacing];
if (!transitioning) {
workspacesBox =
this._getWorkspacesBoxForState(currentState, ...workspaceParams);
@@ -759,14 +758,12 @@ const ExtraWorkspaceViewCommon = {
exposeWindows() {
const adjustment = this._workspace._background._stateAdjustment;
+ opt.WORKSPACE_MODE = 1;
if (adjustment.value === 0) {
adjustment.value = 0;
adjustment.ease(1, {
duration: 200,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- onComplete: () => {
- opt.WORKSPACE_MODE = 1;
- },
});
}
},
@@ -805,7 +802,18 @@ const WorkspacesDisplayCommon = {
upper: 0, // FitMode.SINGLE,
}),
this._overviewAdjustment);
- Main.layoutManager.overviewGroup.add_actor(view);
+ Main.layoutManager.overviewGroup.add_child(view);
+
+ if (opt.CLICK_EMPTY_CLOSE) {
+ // Allow users to close the overview by clicking on an empty space on the secondary monitor
+ // The primary monitor overview is handled in the overviewControls
+ const clickAction = new Clutter.ClickAction();
+ clickAction.connect('clicked', () => {
+ Main.overview.hide();
+ });
+ view.reactive = true;
+ view.add_action(clickAction);
+ }
}
this._workspacesViews.push(view);
@@ -906,15 +914,15 @@ const WorkspacesDisplayCommon = {
break;
case Clutter.KEY_space:
if (Me.Util.isCtrlPressed() && Me.Util.isShiftPressed()) {
- Me.Util.activateSearchProvider(Me.ESP_PREFIX);
+ Me.Util.openPreferences();
} else if (Me.Util.isAltPressed()) {
Main.ctrlAltTabManager._items.forEach(i => {
if (i.sortGroup === 1 && i.name === 'Dash')
Main.ctrlAltTabManager.focusGroup(i);
});
- } else if (opt.get('recentFilesSearchProviderModule') && Me.Util.isCtrlPressed()) {
- Me.Util.activateSearchProvider(Me.RFSP_PREFIX);
- } else if (opt.get('windowSearchProviderModule')) {
+ } else if (Me.Util.getEnabledExtensions('extensions-search-provider').length && Me.Util.isCtrlPressed()) {
+ Me.Util.activateSearchProvider(Me.ESP_PREFIX);
+ } else if (Me.Util.getEnabledExtensions('windows-search-provider').length) {
Me.Util.activateSearchProvider(Me.WSP_PREFIX);
}
@@ -924,7 +932,7 @@ const WorkspacesDisplayCommon = {
case Clutter.KEY_Right:
case Clutter.KEY_Up:
case Clutter.KEY_Tab:
- if (Main.overview._overview._controls._searchController.searchActive) {
+ if (Main.overview.searchController.searchActive) {
Main.overview.searchEntry.grab_key_focus();
} else if (opt.OVERVIEW_MODE2 && !opt.WORKSPACE_MODE && state === 1) {
// expose windows by "clicking" on ws thumbnail
diff --git a/extensions/47/vertical-workspaces/meson.build b/extensions/47/vertical-workspaces/meson.build
new file mode 100644
index 0000000..1c50d8d
--- /dev/null
+++ b/extensions/47/vertical-workspaces/meson.build
@@ -0,0 +1,25 @@
+project('vertical-workspaces')
+
+gnome = import('gnome')
+i18n = import('i18n')
+
+uuid = 'vertical-workspaces@G-dH.github.com'
+rdnn = 'org.gnome.shell.extensions.vertical-workspaces'
+
+datadir = get_option('datadir')
+extension_dir = datadir / 'gnome-shell' / 'extensions' / uuid
+
+install_data(
+ [
+ 'extension.js',
+ 'metadata.json',
+ 'prefs.js',
+ 'stylesheet.css',
+ ],
+ install_dir : extension_dir,
+)
+
+install_subdir('lib', install_dir : extension_dir)
+
+subdir('schemas')
+subdir('po')
diff --git a/extensions/45/vertical-workspaces/metadata.json b/extensions/47/vertical-workspaces/metadata.json
index 895047e..1114017 100644
--- a/extensions/45/vertical-workspaces/metadata.json
+++ b/extensions/47/vertical-workspaces/metadata.json
@@ -3,7 +3,9 @@
"uuid": "vertical-workspaces@G-dH.github.com",
"description": "Customize your GNOME Shell UX to suit your workflow, whether you like horizontally or vertically stacked workspaces.",
"shell-version": [
- "45"
+ "45",
+ "46",
+ "47"
],
"session-modes": [
"user",
@@ -15,5 +17,6 @@
},
"gettext-domain": "vertical-workspaces",
"settings-schema": "org.gnome.shell.extensions.vertical-workspaces",
- "version-name": "45.2"
+ "version-name": "46.4"
}
+
diff --git a/extensions/47/vertical-workspaces/po/LINGUAS b/extensions/47/vertical-workspaces/po/LINGUAS
new file mode 100644
index 0000000..6f31458
--- /dev/null
+++ b/extensions/47/vertical-workspaces/po/LINGUAS
@@ -0,0 +1,2 @@
+cs
+nl
diff --git a/extensions/47/vertical-workspaces/po/cs.po b/extensions/47/vertical-workspaces/po/cs.po
new file mode 100644
index 0000000..2df5095
--- /dev/null
+++ b/extensions/47/vertical-workspaces/po/cs.po
@@ -0,0 +1,2568 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR GdH
+# This file is distributed under the same license as the vertical-workspaces package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: vertical-workspaces\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-19 08:40+0200\n"
+"PO-Revision-Date: 2024-07-19 08:50+0200\n"
+"Last-Translator: Ludek Vydra <lvtran@u.k2.cz>\n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: prefs.js:29
+msgid "Profiles"
+msgstr "Profily"
+
+#: prefs.js:34 prefs.js:1977
+msgid "Layout"
+msgstr "Rozložení"
+
+#: prefs.js:39
+msgid "Appearance"
+msgstr "Vzhled"
+
+#: prefs.js:44
+msgid "Behavior"
+msgstr "Vlastnosti"
+
+#: prefs.js:49 prefs.js:345
+msgid "App Grid"
+msgstr "Mřížka"
+
+#: prefs.js:54
+msgid "Modules"
+msgstr "Moduly"
+
+#: prefs.js:59
+msgid "Misc"
+msgstr "Různé"
+
+#: prefs.js:64
+msgid "About"
+msgstr "O aplikaci"
+
+#: prefs.js:107
+msgid "Custom Profiles"
+msgstr "Uživatelské profily"
+
+#: prefs.js:108
+msgid "Sets of settings that can help you with the initial customization"
+msgstr "Sady nastavení jež vám mohou pomoci s počátečním přizpůsobením"
+
+#: prefs.js:113
+msgid "Profile 1"
+msgstr "Profil 1"
+
+#: prefs.js:119
+msgid "Profile 2"
+msgstr "Profil 2"
+
+#: prefs.js:125
+msgid "Profile 3"
+msgstr "Profil 3"
+
+#: prefs.js:131
+msgid "Profile 4"
+msgstr "Profil 4"
+
+#: prefs.js:146 prefs.js:629 prefs.js:1185 prefs.js:1968
+msgid "Dash"
+msgstr "Dash"
+
+#: prefs.js:152
+msgid "Dash Position"
+msgstr "Pozice Dash"
+
+#: prefs.js:157 prefs.js:417
+msgid "Bottom"
+msgstr "Dole"
+
+#: prefs.js:158
+msgid "Left"
+msgstr "Vlevo"
+
+#: prefs.js:159
+msgid "Top"
+msgstr "Nahoře"
+
+#: prefs.js:160
+msgid "Right"
+msgstr "Vpravo"
+
+#: prefs.js:161 prefs.js:205 prefs.js:548
+msgid "Hide"
+msgstr "Skrýt"
+
+#: prefs.js:169
+msgid "Center Horizontal Dash to Workspace"
+msgstr "Vycentrovat horizontální Dash"
+
+#: prefs.js:170
+msgid ""
+"If the Dash Position is set to Top or Bottom, the position will be "
+"recalculated relative to the workspace preview instead of the screen"
+msgstr ""
+"Pokud je pozice Dash nastavena na Nahoře nebo Dole, pozice se přepočítá "
+"vzhledem k náhledu pracovního prostoru namísto obrazovky"
+
+#: prefs.js:189
+msgid "Fine Tune Dash Position"
+msgstr "Upravit pozici Dash"
+
+#: prefs.js:190
+msgid ""
+"Adjusts the position of the dash on the axis given by the orientation of the "
+"workspaces"
+msgstr "Upraví polohu Dash na dané ose posle orientace pracovních ploch"
+
+#: prefs.js:200
+msgid "Show Apps Icon Position"
+msgstr "Nastavit pozici ikony aplikací"
+
+#: prefs.js:201
+msgid "Sets the position of the \"Show Applications\" icon in the Dash"
+msgstr "Nastavuje pozici ikony \"Zobrazit aplikace\" v Dash"
+
+#: prefs.js:206
+msgid "Start"
+msgstr "Začátek"
+
+#: prefs.js:207
+msgid "End"
+msgstr "Konec"
+
+#: prefs.js:215
+msgid "Workspace Thumbnails / Orientation"
+msgstr "Náhledy pracovního prostoru / Orientace"
+
+#: prefs.js:221
+msgid "Thumbnails Position / Workspaces Orientation"
+msgstr "Pozice náhledů / Orientace pracovních ploch"
+
+#: prefs.js:222
+msgid ""
+"Position of the workspace thumbnails on the screen also sets orientation of "
+"the workspaces to vertical or horizontal. You have two options to disable "
+"workspace thumbnails, one sets workspaces to vertical orientation, the "
+"second one to horizontal."
+msgstr ""
+"Umístění miniatur pracovních ploch na obrazovce také nastavuje orientaci "
+"pracovních ploch na vertikální nebo horizontální. Máte dvě možnosti jak "
+"zakázat miniatury pracovních ploch, jedna nastaví orientaci pracovní plochy "
+"na vertikální , druhá na horizontální."
+
+#: prefs.js:227
+msgid "Left \t Vertical Orientation"
+msgstr "Vlevo \t Svisle"
+
+#: prefs.js:228
+msgid "Right \t Vertical Orientation"
+msgstr "Vpravo \t Svisle"
+
+#: prefs.js:229
+msgid "Hide \t Vertical Orientation"
+msgstr "Skryj \t Svisle"
+
+#: prefs.js:230
+msgid "Top \t Horizontal Orientation"
+msgstr "Nahoře \t Vodorovně"
+
+#: prefs.js:231
+msgid "Bottom \t Horizontal Orientation"
+msgstr "Dole \t Vodorovně"
+
+#: prefs.js:232
+msgid "Hide \t Horizontal Orientation"
+msgstr "Skryj \t Vodorovně"
+
+#: prefs.js:248 prefs.js:564
+msgid "Fine Tune Workspace Thumbnails Position"
+msgstr "Doladit pozice miniatur pracovního prostoru"
+
+#: prefs.js:249 prefs.js:565
+msgid ""
+"Adjusts the position of the thumbnails on the axis given by the orientation "
+"of the workspaces"
+msgstr "Upraví polohu miniatur na ose dané orientací pracovních ploch"
+
+#: prefs.js:257
+msgid "Reserve Full Screen Height/Width for Thumbnails"
+msgstr "Vyhradit výšku/šířku celé obrazovky pro miniatury"
+
+#: prefs.js:258
+msgid ""
+"The whole screen height/width will be reserved for workspace thumbnails at "
+"the expense of space available for Dash (if the Dash is oriented in a "
+"different axis)."
+msgstr ""
+"Celá výška/šířka obrazovky bude vyhrazena pro miniatury pracovního prostoru "
+"na úkor místa dostupného pro Dash (pokud je Dash orientován v jiné ose)."
+
+#: prefs.js:275
+msgid "Workspace Thumbnails Max Scale - Window Picker"
+msgstr "Miniatury pracovního prostoru Maximální měřítko - Výběr okna"
+
+#: prefs.js:276
+msgid ""
+"Adjusts the maximum size of the workspace thumbnails in the overview "
+"(percentage relative to display width)"
+msgstr ""
+"Upraví maximální velikost miniatur pracovního prostoru (v procentech "
+"vzhledem k šířce zobrazení)"
+
+#: prefs.js:293
+msgid "Workspace Thumbnails Max Scale - App View"
+msgstr "Miniatury pracovního prostoru Maximální měřítko -Aplikační pohled"
+
+#: prefs.js:294
+msgid "Allows you to set different thumbnails scale for the Applications view"
+msgstr "Umožňuje nastavit různé měřítko miniatur pro zobrazení Aplikace"
+
+#: prefs.js:302 prefs.js:822
+msgid "Workspace Preview"
+msgstr "Náhled pracovního prostoru"
+
+#: prefs.js:317
+msgid "Workspaces Scale"
+msgstr "Měřítko pracovních prostorů"
+
+#: prefs.js:318
+msgid ""
+"Allows to shrink workspace previews to adjust spacing or fit more of the "
+"adjacent workspaces on the screen. Default size is calculated to use all "
+"available space with minimal spacing"
+msgstr ""
+"Umožňuje zmenšit náhledy pracovních ploch, aby se upravily rozestupy nebo "
+"aby se na obrazovku vešlo více sousedních pracovních ploch. Výchozí velikost "
+"je vypočtena tak, aby se využil veškerý dostupný prostor s minimálními "
+"rozestupy"
+
+#: prefs.js:335
+msgid "Workspaces Spacing"
+msgstr "Rozestupy pracovních prostorů"
+
+#: prefs.js:336
+msgid ""
+"Adjusts spacing between workspace previews so you can control how much of "
+"the adjacent workspaces overlap to the current workspace overview. Default "
+"value should set the adjacent workspaces off-screen."
+msgstr ""
+"Upravuje rozestupy mezi náhledy pracovních ploch, tedy můžete ovlivnit, jak "
+"moc se sousední pracovní plochy překrývají s aktuálním přehledem pracovních "
+"ploch. Výchozí hodnota by měla nastavit sousední pracovní plochy mimo "
+"obrazovku."
+
+#: prefs.js:351
+msgid "Center App Grid"
+msgstr "Vycentrovat mřížku aplikace"
+
+#: prefs.js:352
+msgid "Centers the app grid relative to the display instead of available space"
+msgstr ""
+"Zobrazení vyhledávání bude vystředěno na displej namísto dostupného místa"
+
+#: prefs.js:361
+msgid "Search View"
+msgstr "Zobrazení vyhledávání"
+
+#: prefs.js:367
+msgid "Center Search View"
+msgstr "Vycentrovat zobrazení vyhledávání"
+
+#: prefs.js:368
+msgid ""
+"Centers the search view relative to the display instead of available space"
+msgstr ""
+"Vycentruje zobrazení vyhledávání vzhledem k displeji namísto dostupného "
+"prostoru"
+
+#: prefs.js:376
+msgid "Always Show Search Entry"
+msgstr "Vždy zobrazit pole vyhledávání"
+
+#: prefs.js:377
+msgid ""
+"If disabled, the search entry field will be hidden when not in use, so the "
+"workspace preview and app grid may take up more space"
+msgstr ""
+"Je-li je zakázáno, pole pro vyhledávání bude skryto, tedy náhled pracovního "
+"prostoru a mřížka aplikace mohou zabírat více místa"
+
+#: prefs.js:394
+msgid "Search Results Width"
+msgstr "Šířka výsledků hledání"
+
+#: prefs.js:395
+msgid ""
+"Adjusts the maximum width of search results view (percentage relative to "
+"default). This allows to fit more (or less) app icons into the app search "
+"result"
+msgstr ""
+"Upraví maximální šířku zobrazení výsledků vyhledávání (v procentech vzhledem "
+"k výchozímu nastavení). To vám umožní umístit více či méně ikon aplikací do "
+"výsledku vyhledávání aplikací"
+
+#: prefs.js:405 prefs.js:2013
+msgid "Panel"
+msgstr "Panel"
+
+#: prefs.js:411
+msgid "Main Panel Position"
+msgstr "Umístění hlavního panelu"
+
+#: prefs.js:412
+msgid "Allows to place the main panel at the bottom of the primary display"
+msgstr "Umožňuje umístit hlavní panel do spodní části primárního displeje"
+
+#: prefs.js:416
+msgid "Top (Default)"
+msgstr "Nahoře (výchozí)"
+
+#: prefs.js:425
+msgid "Main Panel Visibility"
+msgstr "Viditelnost hlavního panelu"
+
+#: prefs.js:426
+msgid "Allows to hide main panel when not needed"
+msgstr "Umožňuje skrýt hlavní panel anebo jej zobrazit jen v přehledu"
+
+#: prefs.js:430
+msgid "Always Visible (Default)"
+msgstr "Vždy viditelný (výchozí)"
+
+#: prefs.js:431
+msgid "Overview Only"
+msgstr "Pouze přehled"
+
+#: prefs.js:432
+msgid "Always Hidden"
+msgstr "Vždy skrytý"
+
+#: prefs.js:442
+msgid "Workspace Switcher Popup"
+msgstr "Přepínač pracovního prostoru - vyskakovací okno"
+
+#: prefs.js:458
+msgid "Horizontal Position (percentage from the left)"
+msgstr "Horizontální poloha (procent zleva)"
+
+#: prefs.js:459
+msgid ""
+"This popup shows up when you switch workspace using a keyboard shortcut or "
+"gesture outside of the overview. You can disable it on the \"Behavior\" tab. "
+"If you want more control over the popup, try the \"Workspace Switcher "
+"Manager\" extension"
+msgstr ""
+"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí "
+"klávesové zkratky nebo gesta mimo přehled. Můžete jej zakázat na kartě "
+"Vlastnosti. Pro větší kontrolu nad vyskakovacím oknem, vyzkoušejte rozšíření "
+"\"Workspace Switcher Manager\""
+
+#: prefs.js:479
+msgid "Vertical Position (percentage from the top)"
+msgstr "Vertikální pozice (procent shora)"
+
+#: prefs.js:490
+msgid "Notifications and OSD"
+msgstr "Oznámení a OSD"
+
+#: prefs.js:496
+msgid "Notification Banner Position"
+msgstr "Pozice oznamovacího banneru"
+
+#: prefs.js:497
+msgid "Choose where the notification banners appear on the screen"
+msgstr "Vyberte, kde se na obrazovce zobrazí oznamovací bannery"
+
+#: prefs.js:501 prefs.js:520 prefs.js:1150
+msgid "Top Left"
+msgstr "Nahoře vlevo"
+
+#: prefs.js:502
+msgid "Top Center (Default)"
+msgstr "Nahoře Střed (výchozí)"
+
+#: prefs.js:503 prefs.js:522 prefs.js:1151
+msgid "Top Right"
+msgstr "Nahoře Vpravo"
+
+#: prefs.js:504 prefs.js:524 prefs.js:1152
+msgid "Bottom Left"
+msgstr "Dole vlevo"
+
+#: prefs.js:505
+msgid "Bottom Center"
+msgstr "Dole Vlevo"
+
+#: prefs.js:506 prefs.js:526 prefs.js:1153
+msgid "Bottom Right"
+msgstr "Dole vpravo"
+
+#: prefs.js:514
+msgid "OSD Popup Position"
+msgstr "Pozice OSD"
+
+#: prefs.js:515
+msgid ""
+"Choose where the OSD pop-ups (like sound volume level) appear on the screen"
+msgstr "Vyberte, kde se na obrazovce zobrazí OSD (například nastavení zvuku)"
+
+#: prefs.js:519 prefs.js:743 prefs.js:787 prefs.js:1087 prefs.js:1107
+#: prefs.js:1130 prefs.js:1244 prefs.js:1363 prefs.js:1380 prefs.js:1397
+#: prefs.js:1463
+msgid "Disable"
+msgstr "Zakázat"
+
+#: prefs.js:521
+msgid "Top Center"
+msgstr "Nahoře vlevo"
+
+#: prefs.js:523
+msgid "Center"
+msgstr "Střed"
+
+#: prefs.js:525
+msgid "Bottom Center (Default)"
+msgstr "Dole Střed (výchozí)"
+
+#: prefs.js:534
+msgid "Secondary Monitors"
+msgstr "Sekundární monitory"
+
+#: prefs.js:540
+msgid "Workspace Thumbnails Position"
+msgstr "Pozice miniatur pracovního prostoru"
+
+#: prefs.js:541
+msgid ""
+"Allows to place workspace thumbnails of secondary monitors on the opposite "
+"side than on the primary monitor"
+msgstr ""
+"Umožňuje umístit miniatury pracovního prostoru sekundárních monitorů na "
+"opačnou stranu než na primárním monitoru"
+
+#: prefs.js:545
+msgid "Same as Primary"
+msgstr "Stejné jako primární"
+
+#: prefs.js:546
+msgid "Left / Top"
+msgstr "Vlevo / Nahoře"
+
+#: prefs.js:547
+msgid "Right / Bottom"
+msgstr "Vpravo / Dole"
+
+#: prefs.js:582
+msgid "Workspace Thumbnails Max Scale"
+msgstr "Miniatury pracovního prostoru Maximální měřítko"
+
+#: prefs.js:583
+msgid ""
+"Adjusts maximum size of the workspace thumbnails (percentage relative to the "
+"display width / height) for secondary monitors"
+msgstr ""
+"Upravuje maximální velikost miniatur pracovního prostoru (v procentech "
+"vzhledem k šířce / výšce zobrazení) pro sekundární monitory"
+
+#: prefs.js:600
+msgid "Workspace Preview Scale"
+msgstr "Měřítko náhledu pracovního prostoru"
+
+#: prefs.js:601
+msgid "Allows to scale down workspace previews on secondary monitors"
+msgstr "Zmenšuje náhledy pracovního prostoru na sekundárních monitorech"
+
+#: prefs.js:609
+msgid "Shift Overview by Panel Height"
+msgstr "Posuň náhled pracovního prostoru podle výšky panelu"
+
+#: prefs.js:610
+msgid ""
+"This option can help align the overview of the secondary monitor with the "
+"primary one"
+msgstr ""
+"Tato možnost může pomoci zarovnat přehled sekundárního monitoru s primárním "
+"monitorem"
+
+#: prefs.js:635
+msgid "Dash Max Icon Size"
+msgstr "Maximální velikost ikon"
+
+#: prefs.js:636
+msgid ""
+"Maximum size of Dash icons in pixels. Adaptive option switches between "
+"default 64 and 48 for low resolution displays"
+msgstr ""
+"Maximální velikost ikon Dash v pixelech. Možnost Adaptive přepíná mezi "
+"výchozími hodnotami 64 a 48 pro displeje s nízkým rozlišením"
+
+#: prefs.js:640 prefs.js:1545 prefs.js:1740
+msgid "Adaptive (Default)"
+msgstr "Adaptivní (výchozí)"
+
+#: prefs.js:641 prefs.js:867 prefs.js:1553 prefs.js:1741
+msgid "128"
+msgstr "128"
+
+#: prefs.js:642 prefs.js:868 prefs.js:1554 prefs.js:1742
+msgid "112"
+msgstr "112"
+
+#: prefs.js:643 prefs.js:1555 prefs.js:1743
+msgid "96"
+msgstr "96"
+
+#: prefs.js:644 prefs.js:870 prefs.js:1556 prefs.js:1744
+msgid "80"
+msgstr "80"
+
+#: prefs.js:645 prefs.js:871 prefs.js:1557 prefs.js:1745
+msgid "64"
+msgstr "64"
+
+#: prefs.js:646 prefs.js:784 prefs.js:872 prefs.js:1558 prefs.js:1746
+msgid "48"
+msgstr "48"
+
+#: prefs.js:647 prefs.js:785 prefs.js:873
+msgid "32"
+msgstr "32"
+
+#: prefs.js:655
+msgid "Dash Background Style"
+msgstr "Dash styl pozadí"
+
+#: prefs.js:656
+msgid ""
+"Allows you to change the background color of the dash to match the search "
+"results an app folders"
+msgstr ""
+"Umožňuje změnit barvu pozadí Dash tak, aby odpovídala výsledkům vyhledávání "
+"ve složkách aplikace"
+
+#: prefs.js:660 prefs.js:1029 prefs.js:1057 prefs.js:1149 prefs.js:1223
+#: prefs.js:1362 prefs.js:1379 prefs.js:1435 prefs.js:1449
+msgid "Default"
+msgstr "Výchozí"
+
+#: prefs.js:661
+msgid "Light"
+msgstr "Lehké"
+
+#: prefs.js:677
+msgid "Dash Background Opacity"
+msgstr "Neprůhlednost pozadí"
+
+#: prefs.js:678
+msgid "Adjusts the opacity of the Dash background"
+msgstr "Upraví průhlednost pozadí Dash"
+
+#: prefs.js:696
+msgid "Dash Background Radius"
+msgstr "Poloměr pozadí"
+
+#: prefs.js:697
+msgid ""
+"Adjusts the border radius of the Dash background in pixels. 0 means the "
+"default value given by the current theme style"
+msgstr ""
+"Upraví poloměr okraje pozadí Dash v pixelech. 0 znamená výchozí hodnotu dle "
+"stylu tématu"
+
+#: prefs.js:707
+msgid "Dash Background GNOME 3 Style"
+msgstr "Dash pozadí stylu GNOME 3"
+
+#: prefs.js:708
+msgid ""
+"Background of the vertically oriented dash will imitate the GNOME 3 style"
+msgstr "Pozadí vertikálně orientovaného Dash napodobí styl prostředí GNOME 3"
+
+#: prefs.js:718
+msgid "Running App Indicator"
+msgstr "Běžící aplikační indikátor"
+
+#: prefs.js:719
+msgid ""
+"Allows you to change style of the running app indicator under the app icon"
+msgstr "Umožňuje změnit styl indikátoru spuštěné aplikace pod ikonou aplikace"
+
+#: prefs.js:723
+msgid "Dot (Default)"
+msgstr "Tečka (výchozí)"
+
+#: prefs.js:724
+msgid "Line"
+msgstr "Linka"
+
+#: prefs.js:732 prefs.js:1233
+msgid "Workspace Thumbnails"
+msgstr "Miniatury pracovního prostoru"
+
+#: prefs.js:738
+msgid "Show Workspace Thumbnail Labels"
+msgstr "Zobrazit štítky miniatur pracovního prostoru"
+
+#: prefs.js:739
+msgid ""
+"Each workspace thumbnail can show label with its index and name (if defined "
+"in the system settings) or name/title of its most recently used app/window"
+msgstr ""
+"Každá miniatura pracovního prostoru může zobrazovat svůj index a název "
+"(pokud je definován v nastavení systému) nebo jméno/název naposledy použité "
+"aplikace/okna"
+
+#: prefs.js:744
+msgid "Index"
+msgstr "Index"
+
+#: prefs.js:745
+msgid "Index + WS Name"
+msgstr "Index + Název plochy"
+
+#: prefs.js:746
+msgid "Index + App Name"
+msgstr "Index + Název aplikace"
+
+#: prefs.js:747
+msgid "Index + Window Title"
+msgstr "Rejstřík + Název okna"
+
+#: prefs.js:754
+msgid "Show WS Thumbnail Label on Hover"
+msgstr "Zobrazit štítek miniatur ploch při umístění kurzoru myši"
+
+#: prefs.js:755
+msgid "Show the label only when the mouse pointer hovers over the thumbnail"
+msgstr "Zobrazit popisek pouze tehdy, když ukazatel myši najede na miniaturu"
+
+#: prefs.js:763
+msgid "Show Wallpaper in Workspace Thumbnails"
+msgstr "Zobrazit tapetu v miniaturách pracovního prostoru"
+
+#: prefs.js:764
+msgid "All workspace thumbnails will include the current desktop background"
+msgstr ""
+"Všechny miniatury pracovního prostoru budou obsahovat aktuální pozadí plochy"
+
+#: prefs.js:772 prefs.js:1254
+msgid "Window Preview"
+msgstr "Náhled okna"
+
+#: prefs.js:778
+msgid "Window Preview App Icon Size"
+msgstr "Velikost ikony aplikace náhledu okna"
+
+#: prefs.js:783
+msgid "64 (Default)"
+msgstr "64 (výchozí)"
+
+#: prefs.js:786
+msgid "22"
+msgstr "22"
+
+#: prefs.js:795
+msgid "Window Title Position / Visibility"
+msgstr "Pozice názvu okna / viditelnost"
+
+#: prefs.js:796
+msgid ""
+"Sets the position of the window title that is displayed when the mouse "
+"hovers over the window or can always be visible"
+msgstr ""
+"Nastavuje pozici názvu okna zobrazeného při najetí myší na okno nebo může "
+"být viditelný vždy"
+
+#: prefs.js:800
+msgid "Inside Window"
+msgstr "Uvnitř okna"
+
+#: prefs.js:801
+msgid "Inside Window Always Visible"
+msgstr "Uvnitř okna vždy viditelné"
+
+#: prefs.js:802
+msgid "Below Window (Default)"
+msgstr "Pod oknem (výchozí)"
+
+#: prefs.js:810
+msgid "Show Close Window Button"
+msgstr "Zobraz tlačítko Zavři okno"
+
+#: prefs.js:811
+msgid "Allows you to hide close window button"
+msgstr "Umožňuje skrýt tlačítko zavření okna"
+
+#: prefs.js:828
+msgid "Show Workspace Preview Background"
+msgstr "Zobrazit pozadí náhledu pracovní plochy"
+
+#: prefs.js:829
+msgid "Allows to hide the background of the workspace preview"
+msgstr "Umožňuje skrýt pozadí náhledu pracovní plochy"
+
+#: prefs.js:846
+msgid "Workspace Background Corner Radius"
+msgstr "Poloměr rohu pozadí pracovní plochy"
+
+#: prefs.js:847
+msgid "Adjusts the corner radius of the workspace preview in the overview"
+msgstr "Nastaví poloměr rohu náhledu pracovní plochy v přehledu"
+
+#: prefs.js:855 prefs.js:1318 prefs.js:2022
+msgid "Search"
+msgstr "Vyhledávání"
+
+#: prefs.js:861
+msgid "App Search Icon Size"
+msgstr "Velikost ikony vyhledávání aplikací"
+
+#: prefs.js:862
+msgid ""
+"Size of results provided by the App Search Provider - smaller size allows to "
+"fit more results. Adaptive option switches between default 96 and 64 for low "
+"resolution displays"
+msgstr ""
+"Velikost ikon aplikací ve výsledcích hledání. Menší velikost - více "
+"zobrazených výsledků. Adaptivní přepíná mezi výchozími hodnotami 96 a 64 pro "
+"displeje s nízkým rozlišením"
+
+#: prefs.js:866
+msgid "Adaptive"
+msgstr "Adaptivní"
+
+#: prefs.js:869
+msgid "96 (Default)"
+msgstr "96 (výchozí)"
+
+#: prefs.js:893
+msgid "Max Search Results Rows"
+msgstr "Maximální počet řádků výsledků hledání"
+
+#: prefs.js:894
+msgid ""
+"Sets the maximum number of rows for result lists of all search providers "
+"except the window search provider which always lists all results"
+msgstr ""
+"Nastaví maximální počet řádků pro seznamy výsledků všech poskytovatelů "
+"vyhledávání vyhledávání s výjimkou zprostředkovatele vyhledávání v okně jenž "
+"vždy zobrazuje všechny výsledky"
+
+#: prefs.js:904
+msgid "Highlighting"
+msgstr "Podtržení"
+
+#: prefs.js:905
+msgid ""
+"The GNOME default highlighting style (bold) causes strings to be "
+"\"randomly\" ellipsized, often preventing you from seeing the whole string, "
+"even if there is space for it. The selected style will be applied to all "
+"search results globally. If you are using other extensions that offer this "
+"option, make sure you set the same setting in all of them."
+msgstr ""
+"Výchozí styl zvýraznění GNOME (tučné) způsobuje náhodné zkreslení a často "
+"brání zobrazení celého řetězce, i když je pro něj místo. Vybraný styl se "
+"použije na všechny výsledky vyhledávání globálně. Pokud používáte jiná "
+"rozšíření, která tuto možnost nabízejí, ujistěte se, že ve všech nastavíte "
+"stejné nastavení."
+
+#: prefs.js:909
+msgid "Bold (Default)"
+msgstr "Tučně (výchozí)"
+
+#: prefs.js:910
+msgid "Underline"
+msgstr "Podtržení"
+
+#: prefs.js:911
+msgid "None"
+msgstr "Nic"
+
+#: prefs.js:919
+msgid "Overview Background"
+msgstr "Přehled - pozadí"
+
+#: prefs.js:925
+msgid "Show Wallpaper"
+msgstr "Zobrazit tapetu"
+
+#: prefs.js:926
+msgid ""
+"Replaces the solid grey background in the overview with the current desktop "
+"wallpaper"
+msgstr "Nahradí jednolité šedé pozadí v přehledu aktuální tapetou plochy"
+
+#: prefs.js:942
+msgid "Brightness"
+msgstr "Jas"
+
+#: prefs.js:943
+msgid "Brightness of the background wallpaper in the overview"
+msgstr "Jas tapety na pozadí v přehledu"
+
+#: prefs.js:959
+msgid "Brightness for Search View"
+msgstr "Jas pro zobrazení hledání"
+
+#: prefs.js:960
+msgid ""
+"Allows you to set a lower background brightness for search view mode where "
+"text visibility is more important"
+msgstr ""
+"Umožňuje nastavit nižší jas pozadí pro režim zobrazení vyhledávání pro lepší "
+"viditelnost textu"
+
+#: prefs.js:976
+msgid "Blur Window Picker Background"
+msgstr "Rozostření pozadí výběru okna"
+
+#: prefs.js:977
+msgid "Sets the amount of background blur in the window picker view"
+msgstr "Rozostření tapety na pozadí ve výběru oken"
+
+#: prefs.js:993
+msgid "Blur App Grid/Search View Background"
+msgstr "Rozostření pozadí v mřížce aplikací/hledání"
+
+#: prefs.js:994
+msgid ""
+"Sets the amount of background blur in the app grid and search results views"
+msgstr ""
+"Nastavení hodnoty rozostření tapety na pozadí v mřížce aplikace a zobrazení "
+"výsledků vyhledávání"
+
+#: prefs.js:1002
+msgid "Smooth Blur Transitions"
+msgstr "Plynulé přechody rozostření"
+
+#: prefs.js:1003
+msgid ""
+"Allows for smoother blur transitions, but can affect the overall smoothness "
+"of overview animations on weak hardware"
+msgstr ""
+"Umožňuje hladší přechody rozostření, ale může ovlivnit celkovou plynulost "
+"animací v přehledu"
+
+#: prefs.js:1018
+msgid "Overview"
+msgstr "Přehled"
+
+#: prefs.js:1024
+msgid "Overview Mode"
+msgstr "Režim přehledu"
+
+#: prefs.js:1025
+msgid ""
+"The Expose Windows on Hover mode does not expose the workspace preview "
+"windows until the mouse pointer enters any window\n"
+"The Static Workspace mode keeps the workspace static when you activate the "
+"overview, it only shows Dash, workspace thumbnails and search entry over the "
+"workspace and only clicking on an active workspace thumbnail activates the "
+"default overview"
+msgstr ""
+"Režim Zobrazit okna při módu najetí myší neodkryje okna náhledu pracovního "
+"prostoru, dokud ukazatel myši nenajede do jakéhokoli okna.\n"
+"Režim Statická pracovní plocha ji zachová statickou při náhledu, zobrazuje "
+"jen Dash, miniatury pracovní plochy a vyhledávání. Jen kliknutím na aktivní "
+"miniaturu pracovní plochy se aktivuje výchozí přehled"
+
+#: prefs.js:1030
+msgid "Expose Windows on Hover"
+msgstr "Zobrazit okna při najetí myší"
+
+#: prefs.js:1031
+msgid "Static Workspace"
+msgstr "Statická pracovní plocha"
+
+#: prefs.js:1038
+msgid "Startup State"
+msgstr "Stav spuštění"
+
+#: prefs.js:1039
+msgid "Allows to change the state in which GNOME Shell starts a session"
+msgstr "Umožňuje změnit stav ve kterém GNOME Shell zahajuje relaci"
+
+#: prefs.js:1043
+msgid "Overview (Default)"
+msgstr "Přehled (výchozí)"
+
+#: prefs.js:1044
+msgid "Desktop"
+msgstr "Desktop"
+
+#: prefs.js:1045 prefs.js:1090 prefs.js:1133
+msgid "Applications"
+msgstr "Aplikace"
+
+#: prefs.js:1052
+msgid "Escape Key Behavior"
+msgstr "Chování klávesy Escape"
+
+#: prefs.js:1053
+msgid ""
+"Allows you to close the overview with a single press of the Escape key, even "
+"from the application grid or from search, if the search entry field does not "
+"have focus"
+msgstr ""
+"Umožňuje zavřít přehled jediným stisknutím klávesy Escape, a to i z mřížky "
+"aplikace nebo z vyhledávání, pokud pole pro zadání vyhledávání nemá fokus"
+
+#: prefs.js:1058
+msgid "Close Overview"
+msgstr "Zavři Přehled"
+
+#: prefs.js:1066
+msgid "Click Empty Space To Close"
+msgstr "Klikni prázdné místo pro zavření"
+
+#: prefs.js:1067
+msgid "Enables clicking on an empty space in the overview to close it"
+msgstr "Povolí kliknutí na prázdné místo v přehledu pro jeho zavření"
+
+#: prefs.js:1076
+msgid "Overlay Key (Super/Windows)"
+msgstr "Překryvná klávesa (Super/Windows)"
+
+#: prefs.js:1082
+msgid "Single-Press Action"
+msgstr "Akce jedním tlačítkem"
+
+#: prefs.js:1083
+msgid ""
+"Disable or change behavior when you press and release the Super key. The "
+"\"Search Windows\" options requires the \"WSP (Window Search Provider)\" "
+"extension installed and enabled. Link is available on the Modules tab in "
+"Settings. If you want another extension (like AATWS) to handle the overlay "
+"key, set this option to \"Overview - Window Picker (Default)\" and the "
+"\"Double-Press Action\" option to \"Applications (Default)\""
+msgstr ""
+"Zakáže nebo změní chování při stisknutí a uvolnění klávesy Super. Možnosti "
+"\"Hledat ve Windows\" vyžaduje nainstalované a povolené rozšíření \"WSP "
+"(Window Search Provider)\". Odkaz je k dispozici na kartě Moduly v "
+"Nastavení. Pokud chcete, aby se o překryvnou klávesu staralo jiné rozšíření "
+"(například AATWS), nastavte tuto možnost na \"Přehled - výběr oken "
+"(výchozí)\" a možnost \"Akce při dvojitém stisknutí\" na \"Aplikace "
+"(výchozí)\"."
+
+#: prefs.js:1088 prefs.js:1131
+msgid "Follow Global Overview Mode"
+msgstr "Podle globálního nastavení"
+
+#: prefs.js:1089 prefs.js:1132
+msgid "Overview - Window Picker (Default)"
+msgstr "Přehled - Okno pro výběr (Výchozí)"
+
+#: prefs.js:1091 prefs.js:1134
+msgid "Overview - Static WS Preview"
+msgstr "Přehled - Statický náhled ploch"
+
+#: prefs.js:1092 prefs.js:1135
+msgid "Overview - Static Workspace"
+msgstr "Přehled - Statická pracovní plocha"
+
+#: prefs.js:1093 prefs.js:1109 prefs.js:1136
+msgid "Search Windows (requires WSP extension)"
+msgstr "Vyhledávání oken (vyžaduje rozšíření WSP)"
+
+#: prefs.js:1102
+msgid "Double-Press Action"
+msgstr "Akce dvojitého stisknutí"
+
+#: prefs.js:1103
+msgid ""
+"Disable or change behavior when you double-press the Super key. The \"Search "
+"Windows\" option requires the \"WSP (Window Search Provider)\" extension "
+"installed and enabled. The \"Static WS Overview - Expose Windows\" option "
+"allows you to switch to default Activities Overview window picker view if "
+"you set static workspace (preview) for the single press/release Super key "
+"action"
+msgstr ""
+"Zakázat nebo změnit chování při dvojitém stisknutí klávesy Super. Volba "
+"„Hledat v oknech“ vyžaduje, aby bylo aktivováno rozšíření "
+"\"WindowSearchProvider\". Volba \"Statický přehled ploch - vystavit okna“ "
+"umožňuje přepnout na výchozí zobrazení výběru oken Přehledu činností. Pokud "
+"nastavíte statický pracovní prostor (náhled) pro akci jediného stisknutí / "
+"uvolnění klávesy Super"
+
+#: prefs.js:1108
+msgid "Applications (Default)"
+msgstr "Aplikace (výchozí)"
+
+#: prefs.js:1110
+msgid "Overview - Window Picker"
+msgstr "Přehled - Okno pro výběr"
+
+#: prefs.js:1119
+msgid "Hot Corner (Install Custom Hot Corners - Extended for more options)"
+msgstr ""
+"Hot Corner (pro více možností nainstalujte rozšíření \"Custom Hot Corners - "
+"Extended\")"
+
+#: prefs.js:1125
+msgid "Hot Corner Action"
+msgstr "Hot Corner Akce"
+
+#: prefs.js:1126
+msgid ""
+"Disable or change behavior of the hot corner. Holding down the Ctrl key "
+"while hitting the hot corner switches between Overview/Applications actions. "
+"The \"Search Windows\" option requires the \"WSP (Window Search Provider)\" "
+"extension installed and enabled"
+msgstr ""
+"Zakázat nebo změnit chování Hot Corner. Podržením klávesy Ctrl při najetí na "
+"Hot Corner přepnete mezi akcemi Přehled/Aplikace. Možnost \"Hleta v oknech\" "
+"vyžaduje nainstalované a povolené rozšíření \"WSP (Window Search Provider)\""
+
+#: prefs.js:1144
+msgid "Hot Corner Position"
+msgstr "Hot Corner pozice"
+
+#: prefs.js:1145
+msgid ""
+"Choose which corner of your monitors will be active. If you choose \"Follow "
+"Dash\" option, the corner will be placed near the left or top edge of the "
+"Dash. The last option extends the hot corner trigger to cover the entire ege "
+"of the monitor where Dash is located"
+msgstr ""
+"Vyberte, který roh monitorů bude aktivní. Pokud zvolíte možnost „Následuj "
+"Dash“, bude umístěn v blízkosti okraje panelu Dash. „Následuj Dash - Okraj“ "
+"rozšiřuje aktivní roh tak, aby pokrýval celý okraj monitoru, na kterém je "
+"umístěn panel Dash"
+
+#: prefs.js:1154
+msgid "Follow Dash"
+msgstr "Následuj Dash"
+
+#: prefs.js:1155
+msgid "Follow Dash - Hot Edge"
+msgstr "Následuj Dash - Okraj"
+
+#: prefs.js:1163
+msgid "Enable Hot Corner in Full-Screen Mode"
+msgstr "Hot Corner aktivovat v režimu celé obrazovky"
+
+#: prefs.js:1164
+msgid ""
+"If you often work with full-screen applications and want the hot corner to "
+"be usable"
+msgstr ""
+"Pokud často pracujete s celoobrazovkovými aplikacemi a chcete, aby byl Hot "
+"Corner použitelný"
+
+#: prefs.js:1174
+msgid "Show Ripples Animation"
+msgstr "Zobrazit animaci vlnění"
+
+#: prefs.js:1175
+msgid ""
+"The ripple animation is played when the hot corner is activated. The ripple "
+"size has been reduced to be less distracting"
+msgstr ""
+"Při aktivaci rohu se přehraje animace vlnění. Velikost vlnění byla zmenšena, "
+"aby méně odváděla pozornost"
+
+#: prefs.js:1191
+msgid "Isolate Workspaces"
+msgstr "Izolovat pracovní plochy"
+
+#: prefs.js:1192
+msgid "Dash will only show apps and windows from the current workspace"
+msgstr "Dash zobrazí pouze aplikace a okna z aktuální pracovní plochy"
+
+#: prefs.js:1202
+msgid "App Icon - Click Behavior"
+msgstr "Aplikační ikony - chování při kliknutí"
+
+#: prefs.js:1203
+msgid ""
+"Choose your preferred behavior when clicking on an app icon. The \"Prefer "
+"Current Workspace\" option opens a new app window if not present in the "
+"current workspace. The \"Open New Window\" option also switches behavior of "
+"the middle click to \"Activate\" since its default behavior is to open a new "
+"window"
+msgstr ""
+"Zvolte preferované chování při kliknutí na ikonu aplikace. Možnost "
+"„Preferovat aktuální pracovní plochu“ otevře nové okno aplikace, pokud není "
+"přítomna na aktuální pracovní ploše. Možnost „Otevřít nové okno“ také "
+"přepíná chování prostředního kliknutí na „Aktivovat“, protože jeho výchozím "
+"chováním je otevření nového okna"
+
+#: prefs.js:1207
+msgid "Activate App Immediately"
+msgstr "Okamžitě aktivuje aplikace"
+
+#: prefs.js:1208
+msgid "First Switch to Workspace"
+msgstr "První přepnutí do pracovního prostoru"
+
+#: prefs.js:1209
+msgid "Open New Window (if supported)"
+msgstr "Otevři nové okno (je-li podporováno)"
+
+#: prefs.js:1210
+msgid "Prefer Current Workspace"
+msgstr "Preferuj aktuální pracovní plochu"
+
+#: prefs.js:1218
+msgid "App Icon - Scroll Action"
+msgstr "Aplikační ikony - Akce posunu"
+
+#: prefs.js:1219
+msgid ""
+"Choose the behavior when scrolling over an app icon. The window cycler works "
+"with a list of windows sorted by the \"Most Recently Used\" and grouped by "
+"workspaces. Scrolling up cycles through previously used windows on the same "
+"workspace and then switches to another workspace, if any"
+msgstr ""
+"Výběr chování při posouvání přes ikonu aplikace. Algoritmus cyklení oken "
+"pracuje se seznamem oken seřazených podle „Nejnověji použitých“ a "
+"seskupených podle pracovních ploch. Posouvání nahoru cykluje dříve použitá "
+"okna na stejné pracovní ploše a poté se přepne na jinou pracovní plochu, "
+"pokud nějaká existuje"
+
+#: prefs.js:1224
+msgid "Cycle App Windows - Highlight Selected"
+msgstr "Cykluj aplikační okna - zvýrazni vybrané"
+
+#: prefs.js:1225
+msgid "Cycle App Windows - Highlight App"
+msgstr "Cykluj aplikační okna - zvýrazni aplikaci"
+
+#: prefs.js:1239
+msgid "Close Workspace Button"
+msgstr "Tlačítko Zavřít pracovní plochu"
+
+#: prefs.js:1240
+msgid ""
+"The Close Workspace button appears on the workspace thumbnail when you hover "
+"over it and allows you to close all windows on the workspace. You can choose "
+"a \"safety lock\" to prevent accidental use"
+msgstr ""
+"Tlačítko Zavřít pracovní plochu se objeví na miniatuře pracovní plochy, když "
+"na ni umístíte ukazatel myši a umožní vám zavřít všechna okna na pracovní "
+"ploše. Můžete si vybrat bezpečnostní zámek, který zabrání náhodnému použití"
+
+#: prefs.js:1245
+msgid "Single Click"
+msgstr "Jedno kliknutí"
+
+#: prefs.js:1246
+msgid "Double Click"
+msgstr "Dvojité kliknutí"
+
+#: prefs.js:1247
+msgid "Ctrl Key + Click"
+msgstr "Klávesa Ctrl + kliknutí"
+
+#: prefs.js:1260
+msgid "Secondary Button Click Action"
+msgstr "Akce druhého tlačítka myši"
+
+#: prefs.js:1261
+msgid "Allows you to add a secondary mouse click action to the window preview"
+msgstr "Umožňuje přidat do náhledu okna akci na kliknutí druhého tlačítka myši"
+
+#: prefs.js:1265 prefs.js:1281 prefs.js:1297
+msgid "Activate Window (Default)"
+msgstr "Aktivuj okno (výchozí)"
+
+#: prefs.js:1266 prefs.js:1282
+msgid "Close Window"
+msgstr "Zavři okno"
+
+#: prefs.js:1267 prefs.js:1283 prefs.js:1298
+msgid "Search For Same App Windows"
+msgstr "Hledej pro stejné aplikační okno"
+
+#: prefs.js:1268 prefs.js:1284 prefs.js:1299
+msgid "Create Window Thumbnail/PiP (requires WTMB extension)"
+msgstr "Vytvoření náhledu okna - PIP (vyžaduje WTMB rozšíření)"
+
+#: prefs.js:1276
+msgid "Middle Button Click Action"
+msgstr "Akce kliknutí prostředního tlačítka"
+
+#: prefs.js:1277
+msgid "Allows you to add a middle mouse click action to the window preview"
+msgstr ""
+"Umožňuje přidat do náhledu okna akci na kliknutí prostředního tlačítka myši"
+
+#: prefs.js:1292
+msgid "App Icon Click Action"
+msgstr "Akce kliknutí na ikonu aplikace"
+
+#: prefs.js:1293
+msgid ""
+"Select the action to take when the application icon on the window preview is "
+"clicked"
+msgstr ""
+"Vyberte akci, která se má provést po kliknutí na ikonu aplikace v náhledu "
+"okna"
+
+#: prefs.js:1307
+msgid "Always Activate Selected"
+msgstr "Vždy aktivovat vybrané"
+
+#: prefs.js:1308
+msgid ""
+"If enabled, the currently selected window will be activated when leaving the "
+"Overview even without clicking. Usage example - press Super to open the "
+"Overview, place mouse pointer over a window, press Super again to activate "
+"the window"
+msgstr ""
+"Je-li povoleno, aktuálně vybrané okno se aktivuje při opuštění Přehledu i "
+"bez kliknutí. Příklad použití: stisknutím tlačítka Super otevřete Přehled, "
+"umístěte ukazatel myši nad okno, opětovným stisknutím tlačítka Super okno "
+"aktivujte"
+
+#: prefs.js:1324
+msgid "Enable Fuzzy Match"
+msgstr "Povolit neúplnou shodu"
+
+#: prefs.js:1325
+msgid ""
+"Enabling the fuzzy match allows you to skip letters in the pattern you are "
+"searching for and find \"Firefox\" even if you type \"ffx\". Works only for "
+"the App, Windows, Extensions and Recent files search providers"
+msgstr ""
+"Povolení přibližné shody umožní přeskočit písmena v řetězci, který hledáte "
+"(najde \"Firefox\" i jen zadáním \"ffx\"). Funguje pouze pro poskytovatele "
+"vyhledávání aplikací, oken a posledních souborů"
+
+#: prefs.js:1333
+msgid "Animations"
+msgstr "Animace"
+
+#: prefs.js:1348
+msgid "Animation Speed"
+msgstr "Rychlost animace"
+
+#: prefs.js:1349
+msgid ""
+"Adjusts the global animation speed in percentage of the default duration - "
+"higher value means slower animation"
+msgstr ""
+"Upraví globální rychlost animace v procentech výchozí doby trvání – vyšší "
+"hodnota znamená pomalejší animaci."
+
+#: prefs.js:1357
+msgid "App Grid Animation"
+msgstr "Animace mřížky aplikací"
+
+#: prefs.js:1358
+msgid ""
+"When entering the App Grid view, the app grid animates from the edge of the "
+"screen. You can choose the direction, keep the Default (direction will be "
+"selected automatically) or disable the animation if you don't like it"
+msgstr ""
+"Mřížka aplikací se animuje od okraje obrazovky. Můžete si vybrat směr, "
+"ponechat výchozí (směr bude vybrán automaticky) nebo vypnout animaci"
+
+#: prefs.js:1364 prefs.js:1381
+msgid "Right to Left"
+msgstr "Zprava doleva"
+
+#: prefs.js:1365 prefs.js:1382
+msgid "Left to Right"
+msgstr "Zleva doprava"
+
+#: prefs.js:1366 prefs.js:1383
+msgid "Bottom to Top"
+msgstr "Zespodu nahoru"
+
+#: prefs.js:1367 prefs.js:1384
+msgid "Top to Bottom"
+msgstr "Zhora dolů"
+
+#: prefs.js:1374
+msgid "Search View Animation"
+msgstr "Animace zobrazení vyhledávání"
+
+#: prefs.js:1375
+msgid ""
+"When search is activated the search view with search results can animate "
+"from the edge of the screen. You can choose the direction, keep the Default "
+"(currently Bottom to Top) or disable the animation if you don't like it."
+msgstr ""
+"Je-li aktivováno vyhledávání, zobrazení vyhledávání s výsledky vyhledávání "
+"se může animovat od okraje obrazovky. Můžete si vybrat směr, ponechat "
+"výchozí (aktuálně zdola nahoru) nebo zakázat animaci."
+
+#: prefs.js:1392
+msgid "Workspace Preview Animation"
+msgstr "Animace náhledu pracovního prostoru"
+
+#: prefs.js:1393
+msgid ""
+"When entering / leaving the App Grid / Search view, the workspace preview "
+"can animate to/from workspace thumbnail."
+msgstr ""
+"Při vstupu / opuštění mřížky aplikací / vyhledávání se náhled pracovního "
+"prostoru může animovat do/z miniatury pracovního prostoru."
+
+#: prefs.js:1398
+msgid "Enable"
+msgstr "Povolit"
+
+#: prefs.js:1406
+msgid "Workspace Switcher"
+msgstr "Přepínač pracovního prostoru"
+
+#: prefs.js:1412
+msgid "Wraparound"
+msgstr "Dokola"
+
+#: prefs.js:1413
+msgid "Continue from the last workspace to the first and vice versa"
+msgstr "Pokračování z posledního pracovního prostoru do prvního a naopak"
+
+#: prefs.js:1421
+msgid "Ignore Last (empty) Workspace"
+msgstr "Ignoruj poslední (prázdný) pracovní prostor"
+
+#: prefs.js:1422
+msgid ""
+"In Dynamic workspaces mode, there is always one empty workspace at the end. "
+"Switcher can ignore this last workspace"
+msgstr ""
+"V režimu dynamických pracovních prostorů je na konci vždy jeden prázdný "
+"pracovní prostor. Přepínač může tento poslední pracovní prostor ignorovat"
+
+#: prefs.js:1430
+msgid "Workspace Switcher Animation"
+msgstr "Animace"
+
+#: prefs.js:1431
+msgid ""
+"Allows you to disable movement of the desktop background during workspace "
+"switcher animation outside of the overview. The Static Background mode also "
+"keeps Conky and desktop icons on their place during switching."
+msgstr ""
+"Umožňuje zakázat pohyb pozadí plochy během animace přepínače pracovního "
+"prostoru mimo přehled. Režim Statické pozadí také udržuje ikony Conky a "
+"plochy na svém místě během přepínání."
+
+#: prefs.js:1436
+msgid "Static Background"
+msgstr "Statické pozadí"
+
+#: prefs.js:1444
+msgid "Workspace Switcher Mode (Isolate Monitors)"
+msgstr "Režim přepínače pracovní plochy (izolované monitory)"
+
+#: prefs.js:1445
+msgid ""
+"Note that this is a workaround, not full-fledged feature. GNOME Shell does "
+"not support separate workspaces for each monitor, so V-Shell switches "
+"workspaces only on the primary monitor and moves windows across workspaces "
+"on secondary monitors in order to simulate independent behavior. The current "
+"monitor is determined by the position of the mouse pointer"
+msgstr ""
+"Poznámka: jedná se o řešení, nikoli o plnohodnotnou funkci. GNOME Shell "
+"nepodporuje samostatné pracovní prostory pro každý monitor, takže V-Shell "
+"přepíná pracovní prostory pouze na primárním monitoru a na sekundárních "
+"monitorech přesouvá okna mezi pracovními prostory tak, aby simuloval "
+"nezávislé chování. Aktuální monitor je určen polohou ukazatele myši"
+
+#: prefs.js:1450
+msgid "Current Monitor"
+msgstr "Aktuální monitor"
+
+#: prefs.js:1458
+msgid "Workspace Switcher Popup Mode"
+msgstr "Vyskakovací režim přepínače pracovní plochy"
+
+#: prefs.js:1459
+msgid ""
+"This popup shows up when you switch workspace using a keyboard shortcut or "
+"gesture outside of the overview. You can to disable the popup at all, or "
+"show it on the current monitor (the one with mouse pointer) instead of the "
+"primary."
+msgstr ""
+"Toto vyskakovací okno se zobrazí, když přepnete pracovní prostor pomocí "
+"klávesové zkratky nebo gesta mimo přehled. Vyskakovací okno můžete úplně "
+"zakázat nebo jej zobrazit na aktuálním monitoru (na tom s ukazatelem myši) "
+"místo na primárním."
+
+#: prefs.js:1464
+msgid "Show on Primary Monitor (Default)"
+msgstr "Zobrazit na primárním monitoru (výchozí)"
+
+#: prefs.js:1465
+msgid "Show on Current Monitor"
+msgstr "Zobrazit na aktuálním monitoru"
+
+#: prefs.js:1473
+msgid "Notifications"
+msgstr "Oznámení"
+
+#: prefs.js:1479
+msgid "Window Attention Handler"
+msgstr "Okno - vyžádání pozornosti"
+
+#: prefs.js:1480
+msgid ""
+"When a window requires attention (often a new window), GNOME Shell shows you "
+"a notification about it. You can disable popups of these messages "
+"(notification will be pushed into the message tray silently) or focus the "
+"source window immediately instead"
+msgstr ""
+"Když okno vyžaduje pozornost (často nové okno), GNOME Shell vám o tom "
+"zobrazí upozornění. Můžete deaktivovat vyskakovací okna těchto zpráv "
+"(oznámení bude do panelu zpráv vloženo tiše) nebo nechat okamžitě zvýraznit "
+"zdrojové okno"
+
+#: prefs.js:1484 prefs.js:1499
+msgid "Show Notifications (Default)"
+msgstr "Zobrazit oznámení (výchozí)"
+
+#: prefs.js:1485
+msgid "Disable Notification Popups"
+msgstr "Zakázat vyskakovací okna s upozorněním"
+
+#: prefs.js:1486
+msgid "Immediately Focus Window"
+msgstr "Okamžitě zvýraznit okno"
+
+#: prefs.js:1494
+msgid "Favorites"
+msgstr "Oblíbené"
+
+#: prefs.js:1495
+msgid "Disable pin/unpin app notifications"
+msgstr "Zakázat upozornění aplikací připnout/odepnout"
+
+#: prefs.js:1500
+msgid "Disable Notifications"
+msgstr "Zakázat oznámení"
+
+#: prefs.js:1518
+msgid "Main App Grid"
+msgstr "Moje mřížka aplikací"
+
+#: prefs.js:1524
+msgid "Apps Sorting"
+msgstr "Řazení aplikací"
+
+#: prefs.js:1525
+msgid ""
+"Choose sorting method for the app grid. Note that sorting by usage ignores "
+"folders"
+msgstr ""
+"Vyberte metodu řazení pro mřížku aplikace. Řazení podle použití ignoruje "
+"složky"
+
+#: prefs.js:1529 prefs.js:1698
+msgid "Custom (Default)"
+msgstr "Vlastní (výchozí)"
+
+#: prefs.js:1530
+msgid "Alphabet - Folders First"
+msgstr "Abecedně, složky na začátek"
+
+#: prefs.js:1531
+msgid "Alphabet - Folders Last"
+msgstr "Abecedně, složky na konec"
+
+#: prefs.js:1532
+msgid "Usage - No Folders"
+msgstr "Použití bez složek"
+
+#: prefs.js:1540
+msgid "Icon Size"
+msgstr "Velikost ikony"
+
+#: prefs.js:1541
+msgid ""
+"Allows to set a fixed app grid icon size and bypass the default adaptive "
+"algorithm"
+msgstr ""
+"Umožňuje vynutit pevnou velikost ikony a obejít výchozí adaptivní algoritmus"
+
+#: prefs.js:1546
+msgid "256"
+msgstr "256"
+
+#: prefs.js:1547
+msgid "224"
+msgstr "224"
+
+#: prefs.js:1548
+msgid "208"
+msgstr "208"
+
+#: prefs.js:1549
+msgid "192"
+msgstr "192"
+
+#: prefs.js:1550
+msgid "176"
+msgstr "176"
+
+#: prefs.js:1551
+msgid "160"
+msgstr "160"
+
+#: prefs.js:1552
+msgid "144"
+msgstr "144"
+
+#: prefs.js:1574
+msgid "Columns per Page (0 for adaptive grid)"
+msgstr "Počet sloupců na stránku (0 pro adaptivní mřížku)"
+
+#: prefs.js:1575
+msgid ""
+"Number of columns in the application grid. If set to 0, the number will be "
+"set automatically to fit the available width"
+msgstr ""
+"Počet sloupců v mřížce aplikace. Je-li nastaveno na 0, číslo se nastaví "
+"automaticky tak, aby odpovídalo dostupné šířce"
+
+#: prefs.js:1591
+msgid "Rows per Page (0 for adaptive grid)"
+msgstr "Počet řádků na stránku (0 pro adaptivní mřížku)"
+
+#: prefs.js:1592
+msgid ""
+"Number of rows in the application grid. If set to 0, the number will be set "
+"automatically to fit the available height"
+msgstr ""
+"Počet řádků v mřížce aplikace. Je-li nastaveno na 0, číslo se nastaví "
+"automaticky tak, aby odpovídalo dostupné výšce"
+
+#: prefs.js:1620
+msgid "App Grid Page Width Scale"
+msgstr "Měřítko šířky stránky mřížky aplikací"
+
+#: prefs.js:1621
+msgid "Adjusts maximum app grid page width relative to the available space"
+msgstr ""
+"Upraví maximální šířku stránky mřížky aplikací vzhledem k dostupnému prostoru"
+
+#: prefs.js:1643
+msgid "App Grid Page Height Scale"
+msgstr "Měřítko výšky stránky mřížky aplikací"
+
+#: prefs.js:1644
+msgid "Adjusts maximum app grid page height relative to the available space"
+msgstr ""
+"Nastaví maximální výšku stránky mřížky aplikací vzhledem k dostupnému "
+"prostoru"
+
+#: prefs.js:1663
+msgid "Grid Spacing"
+msgstr "Rozestupy mřížky"
+
+#: prefs.js:1664
+msgid ""
+"V-Shell uses this value to calculate grid dimensions for adaptive options. "
+"However, the main grid automatically adjusts the spacing based on the grid "
+"and available space"
+msgstr ""
+"V-Shell tuto hodnotu používá k výpočtu rozměrů mřížky pro adaptivní "
+"možnosti. Hlavní mřížka však automaticky upravuje rozteč na základě mřížky a "
+"dostupného prostoru"
+
+#: prefs.js:1674
+msgid "Allow Incomplete Pages"
+msgstr "Povolit neúplné stránky"
+
+#: prefs.js:1675
+msgid ""
+"If disabled, icons from the next page (if any) are automatically moved to "
+"fill any empty slot left after an icon was (re)moved (to a folder for "
+"example)"
+msgstr ""
+"Je-li zakázáno, ikony z další stránky (jsou-li) se automaticky přesunou tak, "
+"aby zaplnily jakýkoli prázdný slot, který zbyl přesunutím/vymazáním ikony/"
+"složky"
+
+#: prefs.js:1687
+msgid "App Folders"
+msgstr "Aplikační složky"
+
+#: prefs.js:1693
+msgid "Folder Apps Sorting"
+msgstr "Třídění aplikací složek"
+
+#: prefs.js:1694
+msgid "Choose sorting method for app folders"
+msgstr "Vyber metodu třídění aplikačních složek"
+
+#: prefs.js:1699
+msgid "Alphabet"
+msgstr "Abeceda"
+
+#: prefs.js:1700
+msgid "Usage"
+msgstr "Použití"
+
+#: prefs.js:1708
+msgid "Active Icons in Folder Preview"
+msgstr "Aktivní ikony v náhledu složky"
+
+#: prefs.js:1709
+msgid ""
+"If enabled, icons in the folder preview behaves like normal icons, you can "
+"activate or even drag them directly, without having to open the folder "
+"first. This option also affects the app grid default icon size"
+msgstr ""
+"Je-li povoleno, pak se ikony v přehledu složek chovají jako běžné ikony. "
+"Můžete je aktivovat nebo dokonce přímo přetáhnout bez otevření složky. Toto "
+"nastavení také ovlivňuje výchozí velikost ikon"
+
+#: prefs.js:1720
+msgid "App Folder Preview Grid Size"
+msgstr "Velikost složek aplikací v mřížce náhledu"
+
+#: prefs.js:1721
+msgid ""
+"Sets a grid size (number of icons) in the folder icon preview. 3x3 options "
+"automatically switches between 2x2 and 3x3 grid depending on the number of "
+"icons in the folder"
+msgstr ""
+"Nastaví velikost mřížky (počet ikon) v náhledu složky. Možnost 3x3 "
+"automaticky přepíná mezi mřížkou 2x2 a 3x3 v závislosti na počtu ikon ve "
+"složce"
+
+#: prefs.js:1725
+msgid "2x2 (Default)"
+msgstr "2x2 (výchozí)"
+
+#: prefs.js:1726
+msgid "3x3 for 5+ apps"
+msgstr "3x3 pro 5+ aplikací"
+
+#: prefs.js:1727
+msgid "3x3 for 9+ apps"
+msgstr "3x3 pro 9+ aplikací"
+
+#: prefs.js:1735
+msgid "Folder Icon Size"
+msgstr "Velikost ikony složky"
+
+#: prefs.js:1736
+msgid ""
+"Allows to set a fixed icon size and bypass the default adaptive algorithm in "
+"the open folder dialog"
+msgstr ""
+"Umožňuje nastavit pevnou velikost ikony a obejít výchozí adaptivní "
+"algoritmus v dialogu otevření složky"
+
+#: prefs.js:1754
+msgid "Maximum Number Of Columns (0 for automatic)"
+msgstr "Maximální počet sloupců (0 pro automatický režim)"
+
+#: prefs.js:1755
+msgid ""
+"Specifies the maximum number of columns per page in folder grids. If you "
+"leave the value at 0, the maximum number of columns will be calculated based "
+"on available space. The actual folder grid dimensions will be determined by "
+"the number of items within the set limits"
+msgstr ""
+"Maximální počet sloupců na stránku v mřížkách složek. Pro 0 se maximální "
+"počet sloupců se vypočítá na základě dostupného místa. Skutečné rozměry "
+"mřížky složek budou určeny počtem položek v rámci nastavených limitů"
+
+#: prefs.js:1771
+msgid "Maximum Number Of Rows (0 for automatic)"
+msgstr "Maximální počet řádků (0 pro automatický režim)"
+
+#: prefs.js:1772
+msgid ""
+"Specifies the maximum number of rows per page in folder grids. If you leave "
+"the value at 0, the maximum number of rows will be calculated based on "
+"available space. The actual folder grid dimensions will be determined by the "
+"number of items within the set limits"
+msgstr ""
+"Maximální počet řádků v mřížce složek. Pro 0 se maximální počet sloupců se "
+"vypočítá na základě dostupného místa. Skutečné rozměry mřížky složek budou "
+"určeny počtem položek v rámci nastavených limitů"
+
+#: prefs.js:1790
+msgid "Folder Grid Spacing"
+msgstr "Rozestupy mřížky pro složky"
+
+#: prefs.js:1791
+msgid "Adjusts the spacing between icons in a folder grid"
+msgstr "Nastavuje rozestupy mezi ikonami ve složkách"
+
+#: prefs.js:1801
+msgid "Center Open Folders"
+msgstr "Vycentrovat otevřené složky"
+
+#: prefs.js:1802
+msgid ""
+"App folders may open in the center of the screen or be centered on the "
+"folder's source icon"
+msgstr ""
+"Složky aplikací se mohou otevřít ve středu obrazovky nebo centrovat nad "
+"ikonou zdrojové složky (volby vypnuto)"
+
+#: prefs.js:1814
+msgid "Content"
+msgstr "Obsah"
+
+#: prefs.js:1820
+msgid "App Grid Content"
+msgstr "Obsah mřížky aplikací"
+
+#: prefs.js:1821
+msgid ""
+"The default Shell removes favorite apps, this option allows to duplicate "
+"them in the grid or remove also running applications. Option \"Favorites and "
+"Running First\" only works with the Alphabet and Usage sorting"
+msgstr ""
+"Výchozí prostředí Shell odebere oblíbené aplikace. Tato možnost vám umožňuje "
+"duplikovat je v mřížce nebo odebrat také spuštěné aplikace. Možnost "
+"„Oblíbené a spuštěné jako první“ funguje pouze s řazením podle použití a "
+"abecedy"
+
+#: prefs.js:1825
+msgid "Include All"
+msgstr "Zahrnout vše"
+
+#: prefs.js:1826
+msgid "Include All - Favorites and Running First"
+msgstr "Zahrnout vše – Oblíbené a Spuštěné jako první"
+
+#: prefs.js:1827
+msgid "Exclude Favorites (Default)"
+msgstr "Vyloučit oblíbené (výchozí)"
+
+#: prefs.js:1828
+msgid "Exclude Running"
+msgstr "Vyloučit spuštěné"
+
+#: prefs.js:1829
+msgid "Exclude Favorites and Running"
+msgstr "Vyloučit Oblíbené a spuštěné"
+
+#: prefs.js:1837
+msgid "App Labels Behavior"
+msgstr "Chování štítků aplikací"
+
+#: prefs.js:1838
+msgid "Choose how and when to display app names"
+msgstr "Vyberte jak a kdy se mají zobrazovat názvy aplikací"
+
+#: prefs.js:1842
+msgid "Ellipsized - Expand Selected (Default)"
+msgstr "Zkrácené – rozbalit vybrané (výchozí)"
+
+#: prefs.js:1843
+msgid "Always Expanded"
+msgstr "Vždy rozbalené"
+
+#: prefs.js:1844
+msgid "Hidden - Show Selected Only"
+msgstr "Skryté - zobrazit pouze vybrané"
+
+#: prefs.js:1852
+msgid "Show Page Navigation Buttons"
+msgstr "Zobrazit navigační tlačítka stránky"
+
+#: prefs.js:1853
+msgid ""
+"You can hide the page navigation buttons if you don't need them or want to "
+"get more space for icons. The buttons are hidden automatically when there is "
+"only one page in the app grid"
+msgstr ""
+"Pokud navigační tlačítka na stránce nepotřebujete nebo chcete získat více "
+"místa pro ikony, můžete je skrýt. Tlačítka se skryjí automaticky, je-li v "
+"mřížce aplikace pouze jedna stránka"
+
+#: prefs.js:1866
+msgid "Performance"
+msgstr "Výkon"
+
+#: prefs.js:1872
+msgid "Smooth App Grid Animations"
+msgstr "Jemná animace mřížky aplikací"
+
+#: prefs.js:1873
+msgid ""
+"This option allows V-Shell to pre-realize app grid and app folders during "
+"session startup in order to avoid stuttering animations when using them for "
+"the first time. If enabled, the session startup needs a little bit more time "
+"to finish and necessary memory will be allocated at this time"
+msgstr ""
+"Tato volba umožňuje prostředí V-Shell při spuštění relace předpřipravit "
+"mřížku aplikací a složky aplikací, aby se zabránilo zadrhávání animací při "
+"jejich prvním použití. Pokud je tato možnost povolena, spuštění relace "
+"potřebuje o něco více času na dokončení a v této době bude alokována "
+"potřebná paměť"
+
+#: prefs.js:1883
+msgid "Reset"
+msgstr "Reset"
+
+#: prefs.js:1888
+msgid "Reset App Grid Layout"
+msgstr "Resetovat rozložení mřížky aplikace"
+
+#: prefs.js:1889
+msgid ""
+"Removes all stored app grid positions, after reset icons will be sorted "
+"alphabetically, except folder contents"
+msgstr ""
+"Odebere všechny uložené pozice mřížky aplikací, po resetu budou ikony "
+"seřazeny podle abecedy kromě obsahu složek"
+
+#: prefs.js:1897
+msgid "Remove App Grid Folders"
+msgstr "Odebrat složky mřížky aplikace"
+
+#: prefs.js:1898
+msgid "Removes all folders, folder apps will move to the root grid"
+msgstr "Odebere všechny složky, aplikace složek se přesunou do kořenové mřížky"
+
+#: prefs.js:1914
+msgid "Optional Modules"
+msgstr "Doplňkové moduly"
+
+#: prefs.js:1920
+msgid ""
+"Windows Search Provider - Moved from V-Shell to the standalone \"WSP\" "
+"extension"
+msgstr ""
+"Zprostředkovatel vyhledávání oken - přesunut z V-Shell do samostatného "
+"rozšíření \"WSP\""
+
+#: prefs.js:1921
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the WSP extension.\n"
+"\n"
+"WSP adds adds open windows to the search results. You can search app names "
+"and window titles. You can also use \"wq//\" or custom prefix (also by "
+"pressing the Space hotkey in the overview, or clicking dash icon) to "
+"suppress results from other search providers"
+msgstr ""
+"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, "
+"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále "
+"k dispozici, pokud si nainstalujete rozšíření WSP.\n"
+"\n"
+"WSP přidává do výsledků vyhledávání otevřená okna. Můžete vyhledávat názvy "
+"aplikací a názvy oken. Můžete také použít \"wq//\" nebo vlastní předponu "
+"(také stisknutím klávesové zkratky Space v přehledu nebo kliknutím na ikonu "
+"pomlčky) pro potlačení výsledků od jiných poskytovatelů vyhledávání"
+
+#: prefs.js:1928
+msgid ""
+"Extensions Search Provider - Moved from V-Shell to the standalone \"ESP\" "
+"extension"
+msgstr ""
+"Zprostředkovatel vyhledávání rozšíření - přesunut z V-Shell do samostatného "
+"rozšíření \"ESP\""
+
+#: prefs.js:1929
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the ESP extension.\n"
+"\n"
+"ESP adds extensions to the search results. You can also use \"eq//\" or "
+"custom prefix (also by pressing the Ctrl + Shift + Space hotkey in the "
+"overview, or clicking dash icon) to suppress results from other search "
+"providers"
+msgstr ""
+"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, "
+"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále "
+"k dispozici, pokud si nainstalujete rozšíření ESP.\n"
+"\n"
+"ESP přidává rozšíření do výsledků vyhledávání. Můžete také použít \"eq//\" "
+"nebo vlastní předponu (také stisknutím klávesové zkratky Ctrl + Shift + "
+"Mezerník v přehledu nebo kliknutím na ikonu pomlčky) pro potlačení výsledků "
+"od jiných poskytovatelů vyhledávání"
+
+#: prefs.js:1936
+msgid ""
+"Window Thumbnails (PiP) - Moved from V-Shell to the standalone \"WTMB\" "
+"extension"
+msgstr ""
+"Miniatury oken (PiP) - Přesunut z V-Shell do samostatného rozšíření \"WTMB\""
+
+#: prefs.js:1937
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the WTMB extension.\n"
+"\n"
+"WTMB allows the creation of Picture-in-Picture like window thumbnails that "
+"you can use for monitoring of windows on another workspace"
+msgstr ""
+"POZNÁMKA: Tento modul byl vydán jako samostatné rozšíření s novými funkcemi, "
+"kliknutím se dozvíte více. Související možnosti prostředí V-Shell jsou stále "
+"k dispozici, pokud si nainstalujete rozšíření WTMB.\n"
+"\n"
+"WTMB umožňuje vytvářet miniatury oken podobné obrázku v obrázku, které "
+"můžete použít pro sledování oken na jiném pracovním prostoru"
+
+#: prefs.js:1944
+msgid ""
+"Built-in Modules (allows to disable modules that conflict with another "
+"extension)"
+msgstr ""
+"Vestavěné moduly (umožňuje zakázat moduly, které jsou v konfliktu s jiným "
+"rozšířením)"
+
+#: prefs.js:1950
+msgid "AppDisplay / IconGrid"
+msgstr "Zobrazení aplikací / mřížka ikon"
+
+#: prefs.js:1951
+msgid "App grid customization and options"
+msgstr "Přizpůsobení a nastavení mřížky aplikace"
+
+#: prefs.js:1959
+msgid "AppFavorites"
+msgstr "Oblíbené aplikace"
+
+#: prefs.js:1960
+msgid "Pin/unpin app notification options"
+msgstr "Nastavení připnutí/odepnutí oznámení aplikace"
+
+#: prefs.js:1969
+msgid "Dash customization and options, support for vertical orientation"
+msgstr "Nastavení konfigurace Dash a podpora vertikální orientace"
+
+#: prefs.js:1978
+msgid "Hot corner options"
+msgstr "Hot Corner nastavení"
+
+#: prefs.js:1986
+msgid "MessageTray"
+msgstr "Panel zpráv"
+
+#: prefs.js:1987
+msgid "Notification position options"
+msgstr "Nastavení umístění oznámení"
+
+#: prefs.js:1995
+msgid "OsdWindow"
+msgstr "OSD okno"
+
+#: prefs.js:1996
+msgid "OSD position options"
+msgstr "OSD nastavení pozice"
+
+#: prefs.js:2004
+msgid "OverlayKey"
+msgstr "Překryvná klávesa"
+
+#: prefs.js:2005
+msgid "Overlay (Super/Window) key options"
+msgstr "Nastavení překryvných kláves (Super/Window)"
+
+#: prefs.js:2014
+msgid "Panel options"
+msgstr "Nastavení panelu"
+
+#: prefs.js:2023
+msgid "Search view and app search provider customization and options"
+msgstr ""
+"Zobrazení vyhledávání a přizpůsobení a nastavení poskytovatele vyhledávání "
+"aplikací"
+
+#: prefs.js:2031
+msgid "SearchController"
+msgstr "Ovladač vyhledávání"
+
+#: prefs.js:2032
+msgid "Escape key behavior options in the overview"
+msgstr "Přehled možností chování klávesy Escape"
+
+#: prefs.js:2040
+msgid "SwipeTracker"
+msgstr "Sledování gest"
+
+#: prefs.js:2041
+msgid "Gestures for vertical workspace orientation"
+msgstr "Gesta pro vertikální orientaci pracovního prostoru"
+
+#: prefs.js:2049
+msgid "WindowAttentionHandler"
+msgstr "Okno - vyžádání pozornosti"
+
+#: prefs.js:2050
+msgid "Window attention handler options"
+msgstr "Nastavení obsluhy oken"
+
+#: prefs.js:2058
+msgid "WindowManager"
+msgstr "Správce oken"
+
+#: prefs.js:2059
+msgid ""
+"Fixes an upstream bug in the minimization animation of a full-screen window"
+msgstr "Opravuje chybu v animaci minimalizace okna na celou obrazovku"
+
+#: prefs.js:2067
+msgid "WindowPreview"
+msgstr "Náhled okna"
+
+#: prefs.js:2068
+msgid ""
+"Window preview options, fixes an upstream bug that fills the system log with "
+"errors when you close a window from the overview or exit the overview with a "
+"gesture when any window is selected"
+msgstr ""
+"Možnosti náhledu okna. Opravuje chybu, která zaplňuje systémový protokol "
+"chybami, když zavřete okno z přehledu nebo opustíte přehled gestem, je-li "
+"vybráno jakékoli okno"
+
+#: prefs.js:2076
+msgid "Workspace"
+msgstr "Pracovní plocha"
+
+#: prefs.js:2077
+msgid ""
+"Fixes workspace preview allocations for vertical workspaces orientation and "
+"window scaling in static overview modes"
+msgstr ""
+"Opravuje přidělení náhledu pracovního prostoru pro vertikální orientaci "
+"pracovních prostorů a měřítko okna v režimech statického přehledu"
+
+#: prefs.js:2085
+msgid "WorkspaceAnimation"
+msgstr "Animace pracovní plochy"
+
+#: prefs.js:2086
+msgid "Static workspace animation option"
+msgstr "Možnost animace statické pracovní plochy"
+
+#: prefs.js:2094
+msgid "WorkspaceSwitcherPopup"
+msgstr "Vyskakovací přepínač pracovní plochy"
+
+#: prefs.js:2095
+msgid "Workspace switcher popup orientation and position options"
+msgstr "Nastavení pozice a orientace vyskakovacího přepínače pracovní plochy"
+
+#: prefs.js:2111
+msgid "Keyboard"
+msgstr "Klávesnice"
+
+#: prefs.js:2117
+msgid "Override Page Up/Down Shortcuts"
+msgstr "Přepsat zkratky Page Up/Down"
+
+#: prefs.js:2118
+msgid ""
+"This option automatically overrides the (Shift +) Super + Page Up/Down "
+"keyboard shortcuts for the current workspace orientation. If you encounter "
+"any issues, check the configuration in the dconf editor"
+msgstr ""
+"Tato možnost automaticky přepíše klávesové zkratky (Shift +) Super + Page Up/"
+"Down pro aktuální orientaci pracovního prostoru. Pokud narazíte na nějaké "
+"problémy, zkontrolujte konfiguraci v editoru dconf"
+
+#: prefs.js:2126
+msgid "Workarounds / Hacks"
+msgstr "Workarounds / Hacky"
+
+#: prefs.js:2132
+msgid "Delay at Startup"
+msgstr "Zpožděné spuštění"
+
+#: prefs.js:2133
+msgid ""
+"If you encounter issues during GNOME Shell startup after logging in, which "
+"could be caused by V-Shell's incompatibility with another extension, try "
+"enabling this option. When enabled, V-Shell is activated after the startup "
+"is complete. It will activate automatically when Dash to Dock, Ubuntu Dock "
+"or Dash to Panel extensions are detected."
+msgstr ""
+"Pokud se během spouštění prostředí GNOME Shell po přihlášení vyskytnou "
+"problémy, které mohou být způsobeny nekompatibilitou prostředí V-Shell s "
+"jiným rozšířením, zkuste tuto možnost povolit. Je-li tato možnost povolena, "
+"bude prostředí V-Shell aktivováno po dokončení spuštění. Aktivuje se "
+"automaticky při zjištění rozšíření Dash to Dock, Ubuntu Dock nebo Dash to "
+"Panel."
+
+#: prefs.js:2141
+msgid "Fix New Window Not In Focus"
+msgstr "Oprava nového okna, které není zaostřeno"
+
+#: prefs.js:2142
+msgid ""
+"If you often find that the app window you open from the Activities overview "
+"does not get focus, try enabling this option."
+msgstr ""
+"Pokud často zjišťujete, že okno aplikace, které otevřete z přehledu aktivit, "
+"není aktivní, zkuste tuto možnost povolit."
+
+#: prefs.js:2150
+msgid "Fix New Window Not On Current Monitor (experimental)"
+msgstr "Opravuje chybu, kdy nové okno není na aktuálním monitoru"
+
+#: prefs.js:2151
+msgid ""
+"If you use multiple monitors, you may encounter the issue of new windows "
+"opening on a different monitor than expected. This option moves those "
+"windows to the current monitor, determined by the position of the mouse "
+"pointer. However, this is a workaround, and some windows may override it, "
+"moving the window back to the previous monitor during initialization"
+msgstr ""
+"Pokud používáte více monitorů, mohou se nová okna otevírat na jiném "
+"monitoru, než jste očekávali. Tato volba přesune nová okna na aktuální "
+"monitor určený polohou ukazatele myši. Jedná se však o jen obcházení "
+"problému a může se stát, že některá okna toto chování mohou zrušit a během "
+"inicializace přesunou okno zpět na předchozí monitor"
+
+#: prefs.js:2174
+msgid "Version"
+msgstr "Verze"
+
+#: prefs.js:2180
+msgid "Reset all options"
+msgstr "Obnovit všechny nastavení"
+
+#: prefs.js:2181
+msgid "Reset all options to their default values"
+msgstr "Nastavte všechny nastavení na výchozí hodnoty"
+
+#: prefs.js:2187
+msgid "Links"
+msgstr "Odkazy"
+
+#: prefs.js:2191
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: prefs.js:2192
+msgid "Source code and more info about this extension"
+msgstr "Zdrojový kód a další informace o tomto rozšíření"
+
+#: prefs.js:2197
+msgid "Changelog"
+msgstr "Seznam změn"
+
+#: prefs.js:2198
+msgid "See what's changed."
+msgstr "Podívejte se, co se změnilo."
+
+#: prefs.js:2203
+msgid "GNOME Extensions"
+msgstr "Rozšíření GNOME"
+
+#: prefs.js:2204
+msgid "Rate and comment V-Shell on the GNOME Extensions site"
+msgstr "Ohodnoťte a okomentujte V-Shell na webu GNOME Extensions"
+
+#: prefs.js:2209
+msgid "Report a bug or suggest new feature"
+msgstr "Nahlaste chybu nebo navrhněte novou funkci"
+
+#: prefs.js:2210
+msgid "Help me to help you!"
+msgstr "Pomozte mi, abych vám pomohl!"
+
+#: prefs.js:2215
+msgid "Buy Me a Coffee"
+msgstr "Kupte mi kávu"
+
+#: prefs.js:2216
+msgid "Enjoying V-Shell? Consider supporting it by buying me a coffee!"
+msgstr "Užíváte si V-Shell? Podpořte ho tím, že mi koupíte kávu!"
+
+#: lib/util.js:408
+msgid "Updating V-Shell"
+msgstr "Aktualizace V-Shell"
+
+#: lib/windowSearchProvider.js:118
+msgid "Open Windows"
+msgstr "Otevřené okna"
+
+#: lib/windowSearchProvider.js:119
+msgid "Search open windows"
+msgstr "Prohledej otevřená okna"
+
+#: lib/dash.js:983
+msgid "Force Quit"
+msgstr "Vynutit vypnutí"
+
+#: lib/dash.js:1000
+msgid "Move App to Current Workspace ( Shift + Click )"
+msgstr "Přesunout aplikaci do aktuální pracovní plochy (Shift + kliknutí)"
+
+#: lib/dash.js:1003
+msgid "Create Window Thumbnail/PiP"
+msgstr "Vytvoření okna - Náhled/PIP"
+
+#: lib/search.js:336
+msgid "Searching…"
+msgstr "Hledání…"
+
+#: lib/search.js:338
+msgid "No results."
+msgstr "Bez výsledku."
+
+#: lib/optionsFactory.js:295
+msgid "Reset profile to defaults"
+msgstr "Reset profilů na výchozí hodnoty"
+
+#: lib/optionsFactory.js:303
+msgid "GNOME 3 Layout (Vertical WS)"
+msgstr "GNOME 3 (vertikální) rozložení ploch"
+
+#: lib/optionsFactory.js:304
+msgid "GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)"
+msgstr "GNOME 4x (horizontální) rozložení ploch - Spodní roh"
+
+#: lib/optionsFactory.js:305
+msgid "Top Left Hot Corner Centric (Vertical WS)"
+msgstr "Levý horní roh (vertikální plochy)"
+
+#: lib/optionsFactory.js:306
+msgid "Dock-Like Overview, Bottom Hot Edge (Horizontal WS)"
+msgstr "Přehled podobný doku, aktivní spodní okraj, horizontální plochy"
+
+#: lib/optionsFactory.js:328
+msgid "Load profile"
+msgstr "Načti profil"
+
+#: lib/optionsFactory.js:337
+msgid "Save current settings into this profile"
+msgstr "Ulož současné nastavení do tohoto profilu"
+
+#: lib/recentFilesSearchProvider.js:119
+msgid "Recent Files"
+msgstr "Nedávné soubory"
+
+#: lib/extensionsSearchProvider.js:127
+msgid "Extensions"
+msgstr "Rozšíření"
+
+#: lib/extensionsSearchProvider.js:128
+msgid "Search extensions"
+msgstr "Prohledej rozšíření"
+
+#~ msgid "Maximum size of Dash icons in pixels"
+#~ msgstr "Maximální velikost Dash ikon v pixelech"
+
+#~ msgid "Search Windows"
+#~ msgstr "Vyhledávací okno"
+
+#~ msgid "GNOME 3"
+#~ msgstr "GNOME 3"
+
+#~ msgid "Hot Corner Centric - Top Left Hot Corner"
+#~ msgstr "Aktivní roh vlevo nahoře"
+
+#~ msgid "Open Windows Icon Position"
+#~ msgstr "Pozice ikony „Hledat v otevřených oknech“"
+
+#~ msgid ""
+#~ "Allows to add \"Search Open Windows\" icon into Dash (if window search "
+#~ "provider enabled on the Modules tab) so you can directly toggle window "
+#~ "search provider results. You can also use the secondary mouse button "
+#~ "click on the Show Apps Icon, or the Space hotkey"
+#~ msgstr ""
+#~ "Umožňuje přidat ikonu „Hledat v otevřených oknech“ do Dashe (pokud je na "
+#~ "kartě Moduly povolen poskytovatel vyhledávání v okně), takže můžete přímo "
+#~ "přepínat výsledky poskytovatele vyhledávání. Můžete také použít "
+#~ "sekundární tlačítko myši na ikonu Zobrazit aplikaci nebo mezerník"
+
+#~ msgid "Recent Files Icon Position"
+#~ msgstr "Pozice ikony „Hledat v posledních souborech“"
+
+#~ msgid ""
+#~ "Allows to add \"Search Recent Files\" icon into Dash (if recent files "
+#~ "search provider enabled on the Modules tab) so you can directly toggle "
+#~ "recent files search provider results. You can also use Ctrl + Space hotkey"
+#~ msgstr ""
+#~ "Umožní přidat ikonu „Hledat v posledních souborech“ do Dash (pokud je "
+#~ "poskytovatel vyhledávání posledních souborů povolen na kartě Moduly), "
+#~ "takže můžete přímo přepínat výsledky poskytovatele vyhledávání posledních "
+#~ "souborů. Můžete také použít klávesovou zkratku Ctrl + mezerník"
+
+#~ msgid "Extensions Icon Position"
+#~ msgstr "Poloha ikony rozšíření"
+
+#~ msgid ""
+#~ "Allows to add \"Search Extensions\" icon into Dash (if extensions search "
+#~ "provider enabled on the Module tab) so you can directly toggle extensions "
+#~ "search provider results. You can also use the Ctrl + Shift + Space hotkey"
+#~ msgstr ""
+#~ "Umožňuje přidat ikonu „Rozšíření hledání“ do Dash (je-li poskytovatel "
+#~ "rozšířeného vyhledávání povolen na kartě Moduly), takže můžete přímo "
+#~ "přepínat výsledky vyhledávání poskytovatele rozšíření. Můžete také použít "
+#~ "klávesovou zkratku Ctrl + Shift + mezerník"
+
+#~ msgid "Folder Columns per Page (0 for adaptive grid)"
+#~ msgstr "Počet sloupců složek na stránku (0 pro adaptivní mřížku)"
+
+#~ msgid "Folder Rows per Page (0 for adaptive grid)"
+#~ msgstr "Počet řádků složek na stránku (0 pro adaptivní mřížku)"
+
+#~ msgid "Window Thumbnails (PIP)"
+#~ msgstr "Miniatury pracovního prostoru (PIP)"
+
+#, javascript-format
+#~ msgid "Default Window Thumbnail (PIP) Scale (% of screen height)"
+#~ msgstr "Výchozí měřítko miniatury okna (PIP) (% výšky obrazovky)"
+
+#~ msgid ""
+#~ "Default scale of window thumbnail (like Picture In Picture) that you can "
+#~ "create using the app icon menu or window preview action"
+#~ msgstr ""
+#~ "Výchozí měřítko miniatury okna, kterou lze vytvořit pomocí nabídky ikony "
+#~ "aplikace nebo akce náhledu okna"
+
+#~ msgid ""
+#~ "Disable or change behavior when you press and release the Super key. The "
+#~ "\"Search Windows\" options requires the WindowSearchProvider module to be "
+#~ "activated"
+#~ msgstr ""
+#~ "Zakázat nebo změnit chování při stisknutí a uvolnění klávesy Super. "
+#~ "Možnosti „Hledat v oknech“ vyžadují aktivaci modulu WindowSearchProvider"
+
+#~ msgid "Search Windows Icon - Scroll Action"
+#~ msgstr "Ikona hledání - akce posouvání"
+
+#~ msgid ""
+#~ "Choose the behavior when scrolling over the Search Windows icon. The "
+#~ "window cycler works with a list of windows sorted by \"Most Recently "
+#~ "Used\" of the current workspace or all workspaces. Scrolling up cycles "
+#~ "through previously used windows on the same workspace, or all windows "
+#~ "regardless workspace. This option is mainly useful for the static "
+#~ "workspace overview mode."
+#~ msgstr ""
+#~ "Zvolte chování při posouvání nad ikonou Hledat v okně. Algoritmus cyklení "
+#~ "oken pracuje se seznamem oken seřazených podle „Nejnověji použitých“ "
+#~ "aktuální pracovní plochy nebo všech pracovních ploch. Posouvání nahoru "
+#~ "cykluje dříve použitá okna na stejné pracovní ploše nebo všechna okna bez "
+#~ "ohledu na pracovní plochu. Tato volba je užitečná především pro režim "
+#~ "statického přehledu pracovních ploch."
+
+#~ msgid "Cycle All Windows"
+#~ msgstr "Cykluj všechna okna"
+
+#~ msgid "Cycle Windows On Current WS"
+#~ msgstr "Cykluj okna v aktuálním WS"
+
+#~ msgid "App Grid Order"
+#~ msgstr "Pořadí aplikací"
+
+#~ msgid "Window Search Provider - Sorting"
+#~ msgstr "Povolit poskytovatele vyhledávání - řazení"
+
+#~ msgid "Choose the window sorting method"
+#~ msgstr "Zvol metodu třídění okna"
+
+#~ msgid "Most Recently Used (MRU)"
+#~ msgstr "Nejpoužívanější (MRU)"
+
+#~ msgid "MRU - Current Workspace First"
+#~ msgstr "Nejpoužívanější - současný pracovní prostor První"
+
+#~ msgid "MRU - By Workspaces"
+#~ msgstr "Nejpoužívanější - podle pracovních ploch"
+
+#~ msgid "Stable Sequence - By Workspaces"
+#~ msgstr "Stabilní pořadí podle pracovních ploch"
+
+#~ msgid "Animations - General"
+#~ msgstr "Animace - Obecné"
+
+#~ msgid "Animations - Overview"
+#~ msgstr "Animace – přehled"
+
+#~ msgid "WindowSearchProvider"
+#~ msgstr "WindowSearchProvider"
+
+#~ msgid "RecentFilesSearchProvider"
+#~ msgstr "Poskytovatel vyhledávání nedávných souborů"
+
+#~ msgid ""
+#~ "Activates the recent files search provider that can be triggered by a "
+#~ "dash icon, Ctrl + Space hotkey or by typing \"fq//\" prefix in the search "
+#~ "entry field. This option needs File History option enabled in the GNOME "
+#~ "Privacy settings"
+#~ msgstr ""
+#~ "Aktivuje poskytovatele vyhledávání posledních souborů spustitelného "
+#~ "ikonou pomlčka, klávesovou zkratkou Ctrl + mezerník nebo zadáním předpony "
+#~ "\"fq//“ do pole pro zadání vyhledávání. Tato možnost vyžaduje, aby byla v "
+#~ "nastavení ochrany osobních údajů GNOME povolena možnost Historie souborů"
+
+#~ msgid "ExtensionsSearchProvider"
+#~ msgstr "Rozšířený poskytovatel hledání"
+
+#~ msgid "WindowThumbnail"
+#~ msgstr "Miniatury pracovního prostoru"
+
+#~ msgid ""
+#~ "Create Window Thumbnail (PIP) option in the app icon menu and window "
+#~ "preview actions"
+#~ msgstr ""
+#~ "Možnost vytvořit miniaturu okna (PIP) v nabídce ikony aplikace a akce "
+#~ "náhledu okna"
+
+#~ msgid "If you like V-Shell, you can help me with my coffee expenses"
+#~ msgstr "Pokud se vám líbí V-Shell, můžete mi pomoci s mými výdaji na kávu"
+
+#~ msgid ""
+#~ "Overview background crashed!\n"
+#~ "If you are using Blur My Shell, disable overview blur in its settings and "
+#~ "re-enable V-Shell Overview Background to avoid visual glitches."
+#~ msgstr ""
+#~ "Přehled pozadí havaroval!\n"
+#~ "Používáte-li aplikaci Blur My Shell, zakažte v jejím nastavení rozmazání "
+#~ "přehledu a znovu zapněte funkci V-Shell Overview Background, abyste se "
+#~ "vyhnuli vizuálním závadám."
+
+#~ msgid "Search Open Windows (Hotkey: Space)"
+#~ msgstr "Hledat v otevřených oknech (klávesová zkratka: mezerník)"
+
+#~ msgid "Search Recent Files (Hotkey: Shift + Space)"
+#~ msgstr "Prohledej poslední soubory (Shift + mezerník)"
+
+#~ msgid "Search Extensions (Hotkey: Ctrl + Space)"
+#~ msgstr "Prohledej rozšíření (Ctrl + mezerník)"
+
+#~ msgid "Search recent files"
+#~ msgstr "Prohledat nedávné soubory"
+
+#~ msgid "Adjusts workspace thumbnails vertical position."
+#~ msgstr "Upraví vertikální polohu miniatur pracovního prostoru."
+
+#~ msgid ""
+#~ "App grid in app view page will be centered to the display instead of the "
+#~ "available space. This option may have impact on the size of the grid, "
+#~ "more for narrower and small resolution displays, especially if workspace "
+#~ "thumbnails are bigger."
+#~ msgstr ""
+#~ "Mřížka aplikace na stránce zobrazení aplikace bude vystředěna k displeji "
+#~ "místo dostupného místa. Tato možnost může mít vliv na velikost mřížky, "
+#~ "spíše pro užší displeje a displeje s malým rozlišením, zvláště pokud jsou "
+#~ "miniatury pracovního prostoru větší."
+
+#~ msgid "Main panel can be visible always, only in the overview or never."
+#~ msgstr "Hlavní panel může být viditelný vždy, pouze v přehledu nebo nikdy."
+
+#~ msgid "Adjusts secondary monitors workspace thumbnails vertical position."
+#~ msgstr ""
+#~ "Upravuje vertikální polohu miniatur pracovního prostoru sekundárních "
+#~ "monitorů."
+
+#~ msgid "24"
+#~ msgstr "24"
+
+#~ msgid "16"
+#~ msgstr "16"
+
+#~ msgid "Default size is 64."
+#~ msgstr "Výchozí velikost je 64."
+
+#~ msgid "Always Show Window Titles"
+#~ msgstr "Vždy zobrazovat názvy oken"
+
+#~ msgid ""
+#~ "All windows on the workspace preview will show their titles, not only the "
+#~ "one with the mouse pointer."
+#~ msgstr ""
+#~ "Všechna okna v náhledu pracovní plochy budou zobrazovat své názvy, nejen "
+#~ "ty s ukazatelem myši."
+
+#~ msgid ""
+#~ "Allows to disable the default adaptive algorithm and set a fixed size of "
+#~ "icons inside folders."
+#~ msgstr ""
+#~ "Umožňuje zakázat výchozí adaptivní algoritmus a nastavit pevnou velikost "
+#~ "ikon uvnitř složek."
+
+#~ msgid ""
+#~ "Each folder icon shows (up to) 4 app icons as a preview of the folder "
+#~ "content, this option allows you to increase the number to 9 icons if "
+#~ "folder contains more than 4 or 8 apps. The latter avoids half empty "
+#~ "folder icons."
+#~ msgstr ""
+#~ "Každá ikona složky zobrazuje (až) 4 ikony aplikací jako náhled obsahu "
+#~ "složky. Tato možnost umožňuje zvýšit počet na 9 ikon, pokud složka "
+#~ "obsahuje více než 4 nebo 8 aplikací."
+
+#~ msgid "Show Static Background"
+#~ msgstr "Zobrazit statické pozadí"
+
+#~ msgid "Show static background wallpaper instead of the solid grey color."
+#~ msgstr "Zobrazit statickou tapetu na pozadí místo šedé barvy."
+
+#~ msgid "Ripples animation shows up when you trigger hot corner."
+#~ msgstr "Animace vlnění se zobrazí, když spustíte Hot Corner."
+
+#~ msgid "Dash Icon Click"
+#~ msgstr "Dash - kliknutí na ikonu"
+
+#~ msgid ""
+#~ "if the app you clicked on has more than one window and the recently used "
+#~ "window is not on the current workspace, the overview can switch to the "
+#~ "workspace with the recent window."
+#~ msgstr ""
+#~ "pokud aplikace, na kterou jste klikli, má více než jedno okno a naposledy "
+#~ "použité okno není na aktuální pracovní ploše, přehled se může přepnout na "
+#~ "pracovní plochu s posledním oknem."
+
+#~ msgid "Switch to Workspace with Recently Used Window"
+#~ msgstr "Přepnout na plochu s naposledy použitým oknem"
+
+#~ msgid ""
+#~ "If enabled, clicking an app icon in a folder preview directly opens the "
+#~ "app without having to open the folder first. Middle button opens new "
+#~ "window of the app without closing the overview, so you can open multiple "
+#~ "apps in a row on the current workspace and secondary button opens the "
+#~ "folder."
+#~ msgstr ""
+#~ "Pokud je tato možnost povolena, kliknutím na ikonu aplikace v náhledu "
+#~ "složky se aplikace otevře přímo, aniž byste museli nejprve otevřít "
+#~ "složku. Prostřední tlačítko otevře nové okno aplikace bez zavření "
+#~ "přehledu, takže na aktuálním pracovním prostoru můžete otevřít více "
+#~ "aplikací v řadě a sekundární tlačítko otevře složku."
+
+#~ msgid "Top Middle"
+#~ msgstr "Nahoře uprostřed"
+
+#~ msgid "Bottom Middle"
+#~ msgstr "Dole uprostřed"
+
+#~ msgid "Compatibility"
+#~ msgstr "Kompatibilita"
+
+#~ msgid "Fix for Dash to Dock"
+#~ msgstr "Oprava pro Dash to Dock"
+
+#~ msgid ""
+#~ "With the default Ubuntu Dock and other Dash To Dock forks, you may "
+#~ "experience issues with Activities overview after you change Dock position "
+#~ "or change monitors configuration. If you are experiencing such issues, "
+#~ "try to enable this option, or (better) disable/replace the dock extension."
+#~ msgstr ""
+#~ "S výchozím dokem Ubuntu a dalšími variantami Dash To Dock můžete "
+#~ "zaznamenat problémy s přehledem aktivit poté, co změníte polohu doku nebo "
+#~ "změníte konfiguraci monitorů. Pokud máte takové problémy, zkuste tuto "
+#~ "možnost povolit nebo (lépe) zakázat/vyměnit rozšíření doku."
+
+#~ msgid ""
+#~ "V-Shell Modules that can be disabled in case of conflict or misbehavior."
+#~ msgstr ""
+#~ "Moduly V-Shell, které lze deaktivovat v případě konfliktu nebo špatného "
+#~ "chování."
+
+#~ msgid ""
+#~ "Hot corner options, removes right panel barrier that collides with CHC-E "
+#~ "extension."
+#~ msgstr ""
+#~ "Možnosti Hot Corner, odstraňuje zábranu pravého panelu, která koliduje s "
+#~ "rozšířením CHC-E."
diff --git a/extensions/47/vertical-workspaces/po/meson.build b/extensions/47/vertical-workspaces/po/meson.build
new file mode 100644
index 0000000..e4483a5
--- /dev/null
+++ b/extensions/47/vertical-workspaces/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('vertical-workspaces', preset : 'glib')
diff --git a/extensions/45/vertical-workspaces/po/nl.po b/extensions/47/vertical-workspaces/po/nl.po
index 2d9613e..2d9613e 100644
--- a/extensions/45/vertical-workspaces/po/nl.po
+++ b/extensions/47/vertical-workspaces/po/nl.po
diff --git a/extensions/47/vertical-workspaces/po/vertical-workspaces.pot b/extensions/47/vertical-workspaces/po/vertical-workspaces.pot
new file mode 100644
index 0000000..1e1b2cf
--- /dev/null
+++ b/extensions/47/vertical-workspaces/po/vertical-workspaces.pot
@@ -0,0 +1,2005 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR GdH
+# This file is distributed under the same license as the vertical-workspaces package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: vertical-workspaces\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-19 08:40+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: prefs.js:29
+msgid "Profiles"
+msgstr ""
+
+#: prefs.js:34 prefs.js:1977
+msgid "Layout"
+msgstr ""
+
+#: prefs.js:39
+msgid "Appearance"
+msgstr ""
+
+#: prefs.js:44
+msgid "Behavior"
+msgstr ""
+
+#: prefs.js:49 prefs.js:345
+msgid "App Grid"
+msgstr ""
+
+#: prefs.js:54
+msgid "Modules"
+msgstr ""
+
+#: prefs.js:59
+msgid "Misc"
+msgstr ""
+
+#: prefs.js:64
+msgid "About"
+msgstr ""
+
+#: prefs.js:107
+msgid "Custom Profiles"
+msgstr ""
+
+#: prefs.js:108
+msgid "Sets of settings that can help you with the initial customization"
+msgstr ""
+
+#: prefs.js:113
+msgid "Profile 1"
+msgstr ""
+
+#: prefs.js:119
+msgid "Profile 2"
+msgstr ""
+
+#: prefs.js:125
+msgid "Profile 3"
+msgstr ""
+
+#: prefs.js:131
+msgid "Profile 4"
+msgstr ""
+
+#: prefs.js:146 prefs.js:629 prefs.js:1185 prefs.js:1968
+msgid "Dash"
+msgstr ""
+
+#: prefs.js:152
+msgid "Dash Position"
+msgstr ""
+
+#: prefs.js:157 prefs.js:417
+msgid "Bottom"
+msgstr ""
+
+#: prefs.js:158
+msgid "Left"
+msgstr ""
+
+#: prefs.js:159
+msgid "Top"
+msgstr ""
+
+#: prefs.js:160
+msgid "Right"
+msgstr ""
+
+#: prefs.js:161 prefs.js:205 prefs.js:548
+msgid "Hide"
+msgstr ""
+
+#: prefs.js:169
+msgid "Center Horizontal Dash to Workspace"
+msgstr ""
+
+#: prefs.js:170
+msgid ""
+"If the Dash Position is set to Top or Bottom, the position will be "
+"recalculated relative to the workspace preview instead of the screen"
+msgstr ""
+
+#: prefs.js:189
+msgid "Fine Tune Dash Position"
+msgstr ""
+
+#: prefs.js:190
+msgid ""
+"Adjusts the position of the dash on the axis given by the orientation of the "
+"workspaces"
+msgstr ""
+
+#: prefs.js:200
+msgid "Show Apps Icon Position"
+msgstr ""
+
+#: prefs.js:201
+msgid "Sets the position of the \"Show Applications\" icon in the Dash"
+msgstr ""
+
+#: prefs.js:206
+msgid "Start"
+msgstr ""
+
+#: prefs.js:207
+msgid "End"
+msgstr ""
+
+#: prefs.js:215
+msgid "Workspace Thumbnails / Orientation"
+msgstr ""
+
+#: prefs.js:221
+msgid "Thumbnails Position / Workspaces Orientation"
+msgstr ""
+
+#: prefs.js:222
+msgid ""
+"Position of the workspace thumbnails on the screen also sets orientation of "
+"the workspaces to vertical or horizontal. You have two options to disable "
+"workspace thumbnails, one sets workspaces to vertical orientation, the "
+"second one to horizontal."
+msgstr ""
+
+#: prefs.js:227
+msgid "Left \t Vertical Orientation"
+msgstr ""
+
+#: prefs.js:228
+msgid "Right \t Vertical Orientation"
+msgstr ""
+
+#: prefs.js:229
+msgid "Hide \t Vertical Orientation"
+msgstr ""
+
+#: prefs.js:230
+msgid "Top \t Horizontal Orientation"
+msgstr ""
+
+#: prefs.js:231
+msgid "Bottom \t Horizontal Orientation"
+msgstr ""
+
+#: prefs.js:232
+msgid "Hide \t Horizontal Orientation"
+msgstr ""
+
+#: prefs.js:248 prefs.js:564
+msgid "Fine Tune Workspace Thumbnails Position"
+msgstr ""
+
+#: prefs.js:249 prefs.js:565
+msgid ""
+"Adjusts the position of the thumbnails on the axis given by the orientation "
+"of the workspaces"
+msgstr ""
+
+#: prefs.js:257
+msgid "Reserve Full Screen Height/Width for Thumbnails"
+msgstr ""
+
+#: prefs.js:258
+msgid ""
+"The whole screen height/width will be reserved for workspace thumbnails at "
+"the expense of space available for Dash (if the Dash is oriented in a "
+"different axis)."
+msgstr ""
+
+#: prefs.js:275
+msgid "Workspace Thumbnails Max Scale - Window Picker"
+msgstr ""
+
+#: prefs.js:276
+msgid ""
+"Adjusts the maximum size of the workspace thumbnails in the overview "
+"(percentage relative to display width)"
+msgstr ""
+
+#: prefs.js:293
+msgid "Workspace Thumbnails Max Scale - App View"
+msgstr ""
+
+#: prefs.js:294
+msgid "Allows you to set different thumbnails scale for the Applications view"
+msgstr ""
+
+#: prefs.js:302 prefs.js:822
+msgid "Workspace Preview"
+msgstr ""
+
+#: prefs.js:317
+msgid "Workspaces Scale"
+msgstr ""
+
+#: prefs.js:318
+msgid ""
+"Allows to shrink workspace previews to adjust spacing or fit more of the "
+"adjacent workspaces on the screen. Default size is calculated to use all "
+"available space with minimal spacing"
+msgstr ""
+
+#: prefs.js:335
+msgid "Workspaces Spacing"
+msgstr ""
+
+#: prefs.js:336
+msgid ""
+"Adjusts spacing between workspace previews so you can control how much of "
+"the adjacent workspaces overlap to the current workspace overview. Default "
+"value should set the adjacent workspaces off-screen."
+msgstr ""
+
+#: prefs.js:351
+msgid "Center App Grid"
+msgstr ""
+
+#: prefs.js:352
+msgid "Centers the app grid relative to the display instead of available space"
+msgstr ""
+
+#: prefs.js:361
+msgid "Search View"
+msgstr ""
+
+#: prefs.js:367
+msgid "Center Search View"
+msgstr ""
+
+#: prefs.js:368
+msgid ""
+"Centers the search view relative to the display instead of available space"
+msgstr ""
+
+#: prefs.js:376
+msgid "Always Show Search Entry"
+msgstr ""
+
+#: prefs.js:377
+msgid ""
+"If disabled, the search entry field will be hidden when not in use, so the "
+"workspace preview and app grid may take up more space"
+msgstr ""
+
+#: prefs.js:394
+msgid "Search Results Width"
+msgstr ""
+
+#: prefs.js:395
+msgid ""
+"Adjusts the maximum width of search results view (percentage relative to "
+"default). This allows to fit more (or less) app icons into the app search "
+"result"
+msgstr ""
+
+#: prefs.js:405 prefs.js:2013
+msgid "Panel"
+msgstr ""
+
+#: prefs.js:411
+msgid "Main Panel Position"
+msgstr ""
+
+#: prefs.js:412
+msgid "Allows to place the main panel at the bottom of the primary display"
+msgstr ""
+
+#: prefs.js:416
+msgid "Top (Default)"
+msgstr ""
+
+#: prefs.js:425
+msgid "Main Panel Visibility"
+msgstr ""
+
+#: prefs.js:426
+msgid "Allows to hide main panel when not needed"
+msgstr ""
+
+#: prefs.js:430
+msgid "Always Visible (Default)"
+msgstr ""
+
+#: prefs.js:431
+msgid "Overview Only"
+msgstr ""
+
+#: prefs.js:432
+msgid "Always Hidden"
+msgstr ""
+
+#: prefs.js:442
+msgid "Workspace Switcher Popup"
+msgstr ""
+
+#: prefs.js:458
+msgid "Horizontal Position (percentage from the left)"
+msgstr ""
+
+#: prefs.js:459
+msgid ""
+"This popup shows up when you switch workspace using a keyboard shortcut or "
+"gesture outside of the overview. You can disable it on the \"Behavior\" tab. "
+"If you want more control over the popup, try the \"Workspace Switcher "
+"Manager\" extension"
+msgstr ""
+
+#: prefs.js:479
+msgid "Vertical Position (percentage from the top)"
+msgstr ""
+
+#: prefs.js:490
+msgid "Notifications and OSD"
+msgstr ""
+
+#: prefs.js:496
+msgid "Notification Banner Position"
+msgstr ""
+
+#: prefs.js:497
+msgid "Choose where the notification banners appear on the screen"
+msgstr ""
+
+#: prefs.js:501 prefs.js:520 prefs.js:1150
+msgid "Top Left"
+msgstr ""
+
+#: prefs.js:502
+msgid "Top Center (Default)"
+msgstr ""
+
+#: prefs.js:503 prefs.js:522 prefs.js:1151
+msgid "Top Right"
+msgstr ""
+
+#: prefs.js:504 prefs.js:524 prefs.js:1152
+msgid "Bottom Left"
+msgstr ""
+
+#: prefs.js:505
+msgid "Bottom Center"
+msgstr ""
+
+#: prefs.js:506 prefs.js:526 prefs.js:1153
+msgid "Bottom Right"
+msgstr ""
+
+#: prefs.js:514
+msgid "OSD Popup Position"
+msgstr ""
+
+#: prefs.js:515
+msgid ""
+"Choose where the OSD pop-ups (like sound volume level) appear on the screen"
+msgstr ""
+
+#: prefs.js:519 prefs.js:743 prefs.js:787 prefs.js:1087 prefs.js:1107
+#: prefs.js:1130 prefs.js:1244 prefs.js:1363 prefs.js:1380 prefs.js:1397
+#: prefs.js:1463
+msgid "Disable"
+msgstr ""
+
+#: prefs.js:521
+msgid "Top Center"
+msgstr ""
+
+#: prefs.js:523
+msgid "Center"
+msgstr ""
+
+#: prefs.js:525
+msgid "Bottom Center (Default)"
+msgstr ""
+
+#: prefs.js:534
+msgid "Secondary Monitors"
+msgstr ""
+
+#: prefs.js:540
+msgid "Workspace Thumbnails Position"
+msgstr ""
+
+#: prefs.js:541
+msgid ""
+"Allows to place workspace thumbnails of secondary monitors on the opposite "
+"side than on the primary monitor"
+msgstr ""
+
+#: prefs.js:545
+msgid "Same as Primary"
+msgstr ""
+
+#: prefs.js:546
+msgid "Left / Top"
+msgstr ""
+
+#: prefs.js:547
+msgid "Right / Bottom"
+msgstr ""
+
+#: prefs.js:582
+msgid "Workspace Thumbnails Max Scale"
+msgstr ""
+
+#: prefs.js:583
+msgid ""
+"Adjusts maximum size of the workspace thumbnails (percentage relative to the "
+"display width / height) for secondary monitors"
+msgstr ""
+
+#: prefs.js:600
+msgid "Workspace Preview Scale"
+msgstr ""
+
+#: prefs.js:601
+msgid "Allows to scale down workspace previews on secondary monitors"
+msgstr ""
+
+#: prefs.js:609
+msgid "Shift Overview by Panel Height"
+msgstr ""
+
+#: prefs.js:610
+msgid ""
+"This option can help align the overview of the secondary monitor with the "
+"primary one"
+msgstr ""
+
+#: prefs.js:635
+msgid "Dash Max Icon Size"
+msgstr ""
+
+#: prefs.js:636
+msgid ""
+"Maximum size of Dash icons in pixels. Adaptive option switches between "
+"default 64 and 48 for low resolution displays"
+msgstr ""
+
+#: prefs.js:640 prefs.js:1545 prefs.js:1740
+msgid "Adaptive (Default)"
+msgstr ""
+
+#: prefs.js:641 prefs.js:867 prefs.js:1553 prefs.js:1741
+msgid "128"
+msgstr ""
+
+#: prefs.js:642 prefs.js:868 prefs.js:1554 prefs.js:1742
+msgid "112"
+msgstr ""
+
+#: prefs.js:643 prefs.js:1555 prefs.js:1743
+msgid "96"
+msgstr ""
+
+#: prefs.js:644 prefs.js:870 prefs.js:1556 prefs.js:1744
+msgid "80"
+msgstr ""
+
+#: prefs.js:645 prefs.js:871 prefs.js:1557 prefs.js:1745
+msgid "64"
+msgstr ""
+
+#: prefs.js:646 prefs.js:784 prefs.js:872 prefs.js:1558 prefs.js:1746
+msgid "48"
+msgstr ""
+
+#: prefs.js:647 prefs.js:785 prefs.js:873
+msgid "32"
+msgstr ""
+
+#: prefs.js:655
+msgid "Dash Background Style"
+msgstr ""
+
+#: prefs.js:656
+msgid ""
+"Allows you to change the background color of the dash to match the search "
+"results an app folders"
+msgstr ""
+
+#: prefs.js:660 prefs.js:1029 prefs.js:1057 prefs.js:1149 prefs.js:1223
+#: prefs.js:1362 prefs.js:1379 prefs.js:1435 prefs.js:1449
+msgid "Default"
+msgstr ""
+
+#: prefs.js:661
+msgid "Light"
+msgstr ""
+
+#: prefs.js:677
+msgid "Dash Background Opacity"
+msgstr ""
+
+#: prefs.js:678
+msgid "Adjusts the opacity of the Dash background"
+msgstr ""
+
+#: prefs.js:696
+msgid "Dash Background Radius"
+msgstr ""
+
+#: prefs.js:697
+msgid ""
+"Adjusts the border radius of the Dash background in pixels. 0 means the "
+"default value given by the current theme style"
+msgstr ""
+
+#: prefs.js:707
+msgid "Dash Background GNOME 3 Style"
+msgstr ""
+
+#: prefs.js:708
+msgid ""
+"Background of the vertically oriented dash will imitate the GNOME 3 style"
+msgstr ""
+
+#: prefs.js:718
+msgid "Running App Indicator"
+msgstr ""
+
+#: prefs.js:719
+msgid ""
+"Allows you to change style of the running app indicator under the app icon"
+msgstr ""
+
+#: prefs.js:723
+msgid "Dot (Default)"
+msgstr ""
+
+#: prefs.js:724
+msgid "Line"
+msgstr ""
+
+#: prefs.js:732 prefs.js:1233
+msgid "Workspace Thumbnails"
+msgstr ""
+
+#: prefs.js:738
+msgid "Show Workspace Thumbnail Labels"
+msgstr ""
+
+#: prefs.js:739
+msgid ""
+"Each workspace thumbnail can show label with its index and name (if defined "
+"in the system settings) or name/title of its most recently used app/window"
+msgstr ""
+
+#: prefs.js:744
+msgid "Index"
+msgstr ""
+
+#: prefs.js:745
+msgid "Index + WS Name"
+msgstr ""
+
+#: prefs.js:746
+msgid "Index + App Name"
+msgstr ""
+
+#: prefs.js:747
+msgid "Index + Window Title"
+msgstr ""
+
+#: prefs.js:754
+msgid "Show WS Thumbnail Label on Hover"
+msgstr ""
+
+#: prefs.js:755
+msgid "Show the label only when the mouse pointer hovers over the thumbnail"
+msgstr ""
+
+#: prefs.js:763
+msgid "Show Wallpaper in Workspace Thumbnails"
+msgstr ""
+
+#: prefs.js:764
+msgid "All workspace thumbnails will include the current desktop background"
+msgstr ""
+
+#: prefs.js:772 prefs.js:1254
+msgid "Window Preview"
+msgstr ""
+
+#: prefs.js:778
+msgid "Window Preview App Icon Size"
+msgstr ""
+
+#: prefs.js:783
+msgid "64 (Default)"
+msgstr ""
+
+#: prefs.js:786
+msgid "22"
+msgstr ""
+
+#: prefs.js:795
+msgid "Window Title Position / Visibility"
+msgstr ""
+
+#: prefs.js:796
+msgid ""
+"Sets the position of the window title that is displayed when the mouse "
+"hovers over the window or can always be visible"
+msgstr ""
+
+#: prefs.js:800
+msgid "Inside Window"
+msgstr ""
+
+#: prefs.js:801
+msgid "Inside Window Always Visible"
+msgstr ""
+
+#: prefs.js:802
+msgid "Below Window (Default)"
+msgstr ""
+
+#: prefs.js:810
+msgid "Show Close Window Button"
+msgstr ""
+
+#: prefs.js:811
+msgid "Allows you to hide close window button"
+msgstr ""
+
+#: prefs.js:828
+msgid "Show Workspace Preview Background"
+msgstr ""
+
+#: prefs.js:829
+msgid "Allows to hide the background of the workspace preview"
+msgstr ""
+
+#: prefs.js:846
+msgid "Workspace Background Corner Radius"
+msgstr ""
+
+#: prefs.js:847
+msgid "Adjusts the corner radius of the workspace preview in the overview"
+msgstr ""
+
+#: prefs.js:855 prefs.js:1318 prefs.js:2022
+msgid "Search"
+msgstr ""
+
+#: prefs.js:861
+msgid "App Search Icon Size"
+msgstr ""
+
+#: prefs.js:862
+msgid ""
+"Size of results provided by the App Search Provider - smaller size allows to "
+"fit more results. Adaptive option switches between default 96 and 64 for low "
+"resolution displays"
+msgstr ""
+
+#: prefs.js:866
+msgid "Adaptive"
+msgstr ""
+
+#: prefs.js:869
+msgid "96 (Default)"
+msgstr ""
+
+#: prefs.js:893
+msgid "Max Search Results Rows"
+msgstr ""
+
+#: prefs.js:894
+msgid ""
+"Sets the maximum number of rows for result lists of all search providers "
+"except the window search provider which always lists all results"
+msgstr ""
+
+#: prefs.js:904
+msgid "Highlighting"
+msgstr ""
+
+#: prefs.js:905
+msgid ""
+"The GNOME default highlighting style (bold) causes strings to be "
+"\"randomly\" ellipsized, often preventing you from seeing the whole string, "
+"even if there is space for it. The selected style will be applied to all "
+"search results globally. If you are using other extensions that offer this "
+"option, make sure you set the same setting in all of them."
+msgstr ""
+
+#: prefs.js:909
+msgid "Bold (Default)"
+msgstr ""
+
+#: prefs.js:910
+msgid "Underline"
+msgstr ""
+
+#: prefs.js:911
+msgid "None"
+msgstr ""
+
+#: prefs.js:919
+msgid "Overview Background"
+msgstr ""
+
+#: prefs.js:925
+msgid "Show Wallpaper"
+msgstr ""
+
+#: prefs.js:926
+msgid ""
+"Replaces the solid grey background in the overview with the current desktop "
+"wallpaper"
+msgstr ""
+
+#: prefs.js:942
+msgid "Brightness"
+msgstr ""
+
+#: prefs.js:943
+msgid "Brightness of the background wallpaper in the overview"
+msgstr ""
+
+#: prefs.js:959
+msgid "Brightness for Search View"
+msgstr ""
+
+#: prefs.js:960
+msgid ""
+"Allows you to set a lower background brightness for search view mode where "
+"text visibility is more important"
+msgstr ""
+
+#: prefs.js:976
+msgid "Blur Window Picker Background"
+msgstr ""
+
+#: prefs.js:977
+msgid "Sets the amount of background blur in the window picker view"
+msgstr ""
+
+#: prefs.js:993
+msgid "Blur App Grid/Search View Background"
+msgstr ""
+
+#: prefs.js:994
+msgid ""
+"Sets the amount of background blur in the app grid and search results views"
+msgstr ""
+
+#: prefs.js:1002
+msgid "Smooth Blur Transitions"
+msgstr ""
+
+#: prefs.js:1003
+msgid ""
+"Allows for smoother blur transitions, but can affect the overall smoothness "
+"of overview animations on weak hardware"
+msgstr ""
+
+#: prefs.js:1018
+msgid "Overview"
+msgstr ""
+
+#: prefs.js:1024
+msgid "Overview Mode"
+msgstr ""
+
+#: prefs.js:1025
+msgid ""
+"The Expose Windows on Hover mode does not expose the workspace preview "
+"windows until the mouse pointer enters any window\n"
+"The Static Workspace mode keeps the workspace static when you activate the "
+"overview, it only shows Dash, workspace thumbnails and search entry over the "
+"workspace and only clicking on an active workspace thumbnail activates the "
+"default overview"
+msgstr ""
+
+#: prefs.js:1030
+msgid "Expose Windows on Hover"
+msgstr ""
+
+#: prefs.js:1031
+msgid "Static Workspace"
+msgstr ""
+
+#: prefs.js:1038
+msgid "Startup State"
+msgstr ""
+
+#: prefs.js:1039
+msgid "Allows to change the state in which GNOME Shell starts a session"
+msgstr ""
+
+#: prefs.js:1043
+msgid "Overview (Default)"
+msgstr ""
+
+#: prefs.js:1044
+msgid "Desktop"
+msgstr ""
+
+#: prefs.js:1045 prefs.js:1090 prefs.js:1133
+msgid "Applications"
+msgstr ""
+
+#: prefs.js:1052
+msgid "Escape Key Behavior"
+msgstr ""
+
+#: prefs.js:1053
+msgid ""
+"Allows you to close the overview with a single press of the Escape key, even "
+"from the application grid or from search, if the search entry field does not "
+"have focus"
+msgstr ""
+
+#: prefs.js:1058
+msgid "Close Overview"
+msgstr ""
+
+#: prefs.js:1066
+msgid "Click Empty Space To Close"
+msgstr ""
+
+#: prefs.js:1067
+msgid "Enables clicking on an empty space in the overview to close it"
+msgstr ""
+
+#: prefs.js:1076
+msgid "Overlay Key (Super/Windows)"
+msgstr ""
+
+#: prefs.js:1082
+msgid "Single-Press Action"
+msgstr ""
+
+#: prefs.js:1083
+msgid ""
+"Disable or change behavior when you press and release the Super key. The "
+"\"Search Windows\" options requires the \"WSP (Window Search Provider)\" "
+"extension installed and enabled. Link is available on the Modules tab in "
+"Settings. If you want another extension (like AATWS) to handle the overlay "
+"key, set this option to \"Overview - Window Picker (Default)\" and the "
+"\"Double-Press Action\" option to \"Applications (Default)\""
+msgstr ""
+
+#: prefs.js:1088 prefs.js:1131
+msgid "Follow Global Overview Mode"
+msgstr ""
+
+#: prefs.js:1089 prefs.js:1132
+msgid "Overview - Window Picker (Default)"
+msgstr ""
+
+#: prefs.js:1091 prefs.js:1134
+msgid "Overview - Static WS Preview"
+msgstr ""
+
+#: prefs.js:1092 prefs.js:1135
+msgid "Overview - Static Workspace"
+msgstr ""
+
+#: prefs.js:1093 prefs.js:1109 prefs.js:1136
+msgid "Search Windows (requires WSP extension)"
+msgstr ""
+
+#: prefs.js:1102
+msgid "Double-Press Action"
+msgstr ""
+
+#: prefs.js:1103
+msgid ""
+"Disable or change behavior when you double-press the Super key. The \"Search "
+"Windows\" option requires the \"WSP (Window Search Provider)\" extension "
+"installed and enabled. The \"Static WS Overview - Expose Windows\" option "
+"allows you to switch to default Activities Overview window picker view if "
+"you set static workspace (preview) for the single press/release Super key "
+"action"
+msgstr ""
+
+#: prefs.js:1108
+msgid "Applications (Default)"
+msgstr ""
+
+#: prefs.js:1110
+msgid "Overview - Window Picker"
+msgstr ""
+
+#: prefs.js:1119
+msgid "Hot Corner (Install Custom Hot Corners - Extended for more options)"
+msgstr ""
+
+#: prefs.js:1125
+msgid "Hot Corner Action"
+msgstr ""
+
+#: prefs.js:1126
+msgid ""
+"Disable or change behavior of the hot corner. Holding down the Ctrl key "
+"while hitting the hot corner switches between Overview/Applications actions. "
+"The \"Search Windows\" option requires the \"WSP (Window Search Provider)\" "
+"extension installed and enabled"
+msgstr ""
+
+#: prefs.js:1144
+msgid "Hot Corner Position"
+msgstr ""
+
+#: prefs.js:1145
+msgid ""
+"Choose which corner of your monitors will be active. If you choose \"Follow "
+"Dash\" option, the corner will be placed near the left or top edge of the "
+"Dash. The last option extends the hot corner trigger to cover the entire ege "
+"of the monitor where Dash is located"
+msgstr ""
+
+#: prefs.js:1154
+msgid "Follow Dash"
+msgstr ""
+
+#: prefs.js:1155
+msgid "Follow Dash - Hot Edge"
+msgstr ""
+
+#: prefs.js:1163
+msgid "Enable Hot Corner in Full-Screen Mode"
+msgstr ""
+
+#: prefs.js:1164
+msgid ""
+"If you often work with full-screen applications and want the hot corner to "
+"be usable"
+msgstr ""
+
+#: prefs.js:1174
+msgid "Show Ripples Animation"
+msgstr ""
+
+#: prefs.js:1175
+msgid ""
+"The ripple animation is played when the hot corner is activated. The ripple "
+"size has been reduced to be less distracting"
+msgstr ""
+
+#: prefs.js:1191
+msgid "Isolate Workspaces"
+msgstr ""
+
+#: prefs.js:1192
+msgid "Dash will only show apps and windows from the current workspace"
+msgstr ""
+
+#: prefs.js:1202
+msgid "App Icon - Click Behavior"
+msgstr ""
+
+#: prefs.js:1203
+msgid ""
+"Choose your preferred behavior when clicking on an app icon. The \"Prefer "
+"Current Workspace\" option opens a new app window if not present in the "
+"current workspace. The \"Open New Window\" option also switches behavior of "
+"the middle click to \"Activate\" since its default behavior is to open a new "
+"window"
+msgstr ""
+
+#: prefs.js:1207
+msgid "Activate App Immediately"
+msgstr ""
+
+#: prefs.js:1208
+msgid "First Switch to Workspace"
+msgstr ""
+
+#: prefs.js:1209
+msgid "Open New Window (if supported)"
+msgstr ""
+
+#: prefs.js:1210
+msgid "Prefer Current Workspace"
+msgstr ""
+
+#: prefs.js:1218
+msgid "App Icon - Scroll Action"
+msgstr ""
+
+#: prefs.js:1219
+msgid ""
+"Choose the behavior when scrolling over an app icon. The window cycler works "
+"with a list of windows sorted by the \"Most Recently Used\" and grouped by "
+"workspaces. Scrolling up cycles through previously used windows on the same "
+"workspace and then switches to another workspace, if any"
+msgstr ""
+
+#: prefs.js:1224
+msgid "Cycle App Windows - Highlight Selected"
+msgstr ""
+
+#: prefs.js:1225
+msgid "Cycle App Windows - Highlight App"
+msgstr ""
+
+#: prefs.js:1239
+msgid "Close Workspace Button"
+msgstr ""
+
+#: prefs.js:1240
+msgid ""
+"The Close Workspace button appears on the workspace thumbnail when you hover "
+"over it and allows you to close all windows on the workspace. You can choose "
+"a \"safety lock\" to prevent accidental use"
+msgstr ""
+
+#: prefs.js:1245
+msgid "Single Click"
+msgstr ""
+
+#: prefs.js:1246
+msgid "Double Click"
+msgstr ""
+
+#: prefs.js:1247
+msgid "Ctrl Key + Click"
+msgstr ""
+
+#: prefs.js:1260
+msgid "Secondary Button Click Action"
+msgstr ""
+
+#: prefs.js:1261
+msgid "Allows you to add a secondary mouse click action to the window preview"
+msgstr ""
+
+#: prefs.js:1265 prefs.js:1281 prefs.js:1297
+msgid "Activate Window (Default)"
+msgstr ""
+
+#: prefs.js:1266 prefs.js:1282
+msgid "Close Window"
+msgstr ""
+
+#: prefs.js:1267 prefs.js:1283 prefs.js:1298
+msgid "Search For Same App Windows"
+msgstr ""
+
+#: prefs.js:1268 prefs.js:1284 prefs.js:1299
+msgid "Create Window Thumbnail/PiP (requires WTMB extension)"
+msgstr ""
+
+#: prefs.js:1276
+msgid "Middle Button Click Action"
+msgstr ""
+
+#: prefs.js:1277
+msgid "Allows you to add a middle mouse click action to the window preview"
+msgstr ""
+
+#: prefs.js:1292
+msgid "App Icon Click Action"
+msgstr ""
+
+#: prefs.js:1293
+msgid ""
+"Select the action to take when the application icon on the window preview is "
+"clicked"
+msgstr ""
+
+#: prefs.js:1307
+msgid "Always Activate Selected"
+msgstr ""
+
+#: prefs.js:1308
+msgid ""
+"If enabled, the currently selected window will be activated when leaving the "
+"Overview even without clicking. Usage example - press Super to open the "
+"Overview, place mouse pointer over a window, press Super again to activate "
+"the window"
+msgstr ""
+
+#: prefs.js:1324
+msgid "Enable Fuzzy Match"
+msgstr ""
+
+#: prefs.js:1325
+msgid ""
+"Enabling the fuzzy match allows you to skip letters in the pattern you are "
+"searching for and find \"Firefox\" even if you type \"ffx\". Works only for "
+"the App, Windows, Extensions and Recent files search providers"
+msgstr ""
+
+#: prefs.js:1333
+msgid "Animations"
+msgstr ""
+
+#: prefs.js:1348
+msgid "Animation Speed"
+msgstr ""
+
+#: prefs.js:1349
+msgid ""
+"Adjusts the global animation speed in percentage of the default duration - "
+"higher value means slower animation"
+msgstr ""
+
+#: prefs.js:1357
+msgid "App Grid Animation"
+msgstr ""
+
+#: prefs.js:1358
+msgid ""
+"When entering the App Grid view, the app grid animates from the edge of the "
+"screen. You can choose the direction, keep the Default (direction will be "
+"selected automatically) or disable the animation if you don't like it"
+msgstr ""
+
+#: prefs.js:1364 prefs.js:1381
+msgid "Right to Left"
+msgstr ""
+
+#: prefs.js:1365 prefs.js:1382
+msgid "Left to Right"
+msgstr ""
+
+#: prefs.js:1366 prefs.js:1383
+msgid "Bottom to Top"
+msgstr ""
+
+#: prefs.js:1367 prefs.js:1384
+msgid "Top to Bottom"
+msgstr ""
+
+#: prefs.js:1374
+msgid "Search View Animation"
+msgstr ""
+
+#: prefs.js:1375
+msgid ""
+"When search is activated the search view with search results can animate "
+"from the edge of the screen. You can choose the direction, keep the Default "
+"(currently Bottom to Top) or disable the animation if you don't like it."
+msgstr ""
+
+#: prefs.js:1392
+msgid "Workspace Preview Animation"
+msgstr ""
+
+#: prefs.js:1393
+msgid ""
+"When entering / leaving the App Grid / Search view, the workspace preview "
+"can animate to/from workspace thumbnail."
+msgstr ""
+
+#: prefs.js:1398
+msgid "Enable"
+msgstr ""
+
+#: prefs.js:1406
+msgid "Workspace Switcher"
+msgstr ""
+
+#: prefs.js:1412
+msgid "Wraparound"
+msgstr ""
+
+#: prefs.js:1413
+msgid "Continue from the last workspace to the first and vice versa"
+msgstr ""
+
+#: prefs.js:1421
+msgid "Ignore Last (empty) Workspace"
+msgstr ""
+
+#: prefs.js:1422
+msgid ""
+"In Dynamic workspaces mode, there is always one empty workspace at the end. "
+"Switcher can ignore this last workspace"
+msgstr ""
+
+#: prefs.js:1430
+msgid "Workspace Switcher Animation"
+msgstr ""
+
+#: prefs.js:1431
+msgid ""
+"Allows you to disable movement of the desktop background during workspace "
+"switcher animation outside of the overview. The Static Background mode also "
+"keeps Conky and desktop icons on their place during switching."
+msgstr ""
+
+#: prefs.js:1436
+msgid "Static Background"
+msgstr ""
+
+#: prefs.js:1444
+msgid "Workspace Switcher Mode (Isolate Monitors)"
+msgstr ""
+
+#: prefs.js:1445
+msgid ""
+"Note that this is a workaround, not full-fledged feature. GNOME Shell does "
+"not support separate workspaces for each monitor, so V-Shell switches "
+"workspaces only on the primary monitor and moves windows across workspaces "
+"on secondary monitors in order to simulate independent behavior. The current "
+"monitor is determined by the position of the mouse pointer"
+msgstr ""
+
+#: prefs.js:1450
+msgid "Current Monitor"
+msgstr ""
+
+#: prefs.js:1458
+msgid "Workspace Switcher Popup Mode"
+msgstr ""
+
+#: prefs.js:1459
+msgid ""
+"This popup shows up when you switch workspace using a keyboard shortcut or "
+"gesture outside of the overview. You can to disable the popup at all, or "
+"show it on the current monitor (the one with mouse pointer) instead of the "
+"primary."
+msgstr ""
+
+#: prefs.js:1464
+msgid "Show on Primary Monitor (Default)"
+msgstr ""
+
+#: prefs.js:1465
+msgid "Show on Current Monitor"
+msgstr ""
+
+#: prefs.js:1473
+msgid "Notifications"
+msgstr ""
+
+#: prefs.js:1479
+msgid "Window Attention Handler"
+msgstr ""
+
+#: prefs.js:1480
+msgid ""
+"When a window requires attention (often a new window), GNOME Shell shows you "
+"a notification about it. You can disable popups of these messages "
+"(notification will be pushed into the message tray silently) or focus the "
+"source window immediately instead"
+msgstr ""
+
+#: prefs.js:1484 prefs.js:1499
+msgid "Show Notifications (Default)"
+msgstr ""
+
+#: prefs.js:1485
+msgid "Disable Notification Popups"
+msgstr ""
+
+#: prefs.js:1486
+msgid "Immediately Focus Window"
+msgstr ""
+
+#: prefs.js:1494
+msgid "Favorites"
+msgstr ""
+
+#: prefs.js:1495
+msgid "Disable pin/unpin app notifications"
+msgstr ""
+
+#: prefs.js:1500
+msgid "Disable Notifications"
+msgstr ""
+
+#: prefs.js:1518
+msgid "Main App Grid"
+msgstr ""
+
+#: prefs.js:1524
+msgid "Apps Sorting"
+msgstr ""
+
+#: prefs.js:1525
+msgid ""
+"Choose sorting method for the app grid. Note that sorting by usage ignores "
+"folders"
+msgstr ""
+
+#: prefs.js:1529 prefs.js:1698
+msgid "Custom (Default)"
+msgstr ""
+
+#: prefs.js:1530
+msgid "Alphabet - Folders First"
+msgstr ""
+
+#: prefs.js:1531
+msgid "Alphabet - Folders Last"
+msgstr ""
+
+#: prefs.js:1532
+msgid "Usage - No Folders"
+msgstr ""
+
+#: prefs.js:1540
+msgid "Icon Size"
+msgstr ""
+
+#: prefs.js:1541
+msgid ""
+"Allows to set a fixed app grid icon size and bypass the default adaptive "
+"algorithm"
+msgstr ""
+
+#: prefs.js:1546
+msgid "256"
+msgstr ""
+
+#: prefs.js:1547
+msgid "224"
+msgstr ""
+
+#: prefs.js:1548
+msgid "208"
+msgstr ""
+
+#: prefs.js:1549
+msgid "192"
+msgstr ""
+
+#: prefs.js:1550
+msgid "176"
+msgstr ""
+
+#: prefs.js:1551
+msgid "160"
+msgstr ""
+
+#: prefs.js:1552
+msgid "144"
+msgstr ""
+
+#: prefs.js:1574
+msgid "Columns per Page (0 for adaptive grid)"
+msgstr ""
+
+#: prefs.js:1575
+msgid ""
+"Number of columns in the application grid. If set to 0, the number will be "
+"set automatically to fit the available width"
+msgstr ""
+
+#: prefs.js:1591
+msgid "Rows per Page (0 for adaptive grid)"
+msgstr ""
+
+#: prefs.js:1592
+msgid ""
+"Number of rows in the application grid. If set to 0, the number will be set "
+"automatically to fit the available height"
+msgstr ""
+
+#: prefs.js:1620
+msgid "App Grid Page Width Scale"
+msgstr ""
+
+#: prefs.js:1621
+msgid "Adjusts maximum app grid page width relative to the available space"
+msgstr ""
+
+#: prefs.js:1643
+msgid "App Grid Page Height Scale"
+msgstr ""
+
+#: prefs.js:1644
+msgid "Adjusts maximum app grid page height relative to the available space"
+msgstr ""
+
+#: prefs.js:1663
+msgid "Grid Spacing"
+msgstr ""
+
+#: prefs.js:1664
+msgid ""
+"V-Shell uses this value to calculate grid dimensions for adaptive options. "
+"However, the main grid automatically adjusts the spacing based on the grid "
+"and available space"
+msgstr ""
+
+#: prefs.js:1674
+msgid "Allow Incomplete Pages"
+msgstr ""
+
+#: prefs.js:1675
+msgid ""
+"If disabled, icons from the next page (if any) are automatically moved to "
+"fill any empty slot left after an icon was (re)moved (to a folder for "
+"example)"
+msgstr ""
+
+#: prefs.js:1687
+msgid "App Folders"
+msgstr ""
+
+#: prefs.js:1693
+msgid "Folder Apps Sorting"
+msgstr ""
+
+#: prefs.js:1694
+msgid "Choose sorting method for app folders"
+msgstr ""
+
+#: prefs.js:1699
+msgid "Alphabet"
+msgstr ""
+
+#: prefs.js:1700
+msgid "Usage"
+msgstr ""
+
+#: prefs.js:1708
+msgid "Active Icons in Folder Preview"
+msgstr ""
+
+#: prefs.js:1709
+msgid ""
+"If enabled, icons in the folder preview behaves like normal icons, you can "
+"activate or even drag them directly, without having to open the folder "
+"first. This option also affects the app grid default icon size"
+msgstr ""
+
+#: prefs.js:1720
+msgid "App Folder Preview Grid Size"
+msgstr ""
+
+#: prefs.js:1721
+msgid ""
+"Sets a grid size (number of icons) in the folder icon preview. 3x3 options "
+"automatically switches between 2x2 and 3x3 grid depending on the number of "
+"icons in the folder"
+msgstr ""
+
+#: prefs.js:1725
+msgid "2x2 (Default)"
+msgstr ""
+
+#: prefs.js:1726
+msgid "3x3 for 5+ apps"
+msgstr ""
+
+#: prefs.js:1727
+msgid "3x3 for 9+ apps"
+msgstr ""
+
+#: prefs.js:1735
+msgid "Folder Icon Size"
+msgstr ""
+
+#: prefs.js:1736
+msgid ""
+"Allows to set a fixed icon size and bypass the default adaptive algorithm in "
+"the open folder dialog"
+msgstr ""
+
+#: prefs.js:1754
+msgid "Maximum Number Of Columns (0 for automatic)"
+msgstr ""
+
+#: prefs.js:1755
+msgid ""
+"Specifies the maximum number of columns per page in folder grids. If you "
+"leave the value at 0, the maximum number of columns will be calculated based "
+"on available space. The actual folder grid dimensions will be determined by "
+"the number of items within the set limits"
+msgstr ""
+
+#: prefs.js:1771
+msgid "Maximum Number Of Rows (0 for automatic)"
+msgstr ""
+
+#: prefs.js:1772
+msgid ""
+"Specifies the maximum number of rows per page in folder grids. If you leave "
+"the value at 0, the maximum number of rows will be calculated based on "
+"available space. The actual folder grid dimensions will be determined by the "
+"number of items within the set limits"
+msgstr ""
+
+#: prefs.js:1790
+msgid "Folder Grid Spacing"
+msgstr ""
+
+#: prefs.js:1791
+msgid "Adjusts the spacing between icons in a folder grid"
+msgstr ""
+
+#: prefs.js:1801
+msgid "Center Open Folders"
+msgstr ""
+
+#: prefs.js:1802
+msgid ""
+"App folders may open in the center of the screen or be centered on the "
+"folder's source icon"
+msgstr ""
+
+#: prefs.js:1814
+msgid "Content"
+msgstr ""
+
+#: prefs.js:1820
+msgid "App Grid Content"
+msgstr ""
+
+#: prefs.js:1821
+msgid ""
+"The default Shell removes favorite apps, this option allows to duplicate "
+"them in the grid or remove also running applications. Option \"Favorites and "
+"Running First\" only works with the Alphabet and Usage sorting"
+msgstr ""
+
+#: prefs.js:1825
+msgid "Include All"
+msgstr ""
+
+#: prefs.js:1826
+msgid "Include All - Favorites and Running First"
+msgstr ""
+
+#: prefs.js:1827
+msgid "Exclude Favorites (Default)"
+msgstr ""
+
+#: prefs.js:1828
+msgid "Exclude Running"
+msgstr ""
+
+#: prefs.js:1829
+msgid "Exclude Favorites and Running"
+msgstr ""
+
+#: prefs.js:1837
+msgid "App Labels Behavior"
+msgstr ""
+
+#: prefs.js:1838
+msgid "Choose how and when to display app names"
+msgstr ""
+
+#: prefs.js:1842
+msgid "Ellipsized - Expand Selected (Default)"
+msgstr ""
+
+#: prefs.js:1843
+msgid "Always Expanded"
+msgstr ""
+
+#: prefs.js:1844
+msgid "Hidden - Show Selected Only"
+msgstr ""
+
+#: prefs.js:1852
+msgid "Show Page Navigation Buttons"
+msgstr ""
+
+#: prefs.js:1853
+msgid ""
+"You can hide the page navigation buttons if you don't need them or want to "
+"get more space for icons. The buttons are hidden automatically when there is "
+"only one page in the app grid"
+msgstr ""
+
+#: prefs.js:1866
+msgid "Performance"
+msgstr ""
+
+#: prefs.js:1872
+msgid "Smooth App Grid Animations"
+msgstr ""
+
+#: prefs.js:1873
+msgid ""
+"This option allows V-Shell to pre-realize app grid and app folders during "
+"session startup in order to avoid stuttering animations when using them for "
+"the first time. If enabled, the session startup needs a little bit more time "
+"to finish and necessary memory will be allocated at this time"
+msgstr ""
+
+#: prefs.js:1883
+msgid "Reset"
+msgstr ""
+
+#: prefs.js:1888
+msgid "Reset App Grid Layout"
+msgstr ""
+
+#: prefs.js:1889
+msgid ""
+"Removes all stored app grid positions, after reset icons will be sorted "
+"alphabetically, except folder contents"
+msgstr ""
+
+#: prefs.js:1897
+msgid "Remove App Grid Folders"
+msgstr ""
+
+#: prefs.js:1898
+msgid "Removes all folders, folder apps will move to the root grid"
+msgstr ""
+
+#: prefs.js:1914
+msgid "Optional Modules"
+msgstr ""
+
+#: prefs.js:1920
+msgid ""
+"Windows Search Provider - Moved from V-Shell to the standalone \"WSP\" "
+"extension"
+msgstr ""
+
+#: prefs.js:1921
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the WSP extension.\n"
+"\n"
+"WSP adds adds open windows to the search results. You can search app names "
+"and window titles. You can also use \"wq//\" or custom prefix (also by "
+"pressing the Space hotkey in the overview, or clicking dash icon) to "
+"suppress results from other search providers"
+msgstr ""
+
+#: prefs.js:1928
+msgid ""
+"Extensions Search Provider - Moved from V-Shell to the standalone \"ESP\" "
+"extension"
+msgstr ""
+
+#: prefs.js:1929
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the ESP extension.\n"
+"\n"
+"ESP adds extensions to the search results. You can also use \"eq//\" or "
+"custom prefix (also by pressing the Ctrl + Shift + Space hotkey in the "
+"overview, or clicking dash icon) to suppress results from other search "
+"providers"
+msgstr ""
+
+#: prefs.js:1936
+msgid ""
+"Window Thumbnails (PiP) - Moved from V-Shell to the standalone \"WTMB\" "
+"extension"
+msgstr ""
+
+#: prefs.js:1937
+msgid ""
+"NOTE: This module has been released as a standalone extension with new "
+"features, click to learn more. Related V-Shell options are still available "
+"if you install the WTMB extension.\n"
+"\n"
+"WTMB allows the creation of Picture-in-Picture like window thumbnails that "
+"you can use for monitoring of windows on another workspace"
+msgstr ""
+
+#: prefs.js:1944
+msgid ""
+"Built-in Modules (allows to disable modules that conflict with another "
+"extension)"
+msgstr ""
+
+#: prefs.js:1950
+msgid "AppDisplay / IconGrid"
+msgstr ""
+
+#: prefs.js:1951
+msgid "App grid customization and options"
+msgstr ""
+
+#: prefs.js:1959
+msgid "AppFavorites"
+msgstr ""
+
+#: prefs.js:1960
+msgid "Pin/unpin app notification options"
+msgstr ""
+
+#: prefs.js:1969
+msgid "Dash customization and options, support for vertical orientation"
+msgstr ""
+
+#: prefs.js:1978
+msgid "Hot corner options"
+msgstr ""
+
+#: prefs.js:1986
+msgid "MessageTray"
+msgstr ""
+
+#: prefs.js:1987
+msgid "Notification position options"
+msgstr ""
+
+#: prefs.js:1995
+msgid "OsdWindow"
+msgstr ""
+
+#: prefs.js:1996
+msgid "OSD position options"
+msgstr ""
+
+#: prefs.js:2004
+msgid "OverlayKey"
+msgstr ""
+
+#: prefs.js:2005
+msgid "Overlay (Super/Window) key options"
+msgstr ""
+
+#: prefs.js:2014
+msgid "Panel options"
+msgstr ""
+
+#: prefs.js:2023
+msgid "Search view and app search provider customization and options"
+msgstr ""
+
+#: prefs.js:2031
+msgid "SearchController"
+msgstr ""
+
+#: prefs.js:2032
+msgid "Escape key behavior options in the overview"
+msgstr ""
+
+#: prefs.js:2040
+msgid "SwipeTracker"
+msgstr ""
+
+#: prefs.js:2041
+msgid "Gestures for vertical workspace orientation"
+msgstr ""
+
+#: prefs.js:2049
+msgid "WindowAttentionHandler"
+msgstr ""
+
+#: prefs.js:2050
+msgid "Window attention handler options"
+msgstr ""
+
+#: prefs.js:2058
+msgid "WindowManager"
+msgstr ""
+
+#: prefs.js:2059
+msgid ""
+"Fixes an upstream bug in the minimization animation of a full-screen window"
+msgstr ""
+
+#: prefs.js:2067
+msgid "WindowPreview"
+msgstr ""
+
+#: prefs.js:2068
+msgid ""
+"Window preview options, fixes an upstream bug that fills the system log with "
+"errors when you close a window from the overview or exit the overview with a "
+"gesture when any window is selected"
+msgstr ""
+
+#: prefs.js:2076
+msgid "Workspace"
+msgstr ""
+
+#: prefs.js:2077
+msgid ""
+"Fixes workspace preview allocations for vertical workspaces orientation and "
+"window scaling in static overview modes"
+msgstr ""
+
+#: prefs.js:2085
+msgid "WorkspaceAnimation"
+msgstr ""
+
+#: prefs.js:2086
+msgid "Static workspace animation option"
+msgstr ""
+
+#: prefs.js:2094
+msgid "WorkspaceSwitcherPopup"
+msgstr ""
+
+#: prefs.js:2095
+msgid "Workspace switcher popup orientation and position options"
+msgstr ""
+
+#: prefs.js:2111
+msgid "Keyboard"
+msgstr ""
+
+#: prefs.js:2117
+msgid "Override Page Up/Down Shortcuts"
+msgstr ""
+
+#: prefs.js:2118
+msgid ""
+"This option automatically overrides the (Shift +) Super + Page Up/Down "
+"keyboard shortcuts for the current workspace orientation. If you encounter "
+"any issues, check the configuration in the dconf editor"
+msgstr ""
+
+#: prefs.js:2126
+msgid "Workarounds / Hacks"
+msgstr ""
+
+#: prefs.js:2132
+msgid "Delay at Startup"
+msgstr ""
+
+#: prefs.js:2133
+msgid ""
+"If you encounter issues during GNOME Shell startup after logging in, which "
+"could be caused by V-Shell's incompatibility with another extension, try "
+"enabling this option. When enabled, V-Shell is activated after the startup "
+"is complete. It will activate automatically when Dash to Dock, Ubuntu Dock "
+"or Dash to Panel extensions are detected."
+msgstr ""
+
+#: prefs.js:2141
+msgid "Fix New Window Not In Focus"
+msgstr ""
+
+#: prefs.js:2142
+msgid ""
+"If you often find that the app window you open from the Activities overview "
+"does not get focus, try enabling this option."
+msgstr ""
+
+#: prefs.js:2150
+msgid "Fix New Window Not On Current Monitor (experimental)"
+msgstr ""
+
+#: prefs.js:2151
+msgid ""
+"If you use multiple monitors, you may encounter the issue of new windows "
+"opening on a different monitor than expected. This option moves those "
+"windows to the current monitor, determined by the position of the mouse "
+"pointer. However, this is a workaround, and some windows may override it, "
+"moving the window back to the previous monitor during initialization"
+msgstr ""
+
+#: prefs.js:2174
+msgid "Version"
+msgstr ""
+
+#: prefs.js:2180
+msgid "Reset all options"
+msgstr ""
+
+#: prefs.js:2181
+msgid "Reset all options to their default values"
+msgstr ""
+
+#: prefs.js:2187
+msgid "Links"
+msgstr ""
+
+#: prefs.js:2191
+msgid "Homepage"
+msgstr ""
+
+#: prefs.js:2192
+msgid "Source code and more info about this extension"
+msgstr ""
+
+#: prefs.js:2197
+msgid "Changelog"
+msgstr ""
+
+#: prefs.js:2198
+msgid "See what's changed."
+msgstr ""
+
+#: prefs.js:2203
+msgid "GNOME Extensions"
+msgstr ""
+
+#: prefs.js:2204
+msgid "Rate and comment V-Shell on the GNOME Extensions site"
+msgstr ""
+
+#: prefs.js:2209
+msgid "Report a bug or suggest new feature"
+msgstr ""
+
+#: prefs.js:2210
+msgid "Help me to help you!"
+msgstr ""
+
+#: prefs.js:2215
+msgid "Buy Me a Coffee"
+msgstr ""
+
+#: prefs.js:2216
+msgid "Enjoying V-Shell? Consider supporting it by buying me a coffee!"
+msgstr ""
+
+#: lib/util.js:408
+msgid "Updating V-Shell"
+msgstr ""
+
+#: lib/windowSearchProvider.js:118
+msgid "Open Windows"
+msgstr ""
+
+#: lib/windowSearchProvider.js:119
+msgid "Search open windows"
+msgstr ""
+
+#: lib/dash.js:983
+msgid "Force Quit"
+msgstr ""
+
+#: lib/dash.js:1000
+msgid "Move App to Current Workspace ( Shift + Click )"
+msgstr ""
+
+#: lib/dash.js:1003
+msgid "Create Window Thumbnail/PiP"
+msgstr ""
+
+#: lib/search.js:336
+msgid "Searching…"
+msgstr ""
+
+#: lib/search.js:338
+msgid "No results."
+msgstr ""
+
+#: lib/optionsFactory.js:295
+msgid "Reset profile to defaults"
+msgstr ""
+
+#: lib/optionsFactory.js:303
+msgid "GNOME 3 Layout (Vertical WS)"
+msgstr ""
+
+#: lib/optionsFactory.js:304
+msgid "GNOME 4x Layout, Bottom Hot Edge (Horizontal WS)"
+msgstr ""
+
+#: lib/optionsFactory.js:305
+msgid "Top Left Hot Corner Centric (Vertical WS)"
+msgstr ""
+
+#: lib/optionsFactory.js:306
+msgid "Dock-Like Overview, Bottom Hot Edge (Horizontal WS)"
+msgstr ""
+
+#: lib/optionsFactory.js:328
+msgid "Load profile"
+msgstr ""
+
+#: lib/optionsFactory.js:337
+msgid "Save current settings into this profile"
+msgstr ""
+
+#: lib/recentFilesSearchProvider.js:119
+msgid "Recent Files"
+msgstr ""
+
+#: lib/extensionsSearchProvider.js:127
+msgid "Extensions"
+msgstr ""
+
+#: lib/extensionsSearchProvider.js:128
+msgid "Search extensions"
+msgstr ""
diff --git a/extensions/45/vertical-workspaces/prefs.js b/extensions/47/vertical-workspaces/prefs.js
index 1369c83..1713643 100644
--- a/extensions/45/vertical-workspaces/prefs.js
+++ b/extensions/47/vertical-workspaces/prefs.js
@@ -3,7 +3,7 @@
* prefs.js
*
* @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
+ * @copyright 2022 - 2024
* @license GPL-3.0
*/
@@ -26,43 +26,41 @@ export default class VShell extends ExtensionPreferences {
const itemFactory = new OptionsFactory.ItemFactory();
const pageList = [
{
- name: 'profiles',
title: _('Profiles'),
iconName: 'open-menu-symbolic',
optionList: this._getProfilesOptionList(itemFactory),
},
{
- name: 'layout',
title: _('Layout'),
iconName: 'view-grid-symbolic',
optionList: this._getLayoutOptionList(itemFactory),
},
{
- name: 'appearance',
title: _('Appearance'),
iconName: 'view-reveal-symbolic',
optionList: this._getAppearanceOptionList(itemFactory),
},
{
- name: 'behavior',
title: _('Behavior'),
iconName: 'system-run-symbolic',
optionList: this._getBehaviorOptionList(itemFactory),
},
{
- name: 'modules',
+ title: _('App Grid'),
+ iconName: 'view-app-grid-symbolic',
+ optionList: this._getAppGridOptionList(itemFactory),
+ },
+ {
title: _('Modules'),
iconName: 'application-x-addon-symbolic',
optionList: this._getModulesOptionList(itemFactory),
},
{
- name: 'misc',
title: _('Misc'),
iconName: 'preferences-other-symbolic',
optionList: this._getMiscOptionList(itemFactory),
},
{
- name: 'about',
title: _('About'),
iconName: 'preferences-system-details-symbolic',
optionList: this._getAboutOptionList(itemFactory),
@@ -104,12 +102,16 @@ export default class VShell extends ExtensionPreferences {
// options item format:
// (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable)
- optionList.push(
- itemFactory.getRowWidget(
- _('Custom Profiles'),
- _('Sets of settings that can help you with the initial customization')
- )
- );
+ optionList.push(itemFactory.getRowWidget(
+ _('Custom Profiles'),
+ null
+ ));
+
+ optionList.push(itemFactory.getRowWidget(
+ _('Save your configurations'),
+ _("The predefined sets of settings, which can help you with the initial configuration and exploring V-Shell's possibilities, can be renamed and overridden by your own configurations"),
+ itemFactory.newLabel()
+ ));
optionList.push(itemFactory.getRowWidget(
_('Profile 1'),
@@ -153,14 +155,13 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Dash Position'),
null,
- // // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'dashPosition',
[
- [_('Top'), 0],
- [_('Right'), 1],
[_('Bottom'), 2],
[_('Left'), 3],
+ [_('Top'), 0],
+ [_('Right'), 1],
[_('Hide'), 4],
],
'dashModule'
@@ -202,7 +203,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Show Apps Icon Position'),
_('Sets the position of the "Show Applications" icon in the Dash'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'showAppsIconPosition',
[
@@ -216,55 +216,6 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Open Windows Icon Position'),
- _('Allows to add "Search Open Windows" icon into Dash (if window search provider enabled on the Modules tab) so you can directly toggle window search provider results. You can also use the secondary mouse button click on the Show Apps Icon, or the Space hotkey'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'dashShowWindowsIcon',
- [
- [_('Hide'), 0],
- [_('Start'), 1],
- [_('End'), 2],
- ],
- 'dashModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Recent Files Icon Position'),
- _('Allows to add "Search Recent Files" icon into Dash (if recent files search provider enabled on the Modules tab) so you can directly toggle recent files search provider results. You can also use Ctrl + Space hotkey'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'dashShowRecentFilesIcon',
- [
- [_('Hide'), 0],
- [_('Start'), 1],
- [_('End'), 2],
- ],
- 'dashModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Extensions Icon Position'),
- _('Allows to add "Search Extensions" icon into Dash (if extensions search provider enabled on the Module tab) so you can directly toggle extensions search provider results. You can also use the Ctrl + Shift + Space hotkey'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'dashShowExtensionsIcon',
- [
- [_('Hide'), 0],
- [_('Start'), 1],
- [_('End'), 2],
- ],
- 'dashModule'
- )
- );
-
-
- optionList.push(
- itemFactory.getRowWidget(
_('Workspace Thumbnails / Orientation')
)
);
@@ -273,7 +224,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Thumbnails Position / Workspaces Orientation'),
_('Position of the workspace thumbnails on the screen also sets orientation of the workspaces to vertical or horizontal. You have two options to disable workspace thumbnails, one sets workspaces to vertical orientation, the second one to horizontal.'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'workspaceThumbnailsPosition',
// this mess is just because of backward compatibility
@@ -327,7 +277,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Workspace Thumbnails Max Scale - Window Picker'),
- _('Adjusts maximum size of the workspace thumbnails in the overview (% relative to display width)'),
+ _('Adjusts the maximum size of the workspace thumbnails in the overview (percentage relative to display width)'),
wsThumbnailScale,
'wsThumbnailScale'
)
@@ -383,11 +333,11 @@ export default class VShell extends ExtensionPreferences {
});
const wsSpacingScale = itemFactory.newScale(wsSpacingAdjustment);
- wsSpacingScale.add_mark(350, Gtk.PositionType.TOP, null);
+ wsSpacingScale.add_mark(this.opt.WS_MAX_SPACING_OFF_SCREEN, Gtk.PositionType.TOP, null);
optionList.push(
itemFactory.getRowWidget(
_('Workspaces Spacing'),
- _('Adjusts spacing between workspace previews so you can control how much of the adjacent workspaces overlap to the current workspace overview. Default value should set the adjacent workspaces off-screen.'),
+ _('Adjusts spacing in pixels between workspace previews, allowing you to control how much the adjacent workspaces overlap in the current workspace overview. Setting the value above 349 pixels disables the visibility of workspaces other than the current one during transitions to/from the app grid view, which can also save some graphical resources if many windows are open on other workspaces'),
wsSpacingScale,
'wsMaxSpacing'
)
@@ -409,25 +359,6 @@ export default class VShell extends ExtensionPreferences {
)
);
- const agPageAdjustment = new Gtk.Adjustment({
- upper: 100,
- lower: 50,
- step_increment: 1,
- page_increment: 10,
- });
-
- const agPageWidthScale = itemFactory.newScale(agPageAdjustment);
- agPageWidthScale.add_mark(90, Gtk.PositionType.TOP, null);
- optionList.push(
- itemFactory.getRowWidget(
- _('App Grid Page Width Scale'),
- _('Adjusts max app grid page width relative to the available space.'),
- agPageWidthScale,
- 'appGridPageWidthScale',
- null,
- 'appDisplayModule'
- )
- );
optionList.push(
itemFactory.getRowWidget(
@@ -465,7 +396,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Search Results Width'),
- _('Adjusts maximum width of search results view (% relative to default). This allows to fit more (or less) app icons into the app search result'),
+ _('Adjusts the maximum width of search results view (percentage relative to default). This allows to fit more (or less) app icons into the app search result'),
searchViewScale,
'searchViewScale',
null,
@@ -483,7 +414,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Main Panel Position'),
_('Allows to place the main panel at the bottom of the primary display'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'panelPosition',
[
@@ -498,7 +428,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Main Panel Visibility'),
_('Allows to hide main panel when not needed'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'panelVisibility',
[
@@ -530,7 +459,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Horizontal Position (% from left)'),
+ _('Horizontal Position (percentage from the left)'),
_('This popup shows up when you switch workspace using a keyboard shortcut or gesture outside of the overview. You can disable it on the "Behavior" tab. If you want more control over the popup, try the "Workspace Switcher Manager" extension'),
hScale,
'wsSwPopupHPosition',
@@ -551,7 +480,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Vertical Position (% from top)'),
+ _('Vertical Position (percentage from the top)'),
null,
vScale,
'wsSwPopupVPosition',
@@ -570,7 +499,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Notification Banner Position'),
_('Choose where the notification banners appear on the screen'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'notificationPosition',
[
@@ -589,7 +517,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('OSD Popup Position'),
_('Choose where the OSD pop-ups (like sound volume level) appear on the screen'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'osdPosition',
[
@@ -616,7 +543,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Workspace Thumbnails Position'),
_('Allows to place workspace thumbnails of secondary monitors on the opposite side than on the primary monitor'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'secWsThumbnailsPosition',
[
@@ -658,7 +584,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Workspace Thumbnails Max Scale'),
- _('Adjusts maximum size of the workspace thumbnails (% relative to display width / height) for secondary monitors'),
+ _('Adjusts maximum size of the workspace thumbnails (percentage relative to the display width / height) for secondary monitors'),
secWsThumbnailScale,
'secWsThumbnailScale'
)
@@ -672,7 +598,7 @@ export default class VShell extends ExtensionPreferences {
});
const wsSecScaleScale = itemFactory.newScale(wsSecScaleAdjustment);
- wsScaleScale.add_mark(100, Gtk.PositionType.TOP, null);
+ wsScaleScale.add_mark(95, Gtk.PositionType.TOP, null);
optionList.push(
itemFactory.getRowWidget(
_('Workspace Preview Scale'),
@@ -684,8 +610,8 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Shift Workspace Preview by Panel Height'),
- _('This option can help align overview of the secondary monitor with the primary monitor'),
+ _('Shift Overview by Panel Height'),
+ _('This option can help align the overview of the secondary monitor with the primary one'),
itemFactory.newSwitch(),
'secWsPreviewShift'
)
@@ -711,18 +637,18 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Dash Max Icon Size'),
- _('Maximum size of Dash icons in pixels'),
- // itemFactory.newComboBox(),
+ _('Maximum size of Dash icons in pixels. Adaptive option switches between default 64 and 48 for low resolution displays'),
itemFactory.newDropDown(),
'dashMaxIconSize',
[
- [_('128'), 128],
- [_('112'), 112],
- [_('96'), 96],
- [_('80'), 80],
- [_('64'), 64],
- [_('48'), 48],
- [_('32'), 32],
+ [_('Adaptive (Default)'), 0],
+ [_('128'), 128],
+ [_('112'), 112],
+ [_('96'), 96],
+ [_('80'), 80],
+ [_('64'), 64],
+ [_('48'), 48],
+ [_('32'), 32],
],
'dashModule'
)
@@ -732,7 +658,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Dash Background Style'),
_('Allows you to change the background color of the dash to match the search results an app folders'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'dashBgColor',
[
@@ -796,7 +721,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Running App Indicator'),
_('Allows you to change style of the running app indicator under the app icon'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'runningDotStyle',
[
@@ -817,7 +741,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Show Workspace Thumbnail Labels'),
_('Each workspace thumbnail can show label with its index and name (if defined in the system settings) or name/title of its most recently used app/window'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'showWsTmbLabels',
[
@@ -858,7 +781,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Window Preview App Icon Size'),
null,
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'winPreviewIconSize',
[
@@ -876,7 +798,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Window Title Position / Visibility'),
_('Sets the position of the window title that is displayed when the mouse hovers over the window or can always be visible'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'winTitlePosition',
[
@@ -935,165 +856,6 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('App Grid')
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Icon Size'),
- _('Allows to set a fixed app grid icon size and bypass the default adaptive algorithm'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appGridIconSize',
- [
- [_('Adaptive (Default)'), -1],
- [_('256'), 256],
- [_('224'), 224],
- [_('208'), 208],
- [_('192'), 192],
- [_('176'), 176],
- [_('160'), 160],
- [_('144'), 144],
- [_('128'), 128],
- [_('112'), 112],
- [_('96'), 96],
- [_('80'), 80],
- [_('64'), 64],
- [_('48'), 48],
- // [_('32'), 32],
- ],
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Folder Icon Size'),
- _('Allows to set a fixed icon size and bypass the default adaptive algorithm in the open folder dialog'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appGridFolderIconSize',
- [
- [_('Adaptive (Default)'), -1],
- [_('128'), 128],
- [_('112'), 112],
- [_('96'), 96],
- [_('80'), 80],
- [_('64'), 64],
- [_('48'), 48],
- [_('32'), 32],
- ],
- 'appDisplayModule'
- )
- );
-
- const folderIconGridCombo = itemFactory.newDropDown();
- optionList.push(
- itemFactory.getRowWidget(
- _('Max App Folder Icon Grid Size'),
- _('Sets a grid size (number of icons) in the folder preview. 3x3 options automatically switches between 2x2 and 3x3 grid depending on the number of icons in the folder'),
- folderIconGridCombo,
- 'appGridFolderIconGrid',
- [
- [_('2x2 (Default)'), 2],
- [_('3x3 for 5+ apps'), 3],
- [_('3x3 for 9+ apps'), 4],
- ],
- 'appDisplayModule'
- )
- );
-
- const columnsAdjustment = new Gtk.Adjustment({
- upper: 15,
- lower: 0,
- step_increment: 1,
- page_increment: 1,
- });
-
- const columnsSpinBtn = itemFactory.newSpinButton(columnsAdjustment);
- optionList.push(itemFactory.getRowWidget(
- _('Columns per Page (0 for adaptive grid)'),
- _('Number of columns in the application grid. If set to 0 (the default), the number will be set automatically to fit the available width'),
- columnsSpinBtn,
- 'appGridColumns',
- null,
- 'appDisplayModule'
- ));
-
- const rowsAdjustment = new Gtk.Adjustment({
- upper: 15,
- lower: 0,
- step_increment: 1,
- page_increment: 1,
- });
-
- const rowsSpinBtn = itemFactory.newSpinButton(rowsAdjustment);
- optionList.push(itemFactory.getRowWidget(
- _('Rows per Page (0 for adaptive grid)'),
- _('Number of rows in the application grid. If set to 0 (the default), the number will be set automatically to fit the available height'),
- rowsSpinBtn,
- 'appGridRows',
- null,
- 'appDisplayModule'
- ));
-
- const folderColumnsAdjustment = new Gtk.Adjustment({
- upper: 15,
- lower: 0,
- step_increment: 1,
- page_increment: 1,
- });
-
- const folderColumnsSpinBtn = itemFactory.newSpinButton(folderColumnsAdjustment);
- optionList.push(itemFactory.getRowWidget(
- _('Folder Columns per Page (0 for adaptive grid)'),
- _('Number of columns in folder grid. If you leave the value at 0, the number of columns will be calculated to fit all the folder icons on one page'),
- folderColumnsSpinBtn,
- 'appGridFolderColumns',
- null,
- 'appDisplayModule'
- ));
-
- const folderRowsAdjustment = new Gtk.Adjustment({
- upper: 15,
- lower: 0,
- step_increment: 1,
- page_increment: 1,
- });
-
- const folderRowsSpinBtn = itemFactory.newSpinButton(folderRowsAdjustment);
- optionList.push(itemFactory.getRowWidget(
- _('Folder Rows per Page (0 for adaptive grid)'),
- _('Number of rows in folder grid. If you leave the value at 0, the number of rows will be calculated to fit all the folder icons on one page'),
- folderRowsSpinBtn,
- 'appGridFolderRows',
- null,
- 'appDisplayModule'
- ));
-
- const appGridSpacingAdjustment = new Gtk.Adjustment({
- upper: 30,
- lower: 5,
- step_increment: 1,
- page_increment: 5,
- });
-
- const appGridSpacingScale = itemFactory.newScale(appGridSpacingAdjustment);
- appGridSpacingScale.add_mark(12, Gtk.PositionType.TOP, null);
- optionList.push(
- itemFactory.getRowWidget(
- _('Grid Spacing'),
- _('Adjusts the spacing between icons in a grid, the real impact is on folders'),
- appGridSpacingScale,
- 'appGridSpacing',
- null,
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
_('Search')
)
);
@@ -1101,11 +863,11 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('App Search Icon Size'),
- _('Size of results provided by the App Search Provider - smaller size allows to fit more results'),
- // itemFactory.newComboBox(),
+ _('Size of results provided by the App Search Provider - smaller size allows to fit more results. Adaptive option switches between default 96 and 64 for low resolution displays'),
itemFactory.newDropDown(),
'searchIconSize',
[
+ [_('Adaptive'), 0],
[_('128'), 128],
[_('112'), 112],
[_('96 (Default)'), 96],
@@ -1141,6 +903,20 @@ export default class VShell extends ExtensionPreferences {
)
);
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Highlighting'),
+ _('The GNOME default highlighting style (bold) causes strings to be "randomly" ellipsized, often preventing you from seeing the whole string, even if there is space for it. The selected style will be applied to all search results globally. If you are using other extensions that offer this option, make sure you set the same setting in all of them.'),
+ itemFactory.newDropDown(),
+ 'highlightingStyle',
+ [
+ [_('Bold (Default)'), 0],
+ [_('Underline'), 1],
+ [_('None'), 2],
+ ]
+ )
+ );
+
optionList.push(
itemFactory.getRowWidget(
@@ -1234,31 +1010,6 @@ export default class VShell extends ExtensionPreferences {
)
);
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Window Thumbnails (PIP)')
- )
- );
-
- const winTmbAdjustment = new Gtk.Adjustment({
- upper: 50,
- lower: 5,
- step_increment: 1,
- page_increment: 1,
- });
-
- const winTmbScale = itemFactory.newScale(winTmbAdjustment);
- winTmbScale.add_mark(15, Gtk.PositionType.TOP, null);
- optionList.push(
- itemFactory.getRowWidget(
- _('Default Window Thumbnail (PIP) Scale (% of screen height)'),
- _('Default scale of window thumbnail (like Picture In Picture) that you can create using the app icon menu or window preview action'),
- winTmbScale,
- 'windowThumbnailScale'
- )
- );
-
return optionList;
}
// ----------------------------------------------------------------
@@ -1276,7 +1027,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Overview Mode'),
_('The Expose Windows on Hover mode does not expose the workspace preview windows until the mouse pointer enters any window\nThe Static Workspace mode keeps the workspace static when you activate the overview, it only shows Dash, workspace thumbnails and search entry over the workspace and only clicking on an active workspace thumbnail activates the default overview'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'overviewMode',
[
@@ -1291,7 +1041,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Startup State'),
_('Allows to change the state in which GNOME Shell starts a session'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'startupState',
[
@@ -1306,7 +1055,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Escape Key Behavior'),
_('Allows you to close the overview with a single press of the Escape key, even from the application grid or from search, if the search entry field does not have focus'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'overviewEscBehavior',
[
@@ -1319,6 +1067,16 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
+ _('Click Empty Space To Close'),
+ _('Enables clicking on an empty space in the overview to close it'),
+ itemFactory.newSwitch(),
+ 'clickEmptyClose',
+ null
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
_('Overlay Key (Super/Windows)')
)
);
@@ -1326,18 +1084,17 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Single-Press Action'),
- _('Disable or change behavior when you press and release the Super key. The "Search Windows" options requires the WindowSearchProvider module to be activated'),
- // itemFactory.newComboBox(),
+ _('Disable or change behavior when you press and release the Super key. The "Search Windows" options requires the "WSP (Window Search Provider)" extension installed and enabled. Link is available on the Modules tab in Settings. If you want another extension (like AATWS) to handle the overlay key, set this option to "Overview - Window Picker (Default)" and the "Double-Press Action" option to "Applications (Default)"'),
itemFactory.newDropDown(),
'overlayKeyPrimary',
[
[_('Disable'), 0],
[_('Follow Global Overview Mode'), 1],
- [_('Overview (Default)'), 2],
+ [_('Overview - Window Picker (Default)'), 2],
[_('Applications'), 3],
[_('Overview - Static WS Preview'), 4],
[_('Overview - Static Workspace'), 5],
- [_('Search Windows'), 6],
+ [_('Search Windows (requires WSP extension)'), 6],
// [_('Search Recent Files'), 7],
],
'overlayKeyModule'
@@ -1347,14 +1104,13 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Double-Press Action'),
- _('Disable or change behavior when you double-press the Super key. The "Search Windows" option requires the WindowSearchProvider module to be activated. The "Static WS Overview - Expose Windows" option allows you to switch to default Activities Overview window picker view if you set static workspace (preview) for the single press/release Super key action'),
- // itemFactory.newComboBox(),
+ _('Disable or change behavior when you double-press the Super key. The "Search Windows" option requires the "WSP (Window Search Provider)" extension installed and enabled. The "Static WS Overview - Expose Windows" option allows you to switch to default Activities Overview window picker view if you set static workspace (preview) for the single press/release Super key action'),
itemFactory.newDropDown(),
'overlayKeySecondary',
[
[_('Disable'), 0],
[_('Applications (Default)'), 1],
- [_('Search Windows'), 2],
+ [_('Search Windows (requires WSP extension)'), 2],
[_('Overview - Window Picker'), 3],
// [_('Search Recent Files'), 4],
],
@@ -1371,18 +1127,17 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Hot Corner Action'),
- _('Disable or change behavior of the hot corner. Holding down the Ctrl key while hitting the hot corner switches between Overview/Applications actions'),
- // itemFactory.newComboBox(),
+ _('Disable or change behavior of the hot corner. Holding down the Ctrl key while hitting the hot corner switches between Overview/Applications actions. The "Search Windows" option requires the "WSP (Window Search Provider)" extension installed and enabled'),
itemFactory.newDropDown(),
'hotCornerAction',
[
[_('Disable'), 0],
[_('Follow Global Overview Mode'), 1],
- [_('Overview - Window Picker'), 2],
+ [_('Overview - Window Picker (Default)'), 2],
[_('Applications'), 3],
[_('Overview - Static WS Preview'), 4],
[_('Overview - Static Workspace'), 5],
- [_('Search Windows'), 6],
+ [_('Search Windows (requires WSP extension)'), 6],
],
'layoutModule'
)
@@ -1392,7 +1147,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Hot Corner Position'),
_('Choose which corner of your monitors will be active. If you choose "Follow Dash" option, the corner will be placed near the left or top edge of the Dash. The last option extends the hot corner trigger to cover the entire ege of the monitor where Dash is located'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'hotCornerPosition',
[
@@ -1451,7 +1205,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('App Icon - Click Behavior'),
_('Choose your preferred behavior when clicking on an app icon. The "Prefer Current Workspace" option opens a new app window if not present in the current workspace. The "Open New Window" option also switches behavior of the middle click to "Activate" since its default behavior is to open a new window'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'dashShowWindowsBeforeActivation',
[
@@ -1468,7 +1221,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('App Icon - Scroll Action'),
_('Choose the behavior when scrolling over an app icon. The window cycler works with a list of windows sorted by the "Most Recently Used" and grouped by workspaces. Scrolling up cycles through previously used windows on the same workspace and then switches to another workspace, if any'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'dashIconScroll',
[
@@ -1482,22 +1234,6 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Search Windows Icon - Scroll Action'),
- _('Choose the behavior when scrolling over the Search Windows icon. The window cycler works with a list of windows sorted by "Most Recently Used" of the current workspace or all workspaces. Scrolling up cycles through previously used windows on the same workspace, or all windows regardless workspace. This option is mainly useful for the static workspace overview mode.'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'searchWindowsIconScroll',
- [
- [_('Default'), 0],
- [_('Cycle All Windows'), 1],
- [_('Cycle Windows On Current WS'), 2],
- ],
- 'dashModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
_('Workspace Thumbnails')
)
);
@@ -1506,7 +1242,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Close Workspace Button'),
_('The Close Workspace button appears on the workspace thumbnail when you hover over it and allows you to close all windows on the workspace. You can choose a "safety lock" to prevent accidental use'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'closeWsButtonMode',
[
@@ -1528,14 +1263,13 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Secondary Button Click Action'),
_('Allows you to add a secondary mouse click action to the window preview'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'winPreviewSecBtnAction',
[
[_('Activate Window (Default)'), 0],
[_('Close Window'), 1],
[_('Search For Same App Windows'), 2],
- [_('Create Window Thumbnail - PIP'), 3],
+ [_('Create Window Thumbnail/PiP (requires WTMB extension)'), 3],
],
'windowPreviewModule'
)
@@ -1545,14 +1279,13 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Middle Button Click Action'),
_('Allows you to add a middle mouse click action to the window preview'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'winPreviewMidBtnAction',
[
[_('Activate Window (Default)'), 0],
[_('Close Window'), 1],
[_('Search For Same App Windows'), 2],
- [_('Create Window Thumbnail - PIP'), 3],
+ [_('Create Window Thumbnail/PiP (requires WTMB extension)'), 3],
],
'windowPreviewModule'
)
@@ -1562,13 +1295,12 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('App Icon Click Action'),
_('Select the action to take when the application icon on the window preview is clicked'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'windowIconClickAction',
[
[_('Activate Window (Default)'), 0],
[_('Search For Same App Windows'), 1],
- [_('Create Window Thumbnail - PIP'), 2],
+ [_('Create Window Thumbnail/PiP (requires WTMB extension)'), 2],
],
'windowPreviewModule'
)
@@ -1587,174 +1319,36 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('App Grid')
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('App Grid Order'),
- _('Choose sorting method for the app grid. Note that sorting by usage ignores folders'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appGridOrder',
- [
- [_('Custom (Default)'), 0],
- [_('Alphabet - Folders First'), 1],
- [_('Alphabet - Folders Last'), 2],
- [_('Usage - No Folders'), 3],
- ],
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('App Folder Order'),
- _('Choose sorting method for app folders'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appFolderOrder',
- [
- [_('Custom (Default)'), 0],
- [_('Alphabet'), 1],
- [_('Usage'), 2],
- ],
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('App Grid Content'),
- _('The default Shell removes favorite apps, this option allows to duplicate them in the grid or remove also running applications. Option "Favorites and Running First" only works with the Alphabet and Usage sorting'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appGridContent',
- [
- [_('Include All'), 0],
- [_('Include All - Favorites and Running First'), 1],
- [_('Exclude Favorites (Default)'), 2],
- [_('Exclude Running'), 3],
- [_('Exclude Favorites and Running'), 4],
- ],
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Active Icons in Folder Preview'),
- _('If enabled, icons in the folder review behaves like normal icons, you can activate or even drag them directly, without having to open the folder first'),
- itemFactory.newSwitch(),
- 'appGridActivePreview',
- null,
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Center Open Folders'),
- _('App folder may open in the center of the screen or above the source folder icon'),
- itemFactory.newSwitch(),
- 'appGridFolderCenter',
- null,
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Allow Incomplete Pages'),
- _('If disabled, icons from the next page (if any) are automatically moved to fill any empty slot left after an icon was (re)moved (to a folder for example)'),
- itemFactory.newSwitch(),
- 'appGridIncompletePages',
- null,
- 'appDisplayModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('App Labels Behavior'),
- _('Choose how and when to display app names'),
- // itemFactory.newComboBox(),
- itemFactory.newDropDown(),
- 'appGridNamesMode',
- [
- [_('Ellipsized - Expand Selected (Default)'), 0],
- [_('Always Expanded'), 1],
- [_('Hidden - Show Selected Only'), 2],
- ],
- 'appDisplayModule'
- )
- );
-
- optionList.push(itemFactory.getRowWidget(
- _('Reset App Grid Layout'),
- _('Removes all stored app grid positions, after reset icons will be sorted alphabetically, except folder contents'),
- itemFactory.newResetButton(() => {
- const settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
- settings.set_value('app-picker-layout', new GLib.Variant('aa{sv}', []));
- })
- ));
-
- optionList.push(itemFactory.getRowWidget(
- _('Remove App Grid Folders'),
- _('Removes all folders, folder apps will move to the root grid'),
- itemFactory.newResetButton(() => {
- const settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
- settings.set_strv('folder-children', []);
- })
- ));
-
-
- optionList.push(
- itemFactory.getRowWidget(
_('Search')
)
);
optionList.push(
itemFactory.getRowWidget(
- _('Window Search Provider - Sorting'),
- _('Choose the window sorting method'),
- // itemFactory.newComboBox(),
+ _('App Grid Search Mode'),
+ _('Select how the search should behave when initiated from the app grid view. The "Filtered App Grid View" option shows all resulting app icons sorted by usage in the app grid view instead of switching to the default search view'),
itemFactory.newDropDown(),
- 'searchWindowsOrder',
+ 'searchAppGridMode',
[
- [_('Most Recently Used (MRU)'), 0],
- [_('MRU - Current Workspace First'), 1],
- [_('MRU - By Workspaces'), 2],
- [_('Stable Sequence - By Workspaces'), 3],
+ [_('Search View (Default)'), 0],
+ [_('Filtered App Grid View'), 1],
],
- 'windowSearchProviderModule'
+ 'searchModule'
)
);
optionList.push(
itemFactory.getRowWidget(
_('Enable Fuzzy Match'),
- _('Enabling the fuzzy match allows you to skip letters in the pattern you are searching for and find "Firefox" even if you type "ffx". Works only for the App, Window and Recent files search providers'),
+ _('Enabling the fuzzy match allows you to skip letters in the pattern you are searching for and find "Firefox" even if you type "ffx". Works only for the App, Windows, Extensions and Recent files search providers'),
itemFactory.newSwitch(),
'searchFuzzy'
)
);
- /* const wspCommandSwitch = itemFactory.newSwitch();
- optionList.push(
- itemFactory.getRowWidget(
- _('Enable Commands in Search Entry'),
- _('You can use following commands separated by the space at the end of entered pattern:\n/x! \t\t\t- close selected window\n/xa! \t\t\t- close all found windows\n/m[number] \t\t- (e.g. /m6) move selected window to workspace with given index\n/ma[number] \t- move all found windows to workspace with given index'),
- wspCommandSwitch,
- 'searchWindowsCommands'
- )
- );*/
-
optionList.push(
itemFactory.getRowWidget(
- _('Animations - General')
+ _('Animations')
)
);
@@ -1770,7 +1364,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('Animation Speed'),
- _('Adjusts the global animation speed in % of the default duration - higher value means slower animation'),
+ _('Adjusts the global animation speed in percentage of the default duration - higher value means slower animation'),
animationSpeedScale,
'animationSpeedFactor'
)
@@ -1778,15 +1372,8 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('Animations - Overview')
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
_('App Grid Animation'),
_('When entering the App Grid view, the app grid animates from the edge of the screen. You can choose the direction, keep the Default (direction will be selected automatically) or disable the animation if you don\'t like it'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'appGridAnimation',
[
@@ -1804,7 +1391,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Search View Animation'),
_('When search is activated the search view with search results can animate from the edge of the screen. You can choose the direction, keep the Default (currently Bottom to Top) or disable the animation if you don\'t like it.'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'searchViewAnimation',
[
@@ -1823,7 +1409,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Workspace Preview Animation'),
_('When entering / leaving the App Grid / Search view, the workspace preview can animate to/from workspace thumbnail.'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'workspaceAnimation',
[
@@ -1862,7 +1447,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Workspace Switcher Animation'),
_('Allows you to disable movement of the desktop background during workspace switcher animation outside of the overview. The Static Background mode also keeps Conky and desktop icons on their place during switching.'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'workspaceSwitcherAnimation',
[
@@ -1875,9 +1459,22 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
+ _('Workspace Switcher Mode (Isolate Monitors)'),
+ _('Note that this is a workaround, not full-fledged feature. GNOME Shell does not support separate workspaces for each monitor, so V-Shell switches workspaces only on the primary monitor and moves windows across workspaces on secondary monitors in order to simulate independent behavior. The current monitor is determined by the position of the mouse pointer'),
+ itemFactory.newDropDown(),
+ 'wsSwitcherMode',
+ [
+ [_('Default'), 0],
+ [_('Current Monitor'), 1],
+ ],
+ 'windowManagerModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
_('Workspace Switcher Popup Mode'),
_('This popup shows up when you switch workspace using a keyboard shortcut or gesture outside of the overview. You can to disable the popup at all, or show it on the current monitor (the one with mouse pointer) instead of the primary.'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'wsSwPopupMode',
[
@@ -1899,7 +1496,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Window Attention Handler'),
_('When a window requires attention (often a new window), GNOME Shell shows you a notification about it. You can disable popups of these messages (notification will be pushed into the message tray silently) or focus the source window immediately instead'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'windowAttentionMode',
[
@@ -1915,7 +1511,6 @@ export default class VShell extends ExtensionPreferences {
itemFactory.getRowWidget(
_('Favorites'),
_('Disable pin/unpin app notifications'),
- // itemFactory.newComboBox(),
itemFactory.newDropDown(),
'favoritesNotify',
[
@@ -1929,40 +1524,443 @@ export default class VShell extends ExtensionPreferences {
return optionList;
}
- _getModulesOptionList(itemFactory) {
+ // -----------------------------------------------------------------------------------------------------------------
+
+ _getAppGridOptionList(itemFactory) {
const optionList = [];
// options item format:
// (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable)
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Main App Grid')
+ )
+ );
+
optionList.push(
itemFactory.getRowWidget(
- _('V-Shell Modules (allows you to disable modules that conflict with another extension)')
+ _('Apps Sorting'),
+ _('Choose sorting method for the app grid. Note that sorting by usage ignores folders'),
+ itemFactory.newDropDown(),
+ 'appGridOrder',
+ [
+ [_('Custom (Default)'), 0],
+ [_('Alphabet'), 4],
+ [_('Alphabet - Folders First'), 1],
+ [_('Alphabet - Folders Last'), 2],
+ [_('Usage - No Folders'), 3],
+ ],
+ 'appDisplayModule'
)
);
optionList.push(
itemFactory.getRowWidget(
- _('WindowSearchProvider'),
- _('Activates the window search provider that adds open windows to the search results. You can search app names and window titles. You can also use "wq//" prefix (also by pressing the Space hotkey in the overview, or clicking dash icon) to suppress results from other search providers'),
+ _('Icon Size'),
+ _('Allows to set a fixed app grid icon size and bypass the default adaptive algorithm'),
+ itemFactory.newDropDown(),
+ 'appGridIconSize',
+ [
+ [_('Adaptive (Default)'), -1],
+ [_('256'), 256],
+ [_('224'), 224],
+ [_('208'), 208],
+ [_('192'), 192],
+ [_('176'), 176],
+ [_('160'), 160],
+ [_('144'), 144],
+ [_('128'), 128],
+ [_('112'), 112],
+ [_('96'), 96],
+ [_('80'), 80],
+ [_('64'), 64],
+ [_('48'), 48],
+ // [_('32'), 32],
+ ],
+ 'appDisplayModule'
+ )
+ );
+
+ const columnsAdjustment = new Gtk.Adjustment({
+ upper: 15,
+ lower: 0,
+ step_increment: 1,
+ page_increment: 1,
+ });
+
+ const columnsSpinBtn = itemFactory.newSpinButton(columnsAdjustment);
+ optionList.push(itemFactory.getRowWidget(
+ _('Columns per Page (0 for adaptive grid)'),
+ _('Number of columns in the application grid. If set to 0, the number will be set automatically to fit the available width'),
+ columnsSpinBtn,
+ 'appGridColumns',
+ null,
+ 'appDisplayModule'
+ ));
+
+ const rowsAdjustment = new Gtk.Adjustment({
+ upper: 15,
+ lower: 0,
+ step_increment: 1,
+ page_increment: 1,
+ });
+
+ const rowsSpinBtn = itemFactory.newSpinButton(rowsAdjustment);
+ optionList.push(itemFactory.getRowWidget(
+ _('Rows per Page (0 for adaptive grid)'),
+ _('Number of rows in the application grid. If set to 0, the number will be set automatically to fit the available height'),
+ rowsSpinBtn,
+ 'appGridRows',
+ null,
+ 'appDisplayModule'
+ ));
+
+ const folderColumnsAdjustment = new Gtk.Adjustment({
+ upper: 15,
+ lower: 0,
+ step_increment: 1,
+ page_increment: 1,
+ });
+
+ const agPageAdjustment = new Gtk.Adjustment({
+ upper: 100,
+ lower: 50,
+ step_increment: 1,
+ page_increment: 10,
+ });
+
+ const agPageWidthScale = itemFactory.newScale(agPageAdjustment);
+ agPageWidthScale.add_mark(60, Gtk.PositionType.TOP, null);
+ agPageWidthScale.add_mark(70, Gtk.PositionType.TOP, null);
+ agPageWidthScale.add_mark(80, Gtk.PositionType.TOP, null);
+ agPageWidthScale.add_mark(90, Gtk.PositionType.TOP, null);
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('App Grid Page Width Scale'),
+ _('Adjusts maximum app grid page width relative to the available space'),
+ agPageWidthScale,
+ 'appGridPageWidthScale',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ const aghPageAdjustment = new Gtk.Adjustment({
+ upper: 100,
+ lower: 50,
+ step_increment: 1,
+ page_increment: 10,
+ });
+
+ const agPageHeightScale = itemFactory.newScale(aghPageAdjustment);
+ agPageHeightScale.add_mark(60, Gtk.PositionType.TOP, null);
+ agPageHeightScale.add_mark(70, Gtk.PositionType.TOP, null);
+ agPageHeightScale.add_mark(80, Gtk.PositionType.TOP, null);
+ agPageHeightScale.add_mark(90, Gtk.PositionType.TOP, null);
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('App Grid Page Height Scale'),
+ _('Adjusts maximum app grid page height relative to the available space'),
+ agPageHeightScale,
+ 'appGridPageHeightScale',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ const appGridSpacingAdjustment = new Gtk.Adjustment({
+ upper: 30,
+ lower: 5,
+ step_increment: 1,
+ page_increment: 5,
+ });
+
+ const appGridSpacingScale = itemFactory.newScale(appGridSpacingAdjustment);
+ appGridSpacingScale.add_mark(12, Gtk.PositionType.TOP, null);
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Grid Spacing'),
+ _('V-Shell uses this value to calculate grid dimensions for adaptive options. However, the main grid automatically adjusts the spacing based on the grid and available space'),
+ appGridSpacingScale,
+ 'appGridSpacing',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Allow Incomplete Pages'),
+ _('If disabled, icons from the next page (if any) are automatically moved to fill any empty slot left after an icon was (re)moved (to a folder for example)'),
itemFactory.newSwitch(),
- 'windowSearchProviderModule'
+ 'appGridIncompletePages',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ // --------------------------------------------------------------------------------------
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('App Folders')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Folder Apps Sorting'),
+ _('Choose sorting method for app folders'),
+ itemFactory.newDropDown(),
+ 'appFolderOrder',
+ [
+ [_('Custom (Default)'), 0],
+ [_('Alphabet'), 1],
+ [_('Usage'), 2],
+ ],
+ 'appDisplayModule'
)
);
optionList.push(
itemFactory.getRowWidget(
- _('RecentFilesSearchProvider'),
- _('Activates the recent files search provider that can be triggered by a dash icon, Ctrl + Space hotkey or by typing "fq//" prefix in the search entry field. This option needs File History option enabled in the GNOME Privacy settings'),
+ _('Active Icons in Folder Preview'),
+ _('If enabled, icons in the folder preview behaves like normal icons, you can activate or even drag them directly, without having to open the folder first. This option also affects the app grid default icon size'),
itemFactory.newSwitch(),
- 'recentFilesSearchProviderModule'
+ 'appGridActivePreview',
+ null,
+ 'appDisplayModule'
)
);
+ const folderIconGridCombo = itemFactory.newDropDown();
optionList.push(
itemFactory.getRowWidget(
- _('ExtensionsSearchProvider'),
- _('Activates the extensions search provider that adds extensions to the search results. You can also use "eq//" prefix (also by pressing the Ctrl + Shift + Space hotkey in the overview, or clicking dash icon) to suppress results from other search providers'),
+ _('App Folder Preview Grid Size'),
+ _('Sets a grid size (number of icons) in the folder icon preview. 3x3 options automatically switches between 2x2 and 3x3 grid depending on the number of icons in the folder'),
+ folderIconGridCombo,
+ 'appGridFolderIconGrid',
+ [
+ [_('2x2 (Default)'), 2],
+ [_('3x3 for 5+ apps'), 3],
+ [_('3x3 for 9+ apps'), 4],
+ ],
+ 'appDisplayModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Folder Icon Size'),
+ _('Allows to set a fixed icon size and bypass the default adaptive algorithm in the open folder dialog'),
+ itemFactory.newDropDown(),
+ 'appGridFolderIconSize',
+ [
+ [_('Adaptive (Default)'), -1],
+ [_('128'), 128],
+ [_('112'), 112],
+ [_('96'), 96],
+ [_('80'), 80],
+ [_('64'), 64],
+ [_('48'), 48],
+ ],
+ 'appDisplayModule'
+ )
+ );
+
+ const folderColumnsSpinBtn = itemFactory.newSpinButton(folderColumnsAdjustment);
+ optionList.push(itemFactory.getRowWidget(
+ _('Maximum Number Of Columns (0 for automatic)'),
+ _('Specifies the maximum number of columns per page in folder grids. If you leave the value at 0, the maximum number of columns will be calculated based on available space. The actual folder grid dimensions will be determined by the number of items within the set limits'),
+ folderColumnsSpinBtn,
+ 'appGridFolderColumns',
+ null,
+ 'appDisplayModule'
+ ));
+
+ const folderRowsAdjustment = new Gtk.Adjustment({
+ upper: 15,
+ lower: 0,
+ step_increment: 1,
+ page_increment: 1,
+ });
+
+ const folderRowsSpinBtn = itemFactory.newSpinButton(folderRowsAdjustment);
+ optionList.push(itemFactory.getRowWidget(
+ _('Maximum Number Of Rows (0 for automatic)'),
+ _('Specifies the maximum number of rows per page in folder grids. If you leave the value at 0, the maximum number of rows will be calculated based on available space. The actual folder grid dimensions will be determined by the number of items within the set limits'),
+ folderRowsSpinBtn,
+ 'appGridFolderRows',
+ null,
+ 'appDisplayModule'
+ ));
+
+ const appFolderSpacingAdjustment = new Gtk.Adjustment({
+ upper: 30,
+ lower: 5,
+ step_increment: 1,
+ page_increment: 5,
+ });
+
+ const appFolderSpacingScale = itemFactory.newScale(appFolderSpacingAdjustment);
+ appFolderSpacingScale.add_mark(12, Gtk.PositionType.TOP, null);
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Folder Grid Spacing'),
+ _('Adjusts the spacing between icons in a folder grid'),
+ appFolderSpacingScale,
+ 'appGridFolderSpacing',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Center Open Folders'),
+ _("App folders may open in the center of the screen or be centered on the folder's source icon"),
+ itemFactory.newSwitch(),
+ 'appGridFolderCenter',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+ // --------------------------------------------------------------------------------------
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Content')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('App Grid Content'),
+ _('The default Shell removes favorite apps, this option allows to duplicate them in the grid or remove also running applications. Option "Favorites and Running First" only works with the Alphabet and Usage sorting'),
+ itemFactory.newDropDown(),
+ 'appGridContent',
+ [
+ [_('Include All'), 0],
+ [_('Include All - Favorites and Running First'), 1],
+ [_('Exclude Favorites (Default)'), 2],
+ [_('Exclude Running'), 3],
+ [_('Exclude Favorites and Running'), 4],
+ ],
+ 'appDisplayModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('App Labels Behavior'),
+ _('Choose how and when to display app names'),
+ itemFactory.newDropDown(),
+ 'appGridNamesMode',
+ [
+ [_('Ellipsized - Expand Selected (Default)'), 0],
+ [_('Always Expanded'), 1],
+ [_('Hidden - Show Selected Only'), 2],
+ ],
+ 'appDisplayModule'
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Show Page Navigation Buttons'),
+ _("You can hide the page navigation buttons if you don't need them or want to get more space for icons. The buttons are hidden automatically when there is only one page in the app grid"),
itemFactory.newSwitch(),
- 'extensionsSearchProviderModule'
+ 'appGridShowPageArrows',
+ null,
+ 'appDisplayModule'
+ )
+ );
+
+
+ // --------------------------------------------------------------------------------------
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Performance')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Smooth App Grid Animations'),
+ _('This option allows V-Shell to pre-realize app grid and app folders during session startup in order to avoid stuttering animations when using them for the first time. If enabled, the session startup needs a little bit more time to finish and necessary memory will be allocated at this time'),
+ itemFactory.newSwitch(),
+ 'appGridPerformance'
+ )
+ );
+
+ // --------------------------------------------------------------------------------------
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Reset')
+ )
+ );
+
+ optionList.push(itemFactory.getRowWidget(
+ _('Reset App Grid Layout'),
+ _('Removes all stored app grid positions, after reset icons will be sorted alphabetically, except folder contents'),
+ itemFactory.newResetButton(() => {
+ const settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
+ settings.set_value('app-picker-layout', new GLib.Variant('aa{sv}', []));
+ })
+ ));
+
+ optionList.push(itemFactory.getRowWidget(
+ _('Remove App Grid Folders'),
+ _('Removes all folders, folder apps will move to the root grid'),
+ itemFactory.newResetButton(() => {
+ const settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
+ settings.set_strv('folder-children', []);
+ })
+ ));
+
+ return optionList;
+ }
+
+ _getModulesOptionList(itemFactory) {
+ const optionList = [];
+ // options item format:
+ // (text, caption, widget, settings-variable, [options for combo], sensitivity-depends-on-bool-variable)
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Optional Modules')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Windows Search Provider - Moved from V-Shell to the standalone "WSP" extension'),
+ _('NOTE: This module has been released as a standalone extension with new features, click to learn more. Related V-Shell options are still available if you install the WSP extension.\n\nWSP adds adds open windows to the search results. You can search app names and window titles. You can also use "wq//" or custom prefix (also by pressing the Space hotkey in the overview, or clicking dash icon) to suppress results from other search providers'),
+ itemFactory.newLinkButton('https://github.com/G-dH/windows-search-provider?tab=readme-ov-file#wsp-windows-search-provider')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Extensions Search Provider - Moved from V-Shell to the standalone "ESP" extension'),
+ _('NOTE: This module has been released as a standalone extension with new features, click to learn more. Related V-Shell options are still available if you install the ESP extension.\n\nESP adds extensions to the search results. You can also use "eq//" or custom prefix (also by pressing the Ctrl + Shift + Space hotkey in the overview, or clicking dash icon) to suppress results from other search providers'),
+ itemFactory.newLinkButton('https://github.com/G-dH/extensions-search-provider?tab=readme-ov-file#esp-extensions-search-provider')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Window Thumbnails (PiP) - Moved from V-Shell to the standalone "WTMB" extension'),
+ _('NOTE: This module has been released as a standalone extension with new features, click to learn more. Related V-Shell options are still available if you install the WTMB extension.\n\nWTMB allows the creation of Picture-in-Picture like window thumbnails that you can use for monitoring of windows on another workspace'),
+ itemFactory.newLinkButton('https://github.com/G-dH/window-thumbnails?tab=readme-ov-file#wtmb-window-thumbnails')
+ )
+ );
+
+ optionList.push(
+ itemFactory.getRowWidget(
+ _('Built-in Modules (allows to disable modules that conflict with another extension)')
)
);
@@ -2094,15 +2092,6 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
- _('WindowThumbnail'),
- _('Create Window Thumbnail (PIP) option in the app icon menu and window preview actions'),
- itemFactory.newSwitch(),
- 'windowThumbnailModule'
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
_('Workspace'),
_('Fixes workspace preview allocations for vertical workspaces orientation and window scaling in static overview modes'),
itemFactory.newSwitch(),
@@ -2122,7 +2111,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(
itemFactory.getRowWidget(
_('WorkspaceSwitcherPopup'),
- _('Workspace switcher popup position options'),
+ _('Workspace switcher popup orientation and position options'),
itemFactory.newSwitch(),
'workspaceSwitcherPopupModule'
)
@@ -2151,54 +2140,44 @@ export default class VShell extends ExtensionPreferences {
)
);
- /* optionList.push(
- itemFactory.getRowWidget(
- _('Compatibility')
- )
- );
-
- optionList.push(
- itemFactory.getRowWidget(
- _('Improve compatibility with Dash to Dock'),
- _('With the default Ubuntu Dock and other Dash To Dock forks, you may experience issues with Activities overview after you change Dock position or re-enable the extension. This option is enabled automatically if a replacement for the Dash is detected. In any case, using Dash to Dock extension with V-Shell is problematic and not recommended.'),
- itemFactory.newSwitch(),
- 'fixUbuntuDock'
- )
- );*/
-
optionList.push(
itemFactory.getRowWidget(
- _('Performance')
+ _('Workarounds / Hacks')
)
);
optionList.push(
itemFactory.getRowWidget(
- _('Smooth App Grid Animations'),
- _('This option allows V-Shell to pre-realize app grid and app folders during session startup in order to avoid stuttering animations when using them for the first time. If enabled, the session startup needs a little bit more time to finish and necessary memory will be allocated at this time'),
+ _('Delay at Startup'),
+ _("If you encounter issues during GNOME Shell startup after logging in, which could be caused by V-Shell's incompatibility with another extension, try enabling this option. When enabled, V-Shell is activated after the startup is complete. It will activate automatically when Dash to Dock, Ubuntu Dock or Dash to Panel extensions are detected."),
itemFactory.newSwitch(),
- 'appGridPerformance'
+ 'delayStartup'
)
);
optionList.push(
itemFactory.getRowWidget(
- _('Workarounds')
+ _('Fix New Window Not In Focus'),
+ _('If you often find that the app window you open from the Activities overview does not get focus, try enabling this option.'),
+ itemFactory.newSwitch(),
+ 'newWindowFocusFix'
)
);
optionList.push(
itemFactory.getRowWidget(
- _('Fix New Window Not In Focus'),
- _('If you often find that the app window you open from the Activities overview does not get focus, try enabling this option.'),
+ _('Fix New Window Not On Current Monitor (experimental)'),
+ _('If you use multiple monitors, you may encounter the issue of new windows opening on a different monitor than expected. This option moves those windows to the current monitor, determined by the position of the mouse pointer. However, this is a workaround, and some windows may override it, moving the window back to the previous monitor during initialization'),
itemFactory.newSwitch(),
- 'newWindowFocusFix'
+ 'newWindowMonitorFix'
)
);
return optionList;
}
+ // --------------------------------------------------------------------------------------------------
+
_getAboutOptionList(itemFactory) {
const optionList = [];
@@ -2218,7 +2197,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(itemFactory.getRowWidget(
_('Reset all options'),
- _('Set all options to default values.'),
+ _('Reset all options to their default values'),
itemFactory.newOptionsResetButton()
));
@@ -2253,7 +2232,7 @@ export default class VShell extends ExtensionPreferences {
optionList.push(itemFactory.getRowWidget(
_('Buy Me a Coffee'),
- _('If you like V-Shell, you can help me with my coffee expenses'),
+ _('Enjoying V-Shell? Consider supporting it by buying me a coffee!'),
itemFactory.newLinkButton('https://buymeacoffee.com/georgdh')
));
diff --git a/extensions/47/vertical-workspaces/schemas/meson.build b/extensions/47/vertical-workspaces/schemas/meson.build
new file mode 100644
index 0000000..ae9efc2
--- /dev/null
+++ b/extensions/47/vertical-workspaces/schemas/meson.build
@@ -0,0 +1,6 @@
+schema = rdnn + '.gschema.xml'
+schema_dir = datadir / 'glib-2.0' / 'schemas'
+
+install_data(schema, install_dir : schema_dir)
+
+gnome.post_install(glib_compile_schemas : true)
diff --git a/extensions/47/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml b/extensions/47/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml
new file mode 100644
index 0000000..c2c52fa
--- /dev/null
+++ b/extensions/47/vertical-workspaces/schemas/org.gnome.shell.extensions.vertical-workspaces.gschema.xml
@@ -0,0 +1,907 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist gettext-domain="vertical-workspaces">
+ <schema id="org.gnome.shell.extensions.vertical-workspaces" path="/org/gnome/shell/extensions/vertical-workspaces/">
+ <key type="i" name="ws-thumbnails-position">
+ <default>0</default>
+ </key>
+ <key type="b" name="ws-thumbnails-full">
+ <default>false</default>
+ </key>
+ <key type="i" name="secondary-ws-thumbnails-position">
+ <default>2</default>
+ </key>
+ <key type="i" name="ws-max-spacing">
+ <default>350</default>
+ </key>
+ <key type="i" name="ws-preview-scale">
+ <default>95</default>
+ </key>
+ <key type="i" name="secondary-ws-preview-scale">
+ <default>95</default>
+ </key>
+ <key type="b" name="secondary-ws-preview-shift">
+ <default>false</default>
+ </key>
+ <key type="i" name="dash-position">
+ <default>0</default>
+ </key>
+ <key type="i" name="dash-position-adjust">
+ <default>-100</default>
+ </key>
+ <key type="i" name="show-app-icon-position">
+ <default>0</default>
+ </key>
+ <key type="i" name="dash-show-windows-icon">
+ <default>1</default>
+ </key>
+ <key type="i" name="dash-show-recent-files-icon">
+ <default>1</default>
+ </key>
+ <key type="i" name="dash-show-extensions-icon">
+ <default>1</default>
+ </key>
+ <key type="i" name="wst-position-adjust">
+ <default>-100</default>
+ </key>
+ <key type="i" name="show-wst-labels">
+ <default>3</default>
+ </key>
+ <key type="b" name="show-wst-labels-on-hover">
+ <default>false</default>
+ </key>
+ <key type="i" name="sec-wst-position-adjust">
+ <default>0</default>
+ </key>
+ <key type="i" name="close-ws-button-mode">
+ <default>2</default>
+ </key>
+ <key type="b" name="center-dash-to-ws">
+ <default>false</default>
+ </key>
+ <key type="b" name="show-search-entry">
+ <default>false</default>
+ </key>
+ <key type="b" name="center-search">
+ <default>true</default>
+ </key>
+ <key type="b" name="center-app-grid">
+ <default>false</default>
+ </key>
+ <key type="i" name="ws-thumbnail-scale">
+ <default>13</default>
+ </key>
+ <key type="i" name="ws-thumbnail-scale-appgrid">
+ <default>13</default>
+ </key>
+ <key type="i" name="secondary-ws-thumbnail-scale">
+ <default>13</default>
+ </key>
+ <key type="i" name="dash-max-icon-size">
+ <default>0</default>
+ </key>
+ <key type="i" name="dash-bg-opacity">
+ <default>20</default>
+ </key>
+ <key type="i" name="dash-bg-color">
+ <default>1</default>
+ </key>
+ <key type="i" name="dash-bg-radius">
+ <default>18</default>
+ </key>
+ <key type="b" name="dash-bg-gs3-style">
+ <default>false</default>
+ </key>
+ <key type="i" name="running-dot-style">
+ <default>1</default>
+ </key>
+ <key type="b" name="enable-page-shortcuts">
+ <default>false</default>
+ </key>
+ <key type="b" name="show-ws-switcher-bg">
+ <default>false</default>
+ </key>
+ <key type="b" name="show-ws-preview-bg">
+ <default>true</default>
+ </key>
+ <key type="i" name="ws-preview-bg-radius">
+ <default>30</default>
+ </key>
+ <key type="b" name="show-bg-in-overview">
+ <default>true</default>
+ </key>
+ <key type="i" name="overview-bg-blur-sigma">
+ <default>30</default>
+ </key>
+ <key type="i" name="app-grid-bg-blur-sigma">
+ <default>40</default>
+ </key>
+ <key type="i" name="overview-bg-brightness">
+ <default>60</default>
+ </key>
+ <key type="i" name="search-bg-brightness">
+ <default>30</default>
+ </key>
+ <key type="b" name="smooth-blur-transitions">
+ <default>false</default>
+ </key>
+ <key type="i" name="app-grid-animation">
+ <default>4</default>
+ </key>
+ <key type="i" name="search-view-animation">
+ <default>0</default>
+ </key>
+ <key type="i" name="workspace-animation">
+ <default>1</default>
+ </key>
+ <key type="i" name="workspace-switcher-animation">
+ <default>1</default>
+ </key>
+ <key type="i" name="ws-switcher-mode">
+ <default>0</default>
+ </key>
+ <key type="i" name="animation-speed-factor">
+ <default>100</default>
+ </key>
+ <key type="i" name="win-preview-icon-size">
+ <default>1</default>
+ </key>
+ <key type="i" name="win-title-position">
+ <default>0</default>
+ </key>
+ <key type="i" name="startup-state">
+ <default>0</default>
+ </key>
+ <key type="i" name="overview-mode">
+ <default>0</default>
+ </key>
+ <key type="i" name="search-icon-size">
+ <default>0</default>
+ </key>
+ <key type="i" name="search-width-scale">
+ <default>100</default>
+ </key>
+ <key type="i" name="app-grid-icon-size">
+ <default>-1</default>
+ </key>
+ <key type="i" name="app-grid-columns">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-grid-rows">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-grid-order">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-folder-order">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-grid-content">
+ <default>2</default>
+ </key>
+ <key type="i" name="app-grid-folder-icon-size">
+ <default>-1</default>
+ </key>
+ <key type="i" name="app-grid-folder-columns">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-grid-folder-rows">
+ <default>0</default>
+ </key>
+ <key type="i" name="app-grid-spacing">
+ <default>12</default>
+ </key>
+ <key type="i" name="app-grid-folder-spacing">
+ <default>12</default>
+ </key>
+ <key type="b" name="app-grid-incomplete-pages">
+ <default>false</default>
+ </key>
+ <key type="i" name="app-grid-names">
+ <default>1</default>
+ </key>
+ <key type="i" name="app-grid-folder-icon-grid">
+ <default>3</default>
+ </key>
+ <key type="b" name="app-grid-active-preview">
+ <default>false</default>
+ </key>
+ <key type="b" name="app-grid-folder-center">
+ <default>false</default>
+ </key>
+ <key type="i" name="app-grid-page-width-scale">
+ <default>90</default>
+ </key>
+ <key type="i" name="app-grid-page-height-scale">
+ <default>90</default>
+ </key>
+ <key type="b" name="app-grid-show-page-arrows">
+ <default>true</default>
+ </key>
+ <key type="i" name="dash-show-windows-before-activation">
+ <default>1</default>
+ </key>
+ <key type="i" name="dash-icon-scroll">
+ <default>1</default>
+ </key>
+ <key type="b" name="dash-isolate-workspaces">
+ <default>false</default>
+ </key>
+ <key type="i" name="search-windows-icon-scroll">
+ <default>1</default>
+ </key>
+ <key type="b" name="search-windows-enable">
+ <default>true</default>
+ </key>
+ <key type="i" name="search-windows-order">
+ <default>1</default>
+ </key>
+ <key type="b" name="search-fuzzy">
+ <default>false</default>
+ </key>
+ <key type="i" name="search-max-results-rows">
+ <default>5</default>
+ </key>
+ <key type="i" name="search-app-grid-mode">
+ <default>0</default>
+ </key>
+ <key type="i" name="panel-visibility">
+ <default>0</default>
+ </key>
+ <key type="i" name="panel-position">
+ <default>0</default>
+ </key>
+ <key type="i" name="window-attention-mode">
+ <default>0</default>
+ </key>
+ <key type="i" name="ws-sw-popup-h-position">
+ <default>50</default>
+ </key>
+ <key type="i" name="ws-sw-popup-v-position">
+ <default>95</default>
+ </key>
+ <key type="i" name="ws-sw-popup-mode">
+ <default>1</default>
+ </key>
+ <key type="b" name="ws-switcher-wraparound">
+ <default>false</default>
+ </key>
+ <key type="b" name="ws-switcher-ignore-last">
+ <default>false</default>
+ </key>
+ <key type="i" name="favorites-notify">
+ <default>1</default>
+ </key>
+ <key type="i" name="notification-position">
+ <default>2</default>
+ </key>
+ <key type="i" name="osd-position">
+ <default>6</default>
+ </key>
+ <key type="i" name="hot-corner-action">
+ <default>1</default>
+ </key>
+ <key type="i" name="hot-corner-position">
+ <default>0</default>
+ </key>
+ <key type="b" name="hot-corner-fullscreen">
+ <default>true</default>
+ </key>
+ <key type="b" name="hot-corner-ripples">
+ <default>true</default>
+ </key>
+ <key type="b" name="always-activate-selected-window">
+ <default>false</default>
+ </key>
+ <key type="i" name="win-preview-sec-mouse-btn-action">
+ <default>3</default>
+ </key>
+ <key type="i" name="win-preview-mid-mouse-btn-action">
+ <default>0</default>
+ </key>
+ <key type="b" name="win-preview-show-close-button">
+ <default>true</default>
+ </key>
+ <key type="i" name="window-icon-click-action">
+ <default>1</default>
+ </key>
+ <key type="i" name="overlay-key-primary">
+ <default>1</default>
+ </key>
+ <key type="i" name="overlay-key-secondary">
+ <default>1</default>
+ </key>
+ <key type="i" name="overview-esc-behavior">
+ <default>0</default>
+ </key>
+ <key type="b" name="click-empty-close">
+ <default>false</default>
+ </key>
+ <key type="b" name="new-window-focus-fix">
+ <default>false</default>
+ </key>
+ <key type="b" name="new-window-monitor-fix">
+ <default>false</default>
+ </key>
+ <key type="b" name="app-grid-performance">
+ <default>false</default>
+ </key>
+ <key name='highlighting-style' type='i'>
+ <default>1</default>
+ </key>
+ <key type="b" name="delay-startup">
+ <default>false</default>
+ </key>
+
+ <key type="b" name="workspace-switcher-popup-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="workspace-animation-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="workspace-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="window-manager-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="window-preview-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="win-attention-handler-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="swipe-tracker-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="search-controller-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="search-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="panel-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="overlay-key-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="osd-window-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="message-tray-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="layout-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="dash-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="app-display-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="app-favorites-module">
+ <default>true</default>
+ </key>
+ <key type="b" name="recent-files-search-provider-module">
+ <default>false</default>
+ </key>
+
+ <key type="b" name="aaa-loading-profile">
+ <default>false</default>
+ </key>
+
+ <key type="s" name="profile-name-1">
+ <default>""</default>
+ </key>
+ <key type="a{ss}" name="profile-data-1">
+ <default>{
+ 'workspaceThumbnailsPosition': '1',
+ 'wsMaxSpacing': '350',
+ 'wsPreviewScale': '95',
+ 'secWsPreviewScale': '95',
+ 'secWsPreviewShift': 'false',
+ 'wsThumbnailsFull': 'false',
+ 'secWsThumbnailsPosition': '2',
+ 'dashPosition': '3',
+ 'dashPositionAdjust': '0',
+ 'wsTmbPositionAdjust': '-80',
+ 'showWsTmbLabels': '3',
+ 'showWsTmbLabelsOnHover': 'false',
+ 'closeWsButtonMode': '2',
+ 'secWsTmbPositionAdjust': '-80',
+ 'dashMaxIconSize': '0',
+ 'centerDashToWs': 'false',
+ 'showAppsIconPosition': '1',
+ 'wsThumbnailScale': '13',
+ 'wsThumbnailScaleAppGrid': '13',
+ 'secWsThumbnailScale': '13',
+ 'showSearchEntry': 'true',
+ 'centerSearch': 'true',
+ 'centerAppGrid': 'true',
+ 'dashBgOpacity': '80',
+ 'dashBgColor': '0',
+ 'dashBgRadius': '0',
+ 'dashBgGS3Style': 'true',
+ 'runningDotStyle': '1',
+ 'showWsSwitcherBg': 'true',
+ 'showWsPreviewBg': 'false',
+ 'wsPreviewBgRadius': '30',
+ 'showBgInOverview': 'true',
+ 'overviewBgBrightness': '30',
+ 'searchBgBrightness': '30',
+ 'overviewBgBlurSigma': '0',
+ 'appGridBgBlurSigma': '40',
+ 'smoothBlurTransitions': 'false',
+ 'appGridAnimation': '4',
+ 'searchViewAnimation': '0',
+ 'workspaceAnimation': '1',
+ 'animationSpeedFactor': '100',
+ 'winPreviewIconSize': '1',
+ 'winTitlePosition': '0',
+ 'startupState': '0',
+ 'overviewMode': '0',
+ 'wsSwitcherMode': '0',
+ 'workspaceSwitcherAnimation': '1',
+ 'searchIconSize': '0',
+ 'searchViewScale': '100',
+ 'appGridIconSize': '-1',
+ 'appGridColumns': '0',
+ 'appGridRows': '0',
+ 'appGridFolderIconSize': '-1',
+ 'appGridFolderColumns': '0',
+ 'appGridFolderRows': '0',
+ 'appGridFolderIconGrid': '2',
+ 'appGridContent': '2',
+ 'appGridIncompletePages': 'false',
+ 'appGridOrder': '0',
+ 'appFolderOrder': '0',
+ 'appGridNamesMode': '1',
+ 'appGridActivePreview': 'false',
+ 'appGridFolderCenter': 'false',
+ 'appGridPageWidthScale': '90',
+ 'appGridPageHeightScale': '90',
+ 'appGridSpacing': '12',
+ 'appGridFolderSpacing': '12',
+ 'appGridShowPageArrows': 'false',
+ 'searchWindowsOrder': '1',
+ 'searchFuzzy': 'false',
+ 'searchMaxResultsRows': '5',
+ 'searchAppGridMode': '0',
+ 'dashShowWindowsBeforeActivation': '1',
+ 'dashIconScroll': '1',
+ 'dashIsolateWorkspaces': 'false',
+ 'searchWindowsIconScroll': '1',
+ 'panelVisibility': '0',
+ 'panelPosition': '0',
+ 'windowAttentionMode': '0',
+ 'wsSwPopupHPosition': '50',
+ 'wsSwPopupVPosition': '95',
+ 'wsSwPopupMode': '1',
+ 'wsSwitcherWraparound': 'false',
+ 'wsSwitcherIgnoreLast': 'false',
+ 'favoritesNotify': '1',
+ 'notificationPosition': '1',
+ 'osdPosition': '6',
+ 'hotCornerAction': '1',
+ 'hotCornerPosition': '0',
+ 'hotCornerFullscreen': 'true',
+ 'hotCornerRipples': 'true',
+ 'alwaysActivateSelectedWindow': 'false',
+ 'winPreviewSecBtnAction': '3',
+ 'winPreviewMidBtnAction': '1',
+ 'winPreviewShowCloseButton': 'true',
+ 'windowIconClickAction': '1',
+ 'overlayKeyPrimary': '1',
+ 'overlayKeySecondary': '1',
+ 'overviewEscBehavior': '0',
+ 'newWindowFocusFix': 'false',
+ 'newWindowMonitorFix': '0',
+ 'highlightingStyle': '1',
+
+ 'workspaceSwitcherPopupModule': 'true',
+ 'workspaceAnimationModule': 'true',
+ 'workspaceModule': 'true',
+ 'windowManagerModule': 'true',
+ 'windowPreviewModule': 'true',
+ 'windowAttentionHandlerModule': 'true',
+ 'swipeTrackerModule': 'true',
+ 'searchControllerModule': 'true',
+ 'searchModule': 'true',
+ 'panelModule': 'true',
+ 'overlayKeyModule': 'true',
+ 'osdWindowModule': 'true',
+ 'messageTrayModule': 'true',
+ 'layoutModule': 'true',
+ 'dashModule': 'true',
+ 'appFavoritesModule': 'true',
+ 'appDisplayModule': 'true'
+ }</default>
+ </key>
+
+ <key type="s" name="profile-name-2">
+ <default>""</default>
+ </key>
+ <key type="a{ss}" name="profile-data-2">
+ <default>{
+ 'workspaceThumbnailsPosition': '5',
+ 'wsMaxSpacing': '80',
+ 'wsPreviewScale': '95',
+ 'secWsPreviewScale': '95',
+ 'secWsPreviewShift': 'false',
+ 'wsThumbnailsFull': 'false',
+ 'secWsThumbnailsPosition': '2',
+ 'dashPosition': '2',
+ 'dashPositionAdjust': '0',
+ 'wsTmbPositionAdjust': '0',
+ 'showWsTmbLabels': '0',
+ 'showWsTmbLabelsOnHover': 'false',
+ 'closeWsButtonMode': '2',
+ 'secWsTmbPositionAdjust': '0',
+ 'dashMaxIconSize': '0',
+ 'centerDashToWs': 'false',
+ 'showAppsIconPosition': '1',
+ 'wsThumbnailScale': '5',
+ 'wsThumbnailScaleAppGrid': '15',
+ 'secWsThumbnailScale': '5',
+ 'showSearchEntry': 'false',
+ 'centerSearch': 'true',
+ 'centerAppGrid': 'true',
+ 'dashBgOpacity': '20',
+ 'dashBgColor': '1',
+ 'dashBgRadius': '0',
+ 'dashBgGS3Style': 'false',
+ 'runningDotStyle': '1',
+ 'showWsSwitcherBg': 'false',
+ 'showWsPreviewBg': 'true',
+ 'wsPreviewBgRadius': '30',
+ 'showBgInOverview': 'true',
+ 'overviewBgBrightness': '50',
+ 'searchBgBrightness': '30',
+ 'overviewBgBlurSigma': '50',
+ 'appGridBgBlurSigma': '40',
+ 'smoothBlurTransitions': 'false',
+ 'appGridAnimation': '4',
+ 'searchViewAnimation': '0',
+ 'workspaceAnimation': '1',
+ 'animationSpeedFactor': '100',
+ 'winPreviewIconSize': '1',
+ 'winTitlePosition': '0',
+ 'startupState': '0',
+ 'overviewMode': '0',
+ 'wsSwitcherMode': '0',
+ 'workspaceSwitcherAnimation': '0',
+ 'searchIconSize': '0',
+ 'searchViewScale': '100',
+ 'appGridIconSize': '-1',
+ 'appGridColumns': '0',
+ 'appGridRows': '0',
+ 'appGridFolderIconSize': '-1',
+ 'appGridFolderColumns': '0',
+ 'appGridFolderRows': '0',
+ 'appGridFolderIconGrid': '2',
+ 'appGridContent': '2',
+ 'appGridIncompletePages': 'false',
+ 'appGridOrder': '0',
+ 'appFolderOrder': '0',
+ 'appGridNamesMode': '1',
+ 'appGridActivePreview': 'false',
+ 'appGridFolderCenter': 'true',
+ 'appGridPageWidthScale': '80',
+ 'appGridPageHeightScale': '90',
+ 'appGridSpacing': '12',
+ 'appGridFolderSpacing': '12',
+ 'appGridShowPageArrows': 'true',
+ 'searchWindowsOrder': '1',
+ 'searchFuzzy': 'false',
+ 'searchMaxResultsRows': '5',
+ 'searchAppGridMode': '0',
+ 'dashShowWindowsBeforeActivation': '1',
+ 'dashIconScroll': '1',
+ 'dashIsolateWorkspaces': 'false',
+ 'searchWindowsIconScroll': '1',
+ 'panelVisibility': '0',
+ 'panelPosition': '0',
+ 'windowAttentionMode': '0',
+ 'wsSwPopupHPosition': '50',
+ 'wsSwPopupVPosition': '95',
+ 'wsSwPopupMode': '1',
+ 'wsSwitcherWraparound': 'false',
+ 'wsSwitcherIgnoreLast': 'false',
+ 'favoritesNotify': '1',
+ 'notificationPosition': '1',
+ 'osdPosition': '6',
+ 'hotCornerAction': '1',
+ 'hotCornerPosition': '6',
+ 'hotCornerFullscreen': 'true',
+ 'hotCornerRipples': 'false',
+ 'alwaysActivateSelectedWindow': 'false',
+ 'winPreviewSecBtnAction': '2',
+ 'winPreviewMidBtnAction': '1',
+ 'winPreviewShowCloseButton': 'true',
+ 'windowIconClickAction': '1',
+ 'overlayKeyPrimary': '1',
+ 'overlayKeySecondary': '1',
+ 'overviewEscBehavior': '0',
+ 'newWindowFocusFix': 'false',
+ 'newWindowMonitorFix': '0',
+ 'highlightingStyle': '1',
+
+ 'workspaceSwitcherPopupModule': 'true',
+ 'workspaceAnimationModule': 'true',
+ 'workspaceModule': 'true',
+ 'windowManagerModule': 'true',
+ 'windowPreviewModule': 'true',
+ 'windowAttentionHandlerModule': 'true',
+ 'swipeTrackerModule': 'true',
+ 'searchControllerModule': 'true',
+ 'searchModule': 'true',
+ 'panelModule': 'true',
+ 'overlayKeyModule': 'true',
+ 'osdWindowModule': 'true',
+ 'messageTrayModule': 'true',
+ 'layoutModule': 'true',
+ 'dashModule': 'true',
+ 'appFavoritesModule': 'true',
+ 'appDisplayModule': 'true'
+ }</default>
+ </key>
+
+ <key type="s" name="profile-name-3">
+ <default>""</default>
+ </key>
+ <key type="a{ss}" name="profile-data-3">
+ <default>{
+ 'workspaceThumbnailsPosition': '0',
+ 'wsMaxSpacing': '350',
+ 'wsPreviewScale': '95',
+ 'secWsPreviewScale': '95',
+ 'secWsPreviewShift': 'false',
+ 'wsThumbnailsFull': 'false',
+ 'secWsThumbnailsPosition': '2',
+ 'dashPosition': '0',
+ 'dashPositionAdjust': '-100',
+ 'wsTmbPositionAdjust': '-100',
+ 'showWsTmbLabels': '3',
+ 'showWsTmbLabelsOnHover': 'false',
+ 'closeWsButtonMode': '2',
+ 'secWsTmbPositionAdjust': '-100',
+ 'dashMaxIconSize': '0',
+ 'centerDashToWs': 'false',
+ 'showAppsIconPosition': '0',
+ 'wsThumbnailScale': '13',
+ 'wsThumbnailScaleAppGrid': '13',
+ 'secWsThumbnailScale': '13',
+ 'showSearchEntry': 'false',
+ 'centerSearch': 'true',
+ 'centerAppGrid': 'false',
+ 'dashBgOpacity': '15',
+ 'dashBgColor': '1',
+ 'dashBgRadius': '0',
+ 'dashBgGS3Style': 'false',
+ 'runningDotStyle': '1',
+ 'showWsSwitcherBg': 'false',
+ 'showWsPreviewBg': 'true',
+ 'wsPreviewBgRadius': '30',
+ 'showBgInOverview': 'true',
+ 'overviewBgBrightness': '60',
+ 'searchBgBrightness': '30',
+ 'overviewBgBlurSigma': '30',
+ 'appGridBgBlurSigma': '80',
+ 'smoothBlurTransitions': 'false',
+ 'appGridAnimation': '4',
+ 'searchViewAnimation': '0',
+ 'workspaceAnimation': '1',
+ 'animationSpeedFactor': '100',
+ 'winPreviewIconSize': '1',
+ 'winTitlePosition': '0',
+ 'startupState': '2',
+ 'overviewMode': '1',
+ 'wsSwitcherMode': '0',
+ 'workspaceSwitcherAnimation': '1',
+ 'searchIconSize': '0',
+ 'searchViewScale': '100',
+ 'appGridIconSize': '-1',
+ 'appGridColumns': '0',
+ 'appGridRows': '0',
+ 'appGridFolderIconSize': '-1',
+ 'appGridFolderColumns': '0',
+ 'appGridFolderRows': '0',
+ 'appGridFolderIconGrid': '3',
+ 'appGridContent': '2',
+ 'appGridIncompletePages': 'false',
+ 'appGridOrder': '0',
+ 'appFolderOrder': '0',
+ 'appGridNamesMode': '1',
+ 'appGridActivePreview': 'true',
+ 'appGridFolderCenter': 'false',
+ 'appGridPageWidthScale': '90',
+ 'appGridPageHeightScale': '90',
+ 'appGridSpacing': '12',
+ 'appGridFolderSpacing': '12',
+ 'appGridShowPageArrows': 'false',
+ 'searchWindowsOrder': '1',
+ 'searchFuzzy': 'false',
+ 'searchMaxResultsRows': '5',
+ 'searchAppGridMode': '0',
+ 'dashShowWindowsBeforeActivation': '1',
+ 'dashIconScroll': '1',
+ 'dashIsolateWorkspaces': 'false',
+ 'searchWindowsIconScroll': '1',
+ 'panelVisibility': '0',
+ 'panelPosition': '0',
+ 'windowAttentionMode': '0',
+ 'wsSwPopupHPosition': '50',
+ 'wsSwPopupVPosition': '95',
+ 'wsSwPopupMode': '1',
+ 'wsSwitcherWraparound': 'false',
+ 'wsSwitcherIgnoreLast': 'false',
+ 'favoritesNotify': '0',
+ 'notificationPosition': '2',
+ 'osdPosition': '6',
+ 'hotCornerAction': '1',
+ 'hotCornerPosition': '1',
+ 'hotCornerFullscreen': 'true',
+ 'hotCornerRipples': 'true',
+ 'alwaysActivateSelectedWindow': 'false',
+ 'winPreviewSecBtnAction': '2',
+ 'winPreviewMidBtnAction': '1',
+ 'winPreviewShowCloseButton': 'true',
+ 'windowIconClickAction': '1',
+ 'overlayKeyPrimary': '1',
+ 'overlayKeySecondary': '1',
+ 'overviewEscBehavior': '0',
+ 'newWindowFocusFix': 'false',
+ 'newWindowMonitorFix': '0',
+ 'highlightingStyle': '1',
+
+ 'workspaceSwitcherPopupModule': 'true',
+ 'workspaceAnimationModule': 'true',
+ 'workspaceModule': 'true',
+ 'windowManagerModule': 'true',
+ 'windowPreviewModule': 'true',
+ 'windowAttentionHandlerModule': 'true',
+ 'swipeTrackerModule': 'true',
+ 'searchControllerModule': 'true',
+ 'searchModule': 'true',
+ 'panelModule': 'true',
+ 'overlayKeyModule': 'true',
+ 'osdWindowModule': 'true',
+ 'messageTrayModule': 'true',
+ 'layoutModule': 'true',
+ 'dashModule': 'true',
+ 'appFavoritesModule': 'true',
+ 'appDisplayModule': 'true'
+ }</default>
+ </key>
+
+ <key type="s" name="profile-name-4">
+ <default>""</default>
+ </key>
+ <key type="a{ss}" name="profile-data-4">
+ <default>{
+ 'workspaceThumbnailsPosition': '6',
+ 'wsMaxSpacing': '65',
+ 'wsPreviewScale': '95',
+ 'secWsPreviewScale': '95',
+ 'secWsPreviewShift': 'false',
+ 'wsThumbnailsFull': 'false',
+ 'secWsThumbnailsPosition': '2',
+ 'dashPosition': '2',
+ 'dashPositionAdjust': '0',
+ 'wsTmbPositionAdjust': '0',
+ 'showWsTmbLabels': '3',
+ 'showWsTmbLabelsOnHover': 'false',
+ 'closeWsButtonMode': '2',
+ 'secWsTmbPositionAdjust': '0',
+ 'dashMaxIconSize': '0',
+ 'centerDashToWs': 'false',
+ 'showAppsIconPosition': '1',
+ 'wsThumbnailScale': '10',
+ 'wsThumbnailScaleAppGrid': '10',
+ 'secWsThumbnailScale': '10',
+ 'showSearchEntry': 'false',
+ 'centerSearch': 'true',
+ 'centerAppGrid': 'false',
+ 'dashBgOpacity': '100',
+ 'dashBgColor': '0',
+ 'dashBgRadius': '0',
+ 'dashBgGS3Style': 'false',
+ 'runningDotStyle': '1',
+ 'showWsSwitcherBg': 'true',
+ 'showWsPreviewBg': 'true',
+ 'wsPreviewBgRadius': '30',
+ 'showBgInOverview': 'true',
+ 'overviewBgBrightness': '60',
+ 'searchBgBrightness': '30',
+ 'overviewBgBlurSigma': '80',
+ 'appGridBgBlurSigma': '80',
+ 'smoothBlurTransitions': 'false',
+ 'appGridAnimation': '4',
+ 'searchViewAnimation': '3',
+ 'workspaceAnimation': '1',
+ 'animationSpeedFactor': '100',
+ 'winPreviewIconSize': '1',
+ 'winTitlePosition': '0',
+ 'startupState': '2',
+ 'overviewMode': '2',
+ 'wsSwitcherMode': '0',
+ 'workspaceSwitcherAnimation': '1',
+ 'searchIconSize': '0',
+ 'searchViewScale': '100',
+ 'appGridIconSize': '-1',
+ 'appGridColumns': '0',
+ 'appGridRows': '0',
+ 'appGridFolderIconSize': '-1',
+ 'appGridFolderColumns': '0',
+ 'appGridFolderRows': '0',
+ 'appGridFolderIconGrid': '3',
+ 'appGridContent': '2',
+ 'appGridIncompletePages': 'false',
+ 'appGridOrder': '0',
+ 'appFolderOrder': '0',
+ 'appGridNamesMode': '1',
+ 'appGridActivePreview': 'true',
+ 'appGridFolderCenter': 'false',
+ 'appGridPageWidthScale': '80',
+ 'appGridPageHeightScale': '90',
+ 'appGridSpacing': '12',
+ 'appGridFolderSpacing': '12',
+ 'appGridShowPageArrows': 'true',
+ 'searchWindowsOrder': '1',
+ 'searchFuzzy': 'false',
+ 'searchMaxResultsRows': '5',
+ 'searchAppGridMode': '0',
+ 'dashShowWindowsBeforeActivation': '1',
+ 'dashIconScroll': '1',
+ 'dashIsolateWorkspaces': 'false',
+ 'searchWindowsIconScroll': '1',
+ 'panelVisibility': '0',
+ 'panelPosition': '0',
+ 'windowAttentionMode': '0',
+ 'wsSwPopupHPosition': '50',
+ 'wsSwPopupVPosition': '95',
+ 'wsSwPopupMode': '1',
+ 'wsSwitcherWraparound': 'false',
+ 'wsSwitcherIgnoreLast': 'false',
+ 'favoritesNotify': '0',
+ 'notificationPosition': '1',
+ 'osdPosition': '6',
+ 'hotCornerAction': '1',
+ 'hotCornerPosition': '6',
+ 'hotCornerFullscreen': 'true',
+ 'hotCornerRipples': 'false',
+ 'alwaysActivateSelectedWindow': 'false',
+ 'winPreviewSecBtnAction': '2',
+ 'winPreviewMidBtnAction': '1',
+ 'winPreviewShowCloseButton': 'true',
+ 'windowIconClickAction': '1',
+ 'overlayKeyPrimary': '1',
+ 'overlayKeySecondary': '1',
+ 'overviewEscBehavior': '0',
+ 'newWindowFocusFix': 'false',
+ 'newWindowMonitorFix': '0',
+ 'highlightingStyle': '1',
+
+ 'workspaceSwitcherPopupModule': 'true',
+ 'workspaceAnimationModule': 'true',
+ 'workspaceModule': 'true',
+ 'windowManagerModule': 'true',
+ 'windowPreviewModule': 'true',
+ 'windowAttentionHandlerModule': 'true',
+ 'swipeTrackerModule': 'true',
+ 'searchControllerModule': 'true',
+ 'searchModule': 'true',
+ 'panelModule': 'true',
+ 'overlayKeyModule': 'true',
+ 'osdWindowModule': 'true',
+ 'messageTrayModule': 'true',
+ 'layoutModule': 'true',
+ 'dashModule': 'true',
+ 'appFavoritesModule': 'true',
+ 'appDisplayModule': 'true'
+ }</default>
+ </key>
+
+ </schema>
+</schemalist>
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot.jpg b/extensions/47/vertical-workspaces/screenshots/screenshot.jpg
index b10585e..b10585e 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot.jpg
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot.jpg
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot0.jpg b/extensions/47/vertical-workspaces/screenshots/screenshot0.jpg
index 866298b..866298b 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot0.jpg
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot0.jpg
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot0.png b/extensions/47/vertical-workspaces/screenshots/screenshot0.png
index b6af4b9..b6af4b9 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot0.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot0.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot1.png b/extensions/47/vertical-workspaces/screenshots/screenshot1.png
index a23c76f..a23c76f 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot1.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot1.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot2.png b/extensions/47/vertical-workspaces/screenshots/screenshot2.png
index 58b2887..58b2887 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot2.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot2.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot3.png b/extensions/47/vertical-workspaces/screenshots/screenshot3.png
index 3d8f48a..3d8f48a 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot3.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot3.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot4.png b/extensions/47/vertical-workspaces/screenshots/screenshot4.png
index e4e5f4f..e4e5f4f 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot4.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot4.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/screenshot5.png b/extensions/47/vertical-workspaces/screenshots/screenshot5.png
index e6ecb55..e6ecb55 100644
--- a/extensions/45/vertical-workspaces/screenshots/screenshot5.png
+++ b/extensions/47/vertical-workspaces/screenshots/screenshot5.png
Binary files differ
diff --git a/extensions/45/vertical-workspaces/screenshots/vertical-workspaces.gif b/extensions/47/vertical-workspaces/screenshots/vertical-workspaces.gif
index c97c653..c97c653 100644
--- a/extensions/45/vertical-workspaces/screenshots/vertical-workspaces.gif
+++ b/extensions/47/vertical-workspaces/screenshots/vertical-workspaces.gif
Binary files differ
diff --git a/extensions/47/vertical-workspaces/stylesheet.css b/extensions/47/vertical-workspaces/stylesheet.css
new file mode 100644
index 0000000..9aa1a99
--- /dev/null
+++ b/extensions/47/vertical-workspaces/stylesheet.css
@@ -0,0 +1,449 @@
+/*
+* V-Shell (Vertical Workspaces)
+* stylesheet.css
+*/
+
+/* General dash */
+#dash.vertical {
+ margin: 0px;
+ padding: 0px;
+}
+
+#dash.vertical .app-well-app,
+#dash.vertical .show-apps {
+ /* left/right padding exceeds dash bg by 6px
+ to cover the spacing between dash and the edge of the screen
+ so the icons will be selectable even at the edge
+ this spacing must be accounted for in overview allocate() */
+ padding-right: 24px;
+ padding-left: 24px;
+ /*spacing between icons*/
+ padding-top: 1px;
+ padding-bottom: 1px;
+ margin: 0px;
+}
+
+#dash.vertical .dash-separator {
+ height: 1px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+#dash.vertical .overview-icon {
+ padding: 5px 0;
+}
+
+#dash.vertical .app-well-app-running-dot {
+ margin: 4px 0px;
+}
+
+#dash.vertical .app-grid-running-dot-custom {
+ margin: 4px 0px;
+ width: 2px;
+ height: 16px;
+}
+
+#dash.vertical .dash-background {
+ margin: 0px;
+}
+
+#dash.vertical-gs3-left .dash-background {
+ border-radius: 0 18px 18px 0;
+ border-left: 0px;
+ padding: 8px 12px 8px 4px;
+ margin-left: 0;
+}
+
+#dash.vertical-gs3-right .dash-background {
+ border-radius: 18px 0 0 18px;
+ border-right: 0px;
+ padding: 8px 4px 8px 12px;
+ margin-right: 0;
+}
+
+#dash.vertical-gs3-left {
+ margin-right: 12px;
+ margin-left: 0px;
+ padding: 0px;
+}
+
+#dash.vertical-gs3-right {
+ margin-right: 0px;
+ margin-left: 12px;
+ padding: 0px;
+}
+
+#dash.vertical-gs3-left .app-well-app,
+#dash.vertical-gs3-left .show-apps,
+#dash.vertical-gs3-right .app-well-app,
+#dash.vertical-gs3-right .show-apps {
+ /* left/right padding exceeds dash bg by 6px to
+ cover spacing between dash icons and the edge of the screen
+ so the icons will be selectable even at the edge
+ this spacing must be accounted for in overview allocate() */
+ padding: 0;
+ padding-right: 9px;
+ padding-left: 9px;
+}
+
+.dash-background-light {
+ background-color: rgb(200, 200, 200);
+ border-color: rgba(150, 150, 150, 0.4);
+}
+
+.app-grid-running-dot-custom {
+ width: 16px;
+ height: 2px;
+}
+
+.dash-label {
+ border-radius: 14px;
+}
+
+/* add shadow to the app grid app label to be readable if it overlaps light icon below */
+.overview-icon-with-label, .folder-name-label {
+ text-shadow: 1px 1px 3px rgba(33, 33, 33, 0.5);
+}
+
+/* adjustment for the vertical ws switcher indicator popup */
+.ws-switcher-indicator {
+ padding: 3px;
+ margin: 5px;
+}
+
+.ws-switcher-indicator:active {
+ padding: 5px;
+ margin: 3px;
+}
+
+/* ws thumbnails captions */
+.ws-tmb-label {
+ padding: 2px;
+ color: rgb(255, 255, 255);
+ background-color: rgba(40,40,40,0.8);
+ text-align: center;
+}
+
+.workspace-thumbnail-indicator {
+ border-radius: 6px;
+}
+
+.ws-tmb-labeled {
+ border: 0px;
+}
+
+.ws-tmb-transparent {
+ border: 0px;
+ background-color: rgba(200, 200, 200, 0.16);
+}
+
+/* app grid page indicators */
+.page-indicator-icon {
+ margin: 0px;
+}
+
+.page-indicator {
+ padding: 0px;
+}
+
+.page-indicators {
+ spacing: 20px;
+ margin: 0;
+}
+
+.page-indicators-horizontal {
+ margin-top: 0px;
+ margin-bottom: 10px;
+}
+
+.page-indicators-vertical {
+ margin-left: 0px;
+ margin-right: 10px;
+}
+
+.search-entry{
+ margin: 0;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ background-color: rgba(200, 200, 200, 0.1);
+ color: white;
+ border-color: rgba(160, 160, 160, 0.4);
+}
+
+.search-entry StLabel.hint-text {
+ color: rgba(200, 200, 200, 0.5);
+}
+
+.search-entry:hover,
+.search-entry:focus {
+ background-color: rgba(200, 200, 200, 0.1);
+}
+
+.search-entry-om2 {
+ color: white;
+ background-color: rgba(40, 40, 40, 1);
+}
+
+.search-entry-om2:hover,
+.search-entry-om2:focus {
+ background-color: rgba(50, 50, 50, 1);
+}
+
+/* for static ws mode */
+/*.search-section-content-bg,*/
+.search-section-content-bg-om2 {
+ border-radius: 26px;
+ border: 1px, rgb(60, 60, 60);
+ padding-top: 15px;
+ background-color: rgb(40, 40, 40);
+}
+
+/* Reduce edge fading of search results scroll view */
+.vfade { -st-vfade-offset: 34px; }
+.hfade { -st-hfade-offset: 34px; }
+
+StButton#vhandle,
+.search-section-content {
+ background-color: rgba(200, 200, 200, 0.08);
+ border: solid 1px rgba(150, 150, 150, 0.3);
+}
+
+.search-section {
+ spacing: 12px;
+}
+
+/* "no results" / "searching..." text*/
+.search-statustext, .search-statustext-om2 {
+ background-color: rgba(200, 200, 200, 0.08);
+ color: white;
+ margin-top: 50px;
+ padding: 30px;
+ border-radius: 20px;
+ text-shadow: 0px 0px 5px rgb(23, 23, 23);
+}
+
+.search-statustext-om2 {
+ background-color: rgb(40, 40, 40);
+ border: 1px rgba(200, 200, 200, 0.1);
+}
+
+#panel:overview, .transparent-panel {
+ background-color: transparent;
+}
+
+/* reduce spacing between app icons in search results */
+.grid-search-results {
+ spacing: 8px;
+ margin-left: 12px;
+ margin-right: 12px;
+}
+
+.show-apps-icon-horizontal-hide {
+ width: 0;
+ margin: 0;
+ spacing: 0;
+}
+
+.show-apps-icon-vertical-hide {
+ height: 0;
+ margin: 0;
+ spacing: 0;
+}
+
+.workspace-close-button {
+ color: white;
+ background-color: dimgrey;
+ width: 18px;
+ height: 18px;
+ padding: 2px;
+ margin: 2px;
+ box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
+ border: 0px;
+ border-radius: 35px;
+}
+
+.workspace-close-button-hover {
+ background-color: rgb(255, 0, 0);
+}
+
+/* ws tmb placeholder */
+.placeholder-vertical {
+ background-size: contain;
+ height: 18px;
+}
+
+.prev-page-indicator {
+ background-gradient-start: transparent;
+ background-gradient-end: rgba(255, 255, 255, 0.05);
+ background-gradient-direction: vertical;
+ border-radius: 0px 0px 30px 30px;
+}
+.next-page-indicator {
+ background-gradient-start: rgba(255, 255, 255, 0.05);
+ background-gradient-end: transparent;
+ background-gradient-direction: vertical;
+ border-radius: 30px 30px 0px 0px;
+
+}
+
+/* reduce size of hot corner ripples to half */
+.ripple-box {
+ width: 26px;
+ height: 26px;
+}
+
+.osd-window {
+ margin: 4em;
+ margin-bottom: 8em; /* avoid overlap with dock extension */
+}
+
+.app-folder-dialog-container {
+ padding: 18px;
+}
+
+.app-folder-dialog {
+ border-color: rgba(160, 160, 160, 0.3);
+}
+
+.folder-name-container {
+ spacing: 12px;
+}
+
+/* 46 changes the default bg color from transparent to the solid color blending with widget background */
+#dash.dash-46 .show-apps,
+#dash.dash-46 .overview-tile,
+#dash.dash-46 .overview-icon,
+.app-folder-45 .overview-icon, /* 45 only */
+.app-folder-46 .overview-icon,
+.page-navigation-arrow,
+.search-provider-icon,
+.list-search-result,
+.grid-search-result,
+.overview-tile {
+ background-color: transparent;
+ }
+
+ /* Needed only for 46+, but doesn't hurt 45 */
+#dash.dash-46 .overview-tile:hover .overview-icon,
+#dash.dash-46 .overview-tile:focus .overview-icon,
+#dash.dash-46 .overview-tile:selected .overview-icon,
+#dash.dash-46 .show-apps:hover .overview-icon,
+#dash.dash-46 .show-apps:focus .overview-icon,
+#dash.dash-46 .show-apps:selected .overview-icon,
+.edit-folder-button:hover,
+.page-navigation-arrow:hover,
+.search-provider-icon:hover,
+.search-provider-icon:focus,
+.search-provider-icon:selected,
+.list-search-result:hover,
+.list-search-result:focus,
+.list-search-result:selected,
+.app-display-46 .overview-tile:hover,
+.app-display-46 .overview-tile:focus,
+.app-display-46 .overview-tile:selected,
+.app-folder-46:hover,
+.app-folder-45:hover .overview-icon,
+.app-folder-45:focus .overview-icon,
+#searchResults .overview-tile:hover,
+#searchResults .overview-tile:focus,
+#searchResults .overview-tile:selected,
+.grid-search-result-46:hover,
+.grid-search-result-46:focus,
+.grid-search-result-46:selected,
+.app-folder-dialog .overview-tile:hover,
+.app-folder-dialog .overview-tile:focus,
+.app-folder-dialog .overview-tile:selected,
+.overview-icon:hover,
+.overview-icon:focus,
+.overview-icon:selected {
+ background-color: rgba(200, 200, 200, 0.15);
+ }
+
+.overview-tile:drop, /* 46 needs to add color so the highlighting style is visible on the app folder preview */
+.app-folder-dialog,
+.edit-folder-button,
+.folder-name-entry,
+.app-folder-46,
+.app-folder-46 .overview-tile,
+.app-folder-45 .overview-icon,
+.edit-folder-button,
+.folder-name-entry {
+ background-color: rgba(200, 200, 200, 0.08);
+}
+
+
+#dash.vertical-46 {
+ margin: 0px;
+ padding: 0px;
+}
+
+#dash.vertical-46-gs3-left {
+ margin-left: 0px;
+ margin-right: 12px;
+}
+
+#dash.vertical-46-gs3-right {
+ margin-right: 0px;
+ margin-left: 12px;
+}
+
+#dash.vertical-46 .overview-tile,
+#dash.vertical-46 .show-apps {
+ margin: 0px;
+ background-color: transparent;
+ /* this padding should keep the dash 6px from the screen edge */
+ padding: 0, 24px;
+}
+
+#dash.vertical-46 .dash-separator {
+ height: 1px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+#dash.vertical-46 .app-grid-running-dot {
+ margin: 0px;
+ offset-y: 0;
+}
+
+#dash.vertical-46 .app-grid-running-dot-custom {
+ margin: 0px;
+ width: 2px;
+ height: 16px;
+ offset-y: 0;
+}
+
+#dash.vertical-46 .dash-background {
+ padding: 12px;
+ margin: 0;
+}
+
+#dash.vertical-46-gs3-left .overview-tile,
+#dash.vertical-46-gs3-left .show-apps {
+ /* this padding should extend the icon tile to the edge of the dash background */
+ padding: 0, 12px;
+}
+
+#dash.vertical-46-gs3-right .overview-tile,
+#dash.vertical-46-gs3-right .show-apps {
+ padding: 0, 12px;
+}
+
+#dash.vertical-46-gs3-left .dash-background {
+ border-radius: 0 18px 18px 0;
+ border-left: 0px;
+}
+
+#dash.vertical-46-gs3-right .dash-background {
+ border-radius: 18px 0 0 18px;
+ border-right: 0px;
+}
+
+/* reverse padding */
+.ws-switcher-vertical {
+ padding: 18px 12px
+}
diff --git a/extensions/current b/extensions/current
index 7d37386..801f180 120000
--- a/extensions/current
+++ b/extensions/current
@@ -1 +1 @@
-45 \ No newline at end of file
+47 \ No newline at end of file
diff --git a/share/man/Makefile b/share/man/Makefile
index 70442a6..2868dd9 100644
--- a/share/man/Makefile
+++ b/share/man/Makefile
@@ -1,6 +1,6 @@
# Progress Linux: gnome-shell-extensions-extra
-# Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+# Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
#
# SPDX-License-Identifier: GPL-3.0+
#
diff --git a/share/man/gnome-shell-extensions-extra.7.rst b/share/man/gnome-shell-extensions-extra.7.rst
index 5b23756..7571a41 100644
--- a/share/man/gnome-shell-extensions-extra.7.rst
+++ b/share/man/gnome-shell-extensions-extra.7.rst
@@ -1,6 +1,6 @@
.. Progress Linux: gnome-shell-extensions-extra
-.. Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+.. Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
..
.. SPDX-License-Identifier: GPL-3.0+
..
diff --git a/share/man/man.in b/share/man/man.in
index b6d2407..5a052bf 100644
--- a/share/man/man.in
+++ b/share/man/man.in
@@ -1,6 +1,6 @@
.\" Progress Linux: gnome-shell-extensions-extra
.\"
-.\" Copyright (C) 2010-2023 Daniel Baumann <daniel.baumann@progress-linux.org>
+.\" Copyright (C) 2010-2024 Daniel Baumann <daniel.baumann@progress-linux.org>
.\"
.\" SPDX-License-Identifier: GPL-3.0+
.\"