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 0000000..64b1c7b Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo differ 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 0000000..fd2f0c5 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo differ 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 0000000..e84ec4b Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..09909ff Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo differ 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 0000000..1ccd83b Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo differ 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 0000000..9149e9e Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..1dce328 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..306a63b Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo differ 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 0000000..6a78ab4 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..b3c07fb Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..d490014 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo differ 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 0000000..662e547 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo differ 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 0000000..60fb2fa Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo differ 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 0000000..b3682f0 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo differ 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 0000000..a4fac19 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..2aa3656 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo new file mode 100644 index 0000000..72ac65e Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo differ 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 0000000..67192c2 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo differ diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/metadata.json b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/metadata.json new file mode 100644 index 0000000..bec7eee --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/metadata.json @@ -0,0 +1,19 @@ +{ + "_generated": "Generated by SweetTooth, do not edit", + "description": "Tweak Tool to Customize GNOME Shell, Change the Behavior and Disable UI Elements", + "donations": { + "buymeacoffee": "justperfection", + "patreon": "justperfection" + }, + "gettext-domain": "just-perfection", + "name": "Just Perfection", + "settings-schema": "org.gnome.shell.extensions.just-perfection", + "shell-version": [ + "45", + "46", + "47" + ], + "url": "https://gitlab.gnome.org/jrahmatzadeh/just-perfection", + "uuid": "just-perfection-desktop@just-perfection", + "version": 30 +} \ No newline at end of file diff --git a/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/prefs.js b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/prefs.js new file mode 100755 index 0000000..f7cea09 --- /dev/null +++ b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/prefs.js @@ -0,0 +1,51 @@ +/** + * Prefs Dialog + * + * @author Javad Rahmatzadeh + * @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 0000000..a93f5c1 Binary files /dev/null and b/gnome-shell-extension-just-perfection/usr/share/gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource differ 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