From 306bdcf0788d10aa9e6fec7735a81c8d956d2aee Mon Sep 17 00:00:00 2001 From: Ward from fusion-voyager-3 Date: Tue, 27 Aug 2024 21:32:05 +0300 Subject: [PATCH] add files --- .github/release-nest-v3 | 2 +- debian/changelog | 5 - debian/control | 19 - debian/copyright | 0 debian/rules | 67 - .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 21 + .../debian/copyright | 23 + ...me-shell-extension-just-perfection.install | 1 + .../debian/postinst | 6 + .../debian/prerm | 7 + .../debian/rules | 6 + .../debian}/source/format | 0 ...ell.extensions.just-perfection.gschema.xml | 409 +++ .../CHANGELOG.md | 555 +++ .../LICENSE | 675 ++++ .../extension.js | 134 + .../lib/API.js | 3226 +++++++++++++++++ .../lib/Manager.js | 1481 ++++++++ .../lib/Prefs/Prefs.js | 410 +++ .../lib/Prefs/PrefsKeys.js | 880 +++++ .../locale/af/LC_MESSAGES/just-perfection.mo | Bin 0 -> 11200 bytes .../locale/ar/LC_MESSAGES/just-perfection.mo | Bin 0 -> 13597 bytes .../locale/be/LC_MESSAGES/just-perfection.mo | Bin 0 -> 15311 bytes .../locale/bg/LC_MESSAGES/just-perfection.mo | Bin 0 -> 16160 bytes .../locale/ca/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12285 bytes .../locale/de/LC_MESSAGES/just-perfection.mo | Bin 0 -> 11762 bytes .../locale/es/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12591 bytes .../locale/fr/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12653 bytes .../locale/gl/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12451 bytes .../locale/it/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12210 bytes .../locale/ja/LC_MESSAGES/just-perfection.mo | Bin 0 -> 13452 bytes .../locale/ne/LC_MESSAGES/just-perfection.mo | Bin 0 -> 17171 bytes .../locale/nl/LC_MESSAGES/just-perfection.mo | Bin 0 -> 11281 bytes .../pt_BR/LC_MESSAGES/just-perfection.mo | Bin 0 -> 12168 bytes .../locale/ru/LC_MESSAGES/just-perfection.mo | Bin 0 -> 15024 bytes .../locale/sv/LC_MESSAGES/just-perfection.mo | Bin 0 -> 11188 bytes .../zh_CN/LC_MESSAGES/just-perfection.mo | Bin 0 -> 10764 bytes .../zh_TW/LC_MESSAGES/just-perfection.mo | Bin 0 -> 10740 bytes .../metadata.json | 19 + .../prefs.js | 51 + .../resources.gresource | Bin 0 -> 96880 bytes .../stylesheet.css | 714 ++++ main.sh | 8 +- 45 files changed, 8628 insertions(+), 97 deletions(-) delete mode 100644 debian/changelog delete mode 100644 debian/control delete mode 100644 debian/copyright delete mode 100755 debian/rules create mode 100644 gnome-shell-extension-just-perfection/debian/changelog create mode 100644 gnome-shell-extension-just-perfection/debian/compat create mode 100644 gnome-shell-extension-just-perfection/debian/control create mode 100644 gnome-shell-extension-just-perfection/debian/copyright create mode 100644 gnome-shell-extension-just-perfection/debian/gnome-shell-extension-just-perfection.install create mode 100755 gnome-shell-extension-just-perfection/debian/postinst create mode 100755 gnome-shell-extension-just-perfection/debian/prerm create mode 100755 gnome-shell-extension-just-perfection/debian/rules rename {debian => gnome-shell-extension-just-perfection/debian}/source/format (100%) create mode 100755 gnome-shell-extension-just-perfection/usr/share/glib-2.0/schemas/org.gnome.shell.extensions.just-perfection.gschema.xml create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/CHANGELOG.md create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/LICENSE create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/extension.js create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/API.js create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Manager.js create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/Prefs.js create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/PrefsKeys.js create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/metadata.json create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/prefs.js create mode 100644 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource create mode 100755 gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/stylesheet.css diff --git a/.github/release-nest-v3 b/.github/release-nest-v3 index 56a6051..00750ed 100644 --- a/.github/release-nest-v3 +++ b/.github/release-nest-v3 @@ -1 +1 @@ -1 \ No newline at end of file +3 diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 6d8d068..0000000 --- a/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -upstream-name (1.0-101pika1) pika; urgency=medium - - * Initial release. (Closes: #nnnn) - - -- ferreo Wed, 18 Jan 2023 21:48:14 +0000 diff --git a/debian/control b/debian/control deleted file mode 100644 index 0bcd8e0..0000000 --- a/debian/control +++ /dev/null @@ -1,19 +0,0 @@ -Source: upstream-name -Section: admin -Priority: optional -Maintainer: name -Standards-Version: 4.6.1 -Build-Depends: debhelper-compat (= 13) -Rules-Requires-Root: no - -Package: pkgname1 -Architecture: linux-any -# Delete any of these lines if un-used -Depends: ${misc:Depends}, depends -Recommends: high priority optdepends -Conflicts: conflicts -Suggests: low priority optdepends -Breaks: also conflicts!? -Provides: provides -# -Description: pkgdesc diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index e69de29..0000000 diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 64a084a..0000000 --- a/debian/rules +++ /dev/null @@ -1,67 +0,0 @@ -#! /usr/bin/make -f - -## See debhelper(7) (uncomment to enable). -## Output every command that modifies files on the build system. -export DH_VERBOSE = 1 -export PIKA_BUILD_ARCH = $(shell cat ../pika-build-arch) - -## === the chain of command === -## debuild runs a chain of dh functions in the following order: -## dh_testdir -## dh_clean -## dh_auto_clean -## dh_update_autotools_config -## dh_autoreconf -## dh_auto_configure -## dh_prep -## dh_build -## dh_auto_build -## dh_install -## dh_auto_install -## dh_installdocs -## dh_installchangelogs -## dh_perl -## dh_link -## dh_strip_nondeterminism -## dh_compress -## dh_fixperms -## dh_missing -## dh_dwz -## dh_strip -## dh_makeshlibs -## dh_shlibdeps -## dh_installdeb -## dh_gencontrol -## but you are most likely to only need to override the following: -## dh_clean -## dh_auto_configure -## dh_build -## dh_install - -## === End end of region === - -## === overriding dh functions === -## by default all dh functions will run a specific command based on the build system selected by "dh $@" -## if you have a makefile that does everything you need this is fine, -## but most likely you have no MakeFile and you want to add your own commands -## Note : overrides must be places above %: -## So here's a few examples: - -## overriding dh_clean to make it not delete rust vendor files: -#override_dh_clean: -# echo "disabled" - -## overriding dh_auto_configure to add custom configs: -#override_dh_auto_configure: -# $(srcdir)/configure -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_DATADIR=/usr/share -DCMAKE_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu -DBUILD_PLUGIN=OFF - -## overriding dh_install to install files to a package: -#override_dh_auto_configure: -# mkdir -p debian/pikman/usr/bin -# cp pikman debian/pikman/usr/bin/ - -## === End end of region === - -## This here will start the build: -%: - dh $@ diff --git a/gnome-shell-extension-just-perfection/debian/changelog b/gnome-shell-extension-just-perfection/debian/changelog new file mode 100644 index 0000000..6dd8ce5 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/changelog @@ -0,0 +1,5 @@ +gnome-shell-extension-just-perfection (46.0-101pika1) pika; urgency=medium + + * Initial Creation + + -- Ward Nakchbandi Sat, 01 Oct 2022 14:50:00 +0200 diff --git a/gnome-shell-extension-just-perfection/debian/compat b/gnome-shell-extension-just-perfection/debian/compat new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/compat @@ -0,0 +1 @@ +10 diff --git a/gnome-shell-extension-just-perfection/debian/control b/gnome-shell-extension-just-perfection/debian/control new file mode 100644 index 0000000..2348c4c --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/control @@ -0,0 +1,21 @@ +Source: gnome-shell-extension-just-perfection +Section: gnome +Priority: optional +Maintainer: Marco Trevisan +Build-Depends: debhelper (>= 10), + eslint , + libglib2.0-bin, + node-chalk , + node-js-yaml , + node-strip-ansi , + libgettextpo-dev, + gettext, + sassc +Standards-Version: 4.1.1 + +Package: gnome-shell-extension-just-perfection +Architecture: all +Depends: gnome-shell, + ${misc:Depends}, + ${shlibs:Depends}, +Description: Support for custom themes in GNOME Shell diff --git a/gnome-shell-extension-just-perfection/debian/copyright b/gnome-shell-extension-just-perfection/debian/copyright new file mode 100644 index 0000000..b93b809 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/copyright @@ -0,0 +1,23 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: ubuntu-dock +Source: https://micheleg.github.io/dash-to-dock + +Files: * +Copyright: 2012-2017 Michele Gaio +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + diff --git a/gnome-shell-extension-just-perfection/debian/gnome-shell-extension-just-perfection.install b/gnome-shell-extension-just-perfection/debian/gnome-shell-extension-just-perfection.install new file mode 100644 index 0000000..09beaf7 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/gnome-shell-extension-just-perfection.install @@ -0,0 +1 @@ +usr \ No newline at end of file diff --git a/gnome-shell-extension-just-perfection/debian/postinst b/gnome-shell-extension-just-perfection/debian/postinst new file mode 100755 index 0000000..eb57d96 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/postinst @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +glib-compile-schemas /usr/share/glib-2.0/schemas/ + diff --git a/gnome-shell-extension-just-perfection/debian/prerm b/gnome-shell-extension-just-perfection/debian/prerm new file mode 100755 index 0000000..15cb003 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/prerm @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +glib-compile-schemas /usr/share/glib-2.0/schemas/ + + diff --git a/gnome-shell-extension-just-perfection/debian/rules b/gnome-shell-extension-just-perfection/debian/rules new file mode 100755 index 0000000..6a60942 --- /dev/null +++ b/gnome-shell-extension-just-perfection/debian/rules @@ -0,0 +1,6 @@ +#!/usr/bin/make -f +export DH_VERBOSE = 1 +export DEB_BUILD_OPTIONS=nocheck + +%: + dh $@ \ No newline at end of file diff --git a/debian/source/format b/gnome-shell-extension-just-perfection/debian/source/format similarity index 100% rename from debian/source/format rename to gnome-shell-extension-just-perfection/debian/source/format diff --git a/gnome-shell-extension-just-perfection/usr/share/glib-2.0/schemas/org.gnome.shell.extensions.just-perfection.gschema.xml b/gnome-shell-extension-just-perfection/usr/share/glib-2.0/schemas/org.gnome.shell.extensions.just-perfection.gschema.xml new file mode 100755 index 0000000..b732d5f --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/glib-2.0/schemas/org.gnome.shell.extensions.just-perfection.gschema.xml @@ -0,0 +1,409 @@ + + + + + + + true + Panel + Panel Visibility Status + + + + false + Panel in Overview + Panel in Overview Visibility Status + + + + true + Background Menu + Background Menu Status + + + + true + Search Box + Search Box Visibility Status + + + + true + Workspace Switcher + Workspace Switcher Visibility Status + + + + true + Dash + Dash Visibility Status + + + + true + OSD + OSD Visibility Status + + + + true + Workspace Popup + Workspace Popup Visibility Status + + + + false + Theme + Theme Status + + + + true + Activities Button + Activities Button Visibility Status + + + + true + Clock Menu + Clock Menu Visibility Status + + + + true + Panel Notification Icon + Panel Notification Icon Visibility Status + + + + true + Keyboard Layout + Keyboard Layout Visibility Status + + + + true + Accessibility Menu + Accessibility Menu Visibility Status + + + + true + Quick Settings Menu + Quick Settings Visibility Status + + + + true + Power Icon + Power Icon Visibility Status + + + + true + Window Picker Icon + Window Picker Icon Visiblity + + + + true + Type to Search + Type to Search Behavior + + + + 0 + + 0 means use Shell theme, 1 means no border, 2 - 61 means border size + Panel Corner Size + + + + 0 + + Workspace Switcher Size in percent, 0 means use default size + Workspace Switcher Size + + + + 0 + + Top Panel Position + Top Panel Position Status + + + + 0 + + 0 means center, 1 means right, 2 means left + Clock Menu Position Status + + + + 0 + + 0 means start of the position + Clock Menu Position Offset + + + + true + Show Apps Button Visiblity + Show Apps Button Visiblity Status + + + + 1 + + 0 means disabled, 1 means default speed, animation speed otherwise + Animation Status + + + + false + Window Demands Attention Focus + Window Demands Attention Focus Status + + + + false + Window Maximized on Create + Window Maximized on Create Status + + + + 0 + + 0 means default, 16, 22, 24, 32, 40, 48, 56, 64 + Dash Icon Size + + + + 1 + + 0 means desktop, 1 means overview + Startup Status + + + + true + Workspaces Visiblity in App Grid + Workspaces Visiblity in App Grid Status + + + + 1 + + 0: top start, 1: top center, 2: top end, 3: bottom start, 4: bottom center, 5: bottom end + Notification Banner Position + + + + false + Always Show Workspaces Switcher + Always Show Workspace Switcher Status + + + + 0 + + 0 means use Shell theme, 1 - 64 means size in pixels + Panel Size + + + + 0 + + 0 means use Shell theme, 1 means no padding, 2 - 61 means padding size + Panel Button Padding Size + + + + 0 + + 0 means use Shell theme, 1 means no padding, 2 - 61 means padding size + Panel Indicator Padding Size + + + + true + Window Preview Caption + Window Preview Caption Status + + + + true + Window Preview Close Button + Window Preview Close Button Status + + + + 0 + + 0 means use default shell size, 1 means no radius, 2 - 61 means radius size + Workspace Background Corner Size + + + + false + Workspace Wrap Around + Workspace Wrap Around Status + + + + true + Ripple Box + Ripple Box Status + + + + true + Double Supper To App Grid + Double Supper To App Grid Status + + + + true + Overlay Key + Overlay Key to Overview Status + + + + true + Switcher Popup Delay + Removes the delay for all switcher popups like alt-tab, ctrl-alt-tab, keyboard layout, ... + + + + true + World Clock Visibility in Clock Menu + World Clock Visibility Status + + + + true + Weather Visibility in Clock Menu + Weather Visibility Status + + + + true + Events Button Visibility in Clock Menu + Events Button Visibility Status + + + + true + Calendar Visibility in Clock Menu + Calendar Visibility Status + + + + 0 + + 0 means use Shell theme, 1 - 60 means panel icon size + Panel Icon Size + + + + true + Dash Separator Visibility + Dash Separator Visibility Status + + + + true + Workspace Peek + Workspace Peek Status + + + + 0 + + Width Size in percent, 0 means use default size + Looking Glass Width size + + + + 0 + + Height Size in percent, 0 means use default size + Looking Glass Height size + + + + 0 + + OSD Position + OSD Position Status + + + + true + Window Menu Take Screenshot Button Visibility + Window Menu Take Screenshot Button Visibility Status + + + + 0 + + 0 means default size + Alt Tab Window Preview Size + + + + 0 + + 0 means default size + Alt Tab Small Icon Size (Window Preview Icon Size) + + + + 0 + + 0 means default size + Alt Tab Icon Size + + + + true + Screen Sharing Indicator Visibility in Panel + Screen Sharing Indicator Visibility Status + + + + true + Screen Recording Indicator Visibility in Panel + Screen Recording Indicator Visibility Status + + + + 0 + + 0 means default size + Controls manager spacing Size (overview spacing) + + + + true + Dash app running dot + Dash app running dot visibility status + + + + 1 + + 0 means default, max displayed search results otherwise + Max Displayed Search Results + + + + true + Dark Mode Toggle Button Visibility In Quick Settings + Dark Mode Toggle Button Visibility Status + + + + + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/CHANGELOG.md b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/CHANGELOG.md new file mode 100755 index 0000000..5474176 --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/CHANGELOG.md @@ -0,0 +1,555 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +We go to the next version after each release on the +[GNOME Shell Extensions website](https://extensions.gnome.org/). + +## [Unreleased] + +## [30.0] - 2024-07-31 + +### Added + +- GNOME Shell 47 Support. + +## [29.0] - 2024-07-06 + +### Added + +- Dark Mode Toggle Button Visibility in Quick Settings. +- Maximum Displayed Search Results feature (GNOME Shell 45 and higher). +- Gresources compiled file for the preferences window to load faster. + +### Fixed + +- Alt-Tab Switcher list Item Background Color for Shell Theme Override (GNOME Shell 46). +- Hidden panel timeout priority on Wayland. +- Panel Menu not Showing Up On Bottom Panel When the Height is Larger than the Screen Height. +- The dash app running indicator visibility. +- Workspace Popup visibility CPU usage. +- Japanese Translation by [@gnuey56](https://gitlab.gnome.org/gnuey56). + +### Changed + +- The clock menu position widget to `AdwSpinRow`. +- The panel height maximum size to 64. + +## [28.0 Lear] - 2024-03-06 + +### Added + +- Buy Me a Coffee donation link. +- GNOME Shell 46 Support. +- Option to maximize windows on creation by [@droserasprout](https://gitlab.gnome.org/droserasprout). + +### Fixed + +- The world clock visibility coming back after reboot or install change. + +### Removed + +- Window Picker Shell Theme Override. +- Search Shell Theme Override. +- Workspace Animation Shell Theme Override. +- Dash Background Shell Theme Override. + +## [27.0 Durer] - 2023-09-14 + +### Changed + +- The world clocks visibility from CSS to JS. + +### Added + +- "Almost none" option to animation speed feature (GNOME Shell 45). +- GNOME Shell 45 Support. +- Japanese Translation by [@gnuey56](https://gitlab.gnome.org/gnuey56). + +### Removed + +- Activities button icon feature (GNOME Shell 45). +- App menu indicator (GNOME Shell 45). + +## [26.0 Rosa] - 2023-08-07 + +### Fixed + +- Remove not defined. + +## [25.0 Rosa] - 2023-08-07 + +### Changed + +- The behavior of the panel is shown only in the overview. + Rather than sliding in from the top, it is now rendered behind the workspaces + by [Schneegans](https://gitlab.gnome.org/Schneegans). + +### Fixed + +- a11y error in GNOME Shell mobile. +- Activities button error in GNOME Shell mobile. +- Marked as an urgent signal for window demand attention focus feature. +- Panel flickering when its position is at the bottom. +- `.set_icon_size` is not a function error (Date Menu). +- Unwanted padding on the disabled power icon. +- Unwanted shadow for workspace in the app grid. + +### Added + +- Dash app running visibility. +- Disable the overlay key. +- EGO donations. +- Workspace peek (GNOME Shell 42 and higher). + +### Removed + +- GNOME Shell support (3.36, 3.38, 40 and 41 no longer getting new features). + +## [24.0 Hals] - 2023-03-01 + +### Changed + +- Window preview close button for super minimal profile (to disabled). + +### Added + +- GNOME Shell 44 support. +- Transparent dash background for shell theme override (GNOME Shell 4x only). + +## [23.0 Goya] - 2023-02-10 + +### Changed + +- Clock menu offset maximum to 20. +- Fastest animation speed (twice as fast as before). + +### Fixed + +- App menu label visibility compatibility issue with open whether extension. +- Hidden workspace switcher padding in overview. +- Keep the clock menu position when another widget is added to the panel. +- Looking Glass API conflicts with the "Dash to Panel" extension. +- Looking Glass error when primary monitor doesn't exist. +- Window preview gap when window picker close button is disabled. +- Workspace boxes top margin in the app grid when the search entry is disabled. +- Italian translation by [@svityboy](https://gitlab.gnome.org/svityboy). + +### Added + +- More dash icon size (16px, 22px, 24px, 40px and 56px). +- Overview spacing size. +- Screen recording indicator visibility. +- Screen sharing indicator visibility. +- Switcher popup delay by [@koplo199](https://gitlab.gnome.org/koplo199). + +## [22.0 Millet] - 2022-09-10 + +### Fixed + +- Dash app button visibility height. +- Looking glass error after unlock. + +### Added + +- App menu label visibility. +- GNOME Shell 43 support. +- Quick settings menu visibility. + +### Removed + +- Aggregate menu for GNOME Shell 43 and higher. + +## [21.0 Reynolds] - 2022-08-06 + +### Changed + +- Prefs compatibility layer checking to GTK and Adw instead of GNOME Shell version. + +### Fixed + +- Application button visibility in Ubuntu 22.04. +- Prefs window size for scaled displays. +- Prefs window size for small displays in GNOME Shell 42. +- Racy prefs window size. +- Window caption going out of display area when dash is disabled in GNOME Shell 40 and higher. +- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). +- Spanish translation by [@Luci](https://gitlab.gnome.org/Luci). + +### Added + +- Alt-Tab window preview icon size. +- Alt-Tab window preview size. +- Alt-Tab icon size. +- Dash separator visibility. +- Looking glass size by [@AdvendraDeswanta](https://gitlab.gnome.org/AdvendraDeswanta). +- OSD position. +- Take the screenshot button in the window menu visibility. + +### Removed + +- Gesture API for GNOME Shell 40 and higher. +- List box separators for GNOME Shell 40 and 41 (EOS). +- Prefs intro. + +## [20.0 Hayez] - 2022-04-01 + +### Fixed + +- Dynamic workspaces getting disabled by workspace popup. +- Flickering panel after Unlock. +- Notification banner position on GNOME Shell 42. +- Window demands attention focus on GNOME Shell 42. +- French translation by [@GeoffreyCoulaud](https://gitlab.gnome.org/GeoffreyCoulaud). +- Italian translation by [@svityboy](https://gitlab.gnome.org/svityboy). + +### Added + +- Events visibility in the clock menu. +- Calendar visibility in the clock menu. +- Dutch translation by [@Vistaus](https://gitlab.gnome.org/Vistaus). + +## [19.0 Ancher] - 2022-03-02 + +### Fixed + +- Blurry search entry on GNOME Shell themes with "box-shadow". +- Prefs file chooser recursion. +- SecondaryMonitorDisplay error on GNOME Shell 42. +- Shell theme overrides OSD on GNOME Shell 42. +- Shell theme overrides the workspace switcher on GNOME Shell 42. +- Workspace popup visibility in GNOME Shell 42. + +### Added + +- Libadwaita for GNOME Shell 42 prefs. +- Panel icon size. +- Panel world clock visibility. +- Weather visibility. + +## [18.0 Roslin] - 2022-02-12 + +### Fixed + +- GNOME 3.x prefs error. + +## [17.0 Roslin] - 2022-02-11 + +### Fixed + +- Emitting panel show when panel is visible. +- Looking glass not showing up. +- Looking glass position on startup when panel is hidden. +- Prefs height going off the screen in small displays. +- Prefs lunching url freeze on Wayland. +- Prefs padding in GNOME Shell 42. +- Prefs UI Improvement by [@muqtxdir](https://gitlab.gnome.org/muqtxdir). +- Startup animation for hiding panel when panel is disabled. +- Type to search when text entry content is replaced with another content. +- Window goes under panel after unlock on Wayland. +- Window picker caption visibility issue on Pop Shell. +- Galician translation by [@frandieguez](https://gitlab.gnome.org/frandieguez). + +### Added + +- Bottom to notification banner position. + +### Removed + +- Panel corner size option for GNOME Shell 42. + +## [16.0 Rembrandt] - 2021-11-15 + +### Fixed + +- Animation jump when search entry is disabled and entering app grid. +- Clock menu revealing in lockscreen when the position is left or right. +- Startup status for Ubuntu. +- Workspace switcher visibility in GNOME Shell 41. + +### Removed + +- Hot corner for GNOME Shell 41. +- Hot corner library for all supported Shell versions. + +### Added + +- Double supper to app grid for GNOME Shell 40 and 41. +- Panel corner size when panel is disabled. +- Panel visibility in overview when panel is disabled. +- Prefs window intro. +- Profile selector to the prefs window. +- Ripple box. + +## [15.0 Magnetized] - 2021-09-22 + +### Fixed + +- unlock recursion error. + +### Added + +- Hot corner support for GNOME Shell 41. + +## [14.0 Magnetized] - 2021-09-22 + +### Changed + +- Repo folder structure to have better organization. + +### Fixed + +- Bottom panel position for multi monitors by [@harshadgavali](https://gitlab.gnome.org/harshadgavali). +- First swipe up in desktop startup status. +- Looking glass position on bottom panel. +- Maximized window gap on Wayland. +- Search entry animation for type to search when search entry is disabled. +- Search entry API to avoid conflicting with other extensions. +- Window picker caption border on disable. +- Window picker disapearing on wayland with shell theme override. +- Galician translation by [@frandieguez](https://gitlab.gnome.org/frandieguez). +- Spanish translation by [@DiegoIvanME](https://gitlab.gnome.org/DiegoIvanME). + +### Removed + +- Donation popover in prefs. +- Hot corner for GNOME Shell 41. + +### Added + +- GNOME Shell 41 support. +- Panel indicator padding size. +- Window picker close button visibility. + +## [13.0 Ring] - 2021-08-10 + +### Changed + +- Search button position in prefs window. + +### Fixed + +- Accessing dash in case the original dash has been removed by third party extensions. +- API.monitorGetInfo for "pMonitor is null" error. +- Dropdown align in preferences dialog. +- Startup status blocking shortcut keys. +- Unwanted window demands attention focus. +- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). + +### Removed + +- Settings and Translation library and using ExtensionUtils instead. + +### Added + +- Panel button padding size. +- Panel height. +- Window picker caption visibility. +- Workspace background corner size in overview. +- Workspace wraparound (modified version of WorkspaceSwitcherWrapAround by [@war1025](https://github.com/war1025)). + +## [12.0 Queen Red] - 2021-06-29 + +### Changed + +- Lighter background color for switcher list (alt+tab) in override theme. +- Workspace switcher max size now maxed out to 30%. + +### Fixed + +- Combobox scroll issue on GTK4. +- Window demands attention focus notification popup. +- French translation by [@GeoffreyCoulaud](https://gitlab.gnome.org/GeoffreyCoulaud). +- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). + +### Added + +- Always show workspace switcher on dynamic workspaces. +- More descriptions to the preferences dialog. +- Notification banner position. +- Startup status for GNOME Shell 40. +- Workspace animation background color for shell theme override. +- Workspaces visibility in app grid by [@fmuellner](https://gitlab.gnome.org/fmuellner). +- Chinese (Taiwan) translation by [@r0930514](https://gitlab.com/r0930514). + +## [11.0 Whisper] - 2021-05-20 + +### Changed + +- App gesture now only works on GNOME 3.36 and 3.38. +- Donation icon to GTK4 non-compatible icon sets. +- Shell theme override is now disabled by default. +- Workspace switcher size for GNOME Shell 40 is now maxed out to 15%. + +### Fixed + +- Gap when panel position is at the bottom and shell override theme happens. +- Panel menu margin when panel is in bottom. +- Window picker icon visibility on drag. +- Workspace switcher size for multi monitor setup. +- Arabic translation by [@AliGalal](https://gitlab.com/AliGalal). +- Chinese translation by [@wsxy162](https://gitlab.com/wsxy162). +- Italian translation by [@l3nn4rt](https://gitlab.com/l3nn4rt). +- Swedish translation by [@MorganAntonsson](https://gitlab.com/MorganAntonsson). + +### Added + +- Activities button icon. +- Dash icon size. +- Window demands attention focus. + +## [10.0] - 2021-03-26 + +### Changed + +- Organized prefs UI for icons and behavior. +- Removed quotes and side bar image from prefs UI. + +### Fixed + +- Fake hot corner primary monitor position. +- Horizontal scroll in prefs. +- Primary Monitor Panel Position. +- Arabic translation by [@karem34](https://gitlab.com/karem34). +- Russian translation by [@librusekus35790](https://gitlab.com/librusekus35790). + +### Added + +- Clock menu position. +- Disable animation or change the animation speed. +- Disable applications button in dash. +- Disable app menu icon. +- Disable panel arrow in GNOME 3.36 and 3.38. +- Disable panel notification icon. +- No results found for prefs window. +- Brazilian Portuguese translation by [@Zelling](https://gitlab.com/Zelling). +- Catalan translation by [@juxuanu](https://gitlab.com/juxuanu). +- Galician translation by [@frandieguez](https://gitlab.com/frandieguez). + +## [9.0] - 2021-03-06 + +### Changed + +- Prefs interface. + +### Fixed + +- Default value for hot corner on extension disable. +- GNOME Shell 40.beta version. + +### Added + +- Disable power icon. +- Panel position. +- Support to prefs window. + +## [8.0] - 2021-02-22 + +### Changed + +- Holding back lonely overview until the final GNOME 40 release. + +### Fixed + +- Dash override theme on GNOME Shell 40 beta. +- Focus for find entry on prefs. +- Search controller for GNOME Shell 40 beta. +- Start search for GNOME Shell 40 beta. +- Workspace switcher enable related to workspace switcher size. +- Nepali translation filename by [@IBA4](https://gitlab.com/IBA4). + +## [7.0] - 2021-02-12 + +### Fixed + +- GNOME Shell 40 hidden side by side workspace preview. +- GNOME Shell 40 search padding when panel is disabled. +- Initial prefs window size. + +### Added + +- GNOME Shell 40 window picker icon visibility to the settings. +- GNOME Shell 40 workspace switcher size to the settings. +- Panel corner size to the settings. +- Search feature to the settings. +- Type to Search to the settings. +- Nepali translation by [@IBA4](https://gitlab.com/IBA4). +- Spanish translation by [@oscfdezdz](https://gitlab.com/oscfdezdz). + +## [6.0] - 2021-01-29 + +### Fixed + +- GNOME Shell 3.38 extra padding on no workspace switcher. +- GNOME Shell 40 and GTK4 support for prefs. +- GNOME Shell 40 support for search entry. +- GNOME Shell 40 support for workspace switcher. + +## [5.0] - 2021-01-05 + +### Added + +- Accessibility Menu visibility to the settings. +- Activities button visibility to the settings. +- App menu visibility to the settings. +- Clock menu visibility to the settings. +- Keyboard Layout visibility to the settings. +- System Menu (Aggregate Menu) visibility to the settings. + +### Changed + +- OSD in settings to "On Screen Display (OSD)". + +### Fixed + +- Hot corner when top panel is visible. +- Padding on no dash. +- Search top padding on no top panel. + +## [4.0] 2020-12-25 + +### Added + +- API to decouple all libraries from using GNOME Shell ui directly. +- Automate build process by [@daPhipz](https://gitlab.com/daPhipz). +- CHANGELOG.md file. +- Compatibility layer for API. +- Translation automation script by [@daPhipz](https://gitlab.com/daPhipz). + +### Changed + +- Default settings to enable. +- Displaying error for generate-mo.sh by [@daPhipz](https://gitlab.com/daPhipz). +- German translation by [@M4he](https://gitlab.com/M4he). + +### Fixed + +- Top padding on no search and no top panel. + +## [3.0] - 2020-12-21 + +### Added + +- CONTRIBUTING.md file. +- Decoupled library from GNOME Shell ui. +- Extension logo. +- Initial Translations. +- Prefs as extension settings. + +## [2.0] - 2020-11-18 + +### Fixed + +- Destroy hot corner on disable. + + +### Added + +- Disable app gesture. +- Disable background menu. +- Hide dash. +- Hide search. +- Hide top panel. +- Hide workspace switcher. +- Hot corner to toggle overview visibility. + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/LICENSE b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/LICENSE new file mode 100755 index 0000000..c4dc63a --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + Just Perfection GNOME Shell Desktop + Copyright (C) 2020-2024 Javad Rahmatzadeh + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Just Perfection GNOME Shell Desktop + Copyright (C) 2020-2024 Javad Rahmatzadeh + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/extension.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/extension.js new file mode 100755 index 0000000..960017d --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/extension.js @@ -0,0 +1,134 @@ +/** + * Extension + * + * @author Javad Rahmatzadeh + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +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 St from 'gi://St'; + +import * as AltTab from 'resource:///org/gnome/shell/ui/altTab.js'; +import * as BackgroundMenu from 'resource:///org/gnome/shell/ui/backgroundMenu.js'; +import * as LookingGlass from 'resource:///org/gnome/shell/ui/lookingGlass.js'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; +import * as OSDWindow from 'resource:///org/gnome/shell/ui/osdWindow.js'; +import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js'; +import * as Panel from 'resource:///org/gnome/shell/ui/panel.js'; +import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; +import * as Search from 'resource:///org/gnome/shell/ui/search.js'; +import * as SearchController from 'resource:///org/gnome/shell/ui/searchController.js'; +import * as SwitcherPopup from 'resource:///org/gnome/shell/ui/switcherPopup.js'; +import * as WindowMenu from 'resource:///org/gnome/shell/ui/windowMenu.js'; +import * as WindowPreview from 'resource:///org/gnome/shell/ui/windowPreview.js'; +import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js'; +import * as WorkspacesView from 'resource:///org/gnome/shell/ui/workspacesView.js'; +import * as WorkspaceSwitcherPopup from 'resource:///org/gnome/shell/ui/workspaceSwitcherPopup.js'; +import * as WorkspaceThumbnail from 'resource:///org/gnome/shell/ui/workspaceThumbnail.js'; + +import * as Config from 'resource:///org/gnome/shell/misc/config.js'; +import * as Util from 'resource:///org/gnome/shell/misc/util.js'; + +import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; + +import {API} from './lib/API.js'; +import {Manager} from './lib/Manager.js'; + +/** + * Extension entry point + */ +export default class JustPerfection extends Extension +{ + /** + * Instance of API + * + * @type {API|null} + */ + #api = null; + + /** + * Instance of Manager + * + * @type {Manager|null} + */ + #manager = null; + + /** + * Enable extension + * + * @returns {void} + */ + enable() + { + const shellVersion = parseFloat(Config.PACKAGE_VERSION); + + let InterfaceSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.interface'}); + + this.#api = new API( + { + Main, + BackgroundMenu, + OverviewControls, + WorkspaceSwitcherPopup, + SwitcherPopup, + InterfaceSettings, + Search, + SearchController, + WorkspaceThumbnail, + WorkspacesView, + Panel, + PanelMenu, + WindowPreview, + Workspace, + LookingGlass, + MessageTray, + OSDWindow, + WindowMenu, + AltTab, + St, + GLib, + Clutter, + Util, + Meta, + GObject, + }, + shellVersion + ); + + this.#api.open(); + + let settings = this.getSettings(); + + this.#manager = new Manager( + { + API: this.#api, + Settings: settings, + }, + shellVersion + ); + + this.#manager.registerSettingsSignals(); + this.#manager.applyAll(); + } + + /** + * Disable extension + * + * @returns {void} + */ + disable() + { + this.#manager?.revertAll(); + this.#manager = null; + + this.#api?.close(); + this.#api = null; + } +} + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/API.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/API.js new file mode 100755 index 0000000..707914a --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/API.js @@ -0,0 +1,3226 @@ +/** + * API Library + * + * @author Javad Rahmatzadeh + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +const XY_POSITION = { + TOP_START: 0, + TOP_CENTER: 1, + TOP_END: 2, + BOTTOM_START: 3, + BOTTOM_CENTER: 4, + BOTTOM_END: 5, + CENTER_START: 6, + CENTER_CENTER: 7, + CENTER_END: 8, +}; + +const PANEL_POSITION = { + TOP: 0, + BOTTOM: 1, +}; + +const PANEL_BOX_POSITION = { + CENTER: 0, + RIGHT: 1, + LEFT: 2, +}; + +const PANEL_HIDE_MODE = { + ALL: 0, + DESKTOP: 1, +}; + +const SHELL_STATUS = { + NONE: 0, + OVERVIEW: 1, +}; + +const DASH_ICON_SIZES = [16, 22, 24, 32, 40, 48, 56, 64]; + +/** + * API to avoid calling GNOME Shell directly + * and make all parts compatible with different GNOME Shell versions + */ +export class API +{ + /** + * Current shell version + * + * @type {number|null} + */ + #shellVersion = null; + + /** + * Originals holder + * + * @type {object} + */ + #originals = {}; + + /** + * Timeout ids + * + * @type {object} + */ + #timeoutIds = {}; + + /** + * Class Constructor + * + * @param {Object} dependencies + * 'Main' reference to ui::main + * 'BackgroundMenu' reference to ui::backgroundMenu + * 'OverviewControls' reference to ui::overviewControls + * 'WorkspaceSwitcherPopup' reference to ui::workspaceSwitcherPopup + * 'SwitcherPopup' reference to ui::switcherPopup + * 'InterfaceSettings' reference to Gio::Settings for 'org.gnome.desktop.interface' + * 'Search' reference to ui::search + * 'SearchController' reference to ui::searchController + * 'WorkspaceThumbnail' reference to ui::workspaceThumbnail + * 'WorkspacesView' reference to ui::workspacesView + * 'Panel' reference to ui::panel + * 'PanelMenu' reference to ui::panelMenu + * 'WindowPreview' reference to ui::windowPreview + * 'Workspace' reference to ui::workspace + * 'LookingGlass' reference to ui::lookingGlass + * 'MessageTray' reference to ui::messageTray + * 'OSDWindow' reference to ui::osdTray + * 'WindowMenu' reference to ui::windowMenu + * 'AltTab' reference to ui::altTab + * 'St' reference to St + * 'GLib' reference to GLib + * 'Clutter' reference to Clutter + * 'Util' reference to misc::util + * 'Meta' reference to Meta + * 'GObject' reference to GObject + * @param {number} shellVersion float in major.minor format + */ + constructor(dependencies, shellVersion) + { + this._main = dependencies['Main'] || null; + this._backgroundMenu = dependencies['BackgroundMenu'] || null; + this._overviewControls = dependencies['OverviewControls'] || null; + this._workspaceSwitcherPopup = dependencies['WorkspaceSwitcherPopup'] || null; + this._switcherPopup = dependencies['SwitcherPopup'] || null; + this._interfaceSettings = dependencies['InterfaceSettings'] || null; + this._search = dependencies['Search'] || null; + this._searchController = dependencies['SearchController'] || null; + this._workspaceThumbnail = dependencies['WorkspaceThumbnail'] || null; + this._workspacesView = dependencies['WorkspacesView'] || null; + this._panel = dependencies['Panel'] || null; + this._panelMenu = dependencies['PanelMenu'] || null; + this._windowPreview = dependencies['WindowPreview'] || null; + this._workspace = dependencies['Workspace'] || null; + this._lookingGlass = dependencies['LookingGlass'] || null; + this._messageTray = dependencies['MessageTray'] || null; + this._osdWindow = dependencies['OSDWindow'] || null; + this._windowMenu = dependencies['WindowMenu'] || null; + this._altTab = dependencies['AltTab'] || null; + this._st = dependencies['St'] || null; + this._glib = dependencies['GLib'] || null; + this._clutter = dependencies['Clutter'] || null; + this._util = dependencies['Util'] || null; + this._meta = dependencies['Meta'] || null; + this._gobject = dependencies['GObject'] || null; + + this.#shellVersion = shellVersion; + + /** + * whether search entry is visible + * + * @member {boolean} + */ + this._searchEntryVisibility = true; + } + + /** + * prepare everything needed for API + * + * @returns {void} + */ + open() + { + this.UIStyleClassAdd(this.#getAPIClassname('shell-version')); + } + + /** + * remove everything from GNOME Shell been added by this class + * + * @returns {void} + */ + close() + { + this.UIStyleClassRemove(this.#getAPIClassname('shell-version')); + this.#startSearchSignal(false); + this.#computeWorkspacesBoxForStateSetDefault(); + this.#altTabSizesSetDefault(); + + for (let [name, id] of Object.entries(this.#timeoutIds)) { + this._glib.source_remove(id); + delete(this.#timeoutIds[name]); + } + } + + /** + * get x and y align for position + * + * @param int pos position + * see XY_POSITION + * + * @returns {array} + * - 0 Clutter.ActorAlign + * - 1 Clutter.ActorAlign + */ + #xyAlignGet(pos) + { + if (XY_POSITION.TOP_START === pos) { + return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.START]; + } + + if (XY_POSITION.TOP_CENTER === pos) { + return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.START]; + } + + if (XY_POSITION.TOP_END === pos) { + return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.START]; + } + + if (XY_POSITION.CENTER_START === pos) { + return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.CENTER]; + } + + if (XY_POSITION.CENTER_CENTER === pos) { + return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.CENTER]; + } + + if (XY_POSITION.CENTER_END === pos) { + return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.CENTER]; + } + + if (XY_POSITION.BOTTOM_START === pos) { + return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.END]; + } + + if (XY_POSITION.BOTTOM_CENTER === pos) { + return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.END]; + } + + if (XY_POSITION.BOTTOM_END === pos) { + return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.END]; + } + } + + /** + * add to animation duration + * + * @param {number} duration in milliseconds + * + * @returns {number} + */ + #addToAnimationDuration(duration) + { + let settings = this._st.Settings.get(); + + return (settings.enable_animations) ? settings.slow_down_factor * duration : 1; + } + + /** + * get signal id of the event + * + * @param {Gtk.Widget} widget to find signal in + * @param {string} signalName signal name + * + * @returns {number} + */ + #getSignalId(widget, signalName) + { + return this._gobject.signal_handler_find(widget, {signalId: signalName}); + } + + /** + * get the css class name for API + * + * @param {string} type + * + * @returns {string} + */ + #getAPIClassname(type) + { + let starter = 'just-perfection-api-'; + + if (type === 'shell-version') { + let shellVerMajor = Math.trunc(this.#shellVersion); + return `${starter}gnome${shellVerMajor}`; + } + + return `${starter}${type}`; + } + + /** + * set panel size to default + * + * @returns {void} + */ + panelSetDefaultSize() + { + if (!this.#originals['panelHeight']) { + return; + } + + this.panelSetSize(this.#originals['panelHeight'], false); + } + + /** + * change panel size + * + * @param {number} size 0 to 100 + * @param {boolean} fake true means it shouldn't change the last size, + * false otherwise + * + * @returns {void} + */ + panelSetSize(size, fake) + { + if (!this.#originals['panelHeight']) { + this.#originals['panelHeight'] = this._main.panel.height; + } + + if (size > 100 || size < 0) { + return; + } + + this._main.panel.height = size; + + if (!fake) { + this._panelSize = size; + } + } + + /** + * get the last size of the panel + * + * @returns {number} + */ + panelGetSize() + { + if (this._panelSize !== undefined) { + return this._panelSize; + } + + if (this.#originals['panelHeight']) { + return this.#originals['panelHeight']; + } + + return this._main.panel.height; + } + + /** + * emit refresh styles + * this is useful when changed style doesn't emit change because doesn't have + * standard styles. for example, style with only `-natural-hpadding` + * won't notify any change. so you need to call this function + * to refresh that + * + * @returns {void} + */ + #emitRefreshStyles() + { + let classname = this.#getAPIClassname('refresh-styles'); + + this.UIStyleClassAdd(classname); + this.UIStyleClassRemove(classname); + } + + /** + * show panel + * + * @returns {void} + */ + panelShow() + { + this._panelVisibility = true; + + let classname = this.#getAPIClassname('no-panel'); + + if (!this.UIStyleClassContain(classname)) { + return; + } + + // The class name should be removed before addChrome the panelBox + // removing after can cause `st_theme_node_lookup_shadow` crash + this.UIStyleClassRemove(classname); + + let overview = this._main.overview; + let searchEntryParent = overview.searchEntry.get_parent(); + let panelBox = this._main.layoutManager.panelBox; + + panelBox.translation_y = 0; + + this._main.layoutManager.overviewGroup.remove_child(panelBox); + this._main.layoutManager.addChrome(panelBox, { + affectsStruts: true, + trackFullscreen: true, + }); + + if (this._hidePanelWorkareasChangedSignal) { + global.display.disconnect(this._hidePanelWorkareasChangedSignal); + delete(this._hidePanelWorkareasChangedSignal); + } + + if (this._hidePanelHeightSignal) { + panelBox.disconnect(this._hidePanelHeightSignal); + delete(this._hidePanelHeightSignal); + } + + searchEntryParent.set_style(`margin-top: 0;`); + + // hide and show can fix windows going under panel + panelBox.hide(); + panelBox.show(); + this.#fixLookingGlassPosition(); + + if (this.#timeoutIds.panelHide) { + this._glib.source_remove(this.#timeoutIds.panelHide); + delete(this.#timeoutIds.panelHide); + } + } + + /** + * hide panel + * + * @param {mode} hide mode see PANEL_HIDE_MODE. defaults to hide all + * @param {boolean} force apply hide even if it is hidden + * + * @returns {void} + */ + panelHide(mode) + { + this._panelVisibility = false; + this._panelHideMode = mode; + + let overview = this._main.overview; + let searchEntryParent = overview.searchEntry.get_parent(); + let panelBox = this._main.layoutManager.panelBox; + let panelHeight = this._main.panel.height; + let panelPosition = this.panelGetPosition(); + let direction = (panelPosition === PANEL_POSITION.BOTTOM) ? 1 : -1; + + if (panelBox.get_parent() === this._main.layoutManager.uiGroup) { + this._main.layoutManager.removeChrome(panelBox); + this._main.layoutManager.overviewGroup.insert_child_at_index(panelBox, 0); + } + + panelBox.translation_y = (mode === PANEL_HIDE_MODE.DESKTOP) ? 0 : panelHeight * direction; + + if (panelPosition === PANEL_POSITION.TOP) { + // when panel is hidden the first element gets too close to the top, + // so we fix it with top margin in search entry + let marginTop = (mode === PANEL_HIDE_MODE.ALL) ? 15 : panelHeight; + searchEntryParent.set_style(`margin-top: ${marginTop}px;`); + } else { + searchEntryParent.set_style(`margin-top: 0;`); + } + + // hide and show can fix windows going under panel + panelBox.hide(); + panelBox.show(); + this.#fixLookingGlassPosition(); + + if (this._hidePanelWorkareasChangedSignal) { + global.display.disconnect(this._hidePanelWorkareasChangedSignal); + delete(this._hidePanelWorkareasChangedSignal); + } + + this._hidePanelWorkareasChangedSignal = global.display.connect( + 'workareas-changed', + () => { + this.panelHide(this._panelHideMode); + } + ); + + if (!this._hidePanelHeightSignal) { + this._hidePanelHeightSignal = panelBox.connect( + 'notify::height', + () => { + this.panelHide(this._panelHideMode); + } + ); + } + + let classname = this.#getAPIClassname('no-panel'); + this.UIStyleClassAdd(classname); + + // update hot corners since we need to make them available + // outside overview + this._main.layoutManager._updateHotCorners(); + + // Maximized windows will have bad maximized gap after unlock in Wayland + // This is a Mutter issue, + // See https://gitlab.gnome.org/GNOME/mutter/-/issues/1627 + // TODO remove after the issue is fixed on Mutter + if (this._meta.is_wayland_compositor()) { + let duration = this.#addToAnimationDuration(180); + this.#timeoutIds.panelHide = this._glib.timeout_add( + this._glib.PRIORITY_DEFAULT, + duration, + () => { + panelBox.hide(); + panelBox.show(); + return this._glib.SOURCE_REMOVE; + } + ); + } + } + + /** + * check whether panel is visible + * + * @returns {boolean} + */ + isPanelVisible() + { + if (this._panelVisibility === undefined) { + return true; + } + + return this._panelVisibility; + } + + /** + * check whether dash is visible + * + * @returns {boolean} + */ + isDashVisible() + { + return this._dashVisibility === undefined || this._dashVisibility; + } + + /** + * show dash + * + * @returns {void} + */ + dashShow() + { + if (!this._main.overview.dash || this.isDashVisible()) { + return; + } + + this._dashVisibility = true; + + this._main.overview.dash.show(); + + this._main.overview.dash.height = -1; + this._main.overview.dash.setMaxSize(-1, -1); + + this.#updateWindowPreviewOverlap(); + } + + /** + * hide dash + * + * @returns {void} + */ + dashHide() + { + if (!this._main.overview.dash || !this.isDashVisible()) { + return; + } + + this._dashVisibility = false; + + this._main.overview.dash.hide(); + + this._main.overview.dash.height = 0; + + this.#updateWindowPreviewOverlap(); + } + + /** + * update window preview overlap + * + * @returns {void} + */ + #updateWindowPreviewOverlap() + { + let wpp = this._windowPreview.WindowPreview.prototype; + + if (this.isDashVisible() && wpp.overlapHeightsOld) { + wpp.overlapHeights = wpp.overlapHeightsOld; + delete(wpp.overlapHeightsOld); + return; + } + + if (!this.isDashVisible()) { + wpp.overlapHeightsOld = wpp.overlapHeights; + wpp.overlapHeights = function () { + let [top, bottom] = this.overlapHeightsOld(); + return [top + 24, bottom + 24]; + }; + } + } + + /** + * add class name to the UI group + * + * @param {string} classname class name + * + * @returns {void} + */ + UIStyleClassAdd(classname) + { + this._main.layoutManager.uiGroup.add_style_class_name(classname); + } + + /** + * remove class name from UI group + * + * @param {string} classname class name + * + * @returns {void} + */ + UIStyleClassRemove(classname) + { + this._main.layoutManager.uiGroup.remove_style_class_name(classname); + } + + /** + * check whether UI group has class name + * + * @param {string} classname class name + * + * @returns {boolean} + */ + UIStyleClassContain(classname) + { + return this._main.layoutManager.uiGroup.has_style_class_name(classname); + } + + /** + * enable background menu + * + * @returns {void} + */ + backgroundMenuEnable() + { + if (!this.#originals['backgroundMenuOpen']) { + return; + } + + this._backgroundMenu.BackgroundMenu.prototype.open = this.#originals['backgroundMenuOpen']; + } + + /** + * disable background menu + * + * @returns {void} + */ + backgroundMenuDisable() + { + let backgroundMenuProto = this._backgroundMenu.BackgroundMenu.prototype; + + if (!this.#originals['backgroundMenuOpen']) { + this.#originals['backgroundMenuOpen'] = backgroundMenuProto.open; + } + + backgroundMenuProto.open = () => {}; + } + + /** + * show search + * + * @param {boolean} fake true means it just needs to do the job but + * don't need to change the search visibility status + * + * @returns {void} + */ + searchEntryShow(fake) + { + let classname = this.#getAPIClassname('no-search'); + + if (!this.UIStyleClassContain(classname)) { + return; + } + + this.UIStyleClassRemove(classname); + + let searchEntry = this._main.overview.searchEntry; + let searchEntryParent = searchEntry.get_parent(); + + searchEntryParent.ease({ + height: searchEntry.height, + opacity: 255, + mode: this._clutter.AnimationMode.EASE, + duration: 110, + onComplete: () => { + searchEntryParent.height = -1; + searchEntry.ease({ + opacity: 255, + mode: this._clutter.AnimationMode.EASE, + duration: 700, + }); + }, + }); + + if (!fake) { + this._searchEntryVisibility = true; + } + + this.#computeWorkspacesBoxForStateChanged(); + } + + /** + * hide search + * + * @param {boolean} fake true means it just needs to do the job + * but don't need to change the search visibility status + * + * @returns {void} + */ + searchEntryHide(fake) + { + this.UIStyleClassAdd(this.#getAPIClassname('no-search')); + + let searchEntry = this._main.overview.searchEntry; + let searchEntryParent = searchEntry.get_parent(); + + searchEntry.ease({ + opacity: 0, + mode: this._clutter.AnimationMode.EASE, + duration: 50, + }); + + searchEntryParent.ease({ + height: 0, + opacity: 0, + mode: this._clutter.AnimationMode.EASE, + duration: 120, + }); + + if (!fake) { + this._searchEntryVisibility = false; + } + + this.#computeWorkspacesBoxForStateChanged(); + } + + /** + * enable start search + * + * @returns {void} + */ + startSearchEnable() + { + this.#startSearchSignal(true); + + if (!this.#originals['startSearch']) { + return; + } + + this._searchController.SearchController.prototype.startSearch = this.#originals['startSearch']; + } + + /** + * disable start search + * + * @returns {void} + */ + startSearchDisable() + { + this.#startSearchSignal(false); + + if (!this.#originals['startSearch']) { + this.#originals['startSearch'] = this._searchController.SearchController.prototype.startSearch + } + + this._searchController.SearchController.prototype.startSearch = () => {}; + } + + /** + * add search signals that needs to be show search entry when the + * search entry is hidden + * + * @param {boolean} add true means add the signal, false means remove + * the signal + * + * @returns {void} + */ + #startSearchSignal(add) + { + let controller + = this._main.overview.viewSelector || + this._main.overview._overview.viewSelector || + this._main.overview._overview.controls._searchController; + + // remove + if (!add) { + if (this._searchActiveSignal) { + controller.disconnect(this._searchActiveSignal); + this._searchActiveSignal = null; + } + return; + } + + // add + if (this._searchActiveSignal) { + return; + } + + this._searchActiveSignal = controller.connect('notify::search-active', () => { + if (this._searchEntryVisibility) { + return; + } + + let inSearch = controller.searchActive; + + if (inSearch) { + this.UIStyleClassAdd(this.#getAPIClassname('type-to-search')); + this.searchEntryShow(true); + } else { + this.UIStyleClassRemove(this.#getAPIClassname('type-to-search')); + this.searchEntryHide(true); + } + }); + } + + /** + * Set maximum displayed search result to default value + * + * @returns {void} + */ + setMaxDisplayedSearchResultToDefault() + { + if (!this.#originals['searchGetMaxDisplayedResults']) { + return; + } + + let ListSearchResultsProto = this._search.ListSearchResults.prototype; + + ListSearchResultsProto._getMaxDisplayedResults = this.#originals['searchGetMaxDisplayedResults']; + } + + /** + * Set maximum displayed search result + * + * @param {number} items max items + * + * @returns {void} + */ + setMaxDisplayedSearchResult(items) + { + let ListSearchResultsProto = this._search.ListSearchResults.prototype; + + if (!this.#originals['searchGetMaxDisplayedResults']) { + this.#originals['searchGetMaxDisplayedResults'] = ListSearchResultsProto._getMaxDisplayedResults; + } + + ListSearchResultsProto._getMaxDisplayedResults = () => { + return items; + } + } + + /** + * enable OSD + * + * @returns {void} + */ + OSDEnable() + { + if (!this.#originals['osdWindowManagerShow']) { + return; + } + + this._main.osdWindowManager.show = this.#originals['osdWindowManagerShow']; + } + + /** + * disable OSD + * + * @returns {void} + */ + OSDDisable() + { + if (!this.#originals['osdWindowManagerShow']) { + this.#originals['osdWindowManagerShow'] + = this._main.osdWindowManager.show; + } + + this._main.osdWindowManager.show = () => {}; + } + + /** + * enable workspace popup + * + * @returns {void} + */ + workspacePopupEnable() + { + if (!this.#originals['workspaceSwitcherPopupDisplay']) { + return; + } + + this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display + = this.#originals['workspaceSwitcherPopupDisplay'] + } + + /** + * disable workspace popup + * + * @returns {void} + */ + workspacePopupDisable() + { + if (!this.#originals['workspaceSwitcherPopupDisplay']) { + this.#originals['workspaceSwitcherPopupDisplay'] + = this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display; + } + + this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display = function (index) { + this.destroy(); + }; + } + + /** + * show workspace switcher + * + * @returns {void} + */ + workspaceSwitcherShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-workspace')); + + this.#workspaceSwitcherShouldShowSetToLast(); + } + + /** + * hide workspace switcher + * + * @returns {void} + */ + workspaceSwitcherHide() + { + this.workspaceSwitcherShouldShow(false, true); + + // should be after `this.workspaceSwitcherShouldShow()` + // since it checks whether it's visible or not + this.UIStyleClassAdd(this.#getAPIClassname('no-workspace')); + } + + /** + * check whether workspace switcher is visible + * + * @returns {boolean} + */ + isWorkspaceSwitcherVisible() + { + return !this.UIStyleClassContain(this.#getAPIClassname('no-workspace')); + } + + /** + * set workspace switcher to its default size + * + * @returns {void} + */ + workspaceSwitcherSetDefaultSize() + { + let thumbnailsBox = this._main.overview._overview._controls._thumbnailsBox; + let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; + + if (!ThumbnailsBoxProto._initOld) { + return; + } + + ThumbnailsBoxProto._init = ThumbnailsBoxProto._initOld; + delete(ThumbnailsBoxProto._initOld); + + thumbnailsBox._maxThumbnailScale = this._workspaceThumbnail.MAX_THUMBNAIL_SCALE; + } + + /** + * set workspace switcher size + * + * @param {number} size in float + * + * @returns {void} + */ + workspaceSwitcherSetSize(size) + { + let thumbnailsBox = this._main.overview._overview._controls._thumbnailsBox; + let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; + + thumbnailsBox._maxThumbnailScale = size; + + if (!ThumbnailsBoxProto._initOld) { + ThumbnailsBoxProto._initOld = ThumbnailsBoxProto._init; + } + + ThumbnailsBoxProto._init = function(...params) { + this._maxThumbnailScale = size; + this._initOld(...params); + }; + } + + /** + * add element to stage + * + * @param {St.Widget} element widget + * + * @returns {void} + */ + chromeAdd(element) + { + this._main.layoutManager.addChrome(element, { + affectsInputRegion : true, + affectsStruts : false, + trackFullscreen : true, + }); + } + + /** + * remove element from stage + * + * @param {St.Widget} element widget + * + * @returns {void} + */ + chromeRemove(element) + { + this._main.layoutManager.removeChrome(element); + } + + /** + * show activities button + * + * @returns {void} + */ + activitiesButtonShow() + { + let activities = this._main.panel.statusArea.activities; + + if (!this.isLocked() && activities) { + activities.container.show(); + } + } + + /** + * hide activities button + * + * @returns {void} + */ + activitiesButtonHide() + { + let activities = this._main.panel.statusArea.activities; + + if (activities) { + activities.container.hide(); + } + } + + /** + * show date menu + * + * @returns {void} + */ + dateMenuShow() + { + if (!this.isLocked()) { + this._main.panel.statusArea.dateMenu.container.show(); + } + } + + /** + * hide date menu + * + * @returns {void} + */ + dateMenuHide() + { + this._main.panel.statusArea.dateMenu.container.hide(); + } + + /** + * show keyboard layout + * + * @returns {void} + */ + keyboardLayoutShow() + { + this._main.panel.statusArea.keyboard.container.show(); + } + + /** + * hide keyboard layout + * + * @returns {void} + */ + keyboardLayoutHide() + { + this._main.panel.statusArea.keyboard.container.hide(); + } + + /** + * show accessibility menu + * + * @returns {void} + */ + accessibilityMenuShow() + { + this._main.panel.statusArea.a11y?.container.show(); + } + + /** + * hide accessibility menu + * + * @returns {void} + */ + accessibilityMenuHide() + { + this._main.panel.statusArea.a11y?.container.hide(); + } + + /** + * show quick settings menu + * + * @returns {void} + */ + quickSettingsMenuShow() + { + this._main.panel.statusArea.quickSettings.container.show(); + } + + /** + * hide quick settings menu + * + * @returns {void} + */ + quickSettingsMenuHide() + { + this._main.panel.statusArea.quickSettings.container.hide(); + } + + /** + * check whether lock dialog is currently showing + * + * @returns {boolean} + */ + isLocked() + { + return this._main.sessionMode.isLocked; + } + + /** + * enable window picker icon + * + * @returns {void} + */ + windowPickerIconEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-window-picker-icon')); + } + + /** + * disable window picker icon + * + * @returns {void} + */ + windowPickerIconDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-window-picker-icon')); + } + + /** + * show power icon + * + * @returns {void} + */ + powerIconShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-power-icon')); + } + + /** + * hide power icon + * + * @returns {void} + */ + powerIconHide() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-power-icon')); + } + + /** + * get primary monitor information + * + * @returns {false|Object} false when monitor does not exist | object + * x: int + * y: int + * width: int + * height: int + * geometryScale: float + */ + monitorGetInfo() + { + let pMonitor = this._main.layoutManager.primaryMonitor; + + if (!pMonitor) { + return false; + } + + return { + 'x': pMonitor.x, + 'y': pMonitor.y, + 'width': pMonitor.width, + 'height': pMonitor.height, + 'geometryScale': pMonitor.geometry_scale, + }; + } + + /** + * get panel position + * + * @returns {number} see PANEL_POSITION + */ + panelGetPosition() + { + if (this._panelPosition === undefined) { + return PANEL_POSITION.TOP; + } + + return this._panelPosition; + } + + /** + * move panel position + * + * @param {number} position see PANEL_POSITION + * @param {boolean} force allow to set even when the current position + * is the same + * + * @returns {void} + */ + panelSetPosition(position, force = false) + { + let monitorInfo = this.monitorGetInfo(); + let panelBox = this._main.layoutManager.panelBox; + + if (!force && position === this.panelGetPosition()) { + return; + } + + if (position === PANEL_POSITION.TOP) { + this._panelPosition = PANEL_POSITION.TOP; + if (this._workareasChangedSignal) { + global.display.disconnect(this._workareasChangedSignal); + this._workareasChangedSignal = null; + } + if (this._panelHeightSignal) { + panelBox.disconnect(this._panelHeightSignal); + this._panelHeightSignal = null; + } + let topX = (monitorInfo) ? monitorInfo.x : 0; + let topY = (monitorInfo) ? monitorInfo.y : 0; + panelBox.set_position(topX, topY); + this.UIStyleClassRemove(this.#getAPIClassname('bottom-panel')); + this.#fixPanelMenuSide(this._st.Side.TOP); + this.#fixLookingGlassPosition(); + return; + } + + this._panelPosition = PANEL_POSITION.BOTTOM; + + // only change it when a monitor detected + // 'workareas-changed' signal will do the job on next monitor detection + if (monitorInfo) { + let BottomX = monitorInfo.x; + let BottomY = monitorInfo.y + monitorInfo.height - this.panelGetSize(); + + panelBox.set_position(BottomX, BottomY); + this.UIStyleClassAdd(this.#getAPIClassname('bottom-panel')); + } + + if (!this._workareasChangedSignal) { + this._workareasChangedSignal + = global.display.connect('workareas-changed', () => { + this.panelSetPosition(PANEL_POSITION.BOTTOM, true); + }); + } + + if (!this._panelHeightSignal) { + this._panelHeightSignal = panelBox.connect('notify::height', () => { + this.panelSetPosition(PANEL_POSITION.BOTTOM, true); + }); + } + + this.#fixPanelMenuSide(this._st.Side.BOTTOM); + this.#fixLookingGlassPosition(); + } + + /** + * fix panel menu opening side based on panel position + * + * @param {number} position St.Side value + * is the same + * + * @returns {void} + */ + #fixPanelMenuSide(position) + { + let PanelMenuButton = this._panelMenu.Button; + let PanelMenuButtonProto = PanelMenuButton.prototype; + + // Set Instances + let findPanelMenus = (widget) => { + if (widget instanceof PanelMenuButton && widget.menu?._boxPointer) { + widget.menu._boxPointer._userArrowSide = position; + } + widget.get_children().forEach(subWidget => { + findPanelMenus(subWidget) + }); + } + + let panelBoxes = [ + this._main.panel._centerBox, + this._main.panel._rightBox, + this._main.panel._leftBox, + ]; + panelBoxes.forEach(panelBox => findPanelMenus(panelBox)); + + // Set Prototypes + if (position === this._st.Side.TOP) { + // reset to default since GNOME Shell panel is top by default + if (PanelMenuButtonProto._setMenuOld) { + PanelMenuButtonProto.setMenu = PanelMenuButtonProto._setMenuOld; + } + return; + } + + if (!PanelMenuButtonProto._setMenuOld) { + PanelMenuButtonProto._setMenuOld = PanelMenuButtonProto.setMenu; + } + + PanelMenuButtonProto.setMenu = function (menu) { + this._setMenuOld(menu); + if (menu) { + menu._boxPointer._userArrowSide = position; + } + } + } + + /** + * fix looking glass position + * + * @returns {void} + */ + #fixLookingGlassPosition() + { + let lookingGlassProto = this._lookingGlass.LookingGlass.prototype; + + if (this.#originals['lookingGlassResize'] === undefined) { + this.#originals['lookingGlassResize'] = lookingGlassProto._resize; + } + + if (this.panelGetPosition() === PANEL_POSITION.TOP && this.isPanelVisible()) { + + lookingGlassProto._resize = this.#originals['lookingGlassResize']; + delete(lookingGlassProto._oldResizeMethod); + delete(this.#originals['lookingGlassResize']); + + return; + } + + if (lookingGlassProto._oldResizeMethod === undefined) { + lookingGlassProto._oldResizeMethod = this.#originals['lookingGlassResize']; + + const Main = this._main; + + lookingGlassProto._resize = function () { + let panelHeight = Main.layoutManager.panelBox.height; + this._oldResizeMethod(); + this._targetY -= panelHeight; + this._hiddenY -= panelHeight; + }; + } + } + + /** + * enable panel notification icon + * + * @returns {void} + */ + panelNotificationIconEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-panel-notification-icon')); + } + + /** + * disable panel notification icon + * + * @returns {void} + */ + panelNotificationIconDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-panel-notification-icon')); + } + + /** + * disconnect all clock menu position signals + * + * @returns {void} + */ + #disconnectClockMenuPositionSignals() + { + let panelBoxes = [ + this._main.panel._centerBox, + this._main.panel._rightBox, + this._main.panel._leftBox, + ]; + + if (this._clockMenuPositionSignals) { + for (let i = 0; i <= 2; i++) { + panelBoxes[i].disconnect(this._clockMenuPositionSignals[i]); + } + delete(this._clockMenuPositionSignals); + } + } + + /** + * set the clock menu position to default + * + * @returns {void} + */ + clockMenuPositionSetDefault() + { + this.clockMenuPositionSet(0, 0); + this.#disconnectClockMenuPositionSignals(); + } + + /** + * set the clock menu position + * + * @param {number} pos see PANEL_BOX_POSITION + * @param {number} offset starts from 0 + * + * @returns {void} + */ + clockMenuPositionSet(pos, offset) + { + let dateMenu = this._main.panel.statusArea.dateMenu; + + let panelBoxes = [ + this._main.panel._centerBox, + this._main.panel._rightBox, + this._main.panel._leftBox, + ]; + + this.#disconnectClockMenuPositionSignals(); + + let fromPos = -1; + let fromIndex = -1; + let toIndex = -1; + let childLength = 0; + for (let i = 0; i <= 2; i++) { + let child = panelBoxes[i].get_children(); + let childIndex = child.indexOf(dateMenu.container); + if (childIndex !== -1) { + fromPos = i; + fromIndex = childIndex; + childLength = panelBoxes[pos].get_children().length; + toIndex = (offset > childLength) ? childLength : offset; + break; + } + } + + // couldn't find the from and to position because it has been removed + if (fromPos === -1 || fromIndex === -1 || toIndex === -1) { + return; + } + + if (pos === fromPos && toIndex === fromIndex) { + return; + } + + panelBoxes[fromPos].remove_child(dateMenu.container); + panelBoxes[pos].insert_child_at_index(dateMenu.container, toIndex); + + if (this.isLocked()) { + this.dateMenuHide(); + } + + if (!this._clockMenuPositionSignals) { + this._clockMenuPositionSignals = [null, null, null]; + for (let i = 0; i <= 2; i++) { + this._clockMenuPositionSignals[i] = panelBoxes[i].connect( + (this.#shellVersion >= 46) ? 'child-added' : 'actor-added', + () => { + this.clockMenuPositionSet(pos, offset); + } + ); + } + } + } + + /** + * enable show apps button + * + * @returns {void} + */ + showAppsButtonEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-show-apps-button')); + } + + /** + * disable show apps button + * + * @returns {void} + */ + showAppsButtonDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-show-apps-button')); + } + + /** + * set animation speed as default + * + * @returns {void} + */ + animationSpeedSetDefault() + { + if (this.#originals['StSlowDownFactor'] === undefined) { + return; + } + + this._st.Settings.get().slow_down_factor = this.#originals['StSlowDownFactor']; + } + + /** + * change animation speed + * + * @param {number} factor in float. bigger number means slower + * + * @returns {void} + */ + animationSpeedSet(factor) + { + if (this.#originals['StSlowDownFactor'] === undefined) { + this.#originals['StSlowDownFactor'] + = this._st.Settings.get().slow_down_factor; + } + + this._st.Settings.get().slow_down_factor = factor; + } + + /** + * set the enable animation as default + * + * @returns {void} + */ + enableAnimationsSetDefault() + { + if (this.#originals['enableAnimations'] === undefined) { + return; + } + + let status = this.#originals['enableAnimations']; + + this._interfaceSettings.set_boolean('enable-animations', status); + } + + /** + * set the enable animation status + * + * @param {boolean} status true to enable, false otherwise + * + * @returns {void} + */ + enableAnimationsSet(status) + { + if (this.#originals['enableAnimations'] === undefined) { + this.#originals['enableAnimations'] + = this._interfaceSettings.get_boolean('enable-animations'); + } + + this._interfaceSettings.set_boolean('enable-animations', status); + } + + /** + * enable focus when window demands attention happens + * + * @returns {void} + */ + windowDemandsAttentionFocusEnable() + { + if ( + this._displayWindowDemandsAttentionSignal || + this._displayWindowMarkedUrgentSignal + ) { + return; + } + + let display = global.display; + + let demandFunction = (display, window) => { + if (!window || window.has_focus() || window.is_skip_taskbar()) { + return; + } + this._main.activateWindow(window); + }; + + this._displayWindowDemandsAttentionSignal + = display.connect('window-demands-attention', demandFunction); + this._displayWindowMarkedUrgentSignal + = display.connect('window-marked-urgent', demandFunction); + + // since removing '_windowDemandsAttentionId' doesn't have any effect + // we remove the original signal and re-connect it on disable + let signalId = this.#getSignalId(global.display, 'window-demands-attention'); + let signalId2 = this.#getSignalId(global.display, 'window-marked-urgent'); + display.disconnect(signalId); + display.disconnect(signalId2); + } + + /** + * disable focus when window demands attention happens + * + * @returns {void} + */ + windowDemandsAttentionFocusDisable() + { + if ( + !this._displayWindowDemandsAttentionSignal || + !this._displayWindowMarkedUrgentSignal + ) { + return; + } + + let display = global.display; + + display.disconnect(this._displayWindowDemandsAttentionSignal); + display.disconnect(this._displayWindowMarkedUrgentSignal); + this._displayWindowDemandsAttentionSignal = null; + this._displayWindowMarkedUrgentSignal = null; + + let wah = this._main.windowAttentionHandler; + wah._windowDemandsAttentionId = display.connect( + 'window-demands-attention', + wah._onWindowDemandsAttention.bind(wah) + ); + wah._windowDemandsAttentionId = display.connect( + 'window-marked-urgent', + wah._onWindowDemandsAttention.bind(wah) + ); + } + + /** + * enable maximizing windows on creation + * + * @returns {void} + */ + windowMaximizedOnCreateEnable() + { + if (this._displayWindowCreatedSignal) { + return; + } + + let display = global.display; + + let createdFunction = (display, window) => { + if (window.can_maximize()) { + window.maximize(this._meta.MaximizeFlags.HORIZONTAL | this._meta.MaximizeFlags.VERTICAL); + } + }; + + this._displayWindowCreatedSignal = display.connect('window-created', createdFunction); + } + + /** + * disable maximizing windows on creation + * + * @returns {void} + */ + windowMaximizedOnCreateDisable() + { + if (!this._displayWindowCreatedSignal) { + return; + } + + let display = global.display; + + display.disconnect(this._displayWindowCreatedSignal); + delete(this._displayWindowCreatedSignal); + } + + /** + * set startup status + * + * @param {number} status see SHELL_STATUS for available status + * + * @returns {void} + */ + startupStatusSet(status) + { + let sessionMode = this._main.sessionMode; + let layoutManager = this._main.layoutManager; + + if (!layoutManager._startingUp) { + return; + } + + if (this.#originals['sessionModeHasOverview'] === undefined) { + this.#originals['sessionModeHasOverview'] = sessionMode.hasOverview; + } + + let ControlsState = this._overviewControls.ControlsState; + let Controls = this._main.overview._overview.controls; + + switch (status) { + + case SHELL_STATUS.NONE: + sessionMode.hasOverview = false; + layoutManager.startInOverview = false; + Controls._stateAdjustment.value = ControlsState.HIDDEN; + break; + + case SHELL_STATUS.OVERVIEW: + default: + sessionMode.hasOverview = true; + layoutManager.startInOverview = true; + break; + } + + if (!this._startupCompleteSignal) { + this._startupCompleteSignal + = layoutManager.connect('startup-complete', () => { + sessionMode.hasOverview = this.#originals['sessionModeHasOverview']; + }); + } + } + + /** + * set startup status to default + * + * @returns {void} + */ + startupStatusSetDefault() + { + if (this.#originals['sessionModeHasOverview'] === undefined) { + return; + } + + if (this._startupCompleteSignal) { + this._main.layoutManager.disconnect(this._startupCompleteSignal); + } + } + + /** + * set dash icon size to default + * + * @returns {void} + */ + dashIconSizeSetDefault() + { + let classnameStarter = this.#getAPIClassname('dash-icon-size'); + + DASH_ICON_SIZES.forEach(size => { + this.UIStyleClassRemove(classnameStarter + size); + }); + } + + /** + * set dash icon size + * + * @param {number} size in pixels + * see DASH_ICON_SIZES for available sizes + * + * @returns {void} + */ + dashIconSizeSet(size) + { + this.dashIconSizeSetDefault(); + + if (!DASH_ICON_SIZES.includes(size)) { + return; + } + + let classnameStarter = this.#getAPIClassname('dash-icon-size'); + + this.UIStyleClassAdd(classnameStarter + size); + } + + /** + * change ControlsManagerLayout._computeWorkspacesBoxForState + * base on the current state + * + * @returns {void} + */ + #computeWorkspacesBoxForStateChanged() + { + let controlsLayout = this._main.overview._overview._controls.layout_manager; + + if (!this.#originals['computeWorkspacesBoxForState']) { + this.#originals['computeWorkspacesBoxForState'] + = controlsLayout._computeWorkspacesBoxForState; + } + + controlsLayout._computeWorkspacesBoxForState = (state, box, searchHeight, ...args) => { + + let inAppGrid = state === this._overviewControls.ControlsState.APP_GRID; + + if (inAppGrid && !this._searchEntryVisibility) { + // We need some spacing on top of workspace box in app grid + // when the search entry is not visible. + searchHeight = 40; + } + + box = this.#originals['computeWorkspacesBoxForState'].call( + controlsLayout, state, box, searchHeight, ...args); + + if (inAppGrid && this._workspacesInAppGridHeight !== undefined) { + box.set_size( + box.get_width(), + this._workspacesInAppGridHeight + ); + } + + return box; + }; + + // Since workspace background has shadow around it, it can cause + // unwanted shadows in app grid when the workspace height is 0. + // so we are removing the shadow when we are in app grid + if (!this._appButtonForComputeWorkspacesSignal) { + this._appButtonForComputeWorkspacesSignal = + this._main.overview.dash.showAppsButton.connect( + 'notify::checked', + () => { + let checked = this._main.overview.dash.showAppsButton.checked; + let classname = this.#getAPIClassname('no-workspaces-in-app-grid'); + if (checked) { + this.UIStyleClassAdd(classname); + } else { + this.UIStyleClassRemove(classname); + } + } + ); + } + } + + /** + * change ControlsManagerLayout._computeWorkspacesBoxForState to its default + * + * @returns {void} + */ + #computeWorkspacesBoxForStateSetDefault() + { + if (!this.#originals['computeWorkspacesBoxForState']) { + return; + } + + let controlsLayout = this._main.overview._overview._controls.layout_manager; + + controlsLayout._computeWorkspacesBoxForState + = this.#originals['computeWorkspacesBoxForState']; + + if (this._appButtonForComputeWorkspacesSignal) { + let showAppsButton = this._main.overview.dash.showAppsButton; + showAppsButton.disconnect(this._appButtonForComputeWorkspacesSignal); + delete(this._appButtonForComputeWorkspacesSignal); + this.UIStyleClassRemove(this.#getAPIClassname('no-workspaces-in-app-grid')); + } + } + + /** + * disable workspaces in app grid + * + * @returns {void} + */ + workspacesInAppGridDisable() + { + this._workspacesInAppGridHeight = 0; + this.#computeWorkspacesBoxForStateChanged(); + } + + /** + * enable workspaces in app grid + * + * @returns {void} + */ + workspacesInAppGridEnable() + { + if (this._workspacesInAppGridHeight === undefined) { + return; + } + + delete(this._workspacesInAppGridHeight); + this.#computeWorkspacesBoxForStateChanged(); + } + + /** + * change notification banner position + * + * @param {number} pos + * see XY_POSITION for available positions + * + * @returns {void} + */ + notificationBannerPositionSet(pos) + { + let messageTray = this._main.messageTray; + let bannerBin = messageTray._bannerBin; + + if (this.#originals['bannerAlignmentX'] === undefined) { + this.#originals['bannerAlignmentX'] = messageTray.bannerAlignment; + } + + if (this.#originals['bannerAlignmentY'] === undefined) { + this.#originals['bannerAlignmentY'] = bannerBin.get_y_align(); + } + + if (this.#originals['hideNotification'] === undefined) { + this.#originals['hideNotification'] = messageTray._hideNotification; + } + + // TOP + messageTray._hideNotification = this.#originals['hideNotification']; + + bannerBin.set_y_align(this._clutter.ActorAlign.START); + + if (pos === XY_POSITION.TOP_START) { + messageTray.bannerAlignment = this._clutter.ActorAlign.START; + return; + } + + if (pos === XY_POSITION.TOP_END) { + messageTray.bannerAlignment = this._clutter.ActorAlign.END; + return; + } + + if (pos === XY_POSITION.TOP_CENTER) { + messageTray.bannerAlignment = this._clutter.ActorAlign.CENTER; + return; + } + + // BOTTOM + + // >> + // This block is going to fix the animation when the notification is + // in bottom area + // this is the same function from (ui.messageTray.messageTray._hideNotification) + // with clutter animation mode set to EASE. + // because the EASE_OUT_BACK (original code) causes glitch when + // the tray is on bottom + const State = this._messageTray.State; + const ANIMATION_TIME = this._messageTray.ANIMATION_TIME; + const Clutter = this._clutter; + + messageTray._hideNotification = function (animate) { + this._notificationFocusGrabber.ungrabFocus(); + this._banner.disconnectObject(this); + this._resetNotificationLeftTimeout(); + this._bannerBin.remove_all_transitions(); + + if (animate) { + this._notificationState = State.HIDING; + this._bannerBin.ease({ + opacity: 0, + duration: ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE, + }); + this._bannerBin.ease({ + opacity: 0, + y: this._bannerBin.height, + duration: ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE, + onComplete: () => { + this._notificationState = State.HIDDEN; + this._hideNotificationCompleted(); + this._updateState(); + }, + }); + } else { + this._bannerBin.y = this._bannerBin.height; + this._bannerBin.opacity = 0; + this._notificationState = State.HIDDEN; + this._hideNotificationCompleted(); + } + } + // << + + bannerBin.set_y_align(this._clutter.ActorAlign.END); + + if (pos === XY_POSITION.BOTTOM_START) { + messageTray.bannerAlignment = this._clutter.ActorAlign.START; + return; + } + + if (pos === XY_POSITION.BOTTOM_END) { + messageTray.bannerAlignment = this._clutter.ActorAlign.END; + return; + } + + if (pos === XY_POSITION.BOTTOM_CENTER) { + messageTray.bannerAlignment = this._clutter.ActorAlign.CENTER; + return; + } + } + + /** + * set notification banner position to default position + * + * @returns {void} + */ + notificationBannerPositionSetDefault() + { + if (this.#originals['bannerAlignmentX'] === undefined || + this.#originals['bannerAlignmentY'] === undefined || + this.#originals['hideNotification'] === undefined + ) { + return; + } + + let messageTray = this._main.messageTray; + let bannerBin = messageTray._bannerBin; + + messageTray.bannerAlignment = this.#originals['bannerAlignmentX']; + bannerBin.set_y_align(this.#originals['bannerAlignmentY']); + messageTray._hideNotification = this.#originals['hideNotification']; + } + + /** + * set the workspace switcher to always/never show + * + * @param {boolean} show true for always show, false for never show + * @param {boolean} fake true means set the current should show status + * + * @returns {void} + */ + workspaceSwitcherShouldShow(shouldShow = true, fake = false) + { + if (!fake) { + this._shouldShow = shouldShow; + } + + if (!this.isWorkspaceSwitcherVisible()) { + return; + } + + let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; + + if (!this.#originals['updateShouldShow']) { + this.#originals['updateShouldShow'] = ThumbnailsBoxProto._updateShouldShow; + } + + ThumbnailsBoxProto._updateShouldShow = function () { + if (this._shouldShow === shouldShow) { + return; + } + this._shouldShow = shouldShow; + this.notify('should-show'); + }; + } + + /** + * set the always show workspace switcher status to last real status + * + * @returns {void} + */ + #workspaceSwitcherShouldShowSetToLast() + { + if (this._shouldShow === undefined) { + this.workspaceSwitcherShouldShowSetDefault(); + return; + } + + this.workspaceSwitcherShouldShow(this._shouldShow); + } + + /** + * set the always show workspace switcher status to default + * + * @returns {void} + */ + workspaceSwitcherShouldShowSetDefault() + { + if (!this.#originals['updateShouldShow'] || !this.isWorkspaceSwitcherVisible()) { + return; + } + + let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; + ThumbnailsBoxProto._updateShouldShow = this.#originals['updateShouldShow']; + delete(this.#originals['updateShouldShow']); + delete(this._shouldShow); + } + + /** + * set panel button hpadding to default + * + * @returns {void} + */ + panelButtonHpaddingSetDefault() + { + if (this._panelButtonHpaddingSize === undefined) { + return; + } + + let classnameStarter = this.#getAPIClassname('panel-button-padding-size'); + this.UIStyleClassRemove(classnameStarter + this._panelButtonHpaddingSize); + this.#emitRefreshStyles(); + + delete this._panelButtonHpaddingSize; + } + + /** + * set panel button hpadding size + * + * @param {number} size in pixels (0 - 60) + * + * @returns {void} + */ + panelButtonHpaddingSizeSet(size) + { + this.panelButtonHpaddingSetDefault(); + + if (size < 0 || size > 60) { + return; + } + + this._panelButtonHpaddingSize = size; + + let classnameStarter = this.#getAPIClassname('panel-button-padding-size'); + this.UIStyleClassAdd(classnameStarter + size); + this.#emitRefreshStyles(); + } + + /** + * set panel indicator padding to default + * + * @returns {void} + */ + panelIndicatorPaddingSetDefault() + { + if (this._panelIndicatorPaddingSize === undefined) { + return; + } + + let classnameStarter = this.#getAPIClassname('panel-indicator-padding-size'); + this.UIStyleClassRemove(classnameStarter + this._panelIndicatorPaddingSize); + this.#emitRefreshStyles(); + + delete this._panelIndicatorPaddingSize; + } + + /** + * set panel indicator padding size + * + * @param {number} size in pixels (0 - 60) + * + * @returns {void} + */ + panelIndicatorPaddingSizeSet(size) + { + this.panelIndicatorPaddingSetDefault(); + + if (size < 0 || size > 60) { + return; + } + + this._panelIndicatorPaddingSize = size; + + let classnameStarter = this.#getAPIClassname('panel-indicator-padding-size'); + this.UIStyleClassAdd(classnameStarter + size); + this.#emitRefreshStyles(); + } + + /** + * get window preview prototype + * + * @returns {Object} + */ + #windowPreviewGetPrototype() + { + return this._windowPreview.WindowPreview.prototype; + } + + /** + * enable window preview caption + * + * @returns {void} + */ + windowPreviewCaptionEnable() + { + if (!this.#originals['windowPreviewGetCaption']) { + return; + } + + let windowPreviewProto = this.#windowPreviewGetPrototype(); + windowPreviewProto._getCaption = this.#originals['windowPreviewGetCaption']; + + this.UIStyleClassRemove(this.#getAPIClassname('no-window-caption')); + } + + /** + * disable window preview caption + * + * @returns {void} + */ + windowPreviewCaptionDisable() + { + let windowPreviewProto = this.#windowPreviewGetPrototype(); + + if (!this.#originals['windowPreviewGetCaption']) { + this.#originals['windowPreviewGetCaption'] = windowPreviewProto._getCaption; + } + + windowPreviewProto._getCaption = () => { + return ''; + }; + + this.UIStyleClassAdd(this.#getAPIClassname('no-window-caption')); + } + + /** + * set workspace background border radius to default size + * + * @returns {void} + */ + workspaceBackgroundRadiusSetDefault() + { + if (this._workspaceBackgroundRadiusSize === undefined) { + return; + } + + let workspaceBackgroundProto = this._workspace.WorkspaceBackground.prototype; + + workspaceBackgroundProto._updateBorderRadius + = this.#originals['workspaceBackgroundUpdateBorderRadius']; + + let classnameStarter = this.#getAPIClassname('workspace-background-radius-size'); + this.UIStyleClassRemove(classnameStarter + this._workspaceBackgroundRadiusSize); + + delete this._workspaceBackgroundRadiusSize; + } + + /** + * set workspace background border radius size + * + * @param {number} size in pixels (0 - 60) + * + * @returns {void} + */ + workspaceBackgroundRadiusSet(size) + { + if (size < 0 || size > 60) { + return; + } + + this.workspaceBackgroundRadiusSetDefault(); + + let workspaceBackgroundProto = this._workspace.WorkspaceBackground.prototype; + + if (!this.#originals['workspaceBackgroundUpdateBorderRadius']) { + this.#originals['workspaceBackgroundUpdateBorderRadius'] + = workspaceBackgroundProto._updateBorderRadius; + } + + const Util = this._util; + const St = this._st; + + workspaceBackgroundProto._updateBorderRadius = function () { + const {scaleFactor} = St.ThemeContext.get_for_stage(global.stage); + const cornerRadius = scaleFactor * size; + + const backgroundContent = this._bgManager.backgroundActor.content; + backgroundContent.rounded_clip_radius = + Util.lerp(0, cornerRadius, this._stateAdjustment.value); + } + + this._workspaceBackgroundRadiusSize = size; + + let classnameStarter = this.#getAPIClassname('workspace-background-radius-size'); + this.UIStyleClassAdd(classnameStarter + size); + } + + /** + * enable workspace wraparound + * + * @returns {void} + */ + workspaceWraparoundEnable() + { + let metaWorkspaceProto = this._meta.Workspace.prototype; + + if (!this.#originals['metaWorkspaceGetNeighbor']) { + this.#originals['metaWorkspaceGetNeighbor'] + = metaWorkspaceProto.get_neighbor; + } + + const Meta = this._meta; + + metaWorkspaceProto.get_neighbor = function (dir) { + + let index = this.index(); + let lastIndex = global.workspace_manager.n_workspaces - 1; + let neighborIndex; + + if (dir === Meta.MotionDirection.UP || dir === Meta.MotionDirection.LEFT) { + // prev + neighborIndex = (index > 0) ? index - 1 : lastIndex; + } else { + // next + neighborIndex = (index < lastIndex) ? index + 1 : 0; + } + + return global.workspace_manager.get_workspace_by_index(neighborIndex); + }; + } + + /** + * disable workspace wraparound + * + * @returns {void} + */ + workspaceWraparoundDisable() + { + if (!this.#originals['metaWorkspaceGetNeighbor']) { + return; + } + + let metaWorkspaceProto = this._meta.Workspace.prototype; + metaWorkspaceProto.get_neighbor = this.#originals['metaWorkspaceGetNeighbor']; + } + + /** + * enable window preview close button + * + * @returns {void} + */ + windowPreviewCloseButtonEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-window-close')); + } + + /** + * disable window preview close button + * + * @returns {void} + */ + windowPreviewCloseButtonDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-window-close')); + } + + /** + * enable ripple box + * + * @returns {void} + */ + rippleBoxEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-ripple-box')); + } + + /** + * disable ripple box + * + * @returns {void} + */ + rippleBoxDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-ripple-box')); + } + + /** + * unblock overlay key + * + * @returns {void} + */ + unblockOverlayKey() + { + if (!this._overlayKeyOldSignalId) { + return; + } + + this._gobject.signal_handler_unblock( + global.display, + this._overlayKeyOldSignalId + ); + + delete(this._overlayKeyOldSignalId); + } + + /** + * block overlay key + * + * @returns {void} + */ + blockOverlayKey() + { + this._overlayKeyOldSignalId = this.#getSignalId(global.display, 'overlay-key'); + + if (!this._overlayKeyOldSignalId) { + return; + } + + this._gobject.signal_handler_block(global.display, this._overlayKeyOldSignalId); + } + + /** + * enable double super press to toggle app grid + * + * @returns {void} + */ + doubleSuperToAppGridEnable() + { + if (this._isDoubleSuperToAppGrid === true) { + return; + } + + if (!this._overlayKeyNewSignalId) { + return; + } + + global.display.disconnect(this._overlayKeyNewSignalId); + delete(this._overlayKeyNewSignalId); + this.unblockOverlayKey(); + + this._isDoubleSuperToAppGrid = true; + } + + /** + * disable double super press to toggle app grid + * + * @returns {void} + */ + doubleSuperToAppGridDisable() + { + if (this._isDoubleSuperToAppGrid === false) { + return; + } + + this.blockOverlayKey(); + + this._overlayKeyNewSignalId = global.display.connect('overlay-key', () => { + this._main.overview.toggle(); + }); + + this._isDoubleSuperToAppGrid = false; + } + + /** + * disable the removal of switcher popup delay + * + * @returns {void} + */ + switcherPopupDelaySetDefault() + { + let SwitcherPopupProto = this._switcherPopup.SwitcherPopup.prototype; + + if (!SwitcherPopupProto.showOld) { + return; + } + + SwitcherPopupProto.show = SwitcherPopupProto.showOld; + delete(SwitcherPopupProto.showOld); + } + + /** + * enable the removal of switcher popup delay + * + * @returns {void} + */ + removeSwitcherPopupDelay() + { + let SwitcherPopupProto = this._switcherPopup.SwitcherPopup.prototype; + + SwitcherPopupProto.showOld = SwitcherPopupProto.show; + + SwitcherPopupProto.show = function (...args) { + let res = this.showOld(...args); + if (res) { + this._showImmediately(); + } + return res; + }; + } + + /** + * set default OSD position + * + * @returns {void} + */ + osdPositionSetDefault() + { + if (!this.#originals['osdWindowShow']) { + return; + } + + let osdWindowProto = this._osdWindow.OsdWindow.prototype; + + osdWindowProto.show = this.#originals['osdWindowShow']; + + delete(osdWindowProto._oldShow); + delete(this.#originals['osdWindowShow']); + + if ( + this.#originals['osdWindowXAlign'] !== undefined && + this.#originals['osdWindowYAlign'] !== undefined + ) { + let osdWindows = this._main.osdWindowManager._osdWindows; + osdWindows.forEach(osdWindow => { + osdWindow.x_align = this.#originals['osdWindowXAlign']; + osdWindow.y_align = this.#originals['osdWindowYAlign']; + }); + delete(this.#originals['osdWindowXAlign']); + delete(this.#originals['osdWindowYAlign']); + } + + this.UIStyleClassRemove(this.#getAPIClassname('osd-position-top')); + this.UIStyleClassRemove(this.#getAPIClassname('osd-position-bottom')); + this.UIStyleClassRemove(this.#getAPIClassname('osd-position-center')); + } + + /** + * set OSD position + * + * @param int pos position XY_POSITION + * + * @returns {void} + */ + osdPositionSet(pos) + { + let osdWindowProto = this._osdWindow.OsdWindow.prototype; + + if (!this.#originals['osdWindowShow']) { + this.#originals['osdWindowShow'] = osdWindowProto.show; + } + + if ( + this.#originals['osdWindowXAlign'] === undefined || + this.#originals['osdWindowYAlign'] === undefined + ) { + let osdWindows = this._main.osdWindowManager._osdWindows; + this.#originals['osdWindowXAlign'] = osdWindows[0].x_align; + this.#originals['osdWindowYAlign'] = osdWindows[0].y_align; + } + + if (osdWindowProto._oldShow === undefined) { + osdWindowProto._oldShow = this.#originals['osdWindowShow']; + } + + let [xAlign, yAlign] = this.#xyAlignGet(pos); + osdWindowProto.show = function () { + this.x_align = xAlign; + this.y_align = yAlign; + this._oldShow(); + }; + + if ( + pos === XY_POSITION.TOP_START || + pos === XY_POSITION.TOP_CENTER || + pos === XY_POSITION.TOP_END + ) { + this.UIStyleClassAdd(this.#getAPIClassname('osd-position-top')); + } + + if ( + pos === XY_POSITION.BOTTOM_START || + pos === XY_POSITION.BOTTOM_CENTER || + pos === XY_POSITION.BOTTOM_END + ) { + this.UIStyleClassAdd(this.#getAPIClassname('osd-position-bottom')); + } + + if ( + pos === XY_POSITION.CENTER_START || + pos === XY_POSITION.CENTER_CENTER || + pos === XY_POSITION.CENTER_END + ) { + this.UIStyleClassAdd(this.#getAPIClassname('osd-position-center')); + } + } + + /** + * show weather in date menu + * + * @returns {void} + */ + weatherShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-weather')); + } + + /** + * hide weather in date menu + * + * @returns {void} + */ + weatherHide() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-weather')); + } + + /** + * show world clocks in date menu + * + * @returns {void} + */ + worldClocksShow() + { + if (!this.#originals['clocksItemSync']) { + return; + } + + let clocksItem = this._main.panel.statusArea.dateMenu._clocksItem; + + clocksItem._sync = this.#originals['clocksItemSync']; + delete(this.#originals['clocksItemSync']); + + if (this._clocksItemShowSignal) { + clocksItem.disconnect(this._clocksItemShowSignal); + delete(this._clocksItemShowSignal); + } + + clocksItem._sync(); + } + + /** + * hide world clocks in date menu + * + * @returns {void} + */ + worldClocksHide() + { + let clocksItem = this._main.panel.statusArea.dateMenu._clocksItem; + + if (!this.#originals['clocksItemSync']) { + this.#originals['clocksItemSync'] = clocksItem._sync; + } + + clocksItem._sync = function () { + this.visible = false; + }; + + if (!this._clocksItemShowSignal) { + this._clocksItemShowSignal = clocksItem.connect('show', () => { + clocksItem._sync(); + }); + } + + clocksItem._sync(); + } + + /** + * show events button in date menu + * + * @returns {void} + */ + eventsButtonShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-events-button')); + } + + /** + * hide events button in date menu + * + * @returns {void} + */ + eventsButtonHide() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-events-button')); + } + + /** + * show calendar in date menu + * + * @returns {void} + */ + calendarShow() + { + this._main.panel.statusArea.dateMenu._calendar.show(); + } + + /** + * hide calendar in date menu + * + * @returns {void} + */ + calendarHide() + { + this._main.panel.statusArea.dateMenu._calendar.hide(); + } + + /** + * set default panel icon size + * + * @returns {void} + */ + panelIconSetDefaultSize() + { + if (this._panelIconSize === undefined || !this.#originals['panelIconSize']) { + return; + } + + let classnameStarter = this.#getAPIClassname('panel-icon-size'); + this.UIStyleClassRemove(classnameStarter + this._panelIconSize); + this.#emitRefreshStyles(); + + let defaultSize = this.#originals['panelIconSize']; + this.#changeDateMenuIndicatorIconSize(defaultSize); + + delete(this._panelIconSize); + } + + /** + * set panel icon size + * + * @param {number} size 1-60 + * + * @returns {void} + */ + panelIconSetSize(size) + { + if (size < 1 || size > 60) { + return; + } + + if (!this.#originals['panelIconSize']) { + this.#originals['panelIconSize'] = this._panel.PANEL_ICON_SIZE; + } + + let classnameStarter = this.#getAPIClassname('panel-icon-size'); + this.UIStyleClassRemove(classnameStarter + this.panelIconGetSize()); + this.UIStyleClassAdd(classnameStarter + size); + this.#emitRefreshStyles(); + + this.#changeDateMenuIndicatorIconSize(size); + + this._panelIconSize = size; + } + + /** + * change date menu indicator icon size + * + * @param {number} size + * + * @returns {void} + */ + #changeDateMenuIndicatorIconSize(size) + { + let dateMenu = this._main.panel.statusArea.dateMenu; + + // we get set_icon_size is not a function in some setups + // in case the date menu has been removed or not created + if ( + dateMenu && + dateMenu._indicator && + dateMenu._indicator.set_icon_size + ) { + dateMenu._indicator.set_icon_size(size); + } + } + + /** + * get panel icon size + * + * @returns {void} + */ + panelIconGetSize() + { + if (this._panelIconSize !== undefined) { + return this._panelIconSize; + } + + return this._panel.PANEL_ICON_SIZE; + } + + /** + * show dash separator + * + * @returns {void} + */ + dashSeparatorShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-dash-separator')); + } + + /** + * hide dash separator + * + * @returns {void} + */ + dashSeparatorHide() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-dash-separator')); + } + + /** + * get looking glass size + * + * @returns {array} + * width: int + * height: int + */ + #lookingGlassGetSize() + { + let lookingGlass = this._main.createLookingGlass(); + + return [lookingGlass.width, lookingGlass.height]; + } + + /** + * set default looking glass size + * + * @returns {void} + */ + lookingGlassSetDefaultSize() + { + if (!this._lookingGlassShowSignal) { + return; + } + + this._main.lookingGlass.disconnect(this._lookingGlassShowSignal); + + delete(this._lookingGlassShowSignal); + delete(this._lookingGlassOriginalSize); + delete(this._monitorsChangedSignal); + } + + /** + * set looking glass size + * + * @param {number} width in float + * @param {number} height in float + * + * @returns {void} + */ + lookingGlassSetSize(width, height) + { + let lookingGlass = this._main.createLookingGlass(); + + if (!this._lookingGlassOriginalSize) { + this._lookingGlassOriginalSize = this.#lookingGlassGetSize(); + } + + if (this._lookingGlassShowSignal) { + lookingGlass.disconnect(this._lookingGlassShowSignal); + delete(this._lookingGlassShowSignal); + } + + this._lookingGlassShowSignal = lookingGlass.connect('show', () => { + let [, currentHeight] = this.#lookingGlassGetSize(); + let [originalWidth, originalHeight] = this._lookingGlassOriginalSize; + + let monitorInfo = this.monitorGetInfo(); + + let dialogWidth + = (width !== null) + ? monitorInfo.width * width + : originalWidth; + + let x = monitorInfo.x + (monitorInfo.width - dialogWidth) / 2; + lookingGlass.set_x(x); + + let keyboardHeight = this._main.layoutManager.keyboardBox.height; + let availableHeight = monitorInfo.height - keyboardHeight; + let dialogHeight + = (height !== null) + ? Math.min(monitorInfo.height * height, availableHeight * 0.9) + : originalHeight; + + let hiddenY = lookingGlass._hiddenY + currentHeight - dialogHeight; + lookingGlass.set_y(hiddenY); + lookingGlass._hiddenY = hiddenY; + + lookingGlass.set_size(dialogWidth, dialogHeight); + }); + + if (!this._monitorsChangedSignal) { + this._monitorsChangedSignal = this._main.layoutManager.connect('monitors-changed', + () => { + this.lookingGlassSetSize(width, height); + }); + } + } + + /** + * show screenshot in window menu + * + * @returns {void} + */ + screenshotInWindowMenuShow() + { + let windowMenuProto = this._windowMenu.WindowMenu.prototype; + + if (windowMenuProto._oldBuildMenu === undefined) { + return; + } + + windowMenuProto._buildMenu = this.#originals['WindowMenubuildMenu']; + + delete(windowMenuProto._oldBuildMenu); + } + + /** + * hide screenshot in window menu + * + * @returns {void} + */ + screenshotInWindowMenuHide() + { + let windowMenuProto = this._windowMenu.WindowMenu.prototype; + + if (!this.#originals['WindowMenubuildMenu']) { + this.#originals['WindowMenubuildMenu'] = windowMenuProto._buildMenu; + } + + if (windowMenuProto._oldBuildMenu === undefined) { + windowMenuProto._oldBuildMenu = this.#originals['WindowMenubuildMenu']; + } + + windowMenuProto._buildMenu = function (window) { + this._oldBuildMenu(window); + this.firstMenuItem.hide(); + }; + } + + /** + * set all alt tab sizes to default + * + * @returns {void} + */ + #altTabSizesSetDefault() + { + let WindowIconProto = this._altTab.WindowIcon.prototype; + if (WindowIconProto._initOld) { + WindowIconProto._init = WindowIconProto._initOld; + delete(WindowIconProto._initOld); + } + + delete(this._altTabAPP_ICON_SIZE); + delete(this._altTabAPP_ICON_SIZE_SMALL); + delete(this._altTabWINDOW_PREVIEW_SIZE); + } + + /** + * set alt tab sizes + * + * @param {number|null} appIconSize + * @param {number|null} appIconSizeSmall + * @param {number|null} windowPreviewSize + * + * @returns {void} + */ + #altTabSizesSet(appIconSize, appIconSizeSmall, windowPreviewSize) + { + let WindowIconProto = this._altTab.WindowIcon.prototype; + if (!WindowIconProto._initOld) { + WindowIconProto._initOld = WindowIconProto._init; + } + + this._altTabAPP_ICON_SIZE ||= this._altTab.APP_ICON_SIZE; + this._altTabAPP_ICON_SIZE_SMALL ||= this._altTab.APP_ICON_SIZE_SMALL; + this._altTabWINDOW_PREVIEW_SIZE ||= this._altTab.WINDOW_PREVIEW_SIZE; + + const APP_ICON_SIZE = appIconSize || this._altTabAPP_ICON_SIZE; + const APP_ICON_SIZE_SMALL = appIconSizeSmall || this._altTabAPP_ICON_SIZE_SMALL; + const WINDOW_PREVIEW_SIZE = windowPreviewSize || this._altTabWINDOW_PREVIEW_SIZE; + + WindowIconProto._init = function(window, mode) { + this._initOld(window, mode); + } + } + + /** + * set default alt tab window preview size + * + * @returns {void} + */ + altTabWindowPreviewSetDefaultSize() + { + if (!this.#originals['altTabWindowPreviewSize']) { + return; + } + + this.#altTabSizesSet(null, null, this.#originals['altTabWindowPreviewSize']); + } + + /** + * set alt tab window preview size + * + * @param {number} size 1-512 + * + * @returns {void} + */ + altTabWindowPreviewSetSize(size) + { + if (size < 1 || size > 512) { + return; + } + + if (!this.#originals['altTabWindowPreviewSize']) { + this.#originals['altTabWindowPreviewSize'] = this._altTab.WINDOW_PREVIEW_SIZE; + } + + this.#altTabSizesSet(null, null, size); + } + + /** + * set default alt tab small icon size + * + * @returns {void} + */ + altTabSmallIconSetDefaultSize() + { + if (!this.#originals['altTabAppIconSizeSmall']) { + return; + } + + this.#altTabSizesSet(null, this.#originals['altTabAppIconSizeSmall'], null); + } + + /** + * set alt tab small icon size + * + * @param {number} size 1-512 + * + * @returns {void} + */ + altTabSmallIconSetSize(size) + { + if (size < 1 || size > 512) { + return; + } + + if (!this.#originals['altTabAppIconSizeSmall']) { + this.#originals['altTabAppIconSizeSmall'] = this._altTab.APP_ICON_SIZE_SMALL; + } + + this.#altTabSizesSet(null, size, null); + } + + /** + * set default alt tab icon size + * + * @returns {void} + */ + altTabIconSetDefaultSize() + { + if (!this.#originals['altTabAppIconSize']) { + return; + } + + this.#altTabSizesSet(this.#originals['altTabAppIconSize'], null, null); + } + + /** + * set alt tab icon size + * + * @param {number} size 1-512 + * + * @returns {void} + */ + altTabIconSetSize(size) + { + if (size < 1 || size > 512) { + return; + } + + if (!this.#originals['altTabAppIconSize']) { + this.#originals['altTabAppIconSize'] = this._altTab.APP_ICON_SIZE; + } + + this.#altTabSizesSet(size, null, null); + } + + /** + * enable screen sharing indicator + * + * @returns {void} + */ + screenSharingIndicatorEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-screen-sharing-indicator')); + } + + /** + * disable screen sharing indicator + * + * @returns {void} + */ + screenSharingIndicatorDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-screen-sharing-indicator')); + } + + /** + * enable screen recording indicator + * + * @returns {void} + */ + screenRecordingIndicatorEnable() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-screen-recording-indicator')); + } + + /** + * disable screen recording indicator + * + * @returns {void} + */ + screenRecordingIndicatorDisable() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-screen-recording-indicator')); + } + + /** + * set controls manager spacing to default + * + * @returns {void} + */ + controlsManagerSpacingSetDefault() + { + if (this._controlsManagerSpacingSize === undefined) { + return; + } + + let classnameStarter = this.#getAPIClassname('controls-manager-spacing-size'); + this.UIStyleClassRemove(classnameStarter + this._controlsManagerSpacingSize); + + delete this._controlsManagerSpacingSize; + } + + /** + * set controls manager spacing size + * + * @param {number} size in pixels (0 - 150) + * + * @returns {void} + */ + controlsManagerSpacingSizeSet(size) + { + this.controlsManagerSpacingSetDefault(); + + if (size < 0 || size > 150) { + return; + } + + this._controlsManagerSpacingSize = size; + + let classnameStarter = this.#getAPIClassname('controls-manager-spacing-size'); + this.UIStyleClassAdd(classnameStarter + size); + } + + /** + * set workspaces view spacing to default + * + * @returns {void} + */ + workspacesViewSpacingSetDefault() + { + let wsvp = this._workspacesView.WorkspacesView.prototype; + + if (wsvp._getSpacingOld === undefined) { + return; + } + + wsvp._getSpacing = wsvp._getSpacingOld; + delete wsvp._getSpacingOld; + } + + /** + * set workspaces view spacing size + * + * @param {number} size in pixels (0 - 500) + * + * @returns {void} + */ + workspacesViewSpacingSizeSet(size) + { + if (size < 0 || size > 500) { + return; + } + + let wsvp = this._workspacesView.WorkspacesView.prototype; + + if (wsvp._getSpacingOld === undefined) { + wsvp._getSpacingOld = wsvp._getSpacing; + } + + wsvp._getSpacing = function (box, fitMode, vertical) { + if (fitMode === 0) { + return size; + } + return this._getSpacingOld(box, fitMode, vertical); + }; + } + + /** + * show dash app running dot + * + * @returns {void} + */ + dashAppRunningDotShow() + { + this.UIStyleClassRemove(this.#getAPIClassname('no-dash-app-running-dot')); + } + + /** + * hide dash app running dot + * + * @returns {void} + */ + dashAppRunningDotHide() + { + this.UIStyleClassAdd(this.#getAPIClassname('no-dash-app-running-dot')); + } + + /** + * show dark style toggle button in quick settings + * + * @returns {void} + */ + quickSettingsDarkStyleToggleShow() + { + this.#onQuickSettingsPropertyCall('_darkMode', (darkMode) => { + darkMode.quickSettingsItems[0].show(); + }); + } + + /** + * hide dark style toggle button in quick settings + * + * @returns {void} + */ + quickSettingsDarkStyleToggleHide() + { + this.#onQuickSettingsPropertyCall('_darkMode', (darkMode) => { + darkMode.quickSettingsItems[0].hide(); + }); + } + + /** + * set workspaces view spacing size + * + * @param {string} propertyName + * @param {Function} func function to call when the property is available + * + * @returns {void} + */ + #onQuickSettingsPropertyCall(propertyName, func) + { + const quickSettings = this._main.panel.statusArea.quickSettings; + + this._glib.idle_add(this._glib.PRIORITY_DEFAULT_IDLE, () => { + if (!quickSettings[propertyName]) { + return this._glib.SOURCE_CONTINUE; + } + func(quickSettings[propertyName]); + return this._glib.SOURCE_REMOVE; + }); + } +} diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Manager.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Manager.js new file mode 100755 index 0000000..95b14d1 --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Manager.js @@ -0,0 +1,1481 @@ +/** + * Manager Library + * + * @author Javad Rahmatzadeh + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +/** + * Apply settings to the GNOME Shell + */ +export class Manager +{ + /** + * Current shell version + * + * @type {number|null} + */ + #shellVersion = null; + + /** + * Instance of API + * + * @type {API|null} + */ + #api = null; + + /** + * Instance of Gio.Settings + * + * @type {Settings|null} + */ + #settings = null; + + /** + * Class Constructor + * + * @param {Object} dependencies + * 'API' instance of lib::API + * 'Settings' instance of Gio::Settings + * @param {number} shellVersion float in major.minor format + */ + constructor(dependencies, shellVersion) + { + this.#api = dependencies['API'] || null; + this.#settings = dependencies['Settings'] || null; + + this.#shellVersion = shellVersion; + } + + /** + * register all signals for settings + * + * @returns {void} + */ + registerSettingsSignals() + { + this.#settings.connect('changed::panel', () => { + this.#applyPanel(false); + }); + + this.#settings.connect('changed::panel-in-overview', () => { + this.#applyPanel(false); + }); + + this.#settings.connect('changed::search', () => { + this.#applySearch(false); + }); + + this.#settings.connect('changed::dash', () => { + this.#applyDash(false); + }); + + this.#settings.connect('changed::osd', () => { + this.#applyOSD(false); + }); + + this.#settings.connect('changed::workspace-popup', () => { + this.#applyWorkspacePopup(false); + }); + + this.#settings.connect('changed::workspace', () => { + this.#applyWorkspace(false); + }); + + this.#settings.connect('changed::background-menu', () => { + this.#applyBackgroundMenu(false); + }); + + this.#settings.connect('changed::theme', () => { + this.#applyTheme(false); + }); + + this.#settings.connect('changed::activities-button', () => { + this.#applyActivitiesButton(false); + }); + + this.#settings.connect('changed::clock-menu', () => { + this.#applyClockMenu(false); + }); + + this.#settings.connect('changed::keyboard-layout', () => { + this.#applyKeyboardLayout(false); + }); + + this.#settings.connect('changed::accessibility-menu', () => { + this.#applyAccessibilityMenu(false); + }); + + this.#settings.connect('changed::quick-settings', () => { + this.#applyQuickSettings(false); + }); + + this.#settings.connect('changed::quick-settings-dark-mode', () => { + this.#applyQuickSettingsDarkMode(false); + }); + + this.#settings.connect('changed::window-picker-icon', () => { + this.#applyWindowPickerIcon(false); + }); + + this.#settings.connect('changed::type-to-search', () => { + this.#applyTypeToSearch(false); + }); + + this.#settings.connect('changed::workspace-switcher-size', () => { + this.#applyWorkspaceSwitcherSize(false); + }); + + this.#settings.connect('changed::power-icon', () => { + this.#applyPowerIcon(false); + }); + + this.#settings.connect('changed::top-panel-position', () => { + this.#applyTopPanelPosition(false); + }); + + this.#settings.connect('changed::panel-notification-icon', () => { + this.#applyPanelNotificationIcon(false); + }); + + this.#settings.connect('changed::clock-menu-position', () => { + this.#applyClockMenuPosition(false); + }); + + this.#settings.connect('changed::clock-menu-position-offset', () => { + this.#applyClockMenuPosition(false); + }); + + this.#settings.connect('changed::show-apps-button', () => { + this.#applyShowAppsButton(false); + }); + + this.#settings.connect('changed::animation', () => { + this.#applyAnimation(false); + }); + + this.#settings.connect('changed::window-demands-attention-focus', () => { + this.#applyWindowDemandsAttentionFocus(false); + }); + + this.#settings.connect('changed::window-maximized-on-create', () => { + this.#applyWindowMaximizedOnCreate(false); + }); + + this.#settings.connect('changed::dash-icon-size', () => { + this.#applyDashIconSize(false); + }); + + this.#settings.connect('changed::startup-status', () => { + this.#applyStartupStatus(false); + }); + + this.#settings.connect('changed::workspaces-in-app-grid', () => { + this.#applyWorkspacesInAppGrid(false); + }); + + this.#settings.connect('changed::notification-banner-position', () => { + this.#applyNotificationBannerPosition(false); + }); + + this.#settings.connect('changed::workspace-switcher-should-show', () => { + this.#applyWorkspaceSwitcherShouldShow(false); + }); + + this.#settings.connect('changed::panel-size', () => { + this.#applyPanelSize(false); + }); + + this.#settings.connect('changed::panel-button-padding-size', () => { + this.#applyPanelButtonPaddingSize(false); + }); + + this.#settings.connect('changed::panel-indicator-padding-size', () => { + this.#applyPanelIndicatorPaddingSize(false); + }); + + this.#settings.connect('changed::window-preview-caption', () => { + this.#applyWindowPreviewCaption(false); + }); + + this.#settings.connect('changed::window-preview-close-button', () => { + this.#applyWindowPreviewCloseButton(false); + }); + + this.#settings.connect('changed::workspace-background-corner-size', () => { + this.#applyWorkspaceBackgroundCornerSize(false); + }); + + this.#settings.connect('changed::workspace-wrap-around', () => { + this.#applyWorkspaceWrapAround(false); + }); + + this.#settings.connect('changed::ripple-box', () => { + this.#applyRippleBox(false); + }); + + this.#settings.connect('changed::overlay-key', () => { + this.#applyOverlayKey(false); + }); + + this.#settings.connect('changed::double-super-to-appgrid', () => { + this.#applyOverlayKey(false); + }); + + this.#settings.connect('changed::switcher-popup-delay', () => { + this.#applySwitcherPopupDelay(false); + }); + + this.#settings.connect('changed::world-clock', () => { + this.#applyWorldClock(false); + }); + + this.#settings.connect('changed::weather', () => { + this.#applyWeather(false); + }); + + this.#settings.connect('changed::calendar', () => { + this.#applyCalendar(false); + }); + + this.#settings.connect('changed::events-button', () => { + this.#applyEventsButton(false); + }); + + this.#settings.connect('changed::panel-icon-size', () => { + this.#applyPanelIconSize(false); + }); + + this.#settings.connect('changed::dash-separator', () => { + this.#applyDashSeparator(false); + }); + + this.#settings.connect('changed::looking-glass-width', () => { + this.#applyLookingGlassSize(false); + }); + + this.#settings.connect('changed::looking-glass-height', () => { + this.#applyLookingGlassSize(false); + }); + + this.#settings.connect('changed::osd-position', () => { + this.#applyOSDPosition(false); + }); + + this.#settings.connect('changed::window-menu-take-screenshot-button', () => { + this.#applyWindowMenuTakeScreenshotButton(false); + }); + + this.#settings.connect('changed::alt-tab-window-preview-size', () => { + this.#applyAltTabWindowPreviewSize(false); + }); + + this.#settings.connect('changed::alt-tab-small-icon-size', () => { + this.#applyAltTabSmallIconSize(false); + }); + + this.#settings.connect('changed::alt-tab-icon-size', () => { + this.#applyAltTabIconSize(false); + }); + + this.#settings.connect('changed::screen-sharing-indicator', () => { + this.#applyScreenSharingIndicator(false); + }); + + this.#settings.connect('changed::screen-recording-indicator', () => { + this.#applyScreenRecordingIndicator(false); + }); + + this.#settings.connect('changed::controls-manager-spacing-size', () => { + this.#applyControlsManagerSpacingSize(false); + }); + + this.#settings.connect('changed::workspace-peek', () => { + this.#applyWorkspacePeek(false); + }); + + this.#settings.connect('changed::dash-app-running', () => { + this.#applyDashAppRunning(false); + }); + + this.#settings.connect('changed::max-displayed-search-results', () => { + this.#applyMaxDisplayedSearchResults(false); + }); + } + + /** + * apply everything to the GNOME Shell + * + * @returns {void} + */ + applyAll() + { + this.#applyTheme(false); + this.#applyPanel(false); + this.#applySearch(false); + this.#applyDash(false); + this.#applyOSD(false); + this.#applyWorkspacePopup(false); + this.#applyWorkspace(false); + this.#applyBackgroundMenu(false); + this.#applyActivitiesButton(false); + this.#applyClockMenu(false); + this.#applyKeyboardLayout(false); + this.#applyAccessibilityMenu(false); + this.#applyQuickSettings(false); + this.#applyQuickSettingsDarkMode(false); + this.#applyWindowPickerIcon(false); + this.#applyTypeToSearch(false); + this.#applyWorkspaceSwitcherSize(false); + this.#applyPowerIcon(false); + this.#applyTopPanelPosition(false); + this.#applyPanelNotificationIcon(false); + this.#applyClockMenuPosition(false); + this.#applyShowAppsButton(false); + this.#applyAnimation(false); + this.#applyWindowDemandsAttentionFocus(false); + this.#applyWindowMaximizedOnCreate(false); + this.#applyDashIconSize(false); + this.#applyStartupStatus(false); + this.#applyWorkspacesInAppGrid(false); + this.#applyNotificationBannerPosition(false); + this.#applyWorkspaceSwitcherShouldShow(false); + this.#applyPanelSize(false); + this.#applyPanelButtonPaddingSize(false); + this.#applyPanelIndicatorPaddingSize(false); + this.#applyWindowPreviewCaption(false); + this.#applyWindowPreviewCloseButton(false); + this.#applyWorkspaceBackgroundCornerSize(false); + this.#applyWorkspaceWrapAround(false); + this.#applyRippleBox(false); + this.#applyOverlayKey(false); + this.#applySwitcherPopupDelay(false); + this.#applyWorldClock(false); + this.#applyWeather(false); + this.#applyPanelIconSize(false); + this.#applyEventsButton(false); + this.#applyCalendar(false); + this.#applyDashSeparator(false); + this.#applyLookingGlassSize(false); + this.#applyOSDPosition(false); + this.#applyWindowMenuTakeScreenshotButton(false); + this.#applyAltTabWindowPreviewSize(false); + this.#applyAltTabSmallIconSize(false); + this.#applyAltTabIconSize(false); + this.#applyScreenSharingIndicator(false); + this.#applyScreenRecordingIndicator(false); + this.#applyControlsManagerSpacingSize(false); + this.#applyWorkspacePeek(false); + this.#applyDashAppRunning(false); + this.#applyMaxDisplayedSearchResults(false); + } + + /** + * revert everything done by this class to the GNOME Shell + * + * @returns {void} + */ + revertAll() + { + this.#applyTheme(true); + this.#applyPanel(true); + this.#applySearch(true); + this.#applyDash(true); + this.#applyOSD(true); + this.#applyWorkspace(true); + this.#applyWorkspacePopup(true); + this.#applyBackgroundMenu(true); + this.#applyActivitiesButton(true); + this.#applyClockMenu(true); + this.#applyKeyboardLayout(true); + this.#applyAccessibilityMenu(true); + this.#applyQuickSettings(true); + this.#applyQuickSettingsDarkMode(true); + this.#applyWindowPickerIcon(true); + this.#applyTypeToSearch(true); + this.#applyWorkspaceSwitcherSize(true); + this.#applyPowerIcon(true); + this.#applyTopPanelPosition(true); + this.#applyPanelNotificationIcon(true); + this.#applyClockMenuPosition(true); + this.#applyShowAppsButton(true); + this.#applyAnimation(true); + this.#applyWindowDemandsAttentionFocus(true); + this.#applyWindowMaximizedOnCreate(true); + this.#applyDashIconSize(true); + this.#applyStartupStatus(true); + this.#applyWorkspacesInAppGrid(true); + this.#applyNotificationBannerPosition(true); + this.#applyWorkspaceSwitcherShouldShow(true); + this.#applyPanelSize(true); + this.#applyPanelButtonPaddingSize(true); + this.#applyPanelIndicatorPaddingSize(true); + this.#applyWindowPreviewCaption(true); + this.#applyWindowPreviewCloseButton(true); + this.#applyWorkspaceBackgroundCornerSize(true); + this.#applyWorkspaceWrapAround(true); + this.#applyRippleBox(true); + this.#applyOverlayKey(true); + this.#applySwitcherPopupDelay(true); + this.#applyWorldClock(true); + this.#applyWeather(true); + this.#applyPanelIconSize(true); + this.#applyEventsButton(true); + this.#applyCalendar(true); + this.#applyDashSeparator(true); + this.#applyLookingGlassSize(true); + this.#applyOSDPosition(true); + this.#applyWindowMenuTakeScreenshotButton(true); + this.#applyAltTabWindowPreviewSize(true); + this.#applyAltTabSmallIconSize(true); + this.#applyAltTabIconSize(true); + this.#applyScreenSharingIndicator(true); + this.#applyScreenRecordingIndicator(true); + this.#applyControlsManagerSpacingSize(true); + this.#applyWorkspacePeek(true); + this.#applyDashAppRunning(true); + this.#applyMaxDisplayedSearchResults(true); + } + + /** + * apply panel settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanel(forceOriginal) + { + let panel = this.#settings.get_boolean('panel'); + let panelInOverview = this.#settings.get_boolean('panel-in-overview'); + + if (forceOriginal || panel) { + this.#api.panelShow(); + } else { + let mode = (panelInOverview) ? 1 : 0; + this.#api.panelHide(mode); + } + } + + /** + * apply search settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applySearch(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('search')) { + this.#api.searchEntryShow(false); + } else { + this.#api.searchEntryHide(false); + } + } + + /** + * apply type to search settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyTypeToSearch(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('type-to-search')) { + this.#api.startSearchEnable(); + } else { + this.#api.startSearchDisable(); + } + } + + /** + * apply dash settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyDash(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('dash')) { + this.#api.dashShow(); + } else { + this.#api.dashHide(); + } + } + + /** + * apply osd settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyOSD(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('osd')) { + this.#api.OSDEnable(); + } else { + this.#api.OSDDisable(); + } + } + + /** + * apply workspace popup settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspacePopup(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('workspace-popup')) { + this.#api.workspacePopupEnable(); + } else { + this.#api.workspacePopupDisable(); + } + } + + /** + * apply workspace settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspace(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('workspace')) { + this.#api.workspaceSwitcherShow(); + } else { + this.#api.workspaceSwitcherHide(); + } + } + + /** + * apply background menu settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyBackgroundMenu(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('background-menu')) { + this.#api.backgroundMenuEnable(); + } else { + this.#api.backgroundMenuDisable(); + } + } + + /** + * apply theme settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyTheme(forceOriginal) + { + let className = 'just-perfection'; + + if (forceOriginal || !this.#settings.get_boolean('theme')) { + this.#api.UIStyleClassRemove(className); + } else { + this.#api.UIStyleClassAdd(className); + } + } + + /** + * apply activities button settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyActivitiesButton(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('activities-button')) { + this.#api.activitiesButtonShow(); + } else { + this.#api.activitiesButtonHide(); + } + } + + /** + * apply clock menu (aka date menu) settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyClockMenu(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('clock-menu')) { + this.#api.dateMenuShow(); + } else { + this.#api.dateMenuHide(); + } + } + + /** + * apply keyboard layout settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyKeyboardLayout(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('keyboard-layout')) { + this.#api.keyboardLayoutShow(); + } else { + this.#api.keyboardLayoutHide(); + } + } + + /** + * apply accessibility menu settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyAccessibilityMenu(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('accessibility-menu')) { + this.#api.accessibilityMenuShow(); + } else { + this.#api.accessibilityMenuHide(); + } + } + + /** + * apply quick settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyQuickSettings(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('quick-settings')) { + this.#api.quickSettingsMenuShow(); + } else { + this.#api.quickSettingsMenuHide(); + } + } + + /** + * apply quick settings dark mode + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyQuickSettingsDarkMode(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('quick-settings-dark-mode')) { + this.#api.quickSettingsDarkStyleToggleShow(); + } else { + this.#api.quickSettingsDarkStyleToggleHide(); + } + } + + /** + * apply window picker icon settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowPickerIcon(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('window-picker-icon')) { + this.#api.windowPickerIconEnable(); + } else { + this.#api.windowPickerIconDisable(); + } + } + + /** + * apply workspace switcher size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspaceSwitcherSize(forceOriginal) + { + let size = this.#settings.get_int('workspace-switcher-size'); + + if (forceOriginal || size === 0) { + this.#api.workspaceSwitcherSetDefaultSize(); + } else { + this.#api.workspaceSwitcherSetSize(size / 100); + } + } + + /** + * apply power icon settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPowerIcon(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('power-icon')) { + this.#api.powerIconShow(); + } else { + this.#api.powerIconHide(); + } + } + + /** + * apply top panel position settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyTopPanelPosition(forceOriginal) + { + if (forceOriginal || this.#settings.get_int('top-panel-position') === 0) { + this.#api.panelSetPosition(0); + } else { + this.#api.panelSetPosition(1); + } + } + + /** + * apply panel notification icon settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanelNotificationIcon(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('panel-notification-icon')) { + this.#api.panelNotificationIconEnable(); + } else { + this.#api.panelNotificationIconDisable(); + } + } + + /** + * apply clock menu position settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyClockMenuPosition(forceOriginal) + { + if (forceOriginal) { + this.#api.clockMenuPositionSetDefault(); + } else { + let pos = this.#settings.get_int('clock-menu-position'); + let offset = this.#settings.get_int('clock-menu-position-offset'); + this.#api.clockMenuPositionSet(pos, offset); + } + } + + /** + * apply show apps button settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyShowAppsButton(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('show-apps-button')) { + this.#api.showAppsButtonEnable(); + } else { + this.#api.showAppsButtonDisable(); + } + } + + /** + * apply animation settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyAnimation(forceOriginal) + { + let animation = this.#settings.get_int('animation'); + + let factors = [ + 0.01, // almost none + 0.2, // fastest + 0.6, // faster + 0.8, // fast + 1.3, // slow + 1.6, // slower + 2.8, // slowest + ]; + + if (forceOriginal) { + this.#api.animationSpeedSetDefault(); + this.#api.enableAnimationsSetDefault(); + } else if (animation === 0) { + // disabled + this.#api.animationSpeedSetDefault(); + this.#api.enableAnimationsSet(false); + } else if (animation === 1) { + // default speed + this.#api.animationSpeedSetDefault(); + this.#api.enableAnimationsSet(true); + } else if (factors[animation - 2] !== undefined) { + // custom speed + this.#api.animationSpeedSet(factors[animation - 2]); + this.#api.enableAnimationsSet(true); + } + } + + /** + * apply window demands attention focus settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowDemandsAttentionFocus(forceOriginal) + { + let focus = this.#settings.get_boolean('window-demands-attention-focus'); + + if (forceOriginal || !focus) { + this.#api.windowDemandsAttentionFocusDisable(); + } else { + this.#api.windowDemandsAttentionFocusEnable(); + } + } + + /** + * apply window maximized on create settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowMaximizedOnCreate(forceOriginal) + { + let maximize = this.#settings.get_boolean('window-maximized-on-create'); + + if (forceOriginal || !maximize) { + this.#api.windowMaximizedOnCreateDisable(); + } else { + this.#api.windowMaximizedOnCreateEnable(); + } + } + + /** + * apply dash icon size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyDashIconSize(forceOriginal) + { + let size = this.#settings.get_int('dash-icon-size'); + + if (forceOriginal || size === 0) { + this.#api.dashIconSizeSetDefault(); + } else { + this.#api.dashIconSizeSet(size); + } + } + + /** + * apply startup status settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyStartupStatus(forceOriginal) + { + let status = this.#settings.get_int('startup-status'); + + if (forceOriginal) { + this.#api.startupStatusSetDefault(); + } else { + this.#api.startupStatusSet(status); + } + } + + /** + * apply workspaces in app grid status settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspacesInAppGrid(forceOriginal) + { + let status = this.#settings.get_boolean('workspaces-in-app-grid'); + + if (forceOriginal || status) { + this.#api.workspacesInAppGridEnable(); + } else { + this.#api.workspacesInAppGridDisable(); + } + } + + /** + * apply notification banner position settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyNotificationBannerPosition(forceOriginal) + { + let pos = this.#settings.get_int('notification-banner-position'); + + if (forceOriginal) { + this.#api.notificationBannerPositionSetDefault(); + } else { + this.#api.notificationBannerPositionSet(pos); + } + } + + /** + * apply workspace switcher should show settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspaceSwitcherShouldShow(forceOriginal) + { + let shouldShow = this.#settings.get_boolean('workspace-switcher-should-show'); + + if (forceOriginal || !shouldShow) { + this.#api.workspaceSwitcherShouldShowSetDefault(); + } else { + this.#api.workspaceSwitcherShouldShow(true); + } + } + + /** + * apply panel size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanelSize(forceOriginal) + { + let size = this.#settings.get_int('panel-size'); + + if (forceOriginal || size === 0) { + this.#api.panelSetDefaultSize(); + } else { + this.#api.panelSetSize(size, false); + } + } + + /** + * apply panel button padding size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanelButtonPaddingSize(forceOriginal) + { + let size = this.#settings.get_int('panel-button-padding-size'); + + if (forceOriginal || size === 0) { + this.#api.panelButtonHpaddingSetDefault(); + } else { + this.#api.panelButtonHpaddingSizeSet(size - 1); + } + } + + /** + * apply panel indicator padding size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanelIndicatorPaddingSize(forceOriginal) + { + let size = this.#settings.get_int('panel-indicator-padding-size'); + + if (forceOriginal || size === 0) { + this.#api.panelIndicatorPaddingSetDefault(); + } else { + this.#api.panelIndicatorPaddingSizeSet(size - 1); + } + } + + /** + * apply window preview caption settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowPreviewCaption(forceOriginal) + { + let status = this.#settings.get_boolean('window-preview-caption'); + + if (forceOriginal || status) { + this.#api.windowPreviewCaptionEnable(); + } else { + this.#api.windowPreviewCaptionDisable(); + } + } + + /** + * apply window preview close button settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowPreviewCloseButton(forceOriginal) + { + let status = this.#settings.get_boolean('window-preview-close-button'); + + if (forceOriginal || status) { + this.#api.windowPreviewCloseButtonEnable(); + } else { + this.#api.windowPreviewCloseButtonDisable(); + } + } + + /** + * apply workspace background corner size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspaceBackgroundCornerSize(forceOriginal) + { + let size = this.#settings.get_int('workspace-background-corner-size'); + + if (forceOriginal || size === 0) { + this.#api.workspaceBackgroundRadiusSetDefault(); + } else { + this.#api.workspaceBackgroundRadiusSet(size - 1); + } + } + + /** + * apply workspace wrap around settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspaceWrapAround(forceOriginal) + { + let status = this.#settings.get_boolean('workspace-wrap-around'); + + if (forceOriginal || !status) { + this.#api.workspaceWraparoundDisable(); + } else { + this.#api.workspaceWraparoundEnable(); + } + } + + /** + * apply ripple box settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyRippleBox(forceOriginal) + { + let status = this.#settings.get_boolean('ripple-box'); + + if (forceOriginal || status) { + this.#api.rippleBoxEnable(); + } else { + this.#api.rippleBoxDisable(); + } + } + + /** + * apply overlay key + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyOverlayKey(forceOriginal) + { + let overlayKey = this.#settings.get_boolean('overlay-key'); + let doubleSuper = this.#settings.get_boolean('double-super-to-appgrid'); + + if (forceOriginal) { + this.#api.doubleSuperToAppGridEnable(); + this.#api.unblockOverlayKey(); + } else if (!overlayKey) { + this.#api.doubleSuperToAppGridEnable(); + this.#api.blockOverlayKey(); + } else { + this.#api.unblockOverlayKey(); + if (doubleSuper) { + this.#api.doubleSuperToAppGridEnable(); + } else { + this.#api.doubleSuperToAppGridDisable(); + } + } + } + + /** + * apply switcher popup delay settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applySwitcherPopupDelay(forceOriginal) + { + let status = this.#settings.get_boolean('switcher-popup-delay'); + + if (forceOriginal || status) { + this.#api.switcherPopupDelaySetDefault(); + } else { + this.#api.removeSwitcherPopupDelay(); + } + } + + /** + * apply world clock settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorldClock(forceOriginal) + { + let status = this.#settings.get_boolean('world-clock'); + + if (forceOriginal || status) { + this.#api.worldClocksShow(); + } else { + this.#api.worldClocksHide(); + } + } + + /** + * apply weather settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWeather(forceOriginal) + { + let status = this.#settings.get_boolean('weather'); + + if (forceOriginal || status) { + this.#api.weatherShow(); + } else { + this.#api.weatherHide(); + } + } + + /** + * apply calendar settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyCalendar(forceOriginal) + { + let status = this.#settings.get_boolean('calendar'); + + if (forceOriginal || status) { + this.#api.calendarShow(); + } else { + this.#api.calendarHide(); + } + } + + /** + * apply events button settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyEventsButton(forceOriginal) + { + let status = this.#settings.get_boolean('events-button'); + + if (forceOriginal || status) { + this.#api.eventsButtonShow(); + } else { + this.#api.eventsButtonHide(); + } + } + + /** + * apply panel icon size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyPanelIconSize(forceOriginal) + { + let size = this.#settings.get_int('panel-icon-size'); + + if (forceOriginal || size === 0) { + this.#api.panelIconSetDefaultSize(); + } else { + this.#api.panelIconSetSize(size); + } + } + + /** + * apply dash separator settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyDashSeparator(forceOriginal) + { + let status = this.#settings.get_boolean('dash-separator'); + + if (forceOriginal || status) { + this.#api.dashSeparatorShow(); + } else { + this.#api.dashSeparatorHide(); + } + } + + /** + * apply looking glass size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyLookingGlassSize(forceOriginal) + { + let widthSize = this.#settings.get_int('looking-glass-width'); + let heightSize = this.#settings.get_int('looking-glass-height'); + + if (forceOriginal) { + this.#api.lookingGlassSetDefaultSize(); + } else { + let width = (widthSize !== 0) ? widthSize / 10 : null; + let height = (heightSize !== 0) ? heightSize / 10 : null; + this.#api.lookingGlassSetSize(width, height); + } + } + + /** + * apply osd position settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyOSDPosition(forceOriginal) + { + let pos = this.#settings.get_int('osd-position'); + + if (forceOriginal || pos === 0) { + this.#api.osdPositionSetDefault(); + } else { + this.#api.osdPositionSet(pos - 1); + } + } + + /** + * apply window menu take screenshot button settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWindowMenuTakeScreenshotButton(forceOriginal) + { + let status = this.#settings.get_boolean('window-menu-take-screenshot-button'); + + if (forceOriginal || status) { + this.#api.screenshotInWindowMenuShow(); + } else { + this.#api.screenshotInWindowMenuHide(); + } + } + + /** + * apply alt tab window preview size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyAltTabWindowPreviewSize(forceOriginal) + { + let size = this.#settings.get_int('alt-tab-window-preview-size'); + + if (forceOriginal || size === 0) { + this.#api.altTabWindowPreviewSetDefaultSize(); + } else { + this.#api.altTabWindowPreviewSetSize(size); + } + } + + /** + * apply alt tab small icon size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyAltTabSmallIconSize(forceOriginal) + { + let size = this.#settings.get_int('alt-tab-small-icon-size'); + + if (forceOriginal || size === 0) { + this.#api.altTabSmallIconSetDefaultSize(); + } else { + this.#api.altTabSmallIconSetSize(size); + } + } + + /** + * apply alt tab icon size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyAltTabIconSize(forceOriginal) + { + let size = this.#settings.get_int('alt-tab-icon-size'); + + if (forceOriginal || size === 0) { + this.#api.altTabIconSetDefaultSize(); + } else { + this.#api.altTabIconSetSize(size); + } + } + + /** + * apply screen sharing indicator settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyScreenSharingIndicator(forceOriginal) + { + let status = this.#settings.get_boolean('screen-sharing-indicator'); + + if (forceOriginal || status) { + this.#api.screenSharingIndicatorEnable(); + } else { + this.#api.screenSharingIndicatorDisable(); + } + } + + /** + * apply screen recording indicator settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyScreenRecordingIndicator(forceOriginal) + { + let status = this.#settings.get_boolean('screen-recording-indicator'); + + if (forceOriginal || status) { + this.#api.screenRecordingIndicatorEnable(); + } else { + this.#api.screenRecordingIndicatorDisable(); + } + } + + /** + * apply controls manager spacing size settings + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyControlsManagerSpacingSize(forceOriginal) + { + let size = this.#settings.get_int('controls-manager-spacing-size'); + + if (forceOriginal || size === 0) { + this.#api.controlsManagerSpacingSetDefault(); + } else { + this.#api.controlsManagerSpacingSizeSet(size); + } + } + + /** + * apply workspace peek + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyWorkspacePeek(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('workspace-peek')) { + this.#api.workspacesViewSpacingSetDefault(); + } else { + this.#api.workspacesViewSpacingSizeSet(400); + } + } + + /** + * apply dash app running + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyDashAppRunning(forceOriginal) + { + if (forceOriginal || this.#settings.get_boolean('dash-app-running')) { + this.#api.dashAppRunningDotShow(); + } else { + this.#api.dashAppRunningDotHide(); + } + } + + /** + * apply max displayed search results + * + * @param {boolean} forceOriginal force original shell setting + * + * @returns {void} + */ + #applyMaxDisplayedSearchResults(forceOriginal) + { + let items = this.#settings.get_int('max-displayed-search-results'); + + if (forceOriginal || items === 0) { + this.#api.setMaxDisplayedSearchResultToDefault(); + } else { + this.#api.setMaxDisplayedSearchResult(items); + } + } +} + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/Prefs.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/Prefs.js new file mode 100755 index 0000000..04b1e7e --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/Prefs.js @@ -0,0 +1,410 @@ +/** + * Prefs Library + * + * @author Javad Rahmatzadeh + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +/** + * prefs widget for showing prefs window + */ +export class Prefs +{ + /** + * Current shell version + * + * @type {number|null} + */ + #shellVersion = null; + + /** + * Instance of PrefsKeys + * + * @type {PrefsKeys|null} + */ + #prefsKeys = null; + + /** + * Instance of Gtk.Builder + * + * @type {Gtk.Builder|null} + */ + #builder = null; + + /** + * Instance of Gio.Settings + * + * @type {Settings|null} + */ + #settings = null; + + /** + * Instance of Resource + * + * @type {Gio.Resource|null} + */ + #resource = null; + + /** + * Instance of Gdk + * + * @type {Gdk|null} + */ + #gdk = null; + + /** + * Instance of Gio + * + * @type {Gio|null} + */ + #gio = null; + + /** + * All available profile names + * + * @type {Array} + */ + #profiles = [ + 'default', + 'minimal', + 'superminimal', + ]; + + /** + * class constructor + * + * @param {Object} dependencies + * 'Builder' instance of Gtk::Builder + * 'Settings' instance of Gio::Settings + * 'Gdk' reference to Gdk + * 'Gio' reference to Gio + * @param {PrefsKeys.PrefsKeys} prefsKeys instance of PrefsKeys + * @param {number} shellVersion float in major.minor format + */ + constructor(dependencies, prefsKeys, shellVersion) + { + this.#settings = dependencies['Settings'] || null; + this.#builder = dependencies['Builder'] || null; + this.#gdk = dependencies['Gdk'] || null; + this.#gio = dependencies['Gio'] || null; + + this.#prefsKeys = prefsKeys; + this.#shellVersion = shellVersion; + } + + /** + * fill prefs window + * + * @param {Adw.PreferencesWindow} window prefs dialog + * @param {string} ResourcesFolderPath folder path to resources folder + * @param {string} gettextDomain gettext domain + * + * @returns {void} + */ + fillPrefsWindow(window, ResourcesFolderPath, gettextDomain) + { + // changing the order here can change the elements order in ui + let uiFilenames = [ + 'profile', + 'visibility', + 'icons', + 'behavior', + 'customize', + ]; + + this.#loadResource(ResourcesFolderPath); + + this.#builder.set_translation_domain(gettextDomain); + for (let uiFilename of uiFilenames) { + this.#builder.add_from_resource( + `/org/gnome/Shell/Extensions/justperfection/ui/${uiFilename}.ui` + ); + } + + for (let uiFilename of uiFilenames) { + let page = this.#builder.get_object(uiFilename); + window.add(page); + } + + this.#setValues(); + this.#guessProfile(); + this.#onlyShowSupportedRows(); + this.#registerAllSignals(window); + + this.#setWindowSize(window); + + window.search_enabled = true; + } + + /** + * load resource + * + * @param {string} folder path to the resources folder + * + * @returns {void} + */ + #loadResource(path) + { + this.#resource = this.#gio.Resource.load(`${path}/resources.gresource`); + this.#gio.resources_register(this.#resource); + } + + /** + * set window size + * + * @param {Adw.PreferencesWindow} window prefs window + * + * @returns {void} + */ + #setWindowSize(window) + { + let [pmWidth, pmHeight, pmScale] = this.#getPrimaryMonitorInfo(); + let sizeTolerance = 50; + let width = 600; + let height = 730; + + if ( + (pmWidth / pmScale) - sizeTolerance >= width && + (pmHeight / pmScale) - sizeTolerance >= height + ) { + window.set_default_size(width, height); + } + } + + /** + * get primary monitor info + * + * @returns {Array} [width, height, scale] + */ + #getPrimaryMonitorInfo() + { + let display = this.#gdk.Display.get_default(); + + let pm = display.get_monitors().get_item(0); + + if (!pm) { + return [700, 500, 1]; + } + + let geo = pm.get_geometry(); + let scale = pm.get_scale_factor(); + + return [geo.width, geo.height, scale]; + } + + /** + * register all signals + * + * @param {Adw.PreferencesWindow} window prefs dialog + * + * @returns {void} + */ + #registerAllSignals(window) + { + this.#registerKeySignals(); + this.#registerProfileSignals(); + this.#registerCloseSignal(window); + } + + /** + * register close signal + * + * @param {Adw.PreferencesWindow} window prefs dialog + * + * @returns {void} + */ + #registerCloseSignal(window) + { + window.connect('close-request', () => { + if (this.#resource) { + this.#gio.resources_unregister(this.#resource); + } + }); + } + + /** + * register signals of all prefs keys + * + * @returns {void} + */ + #registerKeySignals() + { + // all available keys + for (let [, key] of Object.entries(this.#prefsKeys.keys)) { + + switch (key.widgetType) { + + case 'GtkSwitch': + this.#builder.get_object(key.widgetId).connect('state-set', (w) => { + this.#settings.set_boolean(key.name, w.get_active()); + this.#guessProfile(); + }); + break; + + case 'AdwActionRow': + this.#builder.get_object(key.widgetId).connect('notify::selected-item', (w) => { + let index = w.get_selected(); + let value = (index in key.maps) ? key.maps[index] : index; + this.#settings.set_int(key.name, value); + this.#guessProfile(); + }); + break; + + case 'AdwSpinRow': + this.#builder.get_object(key.widgetId).connect('notify::value', (w) => { + let value = w.get_value(); + this.#settings.set_int(key.name, value); + this.#guessProfile(); + }); + break; + } + } + } + + /** + * register profile signals + * + * @returns {void} + */ + #registerProfileSignals() + { + for (let profile of this.#profiles) { + let widget = this.#builder.get_object(`profile_${profile}`); + if (!widget) { + break; + } + widget.connect('clicked', (w) => { + this.#setValues(profile); + }); + } + } + + /** + * can check all current values and guess the profile based on the values + * + * @returns {void} + */ + #guessProfile() + { + let totalCount = 0; + let matchCount = {}; + + for (let profile of this.#profiles) { + matchCount[profile] = 0; + } + + for (let [, key] of Object.entries(this.#prefsKeys.keys)) { + + if (!key.supported) { + continue; + } + + let value; + + switch (key.widgetType) { + case 'GtkSwitch': + value = this.#builder.get_object(key.widgetId).get_active(); + break; + case 'AdwActionRow': + value = this.#builder.get_object(key.widgetId).get_selected(); + break; + case 'AdwSpinRow': + value = this.#builder.get_object(key.widgetId).get_value(); + break; + default: + value = ''; + continue; + } + + for (let profile of this.#profiles) { + if (key.profiles[profile] === value) { + matchCount[profile]++; + } + } + + totalCount++; + } + + let currentProfile = 'custom'; + for (let profile of this.#profiles) { + if (matchCount[profile] === totalCount) { + currentProfile = profile; + break; + } + } + + let widget = this.#builder.get_object(`profile_${currentProfile}`); + if (widget) { + widget.set_active(true); + } + } + + /** + * set values for all elements + * + * @param {string} profile profile name or null for get it from gsettings + * + * @returns {void} + */ + #setValues(profile) + { + for (let [, key] of Object.entries(this.#prefsKeys.keys)) { + + let widget = this.#builder.get_object(key.widgetId); + + let value; + + switch (key.widgetType) { + + case 'GtkSwitch': + value + = (profile) + ? key.profiles[profile] + : this.#settings.get_boolean(key.name); + + widget.set_active(value); + break; + + case 'AdwActionRow': + let index + = (profile) + ? key.profiles[profile] + : this.#settings.get_int(key.name); + + for (let k in key.maps) { + if (key.maps[k] === index) { + index = k; + break; + } + } + widget.set_selected(index); + break; + + case 'AdwSpinRow': + value + = (profile) + ? key.profiles[profile] + : this.#settings.get_int(key.name); + + widget.set_value(value); + break; + } + } + } + + /** + * apply all supported keys to the elements + * + * @returns {void} + */ + #onlyShowSupportedRows() + { + for (let [, key] of Object.entries(this.#prefsKeys.keys)) { + let row = this.#builder.get_object(`${key.id}_row`); + let visible = key.supported; + row.visible = visible; + } + } +}; + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/PrefsKeys.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/PrefsKeys.js new file mode 100755 index 0000000..398c09a --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/PrefsKeys.js @@ -0,0 +1,880 @@ +/** + * PrefsKeys Library + * + * @author Javad Rahmatzadeh + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +/** + * prefs keys + */ +export class PrefsKeys +{ + /** + * Current shell version + * + * @type {number|null} + */ + #shellVersion = null; + + /** + * class constructor + * + * @param {number} shellVersion float in major.minor format + */ + constructor(shellVersion) + { + this.#shellVersion = shellVersion; + + /** + * holds all keys generated by this.#setKey() + * + * @member {Object} + */ + this.keys = {}; + + this.#setDefaults(); + } + + /** + * set all default keys + * + * @returns {void} + */ + #setDefaults() + { + this.#setKey( + 'visibility', + 'panel', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'panel-in-overview', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'activities-button', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'clock-menu', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'keyboard-layout', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'accessibility-menu', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'quick-settings', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'quick-settings-dark-mode', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'screen-sharing-indicator', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'screen-recording-indicator', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'search', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'dash', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'dash-separator', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'dash-app-running', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'osd', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'workspace-popup', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'workspace', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'background-menu', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'show-apps-button', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'workspaces-in-app-grid', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'window-preview-caption', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'window-preview-close-button', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'ripple-box', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'visibility', + 'world-clock', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'weather', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'calendar', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'events-button', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'visibility', + 'window-menu-take-screenshot-button', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'icons', + 'panel-notification-icon', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'icons', + 'power-icon', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'icons', + 'window-picker-icon', + 'GtkSwitch', + true, + { + default: true, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'behavior', + 'type-to-search', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'behavior', + 'window-demands-attention-focus', + 'GtkSwitch', + true, + { + default: false, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'behavior', + 'window-maximized-on-create', + 'GtkSwitch', + true, + { + default: false, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'behavior', + 'workspace-switcher-should-show', + 'GtkSwitch', + true, + { + default: false, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'behavior', + 'startup-status', + 'AdwActionRow', + true, + { + default: 1, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'behavior', + 'workspace-wrap-around', + 'GtkSwitch', + true, + { + default: false, + minimal: false, + superminimal: false, + } + ); + + this.#setKey( + 'behavior', + 'workspace-peek', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'behavior', + 'overlay-key', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'behavior', + 'double-super-to-appgrid', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: false, + } + ); + + this.#setKey( + 'behavior', + 'switcher-popup-delay', + 'GtkSwitch', + true, + { + default: true, + minimal: true, + superminimal: true, + } + ); + + this.#setKey( + 'customize', + 'controls-manager-spacing-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 22, + } + ); + + this.#setKey( + 'customize', + 'workspace-background-corner-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 15, + } + ); + + this.#setKey( + 'customize', + 'top-panel-position', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'clock-menu-position', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'clock-menu-position-offset', + 'AdwSpinRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'workspace-switcher-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'animation', + 'AdwActionRow', + true, + { + default: 1, + minimal: 1, + superminimal: 1, + } + ); + + this.#setKey( + 'customize', + 'dash-icon-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 1, + superminimal: 0, + }, + { + '1': 16, + '2': 22, + '3': 24, + '4': 32, + '5': 40, + '6': 48, + '7': 56, + '8': 64, + } + ); + + this.#setKey( + 'customize', + 'notification-banner-position', + 'AdwActionRow', + true, + { + default: 1, + minimal: 1, + superminimal: 1, + } + ); + + this.#setKey( + 'customize', + 'panel-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'panel-button-padding-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'panel-indicator-padding-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'panel-icon-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'osd-position', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'looking-glass-width', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'looking-glass-height', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'customize', + 'alt-tab-window-preview-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + }, + { + '0': 0, + '1': 32, + '2': 64, + '3': 128, + '4': 256, + '5': 512, + } + ); + + this.#setKey( + 'customize', + 'alt-tab-small-icon-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + }, + { + '0': 0, + '1': 32, + '2': 64, + '3': 128, + '4': 256, + '5': 512, + } + ); + + this.#setKey( + 'customize', + 'alt-tab-icon-size', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + }, + { + '0': 0, + '1': 32, + '2': 64, + '3': 128, + '4': 256, + '5': 512, + } + ); + + this.#setKey( + 'customize', + 'max-displayed-search-results', + 'AdwActionRow', + true, + { + default: 0, + minimal: 0, + superminimal: 0, + } + ); + + this.#setKey( + 'override', + 'theme', + 'GtkSwitch', + true, + { + default: false, + minimal: true, + superminimal: true, + } + ); + } + + /** + * set key + * + * @param {string} category possible values: + * - visibility + * - icons + * - behavior + * - customize + * - override + * @param {string} name should be the same as gsettings key name + * @param {string} widgetType gtk widget type like 'GtkSwitch'. + * @param {boolean} supported whether supported in the current shell + * @param {Object} profiles values for each profile. for example: + * {default: true, minimal: false} + * @param {Object} [maps] for example for combobox you can specify + * if the index is 1 use 32 as value: + * {1 : 32} + * + * @returns {void} + */ + #setKey(category, name, widgetType, supported, profiles, maps = {}) + { + let id = name.replace(/-/g, '_'); + let widgetName = widgetType.toLowerCase().replace('gtk', ''); + + let widgetId + = (widgetType === 'AdwActionRow' || widgetType === 'AdwSpinRow') + ? `${id}_row` + : `${id}_${widgetName}`; + + this.keys[id] = { + category, + widgetType, + name, + id, + widgetId, + supported, + profiles, + maps, + }; + } + + /** + * delete key + * + * @param {string} id key id + * + * @returns {void} + */ + deleteKey(id) + { + delete(this.keys[id]); + } +}; + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..64b1c7b6e6075bb4af2ef016ccd444c97902eba3 GIT binary patch literal 11200 zcma)?d5mPoUB{oX<6|))BsloOE(aW6+mqe(wHe!M&#}8+@6PUcXT0MhHhw)_-Tk(^ z-)r7`J+l)VI~$I~#Bqc~LPQh^EE|!;2v8CP2olTr!yMrXfgph_6bBFnfkYIMLyADEd73U+43O-#5QEirx%<3)~4_ zcwrR%0QgRjrsyzu6SxAN0G|&1uY!j9H^9rlw|-v~T>3P?!F}M{LG@cu`yYaucM24} z_kjlx_-*hA_yCJua#j@m3Me`+GFkliD^T;#L+Cp9W#9~WHMjzHK#l)A zC_aA~G~l;Eo$sUYn{syT1eGb&Re*%gx-vECN{BKZnUbxE3{d1u7?{7fq!{`X-owSHQ$O!S{n_gMR>O-WNgX;a39wD~RZ# zvzRP2;5p!(p!9zp)VxPP*-rvagQvkR_Y4N5OgUWpFomA;P%}+y`o%C&9ho?}FEYUk7!b%c)2%20Rzs32NONL9KU3=syA; zrhY%Db3F&*x}r~j*MTpBH-fK$;_nqSN^XyW;>Tm4U)T?OgTyE zQnXHoavMc^+o0%om;3Aej&!5?y_=6yp@P_>dnl-*vzOzb{Ob7>{eG6BbHeWE9TdrG z2c`P`3?B{31EJwzaE=mFzK4=f29)Y2S;1l_t6kvrq2s3lJ{horTdR*6-Wm3GQkvzsX%4Nj|E1*J+MRD% z;dt4)SO?(Yg^QcUYQM}`J{-Oee2lYk2g%uZkTI}(a`4l zye^v0M(SR2El5k}J(wr0X#X18QUs{kWKA9i;-ZZ72c>dA_3o@Rt682xKd$uC*mfIh zDI#&Khz{G0W)|lyb0o&R%B}VP!xJ2_?J_!&q`e|Kl4U)~Fyb5mkJpQYP(Si)J=X#r3hiZ|WRo z!_m+TgDv=_(%S68`AfqXSfk?<@W-anv8DM5MO8MFV6Y!(T1hdKetEZhCLR2tqi9e_ zH}G1hT^Ak0scITJ;l9y4JN}RlW+%==@Pz}%!pa0eZpg7X2_jcB@Denwpz|UsH|q#F zf4hWpm$o>!y6B>c`x^p^S&Un)&HXhW?njP|f4jk(cr7iD{G_oke08$CJllAii%vN6 z7Dhz=+u1(WZes$}CW%b6WVIWo9j~8b&1CvII^cJZXYHhKqkBgQ4s^+u3Rgv_;`LnB z$I5Z2J#Gj1Y0vkT_Tz$`ET;%j2L(WrH5hQ`bUgH0^8^iwTGJqod=_ypJb@9&2W^Q&CW+;}&1zBsUgM)wR@( zbBXkfj(j`^XAn}3F#`hKB23$WZLrHxSQblD<4e^!LRxmV?j^kVe!+RK$c<`q(n7uGb)HTNUm#I8)-a9RwsQ$ zwA9bm-5=byzO9x~CV=&V<%l6}6P1UgrtE-tA7eO58w)`Cb#hg__7qYCF7wu~y15^*=<+~kr!sem+D*W7oGxiv zT__sfVh5Y#IZ16;7jekhU~^72eZ+UmC_)o&TiDg>te_N9Dpx4nC`)8!nP=pZgE);l z5ZJn>QZeWCX%oknvtgCL=~Ky@&}Tl&8$%pHhLJnnJTb|~PGtQNepA^;(=jn66_;^& zhL7F0i#=jM@G4z7A7b?iK~lM9Kpmi#0IVnu9z1$%VSmWuu_zD5exV za#NI5*G0;Hg6~G!RVu5YTH8@b#VDO(n~;k1Mt#m_eIkm=)Yv=~1znrB2!V`jrYtd9 z5<+u8j;89a(gf&im@1_TQx{P?_AwU^T_U-q)oEd{>&;!x4NnsHT9!WNGb9%eCIc3& z?M1b!JZ-H$PW&fBswN-UChaSEOsLd_pf-QP+A2eHidtheyF{)Hp=6ioDZ2nq>pd=@EOXs`t|ncka@K80jclfUB)@U@^~5lB+fj zwHhb59ik`G=EfcVTGUu5I!UX+J*j9cXVYfK;<3hYGCYlH%yaXcHhXsM+11#+r?Gpl z*>%(OuA3XX_U_uX;|LzSv7Et)j%gFOcPt!Q*gx6$?x|fn=I}wBz9AnmZRBv? zLH?Dbx5?CVn0Uv1%Lf{JC*!nDF2;@h>1w9XI&JnglX3^{#&+VgN8s<;q*XM$AKu)k zwg$Ue-zaR(rF=L{oHe$9A!(Ox^Sv@5B3b@5!iZ>=;A9TEd^77|$UUxs?l#XfZuFyp zTWlvTPM)G_B>0+gqb2dx=p!{&H{1jaM9GGF`6wA^vA*TzkXZhakaM>hRWq{;LCbAJ zkh|42gp%XPGSA zD0+m?e#~{)CH(9zn(43zYr`GK{e!lZ$DQbyf|LKtE=Y%4FlGZDqz~l}8;i%08Q4PYPZ{>U1U& z5lg=tnZS7@$j1DExw&HNE{kfE`0VJgdlle-)kh_^UO($eG;Dx$j7U2gRA~H}Lu)v) z#{2h?!}<~j-E~HsJ)=du$)$*7@ev}chq(H88q(}68~SD8OpV)6N&Wi-3Stv(PaCK!(+Ss&+Bmm3re6$gzqP4D z(<1q{l4ujK7-sc10~=$cYZiq@Kz)mh?TD>~hl5b#?O@bw((02$jBOki4%#L{#O+8e zqD{5R<|V|s08b>mv2-F22-|ATHC;i$af1&yFR(zb1Eqk#fdP zG!uN#c)7KNN4u@VDoqNm$-gWtIlJSTVx!mLhEB}F>Z)23>u6D3h$JqpQy6M^`)K2r_Q`C%(LsYtlz=2k)Ti93mKD)14^>ZTF1H~0QARR3RkdYNK#Bm zQ}n{bMX)xvi2IJ}nNtY7=x{Nidgj7VMP$$&b32uRSmc8ttaGZSduh;1fHR$1k8Xzz z62H)gV){d1N8{P}=Am~8Bvk|FgL)hOrJ*9p(?DY@iLH}dELcb4o5<A$gCr%_v6Zz2@)(P5+xn0|F<|9?h2Lxdlu%&U!$QlQ>n^W(`14c`7 zgD|(3Z^#hUjfa+6F7-zJp;=bIR5nqI1eFVP?PT)}k`AQ9Z8jL^NnY)A&ky{9<#NTQ z<-L0=A8{#Bj2}C#Noul_{JP&(I_2#g5}g8Pwkd-u;&?!`EfKBWAT0U(gqC>UBtz@z zWug^vpKa+h4rH_LgY8DghAzM7&(?ka48!uFeSUkQeeY(lGYDO<3 z)|4lciK1!1IAi1a88MMByHzI|VEW_|E&w^N!=-0zXVp4YS~oTcfApYRZnqPEH%@Ob zO|lWaaM+^B>(OYGi}FM%HIXa>6LL!i>f4--rwsR;fy;Gi+$>k$v~*2AU0wDbT3MpA zgGovng(nVlj)!8_cX{eom*%5I(9#y$s=S!2i2G1np!M8w6({sZhj95~G2FoO=s%CG zgxU4?4p9mbw5M5qvongXNWFjrLa!W1JjvcGevhL}bgb=_tx6F%PA#tUvZS#EM4<$@lhWRBO>{Vb#oaDO~v?DC_7{-QL= zsH?ltxMku|90h;pBd9Ctk#q6irN*1sW{x;J*>R0RPnR59J%j|$S=(dLz@v_vzwpT% z6*Rg`L@U1Hlqe`uD=n`q7dlcb6G@Gn#aMGHC zYhBAmxJYvn_dxzn-k%c$Q}-TU3%iwD<$tfzJg1n>cKG9rky{zt3I?SWyeFTiSPQMk Kj2PjS=zjsBCW}A- literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..fd2f0c5d1b342e87b780abba48aaac84a4aa3718 GIT binary patch literal 13597 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 R_F+$TiFePn4_->){{yCRe@_4a literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..e84ec4b5a4776bb9e6369cbb9e96a9312761e182 GIT binary patch literal 15311 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 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..1ccd83b8825bccfa96773a7c137d2115f4e8d6dc GIT binary patch literal 12285 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 F{|g}$EZ_hD literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..9149e9e3726efc3435be8d4f24eeb9b4c4f62e33 GIT binary patch literal 11762 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 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..6a78ab448ea011d53d6d7d6f6b52e5f28092ea5e GIT binary patch literal 12451 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 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..662e547e447535833e08ee4adb6caf54fb4ed2af GIT binary patch literal 17171 zcmchd3yfUVdB-p15ile?LJ|lhT-r3j!MpK`*MbSQ*ESCuHr@pTNx*k^?(R-@cJ5^E ztk;{8Vh9ftUU}3!oj9a3KnTRHB?r<{kgBLn+K5()+N!NYS5%RT)C9GusO2Jkje^FIYc@Mqvz;BoH`f)9hg37!D122TdB0d>@;!Q;RZ z$iHBUuSMV-2#Me>-~TFjG5y_OANbecd%&al5}nh)_k(AFqPH9rol8K`8T9>6f$ydN z8SsN(4b=MkLGkxB5LE=b{rpoP|ALo2{sp*<{@;U_f+r!&yTB_!SPF)G{}%8Z`s3gk z;60$u*#k;1PlGz=PyG0wfui#oD0}=3cr5r!kbl8{^0gQ|;S}4q0@VD);OXGypyV0` zLvR8Vy`5kS{0b;NT!@iGe=Rr&ZUr^o0tdkT;0M5;gR=9nIDzzgD)>q8gT8+=_&)k$ zp!k>r&jfD=#qZ;w&iM`~dVdN^kFSHW%g;fM2z~|XoJBByIrx51^Vfsoe=Declc4C$ zf;WS|2VMrg1?v1IC_(#{gR<)?P_b%!{ zU&=a~{>MSd(+|ooF9CJlT0g!Sls!HRil1+Q92K;{<=`KI9|wN{t_ROV8H&TLp!mEU z)cPku>FW?a5wk@_+Hju{UMX<7KFK#@%zB5 zz&F8ha0Njpxt;*e1NZs<-+{8`fc>@%k6ZyiFK|d(_t^+Rt6Hx2F1Ipg7g3{~1f|r3u;iOuBIml2j z3ElY}!C!#lZ}4LlM=)xP<-+obLi~E4UMU z1e9LRIX?*Q1}_9RfG>lR_ZT*b&d0z%1XqF5_pdEt+M?j{6N5OUA4?*#_ zh#-?31EB1?71X*NpzQks_zd{xp!~AVCR{yu0F)hDpy<5@{un%cDY+AT9XtU{FrMU? z11|-?;_)Zo2>s(xj_|Xf*6#pLF-ucpZ+ z$I>>_q_5*?`rJo5jYfDlzm$xNXxZm(9%Mhsrq5?-YiSYfH)zt`G%fp_$b#=uD%LR2c|sQ8lixxKZ9#Zj|FRT;ryK)s^WaZG_h*)tKir38$*bY&DG1uoN}o zaGE2+bTXOs{is?B8|CS^jiff!p~;j=xitD+P*MXU;FAggo`VcaAY!`j)S#PC9amDdj24Tja8DdDQD8a^Kanz z_m9T^TDQ_Epm+?2k`&)TNj=8G>&C~^xDl+KNu?$OnQaiM-B-A}Rtq=JRI4)eRhf(0 zRAEFd4~OGgRF?zW>||0YrQvwAEvc9BN%>$>i>q;|Q-Nh%CAA%CMgXl=<%;;9A4Bam zbb;z2Sx=_JnQGP#2IKK)rqakT9InN2iC#L@NNT}gIgLguu~UB~nhU4mx$wMnrWV)r zxHuS0W;8wQMzEIT-B2%=f_2;QmefOAOt#r$eUvr=ec@CN=w6vL!m*@Yg?^OzXBdx< z6D?^Vjitdg@!V(<)l1>Vi12E3_Yac^Hpb(PU}L#Dl?EG=WJ)&KP>IqsyfQ9NOfuCm zxTRcbOa_~x?d54~8b^m;95+S>6K2SJnmyLToYBL z_1xb(CTmG;rWV$GEZ9-iw%w`AmmzCVjl@aOPh1VI8y+kus?$k=#kMdkmD8I1%hK+_ zbjXK}Vu(Y!h37$Sac~_;Ron0h_l)Po`GayWoVX0Z6A7FMYm_nMoDz$(Aa)I>&4OXc z`@D!M%{oFZ-wu=9=W&AM1ktCNZ}=8lTmfT{4@7Vw$I`N#z8$9FIVE=Q!`}}=y2Rn zxk`PPtmnE`EAvvjIi4m@o8C*}#}zw8PU@=;4uB^q@lPqF8hwpubV)eYs8{;(9*M;Q z90CORlCZzOKgdX12!`d9`Wuzz!geooK{K9=5iwq9TODk6;k~&`>50QN$@aiI)8?35 z<1Ck(Cz~3cjOsG!K@;_S56Qq^IdTPfx~bpXYXvqLn+%2>gyhKjoQ#Ru%;(w*nycJo z)S_Pc3ydaQB@HL=_`;?o%f^#sGJlq%sUhT5+mRc(ut!XuHUdeNxZq0EmThKI>J65g z3`=v>Xu3RB%%#C_C7E?!q;EaPIz~4Eq8Dt;u*5NuWk`Cu9Z>Hh0!LRlf^Tg?a*wq# zpBsuA^_UnKiSQBAC~2Y5Rz&=D$kl4MDs{=BYgMD%z}%xzJ*>)%Byk(S5TRv^K|WMjs*AFWKv0o8oh<$s5_=dG2T}Ax2XPYxc0hD>-_zVXinuh zk{<7o>>_H_OIPo}ZP9JI-IVa-b2e7auCQ9FvmJ%16eKBnlv1oVQ$fDiE}*zdn|k{L z?_+~8%I7Awy3rt5xd?{qm0+^z?0Nv5xiGs*`K?2^8+@#dYVHErHR`<2$8+bDOTWd1 zz3q0s)^0|w4ipQ9;&>`(>ng*x_45mVu_PO^f>w-gsYjGZy$H1JFI1b|%$$R^DXV>P zvYq_ToFYNVshC5D+2xQE(Y(7+Yo2HGj!rkZ33HD{c+OhU%eS?XVa(bmFSSmDpFZjJ)$ah7|)Y*->+{uH|QlyEN%a zi+mI>AjP(8V5pvajyr1KRi(Zgcq_zD2Ewa3G#rZSy1dG9RxGmDqrOe)M7h+*`%>CB zk_?24hOX<|%uP?b`UZIe9SD~%UB0Yu>GHm%7lg}J4y;^p{?ZFpUa)8*nY?eL9#zwd zUK9qxWouTi3@@ujqvh&FOE0?c3e>@??=7unH9z^d`f*1&uWj?{Bt6aTQab8D*tF9ke-*<7bPCW58 z+_$bemZ+W%gcpyN8;gc2Gxey_w?3&)ryNyt-E`IROGA5HbzU_*cU8D-@uD01Ht=%e z-hT$d4UJsJa7F)$i{U7kZ$3BQ{K0(dj`=44o(Sig-9!wjg?+A-gJ!F@CF>U?u|$12WvRP)V8 z8Q$eMgPEOlI1?UT<>^TVj3(?rp=rYf>u%@$tlZ~VVQ0a&r?EQ|iv1jbm`}Ph4k2*I zLHk(wlB2nor>C999&z;Ub9#IlVu4$N-dZrrDnzFPKc-M5-d2JG!j$>djOk+VGD{nQwUo2mUe&iRVmavt7Rbo}ACN zr5u&p=qcld-AHCUGK~x!{QN)AZ{yS%8d0B_U$~)7{U#ZKBHL%W^JdM}hmN&6Z~=s> z(S59&jorm^l`oLTURL#as4!aPzo}?2Xwi z4L}vn_|6vRE`b-AUCn>@W>hklforsak@z+vHCcjZE3)@FLEs(n%#M4Q#Jrqj`NjfF z$;PJ;o(dKUSyWKuHf-9lzPA;7j6$)8 zIeRZG?An_n6^qE1U9-j-=6jj3t8?Tws#l4>l|`iXT3{K{^zw|`YpF)L zXQ4~&2=AcCj|I(hQ74(>IY@ndzKN+IotM`Zw)v*>Z?cp^6n^m#{QX4?W+ZcSu@)cl zsXaW;(PvB+WhL7>h%M$o?}d*#iYC%idFb#qvIDieL?1>;J#_Ac&;r&!G2ePXQJZbS2+*@5 z@_VBfQU zl|Ms_7m_BF6uTVon75#g$*)sKI^&)4#=e}B!;Aj*)w&?LgDhX+0rKC6o&BZT_OLBp z+47L_VU7c$Cv!N4q(e)#EvH7=i6gpqAq@Xewn}sNdWP_HrJjy$?cQu#%>Qu59gb-q z6~#>)3Y=o@O7c>156=&rNYy z=H%TF?y>*S$DP+D(_$0y1<5VyHcxqp7E`f}?<{-V#O}$Al z4;L))syggq7>BI?QRW>VnN#t>Td>fZMN?PH8OKL*``J*D@j3+Up>%KU?w#&Pc>`ON z2EOf%vC64p$xJa>ygKG3VJF_jHm|lU4dpE3)lw`Z?7DRzb5;mwqTPXXU$KoHL7qG6 zVWXB4I7{TA(nF(oJwD01kHwi@*P%y3VS=z!<>72xVUJV5<9VKAVYklOIXW~2C>Af6 z`tLGbe^7MSJ+@ocetrq-(IUZc*z1=2lOs#r8-lOFra0}}$&9HGO+d>3EK(RT7fXk= zbek|!V+Z}#(P4f1++5HHD)YaQQKEw^Pgt5FgNsW0Lfsr-!XiaJ-uo;(z(kkDv`1)c z7o>Alf7jU$1?f81?lt~LLKskq^S3S5kQ>a6UShb1Td@SwTkP|IAuMlLD)QXx1+w>E z5-)Ob(SyR%?inIGAeu|Ay@&Li-b5G1(Ay-sFi!2ASE<)Z3f4oVh=@gse2#oRkNEWr z7(0Zw*^ZxM(WRmYT19QK^yRO!*q4~gHx|D-6$!lvcISMygG-u!-Gg>V3UW-U%A#0D z+IbTWK&L3VnYSxUx}zW6BQufW1;iWRMwwNvg+x5H`<;T0ON?@6$NMDxF5Y25P6|QP ziOX9^a12yckkOktpuF2@56$3K7{bS>nXtuL2AGje=y1IDvkk&V0`lhd-M@8)_ra{SXjbA@@BcDrB~XH4&wBBrR`cH)0t5?4*`9O#<@C5 zVTZvjadf^wb^SdbDP-YHVN?VotWnb;Uy^*v6+h+v_M$G)ZXO9ZRA>FE=qJmQgdr{XNZ9N|9E2 zAY>G=OqoDPN>ag0NU1t@us8eqa!4ujv)`eRa&w#j`ksY6Qb}-(O0wYaiq2UuIw-|7 zmi>&~{Cys`uMn~$OQW@$%ll~fDZpsc6gL2{GpbNSU|DPD1n`p+rcM#Z8klG#Z zTWCW{u{=PhBPv*i9xd*05TE6Htg^hJ1jD4SW>&%TEUydd9(NM-EYW+0;19EPlp{{+ z{u>E|djvd0aZ_}fYZ*S}p1B$M^Alx`A?M+8W&OmW>k)p7=!!!BZjMSUkKlb4O#Wh> z|DFL2xiC@tfHS5_@MA81bXzHc*-@4!bgcBp05FWy@FiY~x()+Y9~HaIxP0U|EELRe zH#?qgM-68gQSDq#lH-^tUuwq@d;fJV=h<#xmJRf_+MTlslV*l1 zzI~B6*3uCy>j5GZ7AqunP3e(24;M5LkRJmJ65^1V!Vzd$sTH*j(NL_hWiANg#T!Y- z-Tv({gO8d|As{&t^QzP=NR9<_1VMC8K#`G&u>*+qm?d{+{1an6()^*f z3(X3d0#zrz>%t2fcz_olV*E(4gF42O{dJV0q#Ik2py{A5Q(W#WMYd)d&Sk=GHrc{q zOzPFBW73gRO2q0UO7sL_y#wZIW-lVzmC(OuKx>cF?Bnh1X99M3h%X+#034F_pp7k3 zynZ(8xOe2V%`{{pI28{p#FsEK30abR1>^-*MnY#SKnPS#R+AcBQrYEp`51B)s|YCR g3r%o}za}{vlAnXjBDy1VFqt1J_7`L|4tX;8A8Au%2LJ#7 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..60fb2fa88cd312105228a9e2f7e6af9f480c9e4b GIT binary patch literal 11281 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 AJ^%m! literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..b3682f00389175fcaf41433c9bf96e16ccc71567 GIT binary patch literal 12168 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 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..a4fac19d37faf68df9f9aafa8b26bf85003eb93f GIT binary patch literal 15024 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 NaXqLl3eQmf@c(`#5D5SP literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000000000000000000000000000000000000..67192c23a39757b231965074e4074e9e7cbd578e GIT binary patch literal 10740 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 + * @copyright 2020-2024 + * @license GPL-3.0-only + */ + +import Gtk from 'gi://Gtk'; +import Gdk from 'gi://Gdk'; +import Gio from 'gi://Gio'; + +import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; +import * as Config from 'resource:///org/gnome/Shell/Extensions/js/misc/config.js'; + +import {Prefs} from './lib/Prefs/Prefs.js'; +import {PrefsKeys} from './lib/Prefs/PrefsKeys.js'; + +/** + * Preferences window entry point + */ +export default class JustPerfectionPrefs extends ExtensionPreferences +{ + /** + * fill preferences window + * + * @returns {void} + */ + fillPreferencesWindow(window) + { + const shellVersion = parseFloat(Config.PACKAGE_VERSION); + const gettextDomain = this.metadata['gettext-domain']; + + let ResourcesFolderPath = this.path; + let prefsKeys = new PrefsKeys(shellVersion); + + let prefs = new Prefs( + { + Builder: new Gtk.Builder(), + Settings: this.getSettings(), + Gdk, + Gio, + }, + prefsKeys, + shellVersion + ); + + prefs.fillPrefsWindow(window, ResourcesFolderPath, gettextDomain); + } +} + diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource new file mode 100644 index 0000000000000000000000000000000000000000..a93f5c1b9ef40af78f9cdf9fed93056f4d64ff3d GIT binary patch literal 96880 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

&Nml&MM0iRM~4zgv(xVEb3XFolKXj%Dc0C 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 literal 0 HcmV?d00001 diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/stylesheet.css b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/stylesheet.css new file mode 100755 index 0000000..974d8e2 --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/stylesheet.css @@ -0,0 +1,714 @@ +.just-perfection +{ + font-size: small; +} + +.just-perfection .switcher-popup +{ + padding: 8px; + spacing: 24px; + font-size: small; +} + +.just-perfection .switcher-list +{ + color: #eeeeec; + background-color: rgba(0, 0, 0, .99); + border: 0 solid rgba(255, 255, 255, .16); + border-radius: 15px; + padding: 12px; + box-shadow: none; +} + +.just-perfection .switcher-list .item-box +{ + padding: 8px; + border-radius: 14px; + border: 1px solid transparent; + background-color: transparent; +} + +.just-perfection .switcher-list .item-box:outlined +{ + border: 0; + background-color: rgba(255, 255, 255, .1); + box-shadow: inset 0 2px 2px 0 rgba(0, 0, 0, .4); +} + +.just-perfection .switcher-list .item-box:selected +{ + background-color: #404040; + color: #eeeeec; +} + +.just-perfection .switcher-list .thumbnail-box +{ + padding: 2px; + spacing: 6px; +} + +.just-perfection .switcher-list .thumbnail +{ + width: 256px; +} + +.just-perfection .switcher-list .separator +{ + width: 1px; + background: #272727; +} + +.just-perfection .switcher-list .switcher-list-item-container +{ + spacing: 12px; +} + +.just-perfection .workspace-switcher-container +{ + background-color: rgba(0, 0, 0, .7); + box-shadow: none; + padding: 3px; + border: 0; + border-radius: 3px; +} + +.just-perfection .workspace-switcher +{ + background: transparent; + border: none; + border-radius: 0; + padding: 0; + spacing: 4px; +} + +.just-perfection .workspace-switcher +{ + background: rgba(0, 0, 0, .7); + box-shadow: none; + border: none; + border-radius: 5px; + padding: 0; + spacing: 4px; +} + +.just-perfection .ws-switcher-indicator, +.just-perfection .ws-switcher-indicator:active +{ + background: transparent; + background-color: rgba(255, 255, 255, .02); + height: 8px; + width: 20px; + border: 0; + border-radius: 2px; + padding: 2px; + margin: 5px; +} + +.just-perfection .ws-switcher-indicator:active +{ + background-color: rgba(255, 255, 255, .8); +} + +.just-perfection .ws-switcher-box +{ + background: transparent; + background-color: rgba(255, 255, 255, .02); + height: 10px; + background-size: 0; + border: 0; + border-radius: 1px; +} + +.just-perfection .ws-switcher-active-up, +.just-perfection .ws-switcher-active-down, +.just-perfection .ws-switcher-active-left, +.just-perfection .ws-switcher-active-right +{ + height: 10px; + background-color: rgba(255, 255, 255, .8); + border: 0; + border-radius: 1px; +} + +.just-perfection .osd-window +{ + background-color: rgba(0, 0, 0, 1); + border: 0; + border-radius: 8px; + padding: 10px; + box-shadow: none; +} + +.just-perfection .osd-window StIcon +{ + width: 22px; + height: 22px; +} + +.just-perfection .tile-preview +{ + background-color: rgba(255, 255, 255, 0.15); + border: 1px solid rgba(255, 255, 255, 0.6); + border-radius: 0; +} + +.just-perfection-api-no-search #overview +{ + spacing: 0; +} + +.just-perfection-api-no-search .overview-controls +{ + padding-top: 36px; + padding-bottom: 36px; +} + +/* commented because the icon will be shown when the window is getting dragged */ +/* icon-dropshadow isn't specific to the window picker icon but that's a quick fix for now */ +/* .just-perfection-api-no-window-picker-icon .workspaces-view StIcon */ +.just-perfection-api-no-window-picker-icon .icon-dropshadow +{ + width: 0; + height: 0; + padding: 0; +} + +.just-perfection-api-bottom-panel #overview +{ + margin-bottom: 24px; +} + +.just-perfection-api-bottom-panel .popup-menu.panel-menu +{ + margin-bottom: 0; +} + +.just-perfection-api-bottom-panel.just-perfection-api-no-panel #overview +{ + margin-bottom: 0; +} + +.just-perfection-api-no-panel #panel +{ + background-color: transparent; +} + +.just-perfection-api-no-panel-arrow .panel-button .popup-menu-arrow +{ + width: 0; + height: 0; +} + +.just-perfection-api-no-panel-notification-icon .clock-display StIcon +{ + width: 0; + height: 0; + padding: 0; +} + +.just-perfection-api-no-panel-notification-icon .clock-display-box +{ + padding: 0; + spacing: 0; +} + +.just-perfection-api-no-show-apps-button .show-apps, +.just-perfection-api-no-show-apps-button .show-apps StIcon +{ + width: 0; + margin: 0; + spacing: 0; +} + +.just-perfection-api-dash-icon-size16 #dash StIcon { height: 16px; width: 16px; } +.just-perfection-api-dash-icon-size22 #dash StIcon { height: 22px; width: 22px; } +.just-perfection-api-dash-icon-size24 #dash StIcon { height: 24px; width: 24px; } +.just-perfection-api-dash-icon-size32 #dash StIcon { height: 32px; width: 32px; } +.just-perfection-api-dash-icon-size40 #dash StIcon { height: 40px; width: 40px; } +.just-perfection-api-dash-icon-size48 #dash StIcon { height: 48px; width: 48px; } +.just-perfection-api-dash-icon-size56 #dash StIcon { height: 56px; width: 56px; } +.just-perfection-api-dash-icon-size64 #dash StIcon { height: 64px; width: 64px; } + + +.just-perfection-api-panel-button-padding-size0 .panel-button { -natural-hpadding: 0px; -minimum-hpadding: 0px; } +.just-perfection-api-panel-button-padding-size1 .panel-button { -natural-hpadding: 1px; -minimum-hpadding: 1px; } +.just-perfection-api-panel-button-padding-size2 .panel-button { -natural-hpadding: 2px; -minimum-hpadding: 2px; } +.just-perfection-api-panel-button-padding-size3 .panel-button { -natural-hpadding: 3px; -minimum-hpadding: 3px; } +.just-perfection-api-panel-button-padding-size4 .panel-button { -natural-hpadding: 4px; -minimum-hpadding: 4px; } +.just-perfection-api-panel-button-padding-size5 .panel-button { -natural-hpadding: 5px; -minimum-hpadding: 5px; } +.just-perfection-api-panel-button-padding-size6 .panel-button { -natural-hpadding: 6px; -minimum-hpadding: 6px; } +.just-perfection-api-panel-button-padding-size7 .panel-button { -natural-hpadding: 7px; -minimum-hpadding: 7px; } +.just-perfection-api-panel-button-padding-size8 .panel-button { -natural-hpadding: 8px; -minimum-hpadding: 8px; } +.just-perfection-api-panel-button-padding-size9 .panel-button { -natural-hpadding: 9px; -minimum-hpadding: 9px; } +.just-perfection-api-panel-button-padding-size10 .panel-button { -natural-hpadding: 10px; -minimum-hpadding: 10px; } +.just-perfection-api-panel-button-padding-size11 .panel-button { -natural-hpadding: 11px; -minimum-hpadding: 11px; } +.just-perfection-api-panel-button-padding-size12 .panel-button { -natural-hpadding: 12px; -minimum-hpadding: 12px; } +.just-perfection-api-panel-button-padding-size13 .panel-button { -natural-hpadding: 13px; -minimum-hpadding: 13px; } +.just-perfection-api-panel-button-padding-size14 .panel-button { -natural-hpadding: 14px; -minimum-hpadding: 14px; } +.just-perfection-api-panel-button-padding-size15 .panel-button { -natural-hpadding: 15px; -minimum-hpadding: 15px; } +.just-perfection-api-panel-button-padding-size16 .panel-button { -natural-hpadding: 16px; -minimum-hpadding: 16px; } +.just-perfection-api-panel-button-padding-size17 .panel-button { -natural-hpadding: 17px; -minimum-hpadding: 17px; } +.just-perfection-api-panel-button-padding-size18 .panel-button { -natural-hpadding: 18px; -minimum-hpadding: 18px; } +.just-perfection-api-panel-button-padding-size19 .panel-button { -natural-hpadding: 19px; -minimum-hpadding: 19px; } +.just-perfection-api-panel-button-padding-size20 .panel-button { -natural-hpadding: 20px; -minimum-hpadding: 20px; } +.just-perfection-api-panel-button-padding-size21 .panel-button { -natural-hpadding: 21px; -minimum-hpadding: 21px; } +.just-perfection-api-panel-button-padding-size22 .panel-button { -natural-hpadding: 22px; -minimum-hpadding: 22px; } +.just-perfection-api-panel-button-padding-size23 .panel-button { -natural-hpadding: 23px; -minimum-hpadding: 23px; } +.just-perfection-api-panel-button-padding-size24 .panel-button { -natural-hpadding: 24px; -minimum-hpadding: 24px; } +.just-perfection-api-panel-button-padding-size25 .panel-button { -natural-hpadding: 25px; -minimum-hpadding: 25px; } +.just-perfection-api-panel-button-padding-size26 .panel-button { -natural-hpadding: 26px; -minimum-hpadding: 26px; } +.just-perfection-api-panel-button-padding-size27 .panel-button { -natural-hpadding: 27px; -minimum-hpadding: 27px; } +.just-perfection-api-panel-button-padding-size28 .panel-button { -natural-hpadding: 28px; -minimum-hpadding: 28px; } +.just-perfection-api-panel-button-padding-size29 .panel-button { -natural-hpadding: 29px; -minimum-hpadding: 29px; } +.just-perfection-api-panel-button-padding-size30 .panel-button { -natural-hpadding: 30px; -minimum-hpadding: 30px; } +.just-perfection-api-panel-button-padding-size31 .panel-button { -natural-hpadding: 31px; -minimum-hpadding: 31px; } +.just-perfection-api-panel-button-padding-size32 .panel-button { -natural-hpadding: 32px; -minimum-hpadding: 32px; } +.just-perfection-api-panel-button-padding-size33 .panel-button { -natural-hpadding: 33px; -minimum-hpadding: 33px; } +.just-perfection-api-panel-button-padding-size34 .panel-button { -natural-hpadding: 34px; -minimum-hpadding: 34px; } +.just-perfection-api-panel-button-padding-size35 .panel-button { -natural-hpadding: 35px; -minimum-hpadding: 35px; } +.just-perfection-api-panel-button-padding-size36 .panel-button { -natural-hpadding: 36px; -minimum-hpadding: 36px; } +.just-perfection-api-panel-button-padding-size37 .panel-button { -natural-hpadding: 37px; -minimum-hpadding: 37px; } +.just-perfection-api-panel-button-padding-size38 .panel-button { -natural-hpadding: 38px; -minimum-hpadding: 38px; } +.just-perfection-api-panel-button-padding-size39 .panel-button { -natural-hpadding: 39px; -minimum-hpadding: 39px; } +.just-perfection-api-panel-button-padding-size40 .panel-button { -natural-hpadding: 40px; -minimum-hpadding: 40px; } +.just-perfection-api-panel-button-padding-size41 .panel-button { -natural-hpadding: 41px; -minimum-hpadding: 41px; } +.just-perfection-api-panel-button-padding-size42 .panel-button { -natural-hpadding: 42px; -minimum-hpadding: 42px; } +.just-perfection-api-panel-button-padding-size43 .panel-button { -natural-hpadding: 43px; -minimum-hpadding: 43px; } +.just-perfection-api-panel-button-padding-size44 .panel-button { -natural-hpadding: 44px; -minimum-hpadding: 44px; } +.just-perfection-api-panel-button-padding-size45 .panel-button { -natural-hpadding: 45px; -minimum-hpadding: 45px; } +.just-perfection-api-panel-button-padding-size46 .panel-button { -natural-hpadding: 46px; -minimum-hpadding: 46px; } +.just-perfection-api-panel-button-padding-size47 .panel-button { -natural-hpadding: 47px; -minimum-hpadding: 47px; } +.just-perfection-api-panel-button-padding-size48 .panel-button { -natural-hpadding: 48px; -minimum-hpadding: 48px; } +.just-perfection-api-panel-button-padding-size49 .panel-button { -natural-hpadding: 49px; -minimum-hpadding: 49px; } +.just-perfection-api-panel-button-padding-size50 .panel-button { -natural-hpadding: 50px; -minimum-hpadding: 50px; } +.just-perfection-api-panel-button-padding-size51 .panel-button { -natural-hpadding: 51px; -minimum-hpadding: 51px; } +.just-perfection-api-panel-button-padding-size52 .panel-button { -natural-hpadding: 52px; -minimum-hpadding: 52px; } +.just-perfection-api-panel-button-padding-size53 .panel-button { -natural-hpadding: 53px; -minimum-hpadding: 53px; } +.just-perfection-api-panel-button-padding-size54 .panel-button { -natural-hpadding: 54px; -minimum-hpadding: 54px; } +.just-perfection-api-panel-button-padding-size55 .panel-button { -natural-hpadding: 55px; -minimum-hpadding: 55px; } +.just-perfection-api-panel-button-padding-size56 .panel-button { -natural-hpadding: 56px; -minimum-hpadding: 56px; } +.just-perfection-api-panel-button-padding-size57 .panel-button { -natural-hpadding: 57px; -minimum-hpadding: 57px; } +.just-perfection-api-panel-button-padding-size58 .panel-button { -natural-hpadding: 58px; -minimum-hpadding: 58px; } +.just-perfection-api-panel-button-padding-size59 .panel-button { -natural-hpadding: 59px; -minimum-hpadding: 59px; } +.just-perfection-api-panel-button-padding-size60 .panel-button { -natural-hpadding: 60px; -minimum-hpadding: 60px; } + +.just-perfection-api-no-window-caption .window-caption +{ + spacing: 0; + background-color: transparent; + border-radius: 0; + border: 0; + padding: 0; + font-size: 0; +} + +.just-perfection-api-workspace-background-radius-size0 .workspace-background { border-radius: 0; } +.just-perfection-api-workspace-background-radius-size1 .workspace-background { border-radius: 1px; } +.just-perfection-api-workspace-background-radius-size2 .workspace-background { border-radius: 2px; } +.just-perfection-api-workspace-background-radius-size3 .workspace-background { border-radius: 3px; } +.just-perfection-api-workspace-background-radius-size4 .workspace-background { border-radius: 4px; } +.just-perfection-api-workspace-background-radius-size5 .workspace-background { border-radius: 5px; } +.just-perfection-api-workspace-background-radius-size6 .workspace-background { border-radius: 6px; } +.just-perfection-api-workspace-background-radius-size7 .workspace-background { border-radius: 7px; } +.just-perfection-api-workspace-background-radius-size8 .workspace-background { border-radius: 8px; } +.just-perfection-api-workspace-background-radius-size9 .workspace-background { border-radius: 9px; } +.just-perfection-api-workspace-background-radius-size10 .workspace-background { border-radius: 10px; } +.just-perfection-api-workspace-background-radius-size11 .workspace-background { border-radius: 11px; } +.just-perfection-api-workspace-background-radius-size12 .workspace-background { border-radius: 12px; } +.just-perfection-api-workspace-background-radius-size13 .workspace-background { border-radius: 13px; } +.just-perfection-api-workspace-background-radius-size14 .workspace-background { border-radius: 14px; } +.just-perfection-api-workspace-background-radius-size15 .workspace-background { border-radius: 15px; } +.just-perfection-api-workspace-background-radius-size16 .workspace-background { border-radius: 16px; } +.just-perfection-api-workspace-background-radius-size17 .workspace-background { border-radius: 17px; } +.just-perfection-api-workspace-background-radius-size18 .workspace-background { border-radius: 18px; } +.just-perfection-api-workspace-background-radius-size19 .workspace-background { border-radius: 19px; } +.just-perfection-api-workspace-background-radius-size20 .workspace-background { border-radius: 20px; } +.just-perfection-api-workspace-background-radius-size21 .workspace-background { border-radius: 21px; } +.just-perfection-api-workspace-background-radius-size22 .workspace-background { border-radius: 22px; } +.just-perfection-api-workspace-background-radius-size23 .workspace-background { border-radius: 23px; } +.just-perfection-api-workspace-background-radius-size24 .workspace-background { border-radius: 24px; } +.just-perfection-api-workspace-background-radius-size25 .workspace-background { border-radius: 25px; } +.just-perfection-api-workspace-background-radius-size26 .workspace-background { border-radius: 26px; } +.just-perfection-api-workspace-background-radius-size27 .workspace-background { border-radius: 27px; } +.just-perfection-api-workspace-background-radius-size28 .workspace-background { border-radius: 28px; } +.just-perfection-api-workspace-background-radius-size29 .workspace-background { border-radius: 29px; } +.just-perfection-api-workspace-background-radius-size30 .workspace-background { border-radius: 30px; } +.just-perfection-api-workspace-background-radius-size31 .workspace-background { border-radius: 31px; } +.just-perfection-api-workspace-background-radius-size32 .workspace-background { border-radius: 32px; } +.just-perfection-api-workspace-background-radius-size33 .workspace-background { border-radius: 33px; } +.just-perfection-api-workspace-background-radius-size34 .workspace-background { border-radius: 34px; } +.just-perfection-api-workspace-background-radius-size35 .workspace-background { border-radius: 35px; } +.just-perfection-api-workspace-background-radius-size36 .workspace-background { border-radius: 36px; } +.just-perfection-api-workspace-background-radius-size37 .workspace-background { border-radius: 37px; } +.just-perfection-api-workspace-background-radius-size38 .workspace-background { border-radius: 38px; } +.just-perfection-api-workspace-background-radius-size39 .workspace-background { border-radius: 39px; } +.just-perfection-api-workspace-background-radius-size40 .workspace-background { border-radius: 40px; } +.just-perfection-api-workspace-background-radius-size41 .workspace-background { border-radius: 41px; } +.just-perfection-api-workspace-background-radius-size42 .workspace-background { border-radius: 42px; } +.just-perfection-api-workspace-background-radius-size43 .workspace-background { border-radius: 43px; } +.just-perfection-api-workspace-background-radius-size44 .workspace-background { border-radius: 44px; } +.just-perfection-api-workspace-background-radius-size45 .workspace-background { border-radius: 45px; } +.just-perfection-api-workspace-background-radius-size46 .workspace-background { border-radius: 46px; } +.just-perfection-api-workspace-background-radius-size47 .workspace-background { border-radius: 47px; } +.just-perfection-api-workspace-background-radius-size48 .workspace-background { border-radius: 48px; } +.just-perfection-api-workspace-background-radius-size49 .workspace-background { border-radius: 49px; } +.just-perfection-api-workspace-background-radius-size50 .workspace-background { border-radius: 50px; } +.just-perfection-api-workspace-background-radius-size51 .workspace-background { border-radius: 51px; } +.just-perfection-api-workspace-background-radius-size52 .workspace-background { border-radius: 52px; } +.just-perfection-api-workspace-background-radius-size53 .workspace-background { border-radius: 53px; } +.just-perfection-api-workspace-background-radius-size54 .workspace-background { border-radius: 54px; } +.just-perfection-api-workspace-background-radius-size55 .workspace-background { border-radius: 55px; } +.just-perfection-api-workspace-background-radius-size56 .workspace-background { border-radius: 56px; } +.just-perfection-api-workspace-background-radius-size57 .workspace-background { border-radius: 57px; } +.just-perfection-api-workspace-background-radius-size58 .workspace-background { border-radius: 58px; } +.just-perfection-api-workspace-background-radius-size59 .workspace-background { border-radius: 59px; } +.just-perfection-api-workspace-background-radius-size60 .workspace-background { border-radius: 60px; } + +.just-perfection-api-panel-indicator-padding-size0 .panel-status-indicators-box { spacing: 0; } +.just-perfection-api-panel-indicator-padding-size1 .panel-status-indicators-box { spacing: 1px; } +.just-perfection-api-panel-indicator-padding-size2 .panel-status-indicators-box { spacing: 2px; } +.just-perfection-api-panel-indicator-padding-size3 .panel-status-indicators-box { spacing: 3px; } +.just-perfection-api-panel-indicator-padding-size4 .panel-status-indicators-box { spacing: 4px; } +.just-perfection-api-panel-indicator-padding-size5 .panel-status-indicators-box { spacing: 5px; } +.just-perfection-api-panel-indicator-padding-size6 .panel-status-indicators-box { spacing: 6px; } +.just-perfection-api-panel-indicator-padding-size7 .panel-status-indicators-box { spacing: 7px; } +.just-perfection-api-panel-indicator-padding-size8 .panel-status-indicators-box { spacing: 8px; } +.just-perfection-api-panel-indicator-padding-size9 .panel-status-indicators-box { spacing: 9px; } +.just-perfection-api-panel-indicator-padding-size10 .panel-status-indicators-box { spacing: 10px; } +.just-perfection-api-panel-indicator-padding-size11 .panel-status-indicators-box { spacing: 11px; } +.just-perfection-api-panel-indicator-padding-size12 .panel-status-indicators-box { spacing: 12px; } +.just-perfection-api-panel-indicator-padding-size13 .panel-status-indicators-box { spacing: 13px; } +.just-perfection-api-panel-indicator-padding-size14 .panel-status-indicators-box { spacing: 14px; } +.just-perfection-api-panel-indicator-padding-size15 .panel-status-indicators-box { spacing: 15px; } +.just-perfection-api-panel-indicator-padding-size16 .panel-status-indicators-box { spacing: 16px; } +.just-perfection-api-panel-indicator-padding-size17 .panel-status-indicators-box { spacing: 17px; } +.just-perfection-api-panel-indicator-padding-size18 .panel-status-indicators-box { spacing: 18px; } +.just-perfection-api-panel-indicator-padding-size19 .panel-status-indicators-box { spacing: 19px; } +.just-perfection-api-panel-indicator-padding-size20 .panel-status-indicators-box { spacing: 20px; } +.just-perfection-api-panel-indicator-padding-size21 .panel-status-indicators-box { spacing: 21px; } +.just-perfection-api-panel-indicator-padding-size22 .panel-status-indicators-box { spacing: 22px; } +.just-perfection-api-panel-indicator-padding-size23 .panel-status-indicators-box { spacing: 23px; } +.just-perfection-api-panel-indicator-padding-size24 .panel-status-indicators-box { spacing: 24px; } +.just-perfection-api-panel-indicator-padding-size25 .panel-status-indicators-box { spacing: 25px; } +.just-perfection-api-panel-indicator-padding-size26 .panel-status-indicators-box { spacing: 26px; } +.just-perfection-api-panel-indicator-padding-size27 .panel-status-indicators-box { spacing: 27px; } +.just-perfection-api-panel-indicator-padding-size28 .panel-status-indicators-box { spacing: 28px; } +.just-perfection-api-panel-indicator-padding-size29 .panel-status-indicators-box { spacing: 29px; } +.just-perfection-api-panel-indicator-padding-size30 .panel-status-indicators-box { spacing: 30px; } +.just-perfection-api-panel-indicator-padding-size31 .panel-status-indicators-box { spacing: 31px; } +.just-perfection-api-panel-indicator-padding-size32 .panel-status-indicators-box { spacing: 32px; } +.just-perfection-api-panel-indicator-padding-size33 .panel-status-indicators-box { spacing: 33px; } +.just-perfection-api-panel-indicator-padding-size34 .panel-status-indicators-box { spacing: 34px; } +.just-perfection-api-panel-indicator-padding-size35 .panel-status-indicators-box { spacing: 35px; } +.just-perfection-api-panel-indicator-padding-size36 .panel-status-indicators-box { spacing: 36px; } +.just-perfection-api-panel-indicator-padding-size37 .panel-status-indicators-box { spacing: 37px; } +.just-perfection-api-panel-indicator-padding-size38 .panel-status-indicators-box { spacing: 38px; } +.just-perfection-api-panel-indicator-padding-size39 .panel-status-indicators-box { spacing: 39px; } +.just-perfection-api-panel-indicator-padding-size40 .panel-status-indicators-box { spacing: 40px; } +.just-perfection-api-panel-indicator-padding-size41 .panel-status-indicators-box { spacing: 41px; } +.just-perfection-api-panel-indicator-padding-size42 .panel-status-indicators-box { spacing: 42px; } +.just-perfection-api-panel-indicator-padding-size43 .panel-status-indicators-box { spacing: 43px; } +.just-perfection-api-panel-indicator-padding-size44 .panel-status-indicators-box { spacing: 44px; } +.just-perfection-api-panel-indicator-padding-size45 .panel-status-indicators-box { spacing: 45px; } +.just-perfection-api-panel-indicator-padding-size46 .panel-status-indicators-box { spacing: 46px; } +.just-perfection-api-panel-indicator-padding-size47 .panel-status-indicators-box { spacing: 47px; } +.just-perfection-api-panel-indicator-padding-size48 .panel-status-indicators-box { spacing: 48px; } +.just-perfection-api-panel-indicator-padding-size49 .panel-status-indicators-box { spacing: 49px; } +.just-perfection-api-panel-indicator-padding-size50 .panel-status-indicators-box { spacing: 50px; } +.just-perfection-api-panel-indicator-padding-size51 .panel-status-indicators-box { spacing: 51px; } +.just-perfection-api-panel-indicator-padding-size52 .panel-status-indicators-box { spacing: 52px; } +.just-perfection-api-panel-indicator-padding-size53 .panel-status-indicators-box { spacing: 53px; } +.just-perfection-api-panel-indicator-padding-size54 .panel-status-indicators-box { spacing: 54px; } +.just-perfection-api-panel-indicator-padding-size55 .panel-status-indicators-box { spacing: 55px; } +.just-perfection-api-panel-indicator-padding-size56 .panel-status-indicators-box { spacing: 56px; } +.just-perfection-api-panel-indicator-padding-size57 .panel-status-indicators-box { spacing: 57px; } +.just-perfection-api-panel-indicator-padding-size58 .panel-status-indicators-box { spacing: 58px; } +.just-perfection-api-panel-indicator-padding-size59 .panel-status-indicators-box { spacing: 59px; } +.just-perfection-api-panel-indicator-padding-size60 .panel-status-indicators-box { spacing: 60px; } + +.just-perfection-api-no-window-close .window-close, +.just-perfection-api-no-window-close.just-perfection .window-close +{ + height: 0; + width: 30px; + background: transparent; + border-radius: 0; + border: 0; + spacing: 0; + box-shadow: none; +} + +.just-perfection-api-no-ripple-box .ripple-box +{ + background-color: transparent; +} + +/** + * This can refresh other styles that is not inculding any standard css styles. + * values are not important here. Just do something that can change the look + */ +.just-perfection-api-refresh-styles .panel-button, +.just-perfection-api-refresh-styles .panel-status-indicators-box, +.just-perfection-api-refresh-styles .panel-button StIcon, +.just-perfection-api-refresh-styles .system-status-icon +{ + background-color: gold; + color: gold; + border-radius: 100px; +} + +.just-perfection-api-no-weather .weather-button, +.just-perfection-api-no-weather .weather-button *, +.just-perfection-api-no-events-button .events-button, +.just-perfection-api-no-events-button .events-button *, +.just-perfection-api-no-screen-sharing-indicator .screen-sharing-indicator, +.just-perfection-api-no-screen-sharing-indicator .screen-sharing-indicator *, +.just-perfection-api-no-screen-recording-indicator .screen-recording-indicator, +.just-perfection-api-no-screen-recording-indicator .screen-recording-indicator * +{ + padding: 0; + margin: 0; + border: 0; + height: 0; + width: 0; +} + +.just-perfection-api-panel-icon-size1 .system-status-icon, .just-perfection-api-panel-icon-size1 .panel-button StIcon { icon-size: 1px; } +.just-perfection-api-panel-icon-size2 .system-status-icon, .just-perfection-api-panel-icon-size2 .panel-button StIcon { icon-size: 2px; } +.just-perfection-api-panel-icon-size3 .system-status-icon, .just-perfection-api-panel-icon-size3 .panel-button StIcon { icon-size: 3px; } +.just-perfection-api-panel-icon-size4 .system-status-icon, .just-perfection-api-panel-icon-size4 .panel-button StIcon { icon-size: 4px; } +.just-perfection-api-panel-icon-size5 .system-status-icon, .just-perfection-api-panel-icon-size5 .panel-button StIcon { icon-size: 5px; } +.just-perfection-api-panel-icon-size6 .system-status-icon, .just-perfection-api-panel-icon-size6 .panel-button StIcon { icon-size: 6px; } +.just-perfection-api-panel-icon-size7 .system-status-icon, .just-perfection-api-panel-icon-size7 .panel-button StIcon { icon-size: 7px; } +.just-perfection-api-panel-icon-size8 .system-status-icon, .just-perfection-api-panel-icon-size8 .panel-button StIcon { icon-size: 8px; } +.just-perfection-api-panel-icon-size9 .system-status-icon, .just-perfection-api-panel-icon-size9 .panel-button StIcon { icon-size: 9px; } +.just-perfection-api-panel-icon-size10 .system-status-icon, .just-perfection-api-panel-icon-size10 .panel-button StIcon { icon-size: 10px; } +.just-perfection-api-panel-icon-size11 .system-status-icon, .just-perfection-api-panel-icon-size11 .panel-button StIcon { icon-size: 11px; } +.just-perfection-api-panel-icon-size12 .system-status-icon, .just-perfection-api-panel-icon-size12 .panel-button StIcon { icon-size: 12px; } +.just-perfection-api-panel-icon-size13 .system-status-icon, .just-perfection-api-panel-icon-size13 .panel-button StIcon { icon-size: 13px; } +.just-perfection-api-panel-icon-size14 .system-status-icon, .just-perfection-api-panel-icon-size14 .panel-button StIcon { icon-size: 14px; } +.just-perfection-api-panel-icon-size15 .system-status-icon, .just-perfection-api-panel-icon-size15 .panel-button StIcon { icon-size: 15px; } +.just-perfection-api-panel-icon-size16 .system-status-icon, .just-perfection-api-panel-icon-size16 .panel-button StIcon { icon-size: 16px; } +.just-perfection-api-panel-icon-size17 .system-status-icon, .just-perfection-api-panel-icon-size17 .panel-button StIcon { icon-size: 17px; } +.just-perfection-api-panel-icon-size18 .system-status-icon, .just-perfection-api-panel-icon-size18 .panel-button StIcon { icon-size: 18px; } +.just-perfection-api-panel-icon-size19 .system-status-icon, .just-perfection-api-panel-icon-size19 .panel-button StIcon { icon-size: 19px; } +.just-perfection-api-panel-icon-size20 .system-status-icon, .just-perfection-api-panel-icon-size20 .panel-button StIcon { icon-size: 20px; } +.just-perfection-api-panel-icon-size21 .system-status-icon, .just-perfection-api-panel-icon-size21 .panel-button StIcon { icon-size: 21px; } +.just-perfection-api-panel-icon-size22 .system-status-icon, .just-perfection-api-panel-icon-size22 .panel-button StIcon { icon-size: 22px; } +.just-perfection-api-panel-icon-size23 .system-status-icon, .just-perfection-api-panel-icon-size23 .panel-button StIcon { icon-size: 23px; } +.just-perfection-api-panel-icon-size24 .system-status-icon, .just-perfection-api-panel-icon-size24 .panel-button StIcon { icon-size: 24px; } +.just-perfection-api-panel-icon-size25 .system-status-icon, .just-perfection-api-panel-icon-size25 .panel-button StIcon { icon-size: 25px; } +.just-perfection-api-panel-icon-size26 .system-status-icon, .just-perfection-api-panel-icon-size26 .panel-button StIcon { icon-size: 26px; } +.just-perfection-api-panel-icon-size27 .system-status-icon, .just-perfection-api-panel-icon-size27 .panel-button StIcon { icon-size: 27px; } +.just-perfection-api-panel-icon-size28 .system-status-icon, .just-perfection-api-panel-icon-size28 .panel-button StIcon { icon-size: 28px; } +.just-perfection-api-panel-icon-size29 .system-status-icon, .just-perfection-api-panel-icon-size29 .panel-button StIcon { icon-size: 29px; } +.just-perfection-api-panel-icon-size30 .system-status-icon, .just-perfection-api-panel-icon-size30 .panel-button StIcon { icon-size: 30px; } +.just-perfection-api-panel-icon-size31 .system-status-icon, .just-perfection-api-panel-icon-size31 .panel-button StIcon { icon-size: 31px; } +.just-perfection-api-panel-icon-size32 .system-status-icon, .just-perfection-api-panel-icon-size32 .panel-button StIcon { icon-size: 32px; } +.just-perfection-api-panel-icon-size33 .system-status-icon, .just-perfection-api-panel-icon-size33 .panel-button StIcon { icon-size: 33px; } +.just-perfection-api-panel-icon-size34 .system-status-icon, .just-perfection-api-panel-icon-size34 .panel-button StIcon { icon-size: 34px; } +.just-perfection-api-panel-icon-size35 .system-status-icon, .just-perfection-api-panel-icon-size35 .panel-button StIcon { icon-size: 35px; } +.just-perfection-api-panel-icon-size36 .system-status-icon, .just-perfection-api-panel-icon-size36 .panel-button StIcon { icon-size: 36px; } +.just-perfection-api-panel-icon-size37 .system-status-icon, .just-perfection-api-panel-icon-size37 .panel-button StIcon { icon-size: 37px; } +.just-perfection-api-panel-icon-size38 .system-status-icon, .just-perfection-api-panel-icon-size38 .panel-button StIcon { icon-size: 38px; } +.just-perfection-api-panel-icon-size39 .system-status-icon, .just-perfection-api-panel-icon-size39 .panel-button StIcon { icon-size: 39px; } +.just-perfection-api-panel-icon-size40 .system-status-icon, .just-perfection-api-panel-icon-size40 .panel-button StIcon { icon-size: 40px; } +.just-perfection-api-panel-icon-size41 .system-status-icon, .just-perfection-api-panel-icon-size41 .panel-button StIcon { icon-size: 41px; } +.just-perfection-api-panel-icon-size42 .system-status-icon, .just-perfection-api-panel-icon-size42 .panel-button StIcon { icon-size: 42px; } +.just-perfection-api-panel-icon-size43 .system-status-icon, .just-perfection-api-panel-icon-size43 .panel-button StIcon { icon-size: 43px; } +.just-perfection-api-panel-icon-size44 .system-status-icon, .just-perfection-api-panel-icon-size44 .panel-button StIcon { icon-size: 44px; } +.just-perfection-api-panel-icon-size45 .system-status-icon, .just-perfection-api-panel-icon-size45 .panel-button StIcon { icon-size: 45px; } +.just-perfection-api-panel-icon-size46 .system-status-icon, .just-perfection-api-panel-icon-size46 .panel-button StIcon { icon-size: 46px; } +.just-perfection-api-panel-icon-size47 .system-status-icon, .just-perfection-api-panel-icon-size47 .panel-button StIcon { icon-size: 47px; } +.just-perfection-api-panel-icon-size48 .system-status-icon, .just-perfection-api-panel-icon-size48 .panel-button StIcon { icon-size: 48px; } +.just-perfection-api-panel-icon-size49 .system-status-icon, .just-perfection-api-panel-icon-size49 .panel-button StIcon { icon-size: 49px; } +.just-perfection-api-panel-icon-size50 .system-status-icon, .just-perfection-api-panel-icon-size50 .panel-button StIcon { icon-size: 50px; } +.just-perfection-api-panel-icon-size51 .system-status-icon, .just-perfection-api-panel-icon-size51 .panel-button StIcon { icon-size: 51px; } +.just-perfection-api-panel-icon-size52 .system-status-icon, .just-perfection-api-panel-icon-size52 .panel-button StIcon { icon-size: 52px; } +.just-perfection-api-panel-icon-size53 .system-status-icon, .just-perfection-api-panel-icon-size53 .panel-button StIcon { icon-size: 53px; } +.just-perfection-api-panel-icon-size54 .system-status-icon, .just-perfection-api-panel-icon-size54 .panel-button StIcon { icon-size: 54px; } +.just-perfection-api-panel-icon-size55 .system-status-icon, .just-perfection-api-panel-icon-size55 .panel-button StIcon { icon-size: 55px; } +.just-perfection-api-panel-icon-size56 .system-status-icon, .just-perfection-api-panel-icon-size56 .panel-button StIcon { icon-size: 56px; } +.just-perfection-api-panel-icon-size57 .system-status-icon, .just-perfection-api-panel-icon-size57 .panel-button StIcon { icon-size: 57px; } +.just-perfection-api-panel-icon-size58 .system-status-icon, .just-perfection-api-panel-icon-size58 .panel-button StIcon { icon-size: 58px; } +.just-perfection-api-panel-icon-size59 .system-status-icon, .just-perfection-api-panel-icon-size59 .panel-button StIcon { icon-size: 59px; } +.just-perfection-api-panel-icon-size60 .system-status-icon, .just-perfection-api-panel-icon-size60 .panel-button StIcon { icon-size: 60px; } + +.just-perfection-api-controls-manager-spacing-size0 .controls-manager, .just-perfection-api-controls-manager-spacing-size0 .secondary-monitor-workspaces { spacing: 0; } +.just-perfection-api-controls-manager-spacing-size1 .controls-manager, .just-perfection-api-controls-manager-spacing-size1 .secondary-monitor-workspaces { spacing: 1px; } +.just-perfection-api-controls-manager-spacing-size2 .controls-manager, .just-perfection-api-controls-manager-spacing-size2 .secondary-monitor-workspaces { spacing: 2px; } +.just-perfection-api-controls-manager-spacing-size3 .controls-manager, .just-perfection-api-controls-manager-spacing-size3 .secondary-monitor-workspaces { spacing: 3px; } +.just-perfection-api-controls-manager-spacing-size4 .controls-manager, .just-perfection-api-controls-manager-spacing-size4 .secondary-monitor-workspaces { spacing: 4px; } +.just-perfection-api-controls-manager-spacing-size5 .controls-manager, .just-perfection-api-controls-manager-spacing-size5 .secondary-monitor-workspaces { spacing: 5px; } +.just-perfection-api-controls-manager-spacing-size6 .controls-manager, .just-perfection-api-controls-manager-spacing-size6 .secondary-monitor-workspaces { spacing: 6px; } +.just-perfection-api-controls-manager-spacing-size7 .controls-manager, .just-perfection-api-controls-manager-spacing-size7 .secondary-monitor-workspaces { spacing: 7px; } +.just-perfection-api-controls-manager-spacing-size8 .controls-manager, .just-perfection-api-controls-manager-spacing-size8 .secondary-monitor-workspaces { spacing: 8px; } +.just-perfection-api-controls-manager-spacing-size9 .controls-manager, .just-perfection-api-controls-manager-spacing-size9 .secondary-monitor-workspaces { spacing: 9px; } +.just-perfection-api-controls-manager-spacing-size10 .controls-manager, .just-perfection-api-controls-manager-spacing-size10 .secondary-monitor-workspaces { spacing: 10px; } +.just-perfection-api-controls-manager-spacing-size11 .controls-manager, .just-perfection-api-controls-manager-spacing-size11 .secondary-monitor-workspaces { spacing: 11px; } +.just-perfection-api-controls-manager-spacing-size12 .controls-manager, .just-perfection-api-controls-manager-spacing-size12 .secondary-monitor-workspaces { spacing: 12px; } +.just-perfection-api-controls-manager-spacing-size13 .controls-manager, .just-perfection-api-controls-manager-spacing-size13 .secondary-monitor-workspaces { spacing: 13px; } +.just-perfection-api-controls-manager-spacing-size14 .controls-manager, .just-perfection-api-controls-manager-spacing-size14 .secondary-monitor-workspaces { spacing: 14px; } +.just-perfection-api-controls-manager-spacing-size15 .controls-manager, .just-perfection-api-controls-manager-spacing-size15 .secondary-monitor-workspaces { spacing: 15px; } +.just-perfection-api-controls-manager-spacing-size16 .controls-manager, .just-perfection-api-controls-manager-spacing-size16 .secondary-monitor-workspaces { spacing: 16px; } +.just-perfection-api-controls-manager-spacing-size17 .controls-manager, .just-perfection-api-controls-manager-spacing-size17 .secondary-monitor-workspaces { spacing: 17px; } +.just-perfection-api-controls-manager-spacing-size18 .controls-manager, .just-perfection-api-controls-manager-spacing-size18 .secondary-monitor-workspaces { spacing: 18px; } +.just-perfection-api-controls-manager-spacing-size19 .controls-manager, .just-perfection-api-controls-manager-spacing-size19 .secondary-monitor-workspaces { spacing: 19px; } +.just-perfection-api-controls-manager-spacing-size20 .controls-manager, .just-perfection-api-controls-manager-spacing-size20 .secondary-monitor-workspaces { spacing: 20px; } +.just-perfection-api-controls-manager-spacing-size21 .controls-manager, .just-perfection-api-controls-manager-spacing-size21 .secondary-monitor-workspaces { spacing: 21px; } +.just-perfection-api-controls-manager-spacing-size22 .controls-manager, .just-perfection-api-controls-manager-spacing-size22 .secondary-monitor-workspaces { spacing: 22px; } +.just-perfection-api-controls-manager-spacing-size23 .controls-manager, .just-perfection-api-controls-manager-spacing-size23 .secondary-monitor-workspaces { spacing: 23px; } +.just-perfection-api-controls-manager-spacing-size24 .controls-manager, .just-perfection-api-controls-manager-spacing-size24 .secondary-monitor-workspaces { spacing: 24px; } +.just-perfection-api-controls-manager-spacing-size25 .controls-manager, .just-perfection-api-controls-manager-spacing-size25 .secondary-monitor-workspaces { spacing: 25px; } +.just-perfection-api-controls-manager-spacing-size26 .controls-manager, .just-perfection-api-controls-manager-spacing-size26 .secondary-monitor-workspaces { spacing: 26px; } +.just-perfection-api-controls-manager-spacing-size27 .controls-manager, .just-perfection-api-controls-manager-spacing-size27 .secondary-monitor-workspaces { spacing: 27px; } +.just-perfection-api-controls-manager-spacing-size28 .controls-manager, .just-perfection-api-controls-manager-spacing-size28 .secondary-monitor-workspaces { spacing: 28px; } +.just-perfection-api-controls-manager-spacing-size29 .controls-manager, .just-perfection-api-controls-manager-spacing-size29 .secondary-monitor-workspaces { spacing: 29px; } +.just-perfection-api-controls-manager-spacing-size30 .controls-manager, .just-perfection-api-controls-manager-spacing-size30 .secondary-monitor-workspaces { spacing: 30px; } +.just-perfection-api-controls-manager-spacing-size31 .controls-manager, .just-perfection-api-controls-manager-spacing-size31 .secondary-monitor-workspaces { spacing: 31px; } +.just-perfection-api-controls-manager-spacing-size32 .controls-manager, .just-perfection-api-controls-manager-spacing-size32 .secondary-monitor-workspaces { spacing: 32px; } +.just-perfection-api-controls-manager-spacing-size33 .controls-manager, .just-perfection-api-controls-manager-spacing-size33 .secondary-monitor-workspaces { spacing: 33px; } +.just-perfection-api-controls-manager-spacing-size34 .controls-manager, .just-perfection-api-controls-manager-spacing-size34 .secondary-monitor-workspaces { spacing: 34px; } +.just-perfection-api-controls-manager-spacing-size35 .controls-manager, .just-perfection-api-controls-manager-spacing-size35 .secondary-monitor-workspaces { spacing: 35px; } +.just-perfection-api-controls-manager-spacing-size36 .controls-manager, .just-perfection-api-controls-manager-spacing-size36 .secondary-monitor-workspaces { spacing: 36px; } +.just-perfection-api-controls-manager-spacing-size37 .controls-manager, .just-perfection-api-controls-manager-spacing-size37 .secondary-monitor-workspaces { spacing: 37px; } +.just-perfection-api-controls-manager-spacing-size38 .controls-manager, .just-perfection-api-controls-manager-spacing-size38 .secondary-monitor-workspaces { spacing: 38px; } +.just-perfection-api-controls-manager-spacing-size39 .controls-manager, .just-perfection-api-controls-manager-spacing-size39 .secondary-monitor-workspaces { spacing: 39px; } +.just-perfection-api-controls-manager-spacing-size40 .controls-manager, .just-perfection-api-controls-manager-spacing-size40 .secondary-monitor-workspaces { spacing: 40px; } +.just-perfection-api-controls-manager-spacing-size41 .controls-manager, .just-perfection-api-controls-manager-spacing-size41 .secondary-monitor-workspaces { spacing: 41px; } +.just-perfection-api-controls-manager-spacing-size42 .controls-manager, .just-perfection-api-controls-manager-spacing-size42 .secondary-monitor-workspaces { spacing: 42px; } +.just-perfection-api-controls-manager-spacing-size43 .controls-manager, .just-perfection-api-controls-manager-spacing-size43 .secondary-monitor-workspaces { spacing: 43px; } +.just-perfection-api-controls-manager-spacing-size44 .controls-manager, .just-perfection-api-controls-manager-spacing-size44 .secondary-monitor-workspaces { spacing: 44px; } +.just-perfection-api-controls-manager-spacing-size45 .controls-manager, .just-perfection-api-controls-manager-spacing-size45 .secondary-monitor-workspaces { spacing: 45px; } +.just-perfection-api-controls-manager-spacing-size46 .controls-manager, .just-perfection-api-controls-manager-spacing-size46 .secondary-monitor-workspaces { spacing: 46px; } +.just-perfection-api-controls-manager-spacing-size47 .controls-manager, .just-perfection-api-controls-manager-spacing-size47 .secondary-monitor-workspaces { spacing: 47px; } +.just-perfection-api-controls-manager-spacing-size48 .controls-manager, .just-perfection-api-controls-manager-spacing-size48 .secondary-monitor-workspaces { spacing: 48px; } +.just-perfection-api-controls-manager-spacing-size49 .controls-manager, .just-perfection-api-controls-manager-spacing-size49 .secondary-monitor-workspaces { spacing: 49px; } +.just-perfection-api-controls-manager-spacing-size50 .controls-manager, .just-perfection-api-controls-manager-spacing-size50 .secondary-monitor-workspaces { spacing: 50px; } +.just-perfection-api-controls-manager-spacing-size51 .controls-manager, .just-perfection-api-controls-manager-spacing-size51 .secondary-monitor-workspaces { spacing: 51px; } +.just-perfection-api-controls-manager-spacing-size52 .controls-manager, .just-perfection-api-controls-manager-spacing-size52 .secondary-monitor-workspaces { spacing: 52px; } +.just-perfection-api-controls-manager-spacing-size53 .controls-manager, .just-perfection-api-controls-manager-spacing-size53 .secondary-monitor-workspaces { spacing: 53px; } +.just-perfection-api-controls-manager-spacing-size54 .controls-manager, .just-perfection-api-controls-manager-spacing-size54 .secondary-monitor-workspaces { spacing: 54px; } +.just-perfection-api-controls-manager-spacing-size55 .controls-manager, .just-perfection-api-controls-manager-spacing-size55 .secondary-monitor-workspaces { spacing: 55px; } +.just-perfection-api-controls-manager-spacing-size56 .controls-manager, .just-perfection-api-controls-manager-spacing-size56 .secondary-monitor-workspaces { spacing: 56px; } +.just-perfection-api-controls-manager-spacing-size57 .controls-manager, .just-perfection-api-controls-manager-spacing-size57 .secondary-monitor-workspaces { spacing: 57px; } +.just-perfection-api-controls-manager-spacing-size58 .controls-manager, .just-perfection-api-controls-manager-spacing-size58 .secondary-monitor-workspaces { spacing: 58px; } +.just-perfection-api-controls-manager-spacing-size59 .controls-manager, .just-perfection-api-controls-manager-spacing-size59 .secondary-monitor-workspaces { spacing: 59px; } +.just-perfection-api-controls-manager-spacing-size60 .controls-manager, .just-perfection-api-controls-manager-spacing-size60 .secondary-monitor-workspaces { spacing: 60px; } +.just-perfection-api-controls-manager-spacing-size61 .controls-manager, .just-perfection-api-controls-manager-spacing-size61 .secondary-monitor-workspaces { spacing: 61px; } +.just-perfection-api-controls-manager-spacing-size62 .controls-manager, .just-perfection-api-controls-manager-spacing-size62 .secondary-monitor-workspaces { spacing: 62px; } +.just-perfection-api-controls-manager-spacing-size63 .controls-manager, .just-perfection-api-controls-manager-spacing-size63 .secondary-monitor-workspaces { spacing: 63px; } +.just-perfection-api-controls-manager-spacing-size64 .controls-manager, .just-perfection-api-controls-manager-spacing-size64 .secondary-monitor-workspaces { spacing: 64px; } +.just-perfection-api-controls-manager-spacing-size65 .controls-manager, .just-perfection-api-controls-manager-spacing-size65 .secondary-monitor-workspaces { spacing: 65px; } +.just-perfection-api-controls-manager-spacing-size66 .controls-manager, .just-perfection-api-controls-manager-spacing-size66 .secondary-monitor-workspaces { spacing: 66px; } +.just-perfection-api-controls-manager-spacing-size67 .controls-manager, .just-perfection-api-controls-manager-spacing-size67 .secondary-monitor-workspaces { spacing: 67px; } +.just-perfection-api-controls-manager-spacing-size68 .controls-manager, .just-perfection-api-controls-manager-spacing-size68 .secondary-monitor-workspaces { spacing: 68px; } +.just-perfection-api-controls-manager-spacing-size69 .controls-manager, .just-perfection-api-controls-manager-spacing-size69 .secondary-monitor-workspaces { spacing: 69px; } +.just-perfection-api-controls-manager-spacing-size70 .controls-manager, .just-perfection-api-controls-manager-spacing-size70 .secondary-monitor-workspaces { spacing: 70px; } +.just-perfection-api-controls-manager-spacing-size71 .controls-manager, .just-perfection-api-controls-manager-spacing-size71 .secondary-monitor-workspaces { spacing: 71px; } +.just-perfection-api-controls-manager-spacing-size72 .controls-manager, .just-perfection-api-controls-manager-spacing-size72 .secondary-monitor-workspaces { spacing: 72px; } +.just-perfection-api-controls-manager-spacing-size73 .controls-manager, .just-perfection-api-controls-manager-spacing-size73 .secondary-monitor-workspaces { spacing: 73px; } +.just-perfection-api-controls-manager-spacing-size74 .controls-manager, .just-perfection-api-controls-manager-spacing-size74 .secondary-monitor-workspaces { spacing: 74px; } +.just-perfection-api-controls-manager-spacing-size75 .controls-manager, .just-perfection-api-controls-manager-spacing-size75 .secondary-monitor-workspaces { spacing: 75px; } +.just-perfection-api-controls-manager-spacing-size76 .controls-manager, .just-perfection-api-controls-manager-spacing-size76 .secondary-monitor-workspaces { spacing: 76px; } +.just-perfection-api-controls-manager-spacing-size77 .controls-manager, .just-perfection-api-controls-manager-spacing-size77 .secondary-monitor-workspaces { spacing: 77px; } +.just-perfection-api-controls-manager-spacing-size78 .controls-manager, .just-perfection-api-controls-manager-spacing-size78 .secondary-monitor-workspaces { spacing: 78px; } +.just-perfection-api-controls-manager-spacing-size79 .controls-manager, .just-perfection-api-controls-manager-spacing-size79 .secondary-monitor-workspaces { spacing: 79px; } +.just-perfection-api-controls-manager-spacing-size80 .controls-manager, .just-perfection-api-controls-manager-spacing-size80 .secondary-monitor-workspaces { spacing: 80px; } +.just-perfection-api-controls-manager-spacing-size81 .controls-manager, .just-perfection-api-controls-manager-spacing-size81 .secondary-monitor-workspaces { spacing: 81px; } +.just-perfection-api-controls-manager-spacing-size82 .controls-manager, .just-perfection-api-controls-manager-spacing-size82 .secondary-monitor-workspaces { spacing: 82px; } +.just-perfection-api-controls-manager-spacing-size83 .controls-manager, .just-perfection-api-controls-manager-spacing-size83 .secondary-monitor-workspaces { spacing: 83px; } +.just-perfection-api-controls-manager-spacing-size84 .controls-manager, .just-perfection-api-controls-manager-spacing-size84 .secondary-monitor-workspaces { spacing: 84px; } +.just-perfection-api-controls-manager-spacing-size85 .controls-manager, .just-perfection-api-controls-manager-spacing-size85 .secondary-monitor-workspaces { spacing: 85px; } +.just-perfection-api-controls-manager-spacing-size86 .controls-manager, .just-perfection-api-controls-manager-spacing-size86 .secondary-monitor-workspaces { spacing: 86px; } +.just-perfection-api-controls-manager-spacing-size87 .controls-manager, .just-perfection-api-controls-manager-spacing-size87 .secondary-monitor-workspaces { spacing: 87px; } +.just-perfection-api-controls-manager-spacing-size88 .controls-manager, .just-perfection-api-controls-manager-spacing-size88 .secondary-monitor-workspaces { spacing: 88px; } +.just-perfection-api-controls-manager-spacing-size89 .controls-manager, .just-perfection-api-controls-manager-spacing-size89 .secondary-monitor-workspaces { spacing: 89px; } +.just-perfection-api-controls-manager-spacing-size90 .controls-manager, .just-perfection-api-controls-manager-spacing-size90 .secondary-monitor-workspaces { spacing: 90px; } +.just-perfection-api-controls-manager-spacing-size91 .controls-manager, .just-perfection-api-controls-manager-spacing-size91 .secondary-monitor-workspaces { spacing: 91px; } +.just-perfection-api-controls-manager-spacing-size92 .controls-manager, .just-perfection-api-controls-manager-spacing-size92 .secondary-monitor-workspaces { spacing: 92px; } +.just-perfection-api-controls-manager-spacing-size93 .controls-manager, .just-perfection-api-controls-manager-spacing-size93 .secondary-monitor-workspaces { spacing: 93px; } +.just-perfection-api-controls-manager-spacing-size94 .controls-manager, .just-perfection-api-controls-manager-spacing-size94 .secondary-monitor-workspaces { spacing: 94px; } +.just-perfection-api-controls-manager-spacing-size95 .controls-manager, .just-perfection-api-controls-manager-spacing-size95 .secondary-monitor-workspaces { spacing: 95px; } +.just-perfection-api-controls-manager-spacing-size96 .controls-manager, .just-perfection-api-controls-manager-spacing-size96 .secondary-monitor-workspaces { spacing: 96px; } +.just-perfection-api-controls-manager-spacing-size97 .controls-manager, .just-perfection-api-controls-manager-spacing-size97 .secondary-monitor-workspaces { spacing: 97px; } +.just-perfection-api-controls-manager-spacing-size98 .controls-manager, .just-perfection-api-controls-manager-spacing-size98 .secondary-monitor-workspaces { spacing: 98px; } +.just-perfection-api-controls-manager-spacing-size99 .controls-manager, .just-perfection-api-controls-manager-spacing-size99 .secondary-monitor-workspaces { spacing: 99px; } +.just-perfection-api-controls-manager-spacing-size100 .controls-manager, .just-perfection-api-controls-manager-spacing-size100 .secondary-monitor-workspaces { spacing: 100px; } +.just-perfection-api-controls-manager-spacing-size101 .controls-manager, .just-perfection-api-controls-manager-spacing-size101 .secondary-monitor-workspaces { spacing: 101px; } +.just-perfection-api-controls-manager-spacing-size102 .controls-manager, .just-perfection-api-controls-manager-spacing-size102 .secondary-monitor-workspaces { spacing: 102px; } +.just-perfection-api-controls-manager-spacing-size103 .controls-manager, .just-perfection-api-controls-manager-spacing-size103 .secondary-monitor-workspaces { spacing: 103px; } +.just-perfection-api-controls-manager-spacing-size104 .controls-manager, .just-perfection-api-controls-manager-spacing-size104 .secondary-monitor-workspaces { spacing: 104px; } +.just-perfection-api-controls-manager-spacing-size105 .controls-manager, .just-perfection-api-controls-manager-spacing-size105 .secondary-monitor-workspaces { spacing: 105px; } +.just-perfection-api-controls-manager-spacing-size106 .controls-manager, .just-perfection-api-controls-manager-spacing-size106 .secondary-monitor-workspaces { spacing: 106px; } +.just-perfection-api-controls-manager-spacing-size107 .controls-manager, .just-perfection-api-controls-manager-spacing-size107 .secondary-monitor-workspaces { spacing: 107px; } +.just-perfection-api-controls-manager-spacing-size108 .controls-manager, .just-perfection-api-controls-manager-spacing-size108 .secondary-monitor-workspaces { spacing: 108px; } +.just-perfection-api-controls-manager-spacing-size109 .controls-manager, .just-perfection-api-controls-manager-spacing-size109 .secondary-monitor-workspaces { spacing: 109px; } +.just-perfection-api-controls-manager-spacing-size110 .controls-manager, .just-perfection-api-controls-manager-spacing-size110 .secondary-monitor-workspaces { spacing: 110px; } +.just-perfection-api-controls-manager-spacing-size111 .controls-manager, .just-perfection-api-controls-manager-spacing-size111 .secondary-monitor-workspaces { spacing: 111px; } +.just-perfection-api-controls-manager-spacing-size112 .controls-manager, .just-perfection-api-controls-manager-spacing-size112 .secondary-monitor-workspaces { spacing: 112px; } +.just-perfection-api-controls-manager-spacing-size113 .controls-manager, .just-perfection-api-controls-manager-spacing-size113 .secondary-monitor-workspaces { spacing: 113px; } +.just-perfection-api-controls-manager-spacing-size114 .controls-manager, .just-perfection-api-controls-manager-spacing-size114 .secondary-monitor-workspaces { spacing: 114px; } +.just-perfection-api-controls-manager-spacing-size115 .controls-manager, .just-perfection-api-controls-manager-spacing-size115 .secondary-monitor-workspaces { spacing: 115px; } +.just-perfection-api-controls-manager-spacing-size116 .controls-manager, .just-perfection-api-controls-manager-spacing-size116 .secondary-monitor-workspaces { spacing: 116px; } +.just-perfection-api-controls-manager-spacing-size117 .controls-manager, .just-perfection-api-controls-manager-spacing-size117 .secondary-monitor-workspaces { spacing: 117px; } +.just-perfection-api-controls-manager-spacing-size118 .controls-manager, .just-perfection-api-controls-manager-spacing-size118 .secondary-monitor-workspaces { spacing: 118px; } +.just-perfection-api-controls-manager-spacing-size119 .controls-manager, .just-perfection-api-controls-manager-spacing-size119 .secondary-monitor-workspaces { spacing: 119px; } +.just-perfection-api-controls-manager-spacing-size120 .controls-manager, .just-perfection-api-controls-manager-spacing-size120 .secondary-monitor-workspaces { spacing: 120px; } +.just-perfection-api-controls-manager-spacing-size121 .controls-manager, .just-perfection-api-controls-manager-spacing-size121 .secondary-monitor-workspaces { spacing: 121px; } +.just-perfection-api-controls-manager-spacing-size122 .controls-manager, .just-perfection-api-controls-manager-spacing-size122 .secondary-monitor-workspaces { spacing: 122px; } +.just-perfection-api-controls-manager-spacing-size123 .controls-manager, .just-perfection-api-controls-manager-spacing-size123 .secondary-monitor-workspaces { spacing: 123px; } +.just-perfection-api-controls-manager-spacing-size124 .controls-manager, .just-perfection-api-controls-manager-spacing-size124 .secondary-monitor-workspaces { spacing: 124px; } +.just-perfection-api-controls-manager-spacing-size125 .controls-manager, .just-perfection-api-controls-manager-spacing-size125 .secondary-monitor-workspaces { spacing: 125px; } +.just-perfection-api-controls-manager-spacing-size126 .controls-manager, .just-perfection-api-controls-manager-spacing-size126 .secondary-monitor-workspaces { spacing: 126px; } +.just-perfection-api-controls-manager-spacing-size127 .controls-manager, .just-perfection-api-controls-manager-spacing-size127 .secondary-monitor-workspaces { spacing: 127px; } +.just-perfection-api-controls-manager-spacing-size128 .controls-manager, .just-perfection-api-controls-manager-spacing-size128 .secondary-monitor-workspaces { spacing: 128px; } +.just-perfection-api-controls-manager-spacing-size129 .controls-manager, .just-perfection-api-controls-manager-spacing-size129 .secondary-monitor-workspaces { spacing: 129px; } +.just-perfection-api-controls-manager-spacing-size130 .controls-manager, .just-perfection-api-controls-manager-spacing-size130 .secondary-monitor-workspaces { spacing: 130px; } +.just-perfection-api-controls-manager-spacing-size131 .controls-manager, .just-perfection-api-controls-manager-spacing-size131 .secondary-monitor-workspaces { spacing: 131px; } +.just-perfection-api-controls-manager-spacing-size132 .controls-manager, .just-perfection-api-controls-manager-spacing-size132 .secondary-monitor-workspaces { spacing: 132px; } +.just-perfection-api-controls-manager-spacing-size133 .controls-manager, .just-perfection-api-controls-manager-spacing-size133 .secondary-monitor-workspaces { spacing: 133px; } +.just-perfection-api-controls-manager-spacing-size134 .controls-manager, .just-perfection-api-controls-manager-spacing-size134 .secondary-monitor-workspaces { spacing: 134px; } +.just-perfection-api-controls-manager-spacing-size135 .controls-manager, .just-perfection-api-controls-manager-spacing-size135 .secondary-monitor-workspaces { spacing: 135px; } +.just-perfection-api-controls-manager-spacing-size136 .controls-manager, .just-perfection-api-controls-manager-spacing-size136 .secondary-monitor-workspaces { spacing: 136px; } +.just-perfection-api-controls-manager-spacing-size137 .controls-manager, .just-perfection-api-controls-manager-spacing-size137 .secondary-monitor-workspaces { spacing: 137px; } +.just-perfection-api-controls-manager-spacing-size138 .controls-manager, .just-perfection-api-controls-manager-spacing-size138 .secondary-monitor-workspaces { spacing: 138px; } +.just-perfection-api-controls-manager-spacing-size139 .controls-manager, .just-perfection-api-controls-manager-spacing-size139 .secondary-monitor-workspaces { spacing: 139px; } +.just-perfection-api-controls-manager-spacing-size140 .controls-manager, .just-perfection-api-controls-manager-spacing-size140 .secondary-monitor-workspaces { spacing: 140px; } +.just-perfection-api-controls-manager-spacing-size141 .controls-manager, .just-perfection-api-controls-manager-spacing-size141 .secondary-monitor-workspaces { spacing: 141px; } +.just-perfection-api-controls-manager-spacing-size142 .controls-manager, .just-perfection-api-controls-manager-spacing-size142 .secondary-monitor-workspaces { spacing: 142px; } +.just-perfection-api-controls-manager-spacing-size143 .controls-manager, .just-perfection-api-controls-manager-spacing-size143 .secondary-monitor-workspaces { spacing: 143px; } +.just-perfection-api-controls-manager-spacing-size144 .controls-manager, .just-perfection-api-controls-manager-spacing-size144 .secondary-monitor-workspaces { spacing: 144px; } +.just-perfection-api-controls-manager-spacing-size145 .controls-manager, .just-perfection-api-controls-manager-spacing-size145 .secondary-monitor-workspaces { spacing: 145px; } +.just-perfection-api-controls-manager-spacing-size146 .controls-manager, .just-perfection-api-controls-manager-spacing-size146 .secondary-monitor-workspaces { spacing: 146px; } +.just-perfection-api-controls-manager-spacing-size147 .controls-manager, .just-perfection-api-controls-manager-spacing-size147 .secondary-monitor-workspaces { spacing: 147px; } +.just-perfection-api-controls-manager-spacing-size148 .controls-manager, .just-perfection-api-controls-manager-spacing-size148 .secondary-monitor-workspaces { spacing: 148px; } +.just-perfection-api-controls-manager-spacing-size149 .controls-manager, .just-perfection-api-controls-manager-spacing-size149 .secondary-monitor-workspaces { spacing: 149px; } +.just-perfection-api-controls-manager-spacing-size150 .controls-manager, .just-perfection-api-controls-manager-spacing-size150 .secondary-monitor-workspaces { spacing: 150px; } + +.just-perfection-api-osd-position-top .osd-window { margin: 4em 2.5em; } +.just-perfection-api-osd-position-center .osd-window { margin: 4em 3.5em; } +.just-perfection-api-osd-position-bottom .osd-window { margin: 4em 3em; } + +.just-perfection-api-no-dash-separator .dash-separator, +.just-perfection-api-no-dash-app-running-dot #dash .app-well-app-running-dot +{ + width: 0; + height: 0; + spacing: 0; + padding: 0; + margin: 0; +} + +.just-perfection-api-no-workspaces-in-app-grid .workspace-background +{ + background-color: transparent; + box-shadow: 0 4px 16px 4px transparent; +} + +.just-perfection-api-no-power-icon .power-status StIcon +{ + width: 0; + height: 0; + padding: 0; +} diff --git a/main.sh b/main.sh index d80ca48..d989810 100755 --- a/main.sh +++ b/main.sh @@ -6,15 +6,13 @@ set -e echo "$PIKA_BUILD_ARCH" > pika-build-arch -VERSION="1.0" +VERSION="46.0" # Clone Upstream -mkdir -p ./src-pkg-name -cp -rvf ./debian ./src-pkg-name/ -cd ./src-pkg-name/ +cd ./gnome-shell-extension-just-perfection/ # Get build deps -LOGNAME=root dh_make --createorig -y -l -p src-pkg-name_"$VERSION" || echo "dh-make: Ignoring Last Error" +LOGNAME=root dh_make --createorig -y -l -p gnome-shell-extension-just-perfection_"$VERSION" || echo "dh-make: Ignoring Last Error" apt-get build-dep ./ -y # Build package