From 6d1e6d113243902e500d41d8c6d7e5c47d52460d Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Thu, 31 Oct 2024 10:19:02 -0400 Subject: [PATCH] [gnome] Update extensions --- .../README.md | 57 +- .../BingWallpaper@ineffable-gmail.com/blur.js | 7 +- .../carousel.js | 2 +- .../extension.js | 145 +++-- .../locale/cs/LC_MESSAGES/BingWallpaper.mo | Bin 7358 -> 7082 bytes .../locale/de/LC_MESSAGES/BingWallpaper.mo | Bin 7377 -> 7321 bytes .../locale/fa_IR/LC_MESSAGES/BingWallpaper.mo | Bin 0 -> 8370 bytes .../locale/it/LC_MESSAGES/BingWallpaper.mo | Bin 7186 -> 7189 bytes .../locale/pt_BR/LC_MESSAGES/BingWallpaper.mo | Bin 7709 -> 7648 bytes .../locale/ru_RU/LC_MESSAGES/BingWallpaper.mo | Bin 9278 -> 9281 bytes .../locale/tr/LC_MESSAGES/BingWallpaper.mo | Bin 7556 -> 7466 bytes .../locale/uk/LC_MESSAGES/BingWallpaper.mo | Bin 9311 -> 9314 bytes .../locale/zh_CN/LC_MESSAGES/BingWallpaper.mo | Bin 5184 -> 6554 bytes .../metadata.json | 5 +- .../prefs.js | 4 + .../schemas/gschemas.compiled | Bin 2432 -> 2473 bytes ...shell.extensions.bingwallpaper.gschema.xml | 7 + .../ui/carousel4.ui | 2 +- .../ui/prefsadw.ui | 27 +- .../utils.js | 81 +-- .../convenience.js | 16 +- .../display_module.js | 4 +- .../metadata.json | 5 +- .../selection.js | 74 +-- .../settings.js | 132 ++--- .../timer.js | 6 +- .../utilaudio.js | 4 +- .../utilexecmd.js | 4 +- .../utilgsp.js | 10 +- .../utilnotify.js | 4 +- .../utilrecorder.js | 4 +- .../utilwebcam.js | 14 +- .../icons/gnome/battery-symbolic.svg | 9 +- .../icons/gnome/cpu-symbolic.svg | 2 +- .../icons/gnome/fan-symbolic.svg | 2 +- .../icons/gnome/gpu-symbolic.svg | 16 +- .../icons/gnome/memory-symbolic.svg | 2 +- .../icons/gnome/network-download-symbolic.svg | 2 +- .../icons/gnome/network-symbolic.svg | 2 +- .../icons/gnome/network-upload-symbolic.svg | 2 +- .../icons/gnome/storage-symbolic.svg | 2 +- .../icons/gnome/system-symbolic.svg | 2 +- .../icons/gnome/temperature-symbolic.svg | 2 +- .../icons/gnome/voltage-symbolic.svg | 2 +- .../locale/ar/LC_MESSAGES/vitals.mo | Bin 0 -> 13793 bytes .../locale/cs/LC_MESSAGES/vitals.mo | Bin 8345 -> 11758 bytes .../locale/uk/LC_MESSAGES/vitals.mo | Bin 10967 -> 15510 bytes .../Vitals@CoreCoding.com/metadata.json | 5 +- .../extensions/Vitals@CoreCoding.com/prefs.ui | 1 + .../Vitals@CoreCoding.com/sensors.js | 11 +- .../appIndicator.js | 31 +- .../dbusMenu.js | 17 + .../extension.js | 2 +- .../iconCache.js | 2 +- .../indicatorStatusIcon.js | 15 +- .../cs/LC_MESSAGES/AppIndicatorExtension.mo | Bin 2225 -> 2416 bytes .../hu/LC_MESSAGES/AppIndicatorExtension.mo | Bin 2434 -> 2646 bytes .../uk/LC_MESSAGES/AppIndicatorExtension.mo | Bin 0 -> 3061 bytes .../LC_MESSAGES/AppIndicatorExtension.mo | Bin 0 -> 2449 bytes .../metadata.json | 6 +- .../trayIconsManager.js | 31 +- .../util.js | 19 +- .../metadata.json | 7 +- .../components/appfolders.js | 42 +- .../components/applications.js | 539 +++++++----------- .../components/coverflow_alt_tab.js | 91 +++ .../components/dash_to_dock.js | 523 +++++++---------- .../components/lockscreen.js | 139 +---- .../components/overview.js | 244 +++----- .../blur-my-shell@aunetx/components/panel.js | 399 ++++--------- .../components/screenshot.js | 187 ++---- .../components/window_list.js | 120 ++-- .../conveniences/connections.js | 9 +- .../conveniences/dummy_pipeline.js | 112 ++++ .../conveniences/effects_manager.js | 95 +-- .../blur-my-shell@aunetx/conveniences/keys.js | 151 +++-- .../paint_signals.js | 6 +- .../conveniences/pipeline.js | 223 ++++++++ .../conveniences/pipelines_manager.js | 168 ++++++ .../conveniences/settings.js | 191 ++++++- .../conveniences/settings_updater.js | 40 ++ .../conveniences/utils.js | 38 ++ .../effects/blur_effect.glsl | 114 ---- .../effects/blur_effect.js | 236 -------- .../effects/{color_effect.glsl => color.glsl} | 0 .../blur-my-shell@aunetx/effects/color.js | 140 +++++ .../effects/color_effect.js | 181 ------ .../blur-my-shell@aunetx/effects/corner.glsl | 93 +++ .../blur-my-shell@aunetx/effects/corner.js | 211 +++++++ .../effects/derivative.glsl | 71 +++ .../effects/derivative.js | 120 ++++ .../effects/downscale.glsl | 76 +++ .../blur-my-shell@aunetx/effects/downscale.js | 140 +++++ .../blur-my-shell@aunetx/effects/effects.js | 332 +++++++++++ .../effects/gaussian_blur.glsl | 70 +++ .../effects/gaussian_blur.js | 213 +++++++ .../effects/hsl_to_rgb.glsl | 14 + .../effects/hsl_to_rgb.js | 31 + .../effects/monte_carlo_blur.glsl | 44 ++ .../effects/monte_carlo_blur.js | 187 ++++++ .../effects/native_dynamic_gaussian_blur.js | 43 ++ .../effects/native_static_gaussian_blur.js | 43 ++ .../effects/{noise_effect.glsl => noise.glsl} | 0 .../blur-my-shell@aunetx/effects/noise.js | 76 +++ .../effects/noise_effect.js | 109 ---- .../blur-my-shell@aunetx/effects/pixelize.js | 88 +++ .../effects/rgb_to_hsl.glsl | 18 + .../effects/rgb_to_hsl.js | 31 + .../blur-my-shell@aunetx/effects/upscale.glsl | 57 ++ .../blur-my-shell@aunetx/effects/upscale.js | 120 ++++ .../blur-my-shell@aunetx/extension.js | 344 ++++------- ...ndow-symbolic.svg => add-row-symbolic.svg} | 0 .../scalable/actions/down-symbolic.svg | 2 + .../actions/duplicate-row-symbolic.svg | 1 + .../actions/dynamic-mode-symbolic.svg | 71 +++ .../scalable/actions/edit-row-symbolic.svg | 14 + .../scalable/actions/general-symbolic.svg | 64 --- .../actions/heart-filled-symbolic.svg | 40 -- .../scalable/actions/heart-symbolic.svg | 2 + .../scalable/actions/pipelines-symbolic.svg | 64 +++ ...w-symbolic.svg => remove-row-symbolic.svg} | 0 .../scalable/actions/select-mode-symbolic.svg | 2 - .../scalable/actions/select-row-symbolic.svg | 2 + .../scalable/actions/static-mode-symbolic.svg | 71 +++ .../af/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11393 -> 7995 bytes .../ar/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 13175 -> 9194 bytes .../az/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1089 -> 1254 bytes .../be/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 326 -> 3494 bytes .../bg/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 4362 -> 1748 bytes .../ca/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1770 -> 1229 bytes .../cs/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12299 -> 16628 bytes .../da/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 0 -> 916 bytes .../de/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12116 -> 15289 bytes .../el/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 15185 -> 10265 bytes .../es/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12631 -> 17156 bytes .../et/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 0 -> 2830 bytes .../fi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 0 -> 7609 bytes .../fr/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12878 -> 17284 bytes .../he/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 661 -> 587 bytes .../hi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 19509 -> 25807 bytes .../hu/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12140 -> 8562 bytes .../id/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11597 -> 8938 bytes .../it/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12696 -> 15008 bytes .../ja/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 0 -> 17069 bytes .../ka/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 3077 -> 2635 bytes .../ko/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 4499 -> 14981 bytes .../nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11317 -> 7968 bytes .../nl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12435 -> 17057 bytes .../nn/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1639 -> 1184 bytes .../pl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11603 -> 14189 bytes .../pt/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11684 -> 10348 bytes .../pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12431 -> 14652 bytes .../ro/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1762 -> 3643 bytes .../ru/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 16241 -> 19098 bytes .../sl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11134 -> 11683 bytes .../sv/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11545 -> 14526 bytes .../ta/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 20639 -> 24834 bytes .../tr/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 12264 -> 16836 bytes .../uk/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 14777 -> 21285 bytes .../vi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 8849 -> 7239 bytes .../LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 10828 -> 13533 bytes .../zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 10391 -> 8190 bytes .../blur-my-shell@aunetx/metadata.json | 7 +- .../preferences/applications.js | 30 +- .../application_row.js} | 22 +- .../preferences/customize_row.js | 163 ------ .../blur-my-shell@aunetx/preferences/dash.js | 44 +- .../preferences/general.js | 49 -- .../blur-my-shell@aunetx/preferences/menu.js | 5 +- .../blur-my-shell@aunetx/preferences/other.js | 55 +- .../preferences/overview.js | 26 +- .../blur-my-shell@aunetx/preferences/panel.js | 46 +- .../preferences/pipelines.js | 98 ++++ .../pipelines_management/effect_row.js | 222 ++++++++ .../pipelines_management/effects_dialog.js | 174 ++++++ .../pipeline_choose_row.js | 106 ++++ .../pipelines_management/pipeline_group.js | 99 ++++ .../extensions/blur-my-shell@aunetx/prefs.js | 26 +- .../schemas/gschemas.compiled | Bin 8296 -> 9848 bytes ...shell.extensions.blur-my-shell.gschema.xml | 105 +++- .../blur-my-shell@aunetx/stylesheet.css | 45 +- .../ui/{window-row.ui => application-row.ui} | 2 +- .../blur-my-shell@aunetx/ui/applications.ui | 78 ++- .../blur-my-shell@aunetx/ui/customize-row.ui | 143 ----- .../blur-my-shell@aunetx/ui/dash.ui | 105 +++- .../blur-my-shell@aunetx/ui/effects-dialog.ui | 77 +++ .../blur-my-shell@aunetx/ui/general.ui | 234 -------- .../blur-my-shell@aunetx/ui/menu.ui | 2 +- .../blur-my-shell@aunetx/ui/other.ui | 152 ++++- .../blur-my-shell@aunetx/ui/overview.ui | 53 +- .../blur-my-shell@aunetx/ui/panel.ui | 96 +++- .../ui/pipeline-choose-row.ui | 39 ++ .../blur-my-shell@aunetx/ui/pipeline-group.ui | 29 + .../blur-my-shell@aunetx/ui/pipelines.ui | 44 ++ .../forge@jmmaranan.com/config/windows.json | 18 +- .../forge@jmmaranan.com/lib/extension/tree.js | 33 +- .../lib/extension/utils.js | 26 + .../lib/extension/window.js | 228 ++++---- .../forge@jmmaranan.com/lib/prefs/settings.js | 32 +- .../locale/fr/LC_MESSAGES/forge.mo | Bin 3408 -> 4783 bytes .../forge@jmmaranan.com/metadata.json | 5 +- .../schemas/gschemas.compiled | Bin 5192 -> 5216 bytes ...g.gnome.shell.extensions.forge.gschema.xml | 6 +- .../gjsosk@vishram1123.com/keycodes.tar.xz | Bin 0 -> 281908 bytes .../physicalLayouts.json | 73 +++ .../scalable/actions/settings-dark.svg | 37 ++ .../hicolor/scalable/actions/settings.svg | 37 ++ .../preferences/init.js | 12 + .../service/components/index.js | 102 ++++ .../service/init.js | 428 ++++++++++++++ .../service/plugins/index.js | 39 ++ .../{busUtils.js => displayConfigState.js} | 84 +-- .../extension.js | 418 ++++++-------- .../logicalMonitor.js | 34 ++ .../manualOrientationIndicator.js | 36 ++ .../manualOrientationMenuToggle.js | 102 ++++ .../metadata.json | 5 +- .../screen-rotate@shyzus.github.io/monitor.js | 50 ++ .../orientation.js | 24 + .../screen-rotate@shyzus.github.io/prefs.js | 180 +++++- .../screen-rotate@shyzus.github.io/rotator.js | 25 +- .../schemas/gschemas.compiled | Bin 684 -> 1445 bytes ...shell.extensions.screen-rotate.gschema.xml | 69 ++- .../sensorProxy.js | 76 +++ .../CHANGELOG.md | 30 +- .../threshold-active-warning-symbolic.svg | 53 ++ .../icons/threshold-active-warning.svg | 52 ++ .../libs/driver.js | 159 ++++-- .../libs/indicator.js | 59 +- ...ad-battery-threshold@marcosdalvarez.org.mo | Bin 4921 -> 6018 bytes ...ad-battery-threshold@marcosdalvarez.org.mo | Bin 4803 -> 5876 bytes .../metadata.json | 5 +- .../preferences/about.js | 34 +- .../preferences/thinkpad.js | 39 +- .../schemas/gschemas.compiled | Bin 792 -> 1076 bytes ...l.extensions.battery-threshold.gschema.xml | 22 +- .../ui/about.ui | 19 +- .../ui/thinkpad.ui | 205 +++++-- 238 files changed, 8705 insertions(+), 4185 deletions(-) create mode 100644 gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/fa_IR/LC_MESSAGES/BingWallpaper.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/ar/LC_MESSAGES/vitals.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/uk/LC_MESSAGES/AppIndicatorExtension.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/zh_TW/LC_MESSAGES/AppIndicatorExtension.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/{effects => conveniences}/paint_signals.js (92%) create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.glsl delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.js rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/{color_effect.glsl => color.glsl} (100%) create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/{noise_effect.glsl => noise.glsl} (100%) create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/{add-window-symbolic.svg => add-row-symbolic.svg} (100%) create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/general-symbolic.svg delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-filled-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/{remove-window-symbolic.svg => remove-row-symbolic.svg} (100%) delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-mode-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/{window_row.js => applications_management/application_row.js} (83%) delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/customize_row.js delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/general.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js rename gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/{window-row.ui => application-row.ui} (96%) delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/customize-row.ui create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui delete mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/general.ui create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui create mode 100644 gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui create mode 100644 gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/keycodes.tar.xz create mode 100644 gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/physicalLayouts.json create mode 100644 gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/ui/icons/hicolor/scalable/actions/settings-dark.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/ui/icons/hicolor/scalable/actions/settings.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js create mode 100644 gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js create mode 100644 gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js create mode 100644 gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js rename gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/{busUtils.js => displayConfigState.js} (53%) create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/logicalMonitor.js create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationIndicator.js create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationMenuToggle.js create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/monitor.js create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/orientation.js create mode 100644 gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js create mode 100644 gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning-symbolic.svg create mode 100644 gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning.svg diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/README.md b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/README.md index 9ac517a..fb547b3 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/README.md +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/README.md @@ -4,7 +4,7 @@ Bring some color to your GNOME desktop by syncing your desktop and lockscreen wa [![Get it on GNOME extensions](/screenshot/get_it_on_gnome_extensions.png)](https://extensions.gnome.org/extension/1262/bing-wallpaper-changer/) [![<3 Sponsor this project on GitHub <3](/screenshot/sponsor.png)](https://github.com/sponsors/neffo) -![Screenshot](/screenshot/notification.png) +![Screenshot](/screenshot/overview.jpg) As featured on [OMG! Ubuntu](https://www.omgubuntu.co.uk/2017/07/bing-wallpaper-changer-gnome-extension). @@ -18,10 +18,44 @@ Also, check out my related [Google Earth View wallpaper extension](https://githu * Image gallery to view, select and curate stored images * Optionally delete old images after a week, or you can keep (and curate) them forever * Override the lockscreen blur (NEW: lockscreen blur is now dynamic!) -* Language support: English (en), German (de), Dutch (nl), Italian (it), Polish (pl), Chinese (zh_CN, zh_TW), French (fr_FR), Portuguese (pt, pt_BR), Ukrainian (uk), Russian (ru_RU), Spanish (es), Korean (ko), Indonesian (id), Catalan (ca), Norwegian Bokmål (nb) & Nynorsk (nn), Swedish (sv), Arabic (ar), Hungarian (hu), Japanese (ja), Czech (cs_CZ), Finnish (fi_FI) and Turkish (tr) - a HUGE thanks to the translators +* Language support: English (en), German (de), Dutch (nl), Italian (it), Polish (pl), Chinese (zh_CN, zh_TW), French (fr_FR), Portuguese (pt, pt_BR), Ukrainian (uk), Russian (ru_RU), Spanish (es), Korean (ko), Indonesian (id), Catalan (ca), Norwegian Bokmål (nb) & Nynorsk (nn), Swedish (sv), Arabic (ar), Hungarian (hu), Japanese (ja), Czech (cs_CZ), Finnish (fi_FI) and Turkish (tr), Persian (fa_ir) - a HUGE thanks to the translators * Image preview in menus & ability to manually set wallpapers individually or copy image to clipboard * A selection of different theme-aware indicator (tray) icons to choose (or hide it completely) +## Quickstart guide + +* Install from [GNOME extensions](https://extensions.gnome.org/extension/1262/bing-wallpaper-changer/), by default your wallpaper will be synced to the current Bing image of the day - if that's all you want you don't have to do anymore, everything is automatic +* Bing Wallpaper (by default) builds a collection of images over time (this can be disabled if required) + +### Control bar +![Bing Wallpaper menu control bar](/screenshot/controlbar.png) + +* 🤍 - Favorite/unfavorite current image (can be used to shuffle only favorite images and favorites are never deleted automatically) +* 🗑️ - Trash/untrash current image (exclude from shuffle selection or optionally deleted from disk) +* ⏪ - select previous day's image (in date order) +* ⏩ - select next day's image (in date order) +* ⏭️ - select today's image (skip to current) +* 🎲 - I'm feeling lucky, show me a random image (by default you should have at least 8 images available, curated with favorite and trash buttons) + +### Quick settings +![Bing Wallpaper menu control bar](/screenshot/quicksettings.png) + +* Always show new images - when a new Bing wallpaper is available switch to it immediately +* Image shuffle mode - switch to a random image at user defined intervals (default once per day or once per startup) +* Image shuffle only favorites - only select favorite images (🤍), by default 'trashed' images are always excluded +* Image shuffle only UHD resolution - occasionally some images are not UHD, exclude these from selection + +### Gallery + +![Gallery item](/screenshot/gallery.png) + +The 4 buttons in the gallery (3rd page in the preferences) do have tool-tips but these do the following: +- Favorite - favorite this image (equivalent to doing this via the control bar) +- Apply - set this image as wallpaper +- View - open image in image viewer +- Info - open the Bing description of the image +- Trash - trash the image + ## TODO * add more languages (#14) - [please help if you can](https://github.com/neffo/bing-wallpaper-gnome-extension/issues/14) @@ -33,10 +67,25 @@ Also, check out my related [Google Earth View wallpaper extension](https://githu * Bing may detect your location incorrectly (and force a locale as above) - if you see this, please let me know what Bing.com itself does * GNOME Shell themes can break some GNOME popup menu elements (toggle switches for example). This impacts GNOME more generally, not just this extension. Double check you are running latest versions of your themes (or disable them). -## Requirements +## System Requirements GNOME 3.36+ or 40+ (Ubuntu 20.04 LTS or later, older versions of the extension work with 3.18+, but are no longer supported). +## Package dependencies + +Below packages are required to build the extension + +``` +npm +gettext +intltool +zip +``` +For Ubuntu you can hit below command to install +``` +sudo apt install npm gettext intltool zip -y +``` + ## Install [Install from extensions.gnome.org](https://extensions.gnome.org/extension/1262/bing-wallpaper-changer/) @@ -53,7 +102,7 @@ sh install.sh ## Enable debug logging -Enable debug logging through the exptension preferences 'Debug options' tab or if unable to open preferences you can enable debugging using dconf-editor with this command: +Enable debug logging through the extension preferences 'Debug options' tab or if unable to open preferences you can enable debugging using dconf-editor with this command: ``` GSETTINGS_SCHEMA_DIR=$HOME/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/schemas dconf-editor /org/gnome/shell/extensions/bingwallpaper/ ``` diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/blur.js b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/blur.js index 95c7b77..b6111bf 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/blur.js +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/blur.js @@ -20,6 +20,7 @@ var shellVersionMajor = parseInt(Config.PACKAGE_VERSION.split('.')[0]); var shellVersionMinor = parseInt(Config.PACKAGE_VERSION.split('.')[1]); var shellVersionPoint = parseInt(Config.PACKAGE_VERSION.split('.')[2]); +var blurField = shellVersionMajor >= 46 ? "radius" : "sigma"; // default BWP mild blur var BWP_BLUR_SIGMA = 2; var BWP_BLUR_BRIGHTNESS = 55; @@ -50,7 +51,7 @@ export function _updateBackgroundEffects_BWP(monitorIndex) { if (effect) { effect.set({ // GNOME defaults when login prompt is visible brightness: BLUR_BRIGHTNESS, - sigma: BLUR_SIGMA * themeContext.scale_factor, + [blurField]: BLUR_SIGMA * themeContext.scale_factor, }); } } @@ -59,7 +60,7 @@ export function _updateBackgroundEffects_BWP(monitorIndex) { if (effect) { effect.set({ // adjustable blur when clock is visible brightness: BWP_BLUR_BRIGHTNESS * 0.01, // we use 0-100 rather than 0-1, so divide by 100 - sigma: BWP_BLUR_SIGMA * themeContext.scale_factor, + [blurField]: BWP_BLUR_SIGMA * themeContext.scale_factor, }); } } @@ -91,7 +92,7 @@ export function _clampValue(value) { export default class Blur { constructor() { this.enabled = false; - log('Bing Wallpaper adjustable blur is '+supportedVersion()?'available':'not available'); + log('Bing Wallpaper adjustable blur is '+(supportedVersion()?'available':'not available')); } set_blur_strength(value) { diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/carousel.js b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/carousel.js index f522ee7..6b0c294 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/carousel.js +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/carousel.js @@ -108,7 +108,7 @@ export default class Carousel { this.log('Delete requested for '+filename); Utils.deleteImage(filename); Utils.setImageHiddenStatus(this.settings, image.urlbase, true); - Utils.cleanupImageList(this.settings); // hide image instead + Utils.purgeImages(this.settings); // hide image instead widget.get_parent().get_parent().set_visible(false); // bit of a hack if (this.callbackfunc) this.callbackfunc(); diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/extension.js b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/extension.js index 493e2c8..c520b31 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/extension.js +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/extension.js @@ -55,10 +55,16 @@ const newMenuSwitchItem = (label, state) => { } function log(msg) { - if (bingWallpaperIndicator && bingWallpaperIndicator._settings.get_boolean('debug-logging')) + if (BingDebug()) console.log('BingWallpaper extension: ' + msg); // disable to keep the noise down in journal } +function BingDebug() { + if (bingWallpaperIndicator && bingWallpaperIndicator._settings.get_boolean('debug-logging')) + return true; + return false; +} + function notifyError(msg) { Main.notifyError("BingWallpaper extension error", msg); } @@ -152,12 +158,12 @@ class BingWallpaperIndicator extends Button { this.toggleSetBackground = newMenuSwitchItem(_("Set background image"), this._settings.get_boolean('set-background')); this.toggleSelectNew = newMenuSwitchItem(_("Always show new images"), this._settings.get_boolean('revert-to-current-image')); this.toggleShuffle = newMenuSwitchItem(_("Image shuffle mode"), true); - this.toggleShuffleOnlyFaves = newMenuSwitchItem(_("Image shuffle only favourites"), this._settings.get_boolean('random-mode-include-only-favourites')); - this.toggleNotifications = newMenuSwitchItem(_("Enable desktop notifications"), this._settings.get_boolean('notify')); + this.toggleShuffleOnlyFaves = newMenuSwitchItem(_("Image shuffle only favorites"), this._settings.get_boolean('random-mode-include-only-favourites')); + /*this.toggleNotifications = newMenuSwitchItem(_("Enable desktop notifications"), this._settings.get_boolean('notify'));*/ this.toggleImageCount = newMenuSwitchItem(_("Show image count"), this._settings.get_boolean('show-count-in-image-title')); this.toggleShuffleOnlyUHD = newMenuSwitchItem(_("Image shuffle only UHD resolutions"), this._settings.get_boolean('random-mode-include-only-uhd')); - [this.toggleNotifications, /*this.toggleImageCount, this.toggleSetBackground,*/ this.toggleSelectNew, + [/*this.toggleNotifications, this.toggleImageCount, this.toggleSetBackground,*/ this.toggleSelectNew, this.toggleShuffle, this.toggleShuffleOnlyFaves, this.toggleShuffleOnlyUHD] .forEach(e => this.settingsSubMenu.menu.addMenuItem(e)); @@ -220,15 +226,21 @@ class BingWallpaperIndicator extends Button { // listen for configuration changes _setConnections() { - this._settings.connect('changed::hide', () => { - this.visible = !this._settings.get_boolean('hide'); - }); + this.settings_connections = []; + + this.settings_connections.push( + this._settings.connect('changed::hide', () => { + this.visible = !this._settings.get_boolean('hide'); + }) + ); let settingConnections = [ {signal: 'changed::icon-name', call: this._setIcon}, {signal: 'changed::market', call: this._refresh}, {signal: 'changed::set-background', call: this._setBackground}, {signal: 'changed::override-lockscreen-blur', call: this._setBlur}, + {signal: 'changed::lockscreen-blur-strength', call: this._setBlur}, + {signal: 'changed::lockscreen-blur-brightness', call: this._setBlur}, {signal: 'changed::selected-image', call: this._setImage}, {signal: 'changed::delete-previous', call: this._cleanUpImages}, {signal: 'changed::notify', call: this._notifyCurrentImage}, @@ -244,11 +256,10 @@ class BingWallpaperIndicator extends Button { // _setShuffleToggleState settingConnections.forEach((e) => { - this._settings.connect(e.signal, e.call.bind(this)); + this.settings_connections.push( + this._settings.connect(e.signal, e.call.bind(this)) + ); }); - - this._settings.connect('changed::lockscreen-blur-strength', blur.set_blur_strength.bind(this, this._settings.get_int('lockscreen-blur-strength'))); - this._settings.connect('changed::lockscreen-blur-brightness', blur.set_blur_brightness.bind(this, this._settings.get_int('lockscreen-blur-brightness'))); // ensure we're in a sensible initial state this._setIcon(); @@ -275,19 +286,23 @@ class BingWallpaperIndicator extends Button { let toggles = [ /*{key: 'set-background', toggle: this.toggleSetBackground},*/ {key: 'revert-to-current-image', toggle: this.toggleSelectNew}, - {key: 'notify', toggle: this.toggleNotifications}, - /*{key: 'show-count-in-image-title', toggle: this.toggleImageCount},*/ + /*{key: 'notify', toggle: this.toggleNotifications}, + {key: 'show-count-in-image-title', toggle: this.toggleImageCount},*/ {key: 'random-mode-enabled', toggle: this.toggleShuffle}, {key: 'random-mode-include-only-favourites', toggle: this.toggleShuffleOnlyFaves}, /*{key: 'random-mode-include-only-unhidden', toggle: this.toggleShuffleOnlyUnhidden},*/ {key: 'random-mode-include-only-uhd', toggle: this.toggleShuffleOnlyUHD}]; - toggles.forEach( (e) => { - this._settings.connect('changed::'+e.key, () => { - e.toggle.setToggleState(this._settings.get_boolean(e.key)); - }); + toggles.forEach( (e) => { + this.settings_connections.push( + this._settings.connect('changed::'+e.key, () => { + log(e.key+' setting changed to '+ (this._settings.get_boolean(e.key)?'true':'false')); + e.toggle.setToggleState(this._settings.get_boolean(e.key)); + }) + ); e.toggle.connect('toggled', (item, state) => { - this._settings.set_boolean(e.key, state); + log(e.key+' switch toggled to '+ (state?'true':'false')); + this._setBooleanSetting(e.key, state); }); }); @@ -300,7 +315,32 @@ class BingWallpaperIndicator extends Button { [this.clipboardImageItem, this.clipboardURLItem]. forEach(e => e.setSensitive(false)); } - } + } + + _setBooleanSetting(key, state) { + let success = this._settings.set_boolean(key, state); + log('key '+key+' set to ' + (state?'true':'false') + ' (returned ' + (success?'true':'false')+')'); + } + + _setStringSetting(key, value) { + let success = this._settings.set_string(key, value); + log('key '+key+' set to ' + value + ' (returned ' + (success?'true':'false')+')'); + } + + _setIntSetting(key, value) { + let success = this._settings.set_int(key, value); + log('key '+key+' set to ' + value + ' (returned ' + (success?'true':'false')+')'); + } + + _onDestroy() { + this._unsetConnections(); + } + + _unsetConnections() { + this.settings_connections.forEach((e) => { + this._settings.disconnect(e); + }); + } _openPrefs() { this._extension.openPreferences(); @@ -312,7 +352,6 @@ class BingWallpaperIndicator extends Button { this.clipboardImageItem.setSensitive(!this._updatePending && this.imageURL != ""); this.clipboardURLItem.setSensitive(!this._updatePending && this.imageURL != ""); this.thumbnailItem.setSensitive(!this._updatePending && this.imageURL != ""); - //this.showItem.setSensitive(!this._updatePending && this.title != "" && this.explanation != ""); this.dwallpaperItem.setSensitive(!this._updatePending && this.filename != ""); this.swallpaperItem.setSensitive(!this._updatePending && this.filename != ""); this.titleItem.setSensitive(!this._updatePending && this.imageinfolink != ""); @@ -348,7 +387,7 @@ class BingWallpaperIndicator extends Button { if (this._settings.get_boolean('notify')) { let image = this._getCurrentImage(); if (image) { - this._createNotification(image); + this._createImageNotification(image); } } } @@ -555,7 +594,7 @@ class BingWallpaperIndicator extends Button { } _curImage() { - this._settings.set_string('selected-image', 'current'); + this._setStringSetting('selected-image', 'current'); this._gotoImage(0); } @@ -569,13 +608,13 @@ class BingWallpaperIndicator extends Button { if (randomEnabled) { log('enabled shuffle mode, by setting a shuffe timer (5 seconds)'); this._restartShuffleTimeout(5); - this._settings.set_boolean('revert-to-current-image', false); + this._setBooleanSetting('revert-to-current-image', false); } else { // clear shuffle timer if (this._shuffleTimeout) GLib.source_remove(this._shuffleTimeout); - this._settings.set_boolean('revert-to-current-image', true); + this._setBooleanSetting('revert-to-current-image', true); } } @@ -627,7 +666,7 @@ class BingWallpaperIndicator extends Button { let newImage = Utils.getImageByIndex(imageList, curIndex + relativePos); if (newImage) - this._settings.set_string('selected-image', newImage.urlbase.replace('/th?id=OHR.', '')); + this._setStringSetting('selected-image', newImage.urlbase.replace('/th?id=OHR.', '')); } _getCurrentImage() { @@ -645,10 +684,17 @@ class BingWallpaperIndicator extends Button { this._restartTimeout(); let market = this._settings.get_string('market'); + // Soup3 should be the version used, but in the past some distros have packaged older versions only if (Soup.MAJOR_VERSION >= 3) { let url = BingImageURL; let params = Utils.BingParams; params['mkt'] = ( market != 'auto' ? market : '' ); + + // if we've set previous days to be something less than 8 and + // delete previous is active we want to just request a subset of wallpapers + if (this._settings.get_boolean('delete-previous') == true && this._settings.get_int('previous-days')<8) { + params['n'] = ""+this._settings.get_int('previous-days'); + } let request = Soup.Message.new_from_encoded_form('GET', url, Soup.form_encode_hash(params)); request.request_headers.append('Accept', 'application/json'); @@ -660,6 +706,7 @@ class BingWallpaperIndicator extends Button { } catch(error) { log('unable to send libsoup json message '+error); + notifyError('Unable to fetch Bing metadata\n'+error); } } else { @@ -675,6 +722,7 @@ class BingWallpaperIndicator extends Button { } catch (error) { log('unable to send libsoup json message '+error); + notifyError('Unable to fetch Bing metadata\n'+error); } } } @@ -694,6 +742,7 @@ class BingWallpaperIndicator extends Button { } catch (error) { log('Network error occured: ' + error); + notifyError('network error occured\n'+error); this._updatePending = false; this._restartTimeout(TIMEOUT_SECONDS_ON_HTTP_ERROR); } @@ -759,13 +808,13 @@ class BingWallpaperIndicator extends Button { log('WARNING: Bing returning market data for ' + datamarket + ' rather than selected ' + prefmarket); Utils.purgeImages(this._settings); // delete older images if enabled - //Utils.cleanupImageList(this._settings); // disabled, as old images should still be downloadble in theory + //Utils.cleanupImageList(this._settings); // merged into purgeImages this._downloadAllImages(); // fetch missing images that are still available Utils.populateImageListResolutions(this._settings); if (newImages.length > 0 && this._settings.get_boolean('revert-to-current-image')) { // user wants to switch to the new image when it arrives - this._settings.set_string('selected-image', 'current'); + this._setStringSetting('selected-image', 'current'); } if (this._settings.get_boolean('notify')) { @@ -773,7 +822,7 @@ class BingWallpaperIndicator extends Button { // notify all new images newImages.forEach((image) => { log('New image to notify: ' + Utils.getImageTitle(image)); - this._createNotification(image); + this._createImageNotification(image); }); } else { @@ -781,7 +830,7 @@ class BingWallpaperIndicator extends Button { let last = newImages.pop(); if (last) { log('New image to notify: ' + Utils.getImageTitle(last)); - this._createNotification(last); + this._createImageNotification(last); } } } @@ -791,6 +840,7 @@ class BingWallpaperIndicator extends Button { } catch (error) { log('_parseData() failed with error ' + error + ' @ '+error.lineNumber); + notifyError('Bing metadata parsing error check ' + error + ' @ '+error.lineNumber); log(error.stack); } } @@ -801,15 +851,25 @@ class BingWallpaperIndicator extends Button { } } - _createNotification(image) { - // set notifications icon - let source = new MessageTray.Source('Bing Wallpaper', 'preferences-desktop-wallpaper-symbolic'); - Main.messageTray.add(source); + _createImageNotification(image) { let msg = _('Bing Wallpaper of the Day for') + ' ' + this._localeDate(image.fullstartdate); let details = Utils.getImageTitle(image); - let notification = new MessageTray.Notification(source, msg, details); - notification.setTransient(this._settings.get_boolean('transient')); - source.showNotification(notification); + this._createNotification(msg, details); + log('_createImageNotification: '+msg+' details: '+details); + } + + _createNotification(msg, details) { + const systemSource = MessageTray.getSystemSource(); + const bingNotify = new MessageTray.Notification({ + source: systemSource, + title: msg, + body: details, + gicon: new Gio.ThemedIcon({name: 'image-x-generic'}), + iconName: 'image-x-generic', + }); + systemSource.addNotification(bingNotify); + //Main.notify(msg, details); + log('_createNotification: '+msg+' details: '+details); } _shuffleImage() { @@ -889,7 +949,7 @@ class BingWallpaperIndicator extends Button { this.dimensions.width = image.width?image.width:null; this.dimensions.height = image.height?image.height:null; this.selected_image = Utils.getImageUrlBase(image); - this._settings.set_string('selected-image', this.selected_image); + this._setStringSetting('selected-image', this.selected_image); if (("favourite" in image) && image.favourite === true ) { this.favourite_status = true; @@ -944,14 +1004,14 @@ class BingWallpaperIndicator extends Button { let stateJSON = JSON.stringify(state); log('Storing state as JSON: ' + stateJSON); - this._settings.set_string('state', stateJSON); + this._setStringSetting('state', stateJSON); } } _reStoreState() { try { // patch for relative paths, ensures that users running git version don't end up with broken state - see EGO review for version 38 https://extensions.gnome.org/review/30299 - this._settings.set_string('download-folder', this._settings.get_string('download-folder').replace('$HOME', '~')); + this._setStringSetting('download-folder', this._settings.get_string('download-folder').replace('$HOME', '~')); let stateJSON = this._settings.get_string('state'); let state = JSON.parse(stateJSON); let maxLongDate = null; @@ -1015,7 +1075,9 @@ class BingWallpaperIndicator extends Button { let BingWallpaperDir = Utils.getWallpaperDir(this._settings); let dir = Gio.file_new_for_path(BingWallpaperDir); if (!dir.query_exists(null)) { - dir.make_directory_with_parents(null); + //dir.make_directory_with_parents(null); + notifyError('Download folder '+BingWallpaperDir+' does not exist or is not writable'); + return; } log("Downloading " + url + " to " + file.get_uri()); let request = Soup.Message.new('GET', url); @@ -1035,6 +1097,7 @@ class BingWallpaperIndicator extends Button { } catch (error) { log('error sending libsoup message '+error); + notifyError('Network error '+error); } } @@ -1059,12 +1122,14 @@ class BingWallpaperIndicator extends Button { } catch(e) { log('Error writing file: ' + e); + notifyError('Image '+file.get_path()+' is not writable, check folder permissions or select a different folder\n'+e); } } ); } catch (error) { log('Unable download image '+error); + notifyError('Image '+file.get_path()+' file error, check folder permissions, disk space or select a different folder\n'+e); } } diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/cs/LC_MESSAGES/BingWallpaper.mo b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/cs/LC_MESSAGES/BingWallpaper.mo index 7a93e54cb7d3d9fa2b87c56ecf6afcbea5f703d9..27c1a6fcd41c3146dbb3d203cd1adb74eab19b62 100644 GIT binary patch literal 7082 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 XYAJ`E$h+SU%MG&Wvoq#wf6M$I@@p%D literal 7358 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 delta 1628 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 literal 0 HcmV?d00001 diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/it/LC_MESSAGES/BingWallpaper.mo b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/it/LC_MESSAGES/BingWallpaper.mo index 2f74f53373c738f21049b8aa8438189146ff8dc8..89c35e9f0385f386fb0f50881e2b2fd4f8f535d7 100644 GIT binary patch delta 1284 zcmXxjOGs346vy#n(&V5=;qjo_l7Xi+U%xR9t-C5UYzAqcAPFQ?0#`}zOx%$)!EKklvQc=SnElC#>( z1~SZiID+{&ip_W*1NaG(@f-57@7xOUHej4n1%hg5icVjd&n&tpW=Fag+W~K zn`1dNY~^y|TvUQm3}YQCQ75M02rA(*tEl#5L`Z=n=g+xD{>h$|s)CxAC5)a@pypGEI z8I@-Vl_x;8=vb5n&#W5@@H{HvI4aRSY{MBW!4#_15|$&oWD(T=TCo+ou^JyCi)3?H ziHk@I%cF`itj0>lw@w;b!m9}tXsHOh@$t z$XT?ATjR}6YoK+AsB+uAp$;1Vay6>Kb%3ZRn44`NI3Bi#(Ce>DcAs-vzD;Fnl9X`c8oW%hC z%rIwZ;?&Ie1lbtoMloulW=z9=rA;Gjx9ip@BM+Ooe1^Qp5+T7|9Hj!_)J zFit1#e@9hT<wL9OTvmf{7>$NQ)~e~wCUE-_9cJN>=_Rlz#c#3%76 zUPsOQ88y#u)I5H&MaOFBaLsy96P-g%a2eZi9E)%cRXQKpvO5;Q)fmARY{G4L11XA4 z;TD`h9<@b`U^ZFkdK81a-%c!b%&s8k#Kur7oWu%znQ#%=UMuCKX+;gF-*uo8JB57g zB40|_MZNeL>UT4!7tf;-FJS*Ny6HseOkguA!!LLc(>WnWunYCKdx)FyH7>&i)ZbUL zr9c{L>_^U`)wmU&Twg7{4x-FG;0bjeqNlm)3AO!1lwfVPp5S=c9%2WfrmgzlnAYlu zYC?H55-skOCsd?^qKws4nlQ18&`H(*w8>rY6y|KDx0g`vYOQX>TjEoR)poj_-om^p zdi$2f@y$@T+`Z;4k2KKRPH2xS36)ZVgJ2ke|YHl>E6MC@W5bi WEH|q!JvJ7YOmUq+FxD7+m-G*{z}6&`6B&|DU;w-pqG@=f2K4_dDO6 zL+ul7*`KNtF9o(9qJj9KG=wZ3OtNDeDG%XFdX@JHkqF0!-3-;gmvDWjUP zDqMt3xDdCX_YcP&K$loUp?e**WtgXfeHwDf|enk-yN4 zwDPnrM>}pui)|A+(H?YSk75S}-H&E?l=MaT89L!#tI7X48vk*^4#vonRr)nr1CwZn zmAr<>)fiz4nM>G!cDx0fs<2>Gr=h5fplTMd(CGswz6V1>g$f{(+-uT3` zxQYv}<1(B;ULw?xUk6U1)!vC*3Tbo#!`Os}(KR1KpF5B9@DDV@a~Rbn>pVPrkZ&v0AJ|(pJcqId{98SQM6ra9`oDxSKYmZFAj}V{Q$l zgp0Jn+~wX&CUQ}EBI_4(8_`O*-BH*V3)$jd6CW?djd7b*FVxZfxP-VhJ}+&=3gQ96 z&)qtFkZ`l;w-T0C-QwWo+{1%S+%Vs zzjO9LY3^)eeSW-pZ?a}x-(#79%?eFUydOyEAGnh};j!w%rHN07pn`~_P EAFgh^I{*Lx delta 2064 zcmYk+TWAzl9LMpqn~iA_O_NR5#Kh=mZPjQR@8%xcB(`d!(NHgeB9rcFRGnpJ{C$o$hkEgHzf5RcXg}UYF2gVfR52*Xjqkg}R zg?Jk$;6E5ZPj>qLVyx3tRdmX^uoWlaKFr0Fs09t+G`xwW_&=6mK~8$0N*u>|t7`|2 z;oQa#u^TI~A2t5ZsBwo<=e+78Iu<{8m{kK$MGer1pI|F$;vQ_o?~#`=mr)bnKn?sS zk`(h2{pcH;wiu^!UV(biHq`iAu~ey!(`mr{n1|QUhkqb{W|)Hpe1eQ^UZDocW%ijk z6Q^Sb>i!+Bdr@0(7?t`{s4cpL7T!fi13sgpz0F|uA`GAgtU$fd8syJ(a!^XcsOPq$ zp4)>AVU8ew<|hssX8<+vRn&9CsLVaZe0-kA{;T@3xvCp}YT>(33;hn8DeOaNaekL{YT?iPbbQU^P~t2Kp8&@c>rgAZqKL;0!Ec5T(2UXW>#*QO9v3I>+1_Mp1j{ zC7)9;ANA(*kR+H|WK6RXHBbokh6hm-44?+Sh|6&V^;{L{)Rs0Q?_%0f8QO&GhGTZS zKP0f03ukc={)?J$3i)MirW#fC?Z_n)MJ-@2&c@TIy}pNfZUiUe3si>7m{nWWhOEte zgQfb^ZF4UiM6LJ)vNCfHwH2393%HM(@IUvwh_8qSoQ+ygJs!oisOO%#*S)M--v>W7 z;9P9O80OT|xkyJs$dzhfl&L5(DK!) zi7yCkj7F*rP2&+<8{qXmTOMXf1KD*G1wM)!O^u6Fy{u{p$7 z#5|&kc++a>EGAYG`sd0a+6gtj3}!u{&x8J9I_+(7g2#hR|eHhU=&?Q1W^c4-`}<#_TT4uAAQdMchCGY{>cHGwZa(lG}#zC zzQwip4(ss;reRr%G4a@ld`t^p>er6^i|NH2Jck=`1oQ9-F2|2phzrQaWTqOk67y1x zWj0W$rXd5nF%vJK1|CKY5JDGDpayz{iTE8g;BQ=p39MHAGEn{8$e&CFu0bF2F-Q4Y zg{RZ3=)@KcOKAvU2=Cx(^f2mXY(pfOO;kG2tp?OW?xF^s#P#?MD=;<7n4RducD#zpmG`KAS)6k}7GeqB z!h1N4+Q11COdGP06S2$~6?L4AHkc2X%X1Rj)53~Tcie?au3kKYBd7&0qOLAGJ33B2 zZsXa58fOq2@CF{nS**i+R^efObCOCM4Wp>6o<|+oFYLfNmR*K7QOWuo*^K#&)%X`X zv6|VA;|OX)3#bMELA?!yF76#$Q48-zr$uFmiWhIAI?Q1$>c94b7qzhKIECZbgq_@r zj(QX)P_s0^eLRR?P{~=xs%=QB4UF^Ty*EbMw4W8`{gr}2V$Av>_!Ia=JcWJoDS!oYn Ib3cmv2V?q$sQ>@~ delta 1362 zcmXZcO-PhM9LMolwcT`evln}DGuO1Nd?|H(SIkxh|{SAwQFvWz2fa z#v&}rGM34q5vF4!_M#@fftp|peK?7lXa-&Q9W~)1uE8bLxD=w+I1kcge7FV6k)H|i z*npj=?+$pZ!~|n>tfu1*-o*#F2`iYr9K+avH*p)rl72>IXbD>!#w=qE@AX8n2Zynl z{wdTvKS-ZGoJATAW1*F7Tt>cWp5so8qaPPhDb6KqeYg(Cu@k-c3j?@<8duBg7qAD1 zaSjh*4e71K5$wcg7(&a*GD~Tk!~z^e1@aIz@l)K6f3ONOHXCyUgV>I@P-o@~YFrNa zzJx_sf)n@%U!oS!%|X+GMv;tI<~|J#oKJL^ub9ufi{)vLi&2Nmk5{n=73h1^miKEMqo$eTl$JkyuR|Hdr*S(9nR#SdSm^6uMcaw&px4z;T?# zDQv@kDW@rG}=9h z%qZQvlJ8o9_Ln5s=R)00dL)Y$qS6w1vnoGNc}%D3?6d3kWd*zVBMzrGP)55s*`sW! zXz@CN2xE4`2cbN{~QY0uKaMLf1ObDb4AxtLj|-_j7u_^5FfSFxJ(y=I!vO;5*@G;M?Hm z;kUs*hwp-W)%!13&;J8z+<(IZ@PY3v`7nGB_lMyF@FJXtx2pS3!tdh#SKzzhZ$Zuf z1^5{J8>n?(hZ=9@N*;i3;r3xD(I11~3lBrhzYM<{_8~*f3sCcZ8cOfaK@0x^J_=uh zTK~Scmh-(2KF<9?h)QMyYW`=S){UX`+=7zx6YxR!drQe_w?bz6IlH zzQ>{bc>=xzo`)ZV&q2-m2`D*!A4<+YskjFv$6rD9|3|3#9-tFn%|lS{4?)fU1hnuX zlzpDB?tcMl-It)`yazS@RVX|EGyER-?-lQ3QqA{{iU*+51vT$4!wiO?L#nmfN z{r?Ughp$6iZ070w{qPi29N&a`ot@j5|^Zo-o4gU>FzauE8b&o^cZ$SC&Ce*kNRQ!Gxo`J7G3;zph{f7`v_WJDE*&f@>ls$hAuE1Y| zN8y*D#vi~4lH;9Fa=#zSe#hY@_%u|${sxraz6g~c{|RxG`Jd|kK?cbm?}A$Iy^!?q z-+|ZdSx7jUO`2j*`F)P|4DBNAqqKF}=sL-l9~|94$uA%2l8n-W<;@Y=HJYx2H2Fog zl76z)E!r`ft|w`VE6nHh2L5XBNy+!R>Va&pe2`A^hhpUIG}-zDO*Xhr)1`R&F@52> zN|T?@>xOHU_7qKf#|F*OM%VjBU!Y=KmwcdWjV62lFzqHyxu;7$IZIP6=(<6x(LSad zt`C>+pNhY4rQvFS9pdv8ZJAd0PpEGdFTg9br)f*H1)47FKTBUf%J(0oU8bpK=sHaM zA^)w+v(tQ696myOj&^{it65_Fd1my@ZWeLV4Xn#;FKotPyOW#KR}z~Btu)9wHfwZ( zW)TI=v*vWzbM3&!t{2!&kOpVXay=<>vm9-^L1u&7{UpuplVRMpO_#gT^Q@C>+c?;^ zet2e<`~7HOmbYD)t82B;{QSJ}L!a8*xKfVyx3^pr^<6(m%eUiOo3w1+3G528w-Vk) zMQXD=4dQm*nZ2{yoglVR(hg(WPm^9hw_#@EB)3~(7S^M{oa?w4&00y+WTA6OoTp*E z$dfeVravepw>Pd`ws~S3QP{61E^SV~n|)qndD634r)agJz=m-iq+2d3e$q*dU#knCtmKzCjck?Ucs=XGbw>=+f~Ktx?0SfegUFt9SU!r(6>@W|XqBZl*uqdM3@tLoTb_Qm zCzAM^${L1xp;$R$vq%NRHp8Bt^}|M9q{^!lqcYjNo=%o>TP}>04Q8WHxcPi9l?u^3 z?fDQdJ?A@A`RTux{bruTl|{C~V4F1d-B`H_sL8U;DhIMr5^SJrs*rHxyjE>Y`Os#h zUqjwBSMh9+XXa{=QZ0z$Jat*eJY9q`eUPi3W#*cTo0x2r_0>JGQBE|azc+0I7gY0K zt7`6*WZPV0RhLn1lRRL~z}HrXidj|!X0uGtNu-%gFJP0MNqYf&> zZ#2co64fmKUx(b*U8CDh6ZVbL;7pzSvQdTK)YI`q>QkC$Q`l**ae&#!i#Q6hOioKn|0sh$Xs*kHDmyZ* z&+zRqig14~*`jjir9o9=>W;j-8Kf#F<|ZL#ZjH+BFIdw7$eqy&dK4)R2ziQ5#&}#pG%@E>=^02)QX=j)NDm28L|Qj89@V)7kC4gY7cY z3*$ner7&h0JtV-B=ZVGI#b&M2bji+@u~%Eq+F`TyWYNxQ*ApIJ-Kbp)w1FmZZG~7{ zvd0#Wov1AyuN_~sM^7#tTRgmYd~tD3^{a-N<1A9KU9y`FBiZ3+*&giaf$J7o$JOf} zZTBb!^Npl;mLYMwpkCLm2d=kduNP@IlfEoC&oBBzc{Dk0UJf_`k;@}Idd=c zBZ})ORhkr^oVjuReC_0BzoToG@{o~(!Y+*P94MYZ!3x@^hDeSe#sId;mH zU(dw$ku&z_skvurYe5{OrS+~RL6fjNK7V5V*ql*(U3EJywe5g(7`SxrZnk&VoPIWl z!zkdOw&Qv(j$GVx&Aq#v;o8HO)8THM4|lDe*g8TC+*xzMb-R0aISQ8NEGi=7(=ZNo z)GKGP^uKqn?M{-AoZtmmq1_^BuoA8#cYG zx+7OHvBY;AYxZ8EW~GE6!j>i-KVp8f66(C!wcRixo`Wt~;=^(560h-_2#2kMDf^*^ zKXp#oAPz)sY z2S6NHaD-hclV;f`%_Ji1DB>q^Rz>CbSJ0tiHsct)!**95ZHpZj6Cgw)R?FO=<&^gv zaOGoqD*M_}doA4IfK?_<>89KdLfm*d(wIx3QYMnO{gkk?5!ns(dk z5#fA-rUaoPjr?j)+c%tEY-%)}&`M&@bl7`|n6+c8mFi3svsu_{2U$pIz-eZaT})+2 zuI7-OQE{iT&vHg)exIUbBGQ>l(@{5jH(eIW7@R#XTdJRH`C1vaKjO`5-Xj1J4N%six)(Tr3BktYdrC%-_ zzQ|8q4u||Uq|3ayR78Fhhi&vu-yjN|${IWIn6iLukXuI4rTnC#nn{V&-P+j6lSHRZ z`<_$pm{~py8~&Wlxao-0Mx+zYOtq*cVN>G-GszOFaX{CoD&n!-7ka+hg`954Z`C~x zY&(|f9jWr!WwuCF@8Qo5U+#0@R|?@uqF8%`GUWn6%_GWe+4CCbmp1WP)#0wWlte){ zV+&)m)M>JMz2Chmy5`<*hP`HJ%k9r>`atRFOz%?=pQi;svwhVyt15x}wDHw^xjN3{ z zCvo8mzkW`jm3Lg%MZ`Z^rK13u%BgYbo*agz6;*Wv zh3a@rrI_AIL+TjyfzwlAuKJ%ImE~1!)w!)Ki6@=*i6gBn+u(GDmZ`)MbTqN5ls~)r Zay5H&&78~m_0kQy&geToH}C1}^M6|>1Hu3R literal 7556 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 diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/uk/LC_MESSAGES/BingWallpaper.mo b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/uk/LC_MESSAGES/BingWallpaper.mo index 574e917b9b4d39215e006a1a4ea078e134682c9c..bed788d7b71d4965931fa2bd38c9ee24e2bcc7a8 100644 GIT binary patch delta 1389 zcmXZcTS!z<6vpv2IgXk4%1Ui=%uD4|nq#SHc`3{6!AjI32nEM791E-@2rfN7 z;d~4wht00gImL~on8>K>F%K)T8CT%IoI|Keyq@zd#&Z20wZKWNc9~6KG1vL5svKJ} zlludx@o!Uh&G$j|573#xYRsojsz?wE@eG#YO;pK0;!6C3z33&ab$AiWa1>REAJ~m< z(%p}}sD(VAQ6WgU(sh-oM0roW@j4WSOn#MJ?zA>TFy?EqD@p^n96FEnYy1 zX|J#iCs11$U_Y+oLG%G?7M00y)B>(z2|hvX`7bO$cb3^X^dke_odkT0l(rcusZ=C@`#o4L`Cd+;9a#TYhTC2BzpJcy;`RK}yI30|Q7ZU#xx3VgGP)F4A!A8x?Qm=mV+m`)K+p(acxEvjbiID)5fD;BZw z?bwU=aU279o_DVgAE36ZnDlkJYjFWKqAJ*eE>yBx2t5l|@TGUZj9?z;@a#i1#>`{NY4P~$wHs<2Rp;eWv32IvHWE5+ z+X)qYH=*OA|7)B$t0L64MV@*p;~Qo#ED(*48*-<191i;Wj-2f3>IwQn$2x=2;e=cB XqM_uL#E3s95Pg){?TH@BamD-xpD~Fl delta 1384 zcmXZcOGs2v9LMqhq>hcRo>q>UGiHUae7`a^OVbL=NaaoB)sEM0U?|0#1 z>`MunU7;~d$7=NObQAiq7Ta(wjz+zUipW&dcNoY02h>8RvB70FhsE4yv$|^RKrj8H zsPXSCkIeTmNTZC7AK0K5h?hch4D;|bmg6l{=)Yh#{>DM{vb{pQgjM(e6_KCVi!Qd^ ziT$XByomY_cX1!AWVRhN&ZBbRC9cP>xD-8vncp&)RUxTI?IeI&z*W?lKgSLD7DsR%dC|_Kn-Mg-j#)U4 zO0xHO3g@vI0~yhzL@jUzm9&|Jb2IZ>BaJpX&f-3Ng9=R+2d{zqupBSrA$*2?n8rix z^a5&!A=LLCBb&2dSc(b0$kEkd3HOIl8yLf)AdUMpG~q1jg*=`TH9LY6coOTefP+7Z z{rC`HV;PRHond^0I(NRJ(ah^=&pNC3LIw_!^woXE& zB;<0Z*AzrR diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/zh_CN/LC_MESSAGES/BingWallpaper.mo b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/locale/zh_CN/LC_MESSAGES/BingWallpaper.mo index b2e8a82b5a5615279123a86c0f31c224971b497f..d9d4e82c04623579aefdd402a0e5aca6cbe1362e 100644 GIT binary patch literal 6554 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 OHS@;*{UHEnvi|^LN^w2_ diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json index 8d55d13..43b2bc4 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json @@ -6,9 +6,10 @@ "settings-schema": "org.gnome.shell.extensions.bingwallpaper", "shell-version": [ "45", - "46" + "46", + "47" ], "url": "https://github.com/neffo/bing-wallpaper-gnome-extension", "uuid": "BingWallpaper@ineffable-gmail.com", - "version": 49 + "version": 50 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/prefs.js b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/prefs.js index a2a1c20..228a467 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/prefs.js +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/prefs.js @@ -73,6 +73,8 @@ export default class BingWallpaperExtensionPreferences extends ExtensionPreferen const debugSwitch = buildable.get_object('debug_switch'); const revertSwitch = buildable.get_object('revert_switch'); const trash_purge_switch = buildable.get_object('trash_purge_switch'); + const delete_previous_switch = buildable.get_object('delete_previous_switch'); + const delete_previous_adjustment = buildable.get_object('delete_previous_adjustment'); const always_export_switch = buildable.get_object('always_export_switch'); const gallery_page = buildable.get_object('gallery_page'); const carouselFlowBox = buildable.get_object('carouselFlowBox'); @@ -213,6 +215,7 @@ export default class BingWallpaperExtensionPreferences extends ExtensionPreferen settings.bind('random-interval', randomIntervalEntry, 'value', Gio.SettingsBindFlags.DEFAULT); settings.bind('trash-deletes-images', trash_purge_switch, 'active', Gio.SettingsBindFlags.DEFAULT); settings.bind('always-export-bing-json', always_export_switch, 'active', Gio.SettingsBindFlags.DEFAULT); + settings.bind('delete-previous', delete_previous_switch, 'active', Gio.SettingsBindFlags.DEFAULT); // button opens Nautilus at our image folder openBtn.connect('clicked', (widget) => { @@ -276,6 +279,7 @@ export default class BingWallpaperExtensionPreferences extends ExtensionPreferen settings.bind('override-lockscreen-blur', overrideSwitch, 'active', Gio.SettingsBindFlags.DEFAULT); settings.bind('lockscreen-blur-strength', strengthEntry, 'value', Gio.SettingsBindFlags.DEFAULT); settings.bind('lockscreen-blur-brightness', brightnessEntry, 'value', Gio.SettingsBindFlags.DEFAULT); + settings.bind('previous-days', delete_previous_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT); // add a couple of preset buttons defaultBtn.connect('clicked', (widget) => { diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/schemas/gschemas.compiled index bdd63d2234bd5eb535e55dd7d2fa231a16092d50..fd85d11cb8bb4f651a9c2622a81cb35281674a69 100644 GIT binary patch literal 2473 zcmaJ@U1%It7`@RXCf2k`8f_Arx-~{N(AkY?)q(*ll3HpY_@b#cn7g|-yVK0hUFIj7 zwM_}7BKAS@62yW(4=U9X@gYc%R`Vj{ArX8l_@ER*q@svH8d0g|+}TaiU>!Jn4rlKF zeE0kIxfi8pOE(bZrxiRD>G)k06I^q@5V!C|?*>eplkk5&T6clXsN>?8I1iqy7NQEQ zy=)@u>by$$IpsJBH4!M+x3%jhQns5dO2;Y4g7Vn)QT*`XoOhRjVFXbF+*3v!nAia{ z0K0(3|3DKwq8Y%_4fcTB%Ge9;DB~e85!-@J=tqDq;N0rkM-PCxuU%qXEP|JTlY_C- z^r`FNUjyF&{v3L0mOga@{B`g@!16O6&(NptgdfAkx`3uP?F;m&_rN~_?g!>(`v&P# zbKW8FF!0r5-x;5JC;S5V4A2)l^c&k#H^H9<&j7XR(698VInE{UEUz@aI z4J=Ha-NA27T?2m+{0H#vOEaBpPtEqC7Vm*ur)tjAr{?&r;11xus{Kp!skzP`@Z-S9 z&A+eHr{?(_1E+!d-}@TqQ`f>TfJ?x>bJLCVsp(IFUk8p}PPNmg-V6T{cotaw^0P_$ z)Xnf0z~2DH<11_Qsp($>uK`!EiU~2$=xc>GT`qb6%TfrSbje~oE*pDr5(WmD590B(O zOYa;g(Wh>OKLS1tT>b0Ae)`lr=V|a|pzYw)I(=%!)gpMA=v}=+pPK$p;9r1_6Hl+u zr{?%|^_U-M9C^QsKJ{++F>n`9dt93DLd`ho0Y3@M4X!-T_SE~~4}ph)R|opOpikWf ze*!!Sh=UguedK=xdSj*qUSxF9b+pV_quR-s{D?R3&8ANI8Z*2yY@9?v203<1BH1QQ zvQ3&~o7_yc$=i}`QV2i5#(mo?!>oTyslsi0-m)>CvtFTeh{q( zpFQxj<69;GeET(Jayi$-+R$UVZ>$Hq_j6VhMCig#Q;vrmzA@XH2lIhhBM@?k`=~ax zgZXg3tSj8_eE{p`g8=IhYYXRP?O|O(x;M3CC%96BV$iH}tWggGNC~Fa>;oeWnc9Xl zi#owO6xF*Ha5-dc7a=n)9npwExz7Vw$kYq?**tefWE7BA$_YIy<=NR>;3}V=te0Z} ze9Red_S-gvxgH`TZ3kbA!KqSV7U7=F;)ONC*nA0&SJA+2+MFalUbnw=H<1 z|CW59T$yqdjt2Yl0|c9CRJnI|%p9SMAj&8=$_qJNw9>dc0n$sf7Avp=$Bcz>H`Y_c V^>ZXov%C*qJ7Iu-N@C-_{0kbi05bpp literal 2432 zcmZ`*U1(fI7@cSmlh(AGG_^@=>&6(^g-*7%MFOU%NNZ?QqA!|ai<#X!*}dlOz03W{ zX4RHZ1#2JFmtrkc1+9ouQ796m(Y^?RsnmzQh+rv%h=K%TXhlWOnY)|VUmU4 z&o|$EH;+B3d|SDpsJ0I9NUT%0)l6{1Mj`$|i=PddK8N7{vbX63yHTgapm+&aDEK6j60xfXo7AA z)&O_@2kW7UHedtLUImsfHdVnrb^&(-n}MyXki_q9fNMJVZQapzVD4#+m=GU;KLr~1 zsRVuM2Kdw9FM&hD$>-@)H^cuL{5>$!H1acj>UQ`G;3eS0j>dZW)btY#SR3%n(7G3M&N60Xlb1-Jnm+eT{-O(EQs#3w>&i zUjkQv+3SmC`qa#;K>wjINPfdRkJO%hV@SG?_vA{z#6@?zkM34?b6>1@#K5Ty3InR}@ zDry!K8B~f{&#`mnQRu6nAT90aPzTa3s=N+ZTTHg{$};CgZitTY`!cjcr`8kWcoW+9ZA;6@4b+&HWmR!7GzT*CxL#XzGScI3`h?JeGq-;B#uC11fl-gBUN1GWif1pE|Rk`uJ zk7XJ&9zVdQbD_54RdYEa7x}(snMVj$ZQnd+Qgi-oD85rq;LrchZ@W1s!aB^BBDY{$ zmNqA3_KWvB0oGO4UDnwifc2R5^j?59y%k`6W(~%+#a#fdjo1RElgXUCOuTF%CDNsc)x&!=eEZ=8qmPyX&Jsp_&s z1|R8+`ABEXM>@0ekSave disk space + + true + Keep previous wallpapers if they are favourites + Sensible default behaivour + + + 8 Number of days to keep wallpapers Delete wallpapers after this number of days diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/carousel4.ui b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/carousel4.ui index c322874..4953091 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/carousel4.ui +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/carousel4.ui @@ -162,7 +162,7 @@ Author: Michael Carroll - Set random mode + Image shuffle mode 1 0 diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/prefsadw.ui b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/prefsadw.ui index 538035c..2d48805 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/prefsadw.ui +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/ui/prefsadw.ui @@ -201,6 +201,11 @@ Bing Wallpaper GNOME extension by: Michael Carroll Enable logging to system journal + + + + + Advanced options Always show new images @@ -210,7 +215,7 @@ Bing Wallpaper GNOME extension by: Michael Carroll Purge on trash - Trashing an image will remove it from database + Trashing an image will remove it from database and disk @@ -233,6 +238,26 @@ Bing Wallpaper GNOME extension by: Michael Carroll + + + Delete older images + Automatically delete older images (excludes favourites) + + + + + Number of days to keep images + Keep images for this number of days (favourites are kept forever) + + + 1 + 90 + 5 + 1 + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/utils.js b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/utils.js index 1ebe159..7c9f1ef 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/utils.js +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/utils.js @@ -118,14 +118,16 @@ export function fetch_change_log(version, label, httpSession) { httpSession.send_and_read_async(request, GLib.PRIORITY_DEFAULT, null, (httpSession, message) => { let data = decoder.decode(httpSession.send_and_read_finish(message).get_data()); let text = JSON.parse(data).body; - label.set_label(text); + if (text) + label.set_label(text); }); } else { httpSession.queue_message(request, (httpSession, message) => { let data = message.response_body.data; let text = JSON.parse(data).body; - label.set_label(text); + if (text) + label.set_label(text); }); } } @@ -299,26 +301,6 @@ export function getImageByIndex(imageList, index) { return imageList[index]; } -export function cleanupImageList(settings) { - if (settings.get_boolean('trash-deletes-images') == false) - return; - let curList = imageListSortByDate(getImageList(settings)); - let cutOff = GLib.DateTime.new_now_utc().add_days(-8); // 8 days ago - let newList = []; - curList.forEach( function (x, i) { - let filename = imageToFilename(settings, x); - let diff = dateFromLongDate(x.fullstartdate, 0).difference(cutOff); - // image is still downloadable (< 8 days old) or still on disk, so we keep - if (diff > 0 || Gio.file_new_for_path(filename).query_exists(null)) { - newList.push(x); - } - else { - BingLog('Cleaning up: '+filename); - } - }); - setImageList(settings, newList); -} - export function populateImageListResolutions(settings) { let curList = imageListSortByDate(getImageList(settings)); let newList = []; @@ -337,7 +319,11 @@ export function populateImageListResolutions(settings) { export function getFetchableImageList(settings) { let imageList = getImageList(settings); - let cutOff = GLib.DateTime.new_now_utc().add_days(-8); // 8 days ago + let maxpictures = settings.get_int('previous-days'); + let maxdownload = 8; + if (maxpictures < maxdownload && maxpictures >=1) + maxdownload = maxpictures; + let cutOff = GLib.DateTime.new_now_utc().add_days(-maxdownload); // default 8 days ago, 1 day = 1 picture let dlList = []; imageList.forEach( function (x, i) { let diff = dateFromLongDate(x.fullstartdate, 0).difference(cutOff); @@ -369,7 +355,10 @@ export function getWallpaperDir(settings) { dir.make_directory_with_parents(null); } //FIXME: test if dir is good and writable - return BingWallpaperDir; + if (dir.query_exists(null)) + return BingWallpaperDir; + else + return null; } export function setWallpaperDir(settings, uri) { @@ -547,24 +536,43 @@ export function deleteImage(to_delete) { } } -// add image to persistant list so we can delete it later (in chronological order), delete the oldest image (if user wants this) +// optionally purge trashed images (default is not, these just don't get select in random mode), optionally purge older images export function purgeImages(settings) { - let deletepictures = settings.get_boolean('delete-previous'); - if (deletepictures === false) - return; + let deleteprevious = settings.get_boolean('delete-previous'); + let keepfavourites = settings.get_boolean('keep-favourites'); + let emptytrash = settings.get_boolean('trash-deletes-images'); + let maxDays = settings.get_int('previous-days'); + BingLog('purgeImages() dp: '+(deleteprevious?'true':'false')+'days:'+maxDays+' favs: '+(keepfavourites?'true':'false')+' trash: '+(emptytrash?'true':'false')); + + /*if (deleteprevious === false) + return;*/ let imagelist = imageListSortByDate(getImageList(settings)); - let maxpictures = settings.get_int('previous-days'); let origlength = imagelist.length; - while (imagelist.length > maxpictures) { - var to_delete = imagelist.shift(); // get the first (oldest item from the list) - if (deletepictures && to_delete != '') { - let imageFilename = imageToFilename(settings, to_delete); + let cutOff = GLib.DateTime.new_now_utc().add_days(-maxDays); // 8 days ago + let newList = []; + imagelist.forEach( function (image, i) { + var diff = dateFromLongDate(image.fullstartdate, 0).difference(cutOff); // relative age of image, < 0 we can delete + // always keep favourites, keep images that are less than minimum period (previous days) or if clean up delete previous is disabled (default) + var keep_image = (keepfavourites && image.favourite && image.favourite === true) || diff > 0 || !deleteprevious; + var ok_to_delete = !keep_image || (emptytrash && image.hidden); + var imageFilename = imageToFilename(settings, image); + + if (emptytrash && image.hidden && diff < 0) + ok_to_delete = true; + + + if (deleteprevious && image != '' && ok_to_delete) { BingLog('deleting '+imageFilename); deleteImage(imageFilename); } - } + else { + BingLog('keeping '+imageFilename); + newList.push(image); + } + }); + setImageList(settings, newList); BingLog('cleaned up image list, count was '+origlength+' now '+imagelist.length); - cleanupImageList(settings); + //cleanupImageList(settings); validate_imagename(settings); // if we deleted our current image, we want to reset it to something valid } @@ -605,7 +613,8 @@ export function importBingJSON(settings) { let parsed = JSON.parse(decoder.decode(contents)); // FIXME: triggers GJS warning without the conversion, need to investigate // need to implement some checks for validity here mergeImageLists(settings, parsed); - cleanupImageList(settings); // remove the older missing images + purgeImages(settings); // remove the older missing images + //cleanupImageList(settings); } } else { diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js index 33c9f99..d507fc9 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js @@ -33,7 +33,7 @@ var debugEnabled = false; /** * @param {boolean} d Enable/Disable debug logging */ -function setDebugEnabled(d) { +export function setDebugEnabled(d) { debugEnabled = d; } @@ -41,9 +41,9 @@ function setDebugEnabled(d) { * @param {string} msg the message to log * @class */ -function TalkativeLog(msg) { +export function TalkativeLog(msg) { if (debugEnabled) - log(`[ESC]${msg}`); + console.log(`[ESC]${msg}`); } /** @@ -53,8 +53,8 @@ function TalkativeLog(msg) { * * @returns {string} the version */ -function getFullVersion() { - return '1.9.0'; // FULL_VERSION +export function getFullVersion() { + return '1.10.0'; // FULL_VERSION } /** @@ -64,7 +64,7 @@ function getFullVersion() { * @param {string} name filename of the image * @returns {Gio.FileIcon} the icon */ -function loadIcon(extensionDir, name) { +export function loadIcon(extensionDir, name) { return new Gio.FileIcon({ file: Gio.File.new_for_path( getImagePath(extensionDir, name) @@ -79,8 +79,6 @@ function loadIcon(extensionDir, name) { * @param {string} name filename of the image * @returns {string} the path */ -function getImagePath(extensionDir, name) { +export function getImagePath(extensionDir, name) { return extensionDir.get_child(`images/${name}`).get_path(); } - -export {TalkativeLog, getFullVersion, setDebugEnabled, loadIcon, getImagePath}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js index 1f1702b..ceff7cc 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js @@ -3,7 +3,7 @@ /** * @type {{_display(): Meta_Display, number_of_displays(): int}} */ -var DisplayApi = { +export const DisplayApi = { /** * Returns the Wayland display or screen * @@ -36,5 +36,3 @@ var DisplayApi = { this._display().set_cursor(cursor); }, }; - -export {DisplayApi}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json index 5fb398b..b0c7dfb 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json @@ -5,9 +5,10 @@ "name": "EasyScreenCast", "settings-schema": "org.gnome.shell.extensions.EasyScreenCast", "shell-version": [ - "46" + "46", + "47" ], "url": "https://github.com/EasyScreenCast/EasyScreenCast", "uuid": "EasyScreenCast@iacopodeenosee.gmail.com", - "version": 50 + "version": 51 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js index 0ed9c7a..c59076c 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js @@ -27,6 +27,7 @@ import Meta from 'gi://Meta'; import Clutter from 'gi://Clutter'; import St from 'gi://St'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as Signals from 'resource:///org/gnome/shell/misc/signals.js'; import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; @@ -38,15 +39,7 @@ import {DisplayApi} from './display_module.js'; /** * @type {Capture} */ -const Capture = GObject.registerClass({ - GTypeName: 'EasyScreenCast_Capture', - Signals: { - 'captured-event': { - param_types: [Clutter.Event.$gtype], - }, - 'stop': {}, - }, -}, class Capture extends GObject.Object { +class Capture extends Signals.EventEmitter { constructor() { super(); Lib.TalkativeLog('-£-capture selection init'); @@ -183,14 +176,9 @@ const Capture = GObject.registerClass({ toString() { return this.GTypeName; } -}); +} -var SelectionArea = GObject.registerClass({ - GTypeName: 'EasyScreenCast_SelectionArea', - Signals: { - 'stop': {}, - }, -}, class SelectionArea extends GObject.Object { +export class SelectionArea extends Signals.EventEmitter { constructor() { super(); Lib.TalkativeLog('-£-area selection init'); @@ -238,14 +226,9 @@ var SelectionArea = GObject.registerClass({ toString() { return this.GTypeName; } -}); +} -var SelectionWindow = GObject.registerClass({ - GTypeName: 'EasyScreenCast_SelectionWindow', - Signals: { - 'stop': {}, - }, -}, class SelectionWindow extends GObject.Object { +export class SelectionWindow extends Signals.EventEmitter { constructor() { super(); Lib.TalkativeLog('-£-window selection init'); @@ -285,12 +268,12 @@ var SelectionWindow = GObject.registerClass({ if (this._selectedWindow) { this._capture._stop(); - var maxHeight = global.screen_height; - var maxWidth = global.screen_width; + let maxHeight = global.screen_height; + let maxWidth = global.screen_width; Lib.TalkativeLog(`-£-global screen area H: ${maxHeight} W: ${maxWidth}`); - var [w, h] = this._selectedWindow.get_size(); - var [wx, wy] = this._selectedWindow.get_position(); + let [w, h] = this._selectedWindow.get_size(); + let [wx, wy] = this._selectedWindow.get_position(); Lib.TalkativeLog(`-£-windows pre wx: ${wx} wy: ${wy} height: ${h} width: ${w}`); @@ -331,22 +314,17 @@ var SelectionWindow = GObject.registerClass({ toString() { return this.GTypeName; } -}); +} -var SelectionDesktop = GObject.registerClass({ - GTypeName: 'EasyScreenCast_SelectionDesktop', - Signals: { - 'stop': {}, - }, -}, class SelectionDesktop extends GObject.Object { +export class SelectionDesktop extends Signals.EventEmitter { constructor() { super(); Lib.TalkativeLog('-£-desktop selection init'); const displayCount = DisplayApi.number_displays(); Lib.TalkativeLog(`-£-Number of monitor ${displayCount}`); - for (var i = 0; i < displayCount; i++) { - var tmpM = DisplayApi.display_geometry_for_index(i); + for (let i = 0; i < displayCount; i++) { + let tmpM = DisplayApi.display_geometry_for_index(i); Lib.TalkativeLog(`-£-monitor ${i} geometry x=${tmpM.x} y=${tmpM.y} w=${tmpM.width} h=${tmpM.height}`); } @@ -376,10 +354,10 @@ var SelectionDesktop = GObject.registerClass({ let tmpM = Main.layoutManager.currentMonitor; - var x = tmpM.x; - var y = tmpM.y; - var height = tmpM.height; - var width = tmpM.width; + let x = tmpM.x; + let y = tmpM.y; + let height = tmpM.height; + let width = tmpM.width; Lib.TalkativeLog(`-£-desktop x: ${x} y: ${y} height: ${height} width: ${width}`); this._capture._saveRect(x, y, height, width); @@ -389,11 +367,9 @@ var SelectionDesktop = GObject.registerClass({ toString() { return this.GTypeName; } -}); +} -var AreaRecording = GObject.registerClass({ - GTypeName: 'EasyScreenCast_AreaRecording', -}, class AreaRecording extends GObject.Object { +export class AreaRecording extends GObject.Object { constructor() { super(); Lib.TalkativeLog('-£-area recording init'); @@ -407,9 +383,9 @@ var AreaRecording = GObject.registerClass({ y: -10, }); - var [recX, recY, recW, recH] = Ext.Indicator.getSelectedRect(); - var tmpH = Main.layoutManager.currentMonitor.height; - var tmpW = Main.layoutManager.currentMonitor.width; + let [recX, recY, recW, recH] = Ext.Indicator.getSelectedRect(); + let tmpH = Main.layoutManager.currentMonitor.height; + let tmpW = Main.layoutManager.currentMonitor.width; Main.uiGroup.add_child(this._areaRecording); @@ -463,7 +439,7 @@ var AreaRecording = GObject.registerClass({ toString() { return this.GTypeName; } -}); +} /** * @param {number} x1 left position @@ -530,5 +506,3 @@ function _selectWindow(windows, x, y) { return filtered[0]; } - -export {SelectionArea, SelectionWindow, SelectionDesktop, AreaRecording}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js index 290d2f2..5d67302 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js @@ -15,51 +15,51 @@ import GObject from 'gi://GObject'; // setting keys -var INPUT_AUDIO_SOURCE_SETTING_KEY = 'input-audio-source'; -var ACTIVE_POST_CMD_SETTING_KEY = 'execute-post-cmd'; -var POST_CMD_SETTING_KEY = 'post-cmd'; -var ACTIVE_PRE_CMD_SETTING_KEY = 'execute-pre-cmd'; -var PRE_CMD_SETTING_KEY = 'pre-cmd'; -var ACTIVE_CUSTOM_GSP_SETTING_KEY = 'active-custom-gsp'; -var ACTIVE_SHORTCUT_SETTING_KEY = 'active-shortcut'; -var SHORTCUT_KEY_SETTING_KEY = 'shortcut-key'; -var TIME_DELAY_SETTING_KEY = 'delay-time'; -var SHOW_NOTIFY_ALERT_SETTING_KEY = 'show-notify-alert'; -var SHOW_AREA_REC_SETTING_KEY = 'show-area-rec'; -var VERBOSE_DEBUG_SETTING_KEY = 'verbose-debug'; -var PIPELINE_REC_SETTING_KEY = 'pipeline'; -var FPS_SETTING_KEY = 'fps'; -var STATUS_INDICATORS_SETTING_KEY = 'status-indicators'; -var X_POS_SETTING_KEY = 'x-pos'; -var Y_POS_SETTING_KEY = 'y-pos'; -var WIDTH_SETTING_KEY = 'width-rec'; -var HEIGHT_SETTING_KEY = 'height-rec'; -var DRAW_CURSOR_SETTING_KEY = 'draw-cursor'; -var AREA_SCREEN_SETTING_KEY = 'area-screen'; -var FILE_NAME_SETTING_KEY = 'file-name'; -var FILE_FOLDER_SETTING_KEY = 'file-folder'; -var FILE_CONTAINER_SETTING_KEY = 'file-container'; -var FILE_RESOLUTION_TYPE_SETTING_KEY = 'file-resolution-type'; -var FILE_RESOLUTION_KAR_SETTING_KEY = 'file-resolution-kar'; -var FILE_RESOLUTION_WIDTH_SETTING_KEY = 'file-resolution-width'; -var FILE_RESOLUTION_HEIGHT_SETTING_KEY = 'file-resolution-height'; -var QUALITY_SETTING_KEY = 'quality-index'; -var DEVICE_INDEX_WEBCAM_SETTING_KEY = 'device-webcam-index'; -var DEVICE_WEBCAM_SETTING_KEY = 'device-webcam'; -var QUALITY_WEBCAM_SETTING_KEY = 'quality-webcam'; -var WIDTH_WEBCAM_SETTING_KEY = 'width-webcam'; -var HEIGHT_WEBCAM_SETTING_KEY = 'height-webcam'; -var TYPE_UNIT_WEBCAM_SETTING_KEY = 'type-unit-webcam'; -var MARGIN_X_WEBCAM_SETTING_KEY = 'margin-x-webcam'; -var MARGIN_Y_WEBCAM_SETTING_KEY = 'margin-y-webcam'; -var ALPHA_CHANNEL_WEBCAM_SETTING_KEY = 'alpha-channel-webcam'; -var CORNER_POSITION_WEBCAM_SETTING_KEY = 'corner-position-webcam'; +export const INPUT_AUDIO_SOURCE_SETTING_KEY = 'input-audio-source'; +export const ACTIVE_POST_CMD_SETTING_KEY = 'execute-post-cmd'; +export const POST_CMD_SETTING_KEY = 'post-cmd'; +export const ACTIVE_PRE_CMD_SETTING_KEY = 'execute-pre-cmd'; +export const PRE_CMD_SETTING_KEY = 'pre-cmd'; +export const ACTIVE_CUSTOM_GSP_SETTING_KEY = 'active-custom-gsp'; +export const ACTIVE_SHORTCUT_SETTING_KEY = 'active-shortcut'; +export const SHORTCUT_KEY_SETTING_KEY = 'shortcut-key'; +export const TIME_DELAY_SETTING_KEY = 'delay-time'; +export const SHOW_NOTIFY_ALERT_SETTING_KEY = 'show-notify-alert'; +export const SHOW_AREA_REC_SETTING_KEY = 'show-area-rec'; +export const VERBOSE_DEBUG_SETTING_KEY = 'verbose-debug'; +export const PIPELINE_REC_SETTING_KEY = 'pipeline'; +export const FPS_SETTING_KEY = 'fps'; +export const STATUS_INDICATORS_SETTING_KEY = 'status-indicators'; +export const X_POS_SETTING_KEY = 'x-pos'; +export const Y_POS_SETTING_KEY = 'y-pos'; +export const WIDTH_SETTING_KEY = 'width-rec'; +export const HEIGHT_SETTING_KEY = 'height-rec'; +export const DRAW_CURSOR_SETTING_KEY = 'draw-cursor'; +export const AREA_SCREEN_SETTING_KEY = 'area-screen'; +export const FILE_NAME_SETTING_KEY = 'file-name'; +export const FILE_FOLDER_SETTING_KEY = 'file-folder'; +export const FILE_CONTAINER_SETTING_KEY = 'file-container'; +export const FILE_RESOLUTION_TYPE_SETTING_KEY = 'file-resolution-type'; +export const FILE_RESOLUTION_KAR_SETTING_KEY = 'file-resolution-kar'; +export const FILE_RESOLUTION_WIDTH_SETTING_KEY = 'file-resolution-width'; +export const FILE_RESOLUTION_HEIGHT_SETTING_KEY = 'file-resolution-height'; +export const QUALITY_SETTING_KEY = 'quality-index'; +export const DEVICE_INDEX_WEBCAM_SETTING_KEY = 'device-webcam-index'; +export const DEVICE_WEBCAM_SETTING_KEY = 'device-webcam'; +export const QUALITY_WEBCAM_SETTING_KEY = 'quality-webcam'; +export const WIDTH_WEBCAM_SETTING_KEY = 'width-webcam'; +export const HEIGHT_WEBCAM_SETTING_KEY = 'height-webcam'; +export const TYPE_UNIT_WEBCAM_SETTING_KEY = 'type-unit-webcam'; +export const MARGIN_X_WEBCAM_SETTING_KEY = 'margin-x-webcam'; +export const MARGIN_Y_WEBCAM_SETTING_KEY = 'margin-y-webcam'; +export const ALPHA_CHANNEL_WEBCAM_SETTING_KEY = 'alpha-channel-webcam'; +export const CORNER_POSITION_WEBCAM_SETTING_KEY = 'corner-position-webcam'; // shortcut tree view columns -var SHORTCUT_COLUMN_KEY = 0; -var SHORTCUT_COLUMN_MODS = 1; +export const SHORTCUT_COLUMN_KEY = 0; +export const SHORTCUT_COLUMN_MODS = 1; -var Settings = GObject.registerClass(class EasyScreenCastSettings extends GObject.Object { +export const Settings = GObject.registerClass(class EasyScreenCastSettings extends GObject.Object { constructor(settings) { super(); this._settings = settings; @@ -137,56 +137,10 @@ var Settings = GObject.registerClass(class EasyScreenCastSettings extends GObjec * @param {boolean} audio with or without audio * @returns {string} */ -function getGSPstd(audio) { +export function getGSPstd(audio) { // TODO update gsp if (audio) return 'queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! videorate ! vp8enc min_quantizer=0 max_quantizer=5 cpu-used=3 deadline=1000000 threads=%T ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. pulsesrc ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! audioconvert ! vorbisenc ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. webmmux name=mux '; else return 'vp9enc min_quantizer=0 max_quantizer=5 cpu-used=3 deadline=1000000 threads=%T ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! webmmux'; } - -export { - getGSPstd, - Settings, - INPUT_AUDIO_SOURCE_SETTING_KEY, - ACTIVE_POST_CMD_SETTING_KEY, - POST_CMD_SETTING_KEY, - ACTIVE_PRE_CMD_SETTING_KEY, - PRE_CMD_SETTING_KEY, - ACTIVE_CUSTOM_GSP_SETTING_KEY, - ACTIVE_SHORTCUT_SETTING_KEY, - SHORTCUT_KEY_SETTING_KEY, - TIME_DELAY_SETTING_KEY, - SHOW_NOTIFY_ALERT_SETTING_KEY, - SHOW_AREA_REC_SETTING_KEY, - VERBOSE_DEBUG_SETTING_KEY, - PIPELINE_REC_SETTING_KEY, - FPS_SETTING_KEY, - STATUS_INDICATORS_SETTING_KEY, - X_POS_SETTING_KEY, - Y_POS_SETTING_KEY, - WIDTH_SETTING_KEY, - HEIGHT_SETTING_KEY, - DRAW_CURSOR_SETTING_KEY, - AREA_SCREEN_SETTING_KEY, - FILE_NAME_SETTING_KEY, - FILE_FOLDER_SETTING_KEY, - FILE_CONTAINER_SETTING_KEY, - FILE_RESOLUTION_TYPE_SETTING_KEY, - FILE_RESOLUTION_KAR_SETTING_KEY, - FILE_RESOLUTION_WIDTH_SETTING_KEY, - FILE_RESOLUTION_HEIGHT_SETTING_KEY, - QUALITY_SETTING_KEY, - DEVICE_INDEX_WEBCAM_SETTING_KEY, - DEVICE_WEBCAM_SETTING_KEY, - QUALITY_WEBCAM_SETTING_KEY, - WIDTH_WEBCAM_SETTING_KEY, - HEIGHT_WEBCAM_SETTING_KEY, - TYPE_UNIT_WEBCAM_SETTING_KEY, - MARGIN_X_WEBCAM_SETTING_KEY, - MARGIN_Y_WEBCAM_SETTING_KEY, - ALPHA_CHANNEL_WEBCAM_SETTING_KEY, - CORNER_POSITION_WEBCAM_SETTING_KEY, - SHORTCUT_COLUMN_KEY, - SHORTCUT_COLUMN_MODS -}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js index 9e35712..ca168f1 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js @@ -27,7 +27,7 @@ let ElapsedSec; /** * @type {TimerDelay} */ -const TimerDelay = GObject.registerClass({ +export const TimerDelay = GObject.registerClass({ GTypeName: 'EasyScreenCast_TimerDelay', }, class TimerDelay extends GObject.Object { /** @@ -145,7 +145,7 @@ let secpassed = 0; /** * @type {TimerCounting} */ -var TimerCounting = GObject.registerClass({ +export const TimerCounting = GObject.registerClass({ GTypeName: 'EasyScreenCast_TimerCounting', }, class TimerCounting extends GObject.Object { /** @@ -255,5 +255,3 @@ var TimerCounting = GObject.registerClass({ } } }); - -export {TimerDelay, TimerCounting}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js index 27201fc..b07e181 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js @@ -27,7 +27,7 @@ import * as Ext from './extension.js'; /** * @type {MixerAudio} */ -var MixerAudio = GObject.registerClass({ +export const MixerAudio = GObject.registerClass({ GTypeName: 'EasyScreenCast_MixerAudio', }, class MixerAudio extends GObject.Object { constructor() { @@ -317,5 +317,3 @@ var MixerAudio = GObject.registerClass({ } } }); - -export {MixerAudio}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js index 2ee88c6..058b810 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js @@ -20,7 +20,7 @@ import * as Lib from './convenience.js'; /** * @type {ExecuteStuff} */ -var ExecuteStuff = GObject.registerClass({ +export const ExecuteStuff = GObject.registerClass({ GTypeName: 'EasyScreenCast_ExecuteStuff', }, class ExecuteStuff extends GObject.Object { /** @@ -262,5 +262,3 @@ var ExecuteStuff = GObject.registerClass({ } } }); - -export {ExecuteStuff}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js index f9f45a3..e2bd0b9 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js @@ -321,7 +321,7 @@ const CONTAINER = [webmVP8, webmVP9, mp4, mkv, ogg, mp4Aac]; * * @returns {string} */ -function composeGSP(settings, mixer) { +export function composeGSP(settings, mixer) { Lib.TalkativeLog('-§-COMPOSE GSP'); let tmpGSP = ''; @@ -703,7 +703,7 @@ function _getWebCamDimension(settings) { * @param {int} container selected container format * @returns {string} */ -function getDescr(quality, container) { +export function getDescr(quality, container) { Lib.TalkativeLog(`-§-get description Q-> ${quality} C-> ${container}`); return CONTAINER[container].quality[quality].descr; @@ -716,7 +716,7 @@ function getDescr(quality, container) { * @param {int} container selected container format * @returns {number} */ -function getFps(quality, container) { +export function getFps(quality, container) { Lib.TalkativeLog(`-§-get fps Q-> ${quality} C-> ${container}`); return CONTAINER[container].quality[quality].fps; @@ -728,10 +728,8 @@ function getFps(quality, container) { * @param {int} container selected container format * @returns {string} */ -function getFileExtension(container) { +export function getFileExtension(container) { Lib.TalkativeLog(`-§-get file extension C-> ${container}`); return CONTAINER[container].fileExt; } - -export {composeGSP, getDescr, getFps, getFileExtension}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js index 1bdb476..90f41b0 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js @@ -27,7 +27,7 @@ import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js' /** * @type {NotifyManager} */ -var NotifyManager = GObject.registerClass({ +export const NotifyManager = GObject.registerClass({ GTypeName: 'EasyScreenCast_NotifyManager', }, class NotifyManager extends GObject.Object { /** @@ -143,5 +143,3 @@ var NotifyManager = GObject.registerClass({ } } }); - -export {NotifyManager}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js index 1b0a434..6ab68e9 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js @@ -27,7 +27,7 @@ import * as Ext from './extension.js'; /** * @type {CaptureVideo} */ -var CaptureVideo = GObject.registerClass({ +export const CaptureVideo = GObject.registerClass({ GTypeName: 'EasyScreenCast_CaptureVideo', }, class CaptureVideo extends GObject.Object { /** @@ -212,5 +212,3 @@ var CaptureVideo = GObject.registerClass({ return result; } }); - -export {CaptureVideo}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js index d1ab076..2f43a36 100644 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js +++ b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js @@ -17,7 +17,7 @@ import GLib from 'gi://GLib'; import Gst from 'gi://Gst?version=1.0'; import * as Lib from './convenience.js'; -var HelperWebcam = GObject.registerClass({ +export const HelperWebcam = GObject.registerClass({ GTypeName: 'EasyScreenCast_HelperWebcam', }, class HelperWebcam extends GObject.Object { /** @@ -241,10 +241,18 @@ var HelperWebcam = GObject.registerClass({ // example, a pipewiresrc or a v4l2src. For now, we are only // using v4l2src. // See also: Gst.DeviceMonitor.get_providers: pipewiredeviceprovider,decklinkdeviceprovider,v4l2deviceprovider + // CLI: "/usr/bin/gst-device-monitor-1.0 Video/Source" // // So, here we filter the devices, that have a device.path property, which // means, these are only v4l2 devices - var filtered = list.filter(device => device.get_properties().get_string('device.path') !== null); + + var filtered = list.filter(device => { + let props = device.get_properties(); + let hasDevice = props != null && props.get_string('device.path') !== null; + if (props != null) + props.free(); + return hasDevice; + }); Lib.TalkativeLog(`-@-devices number after filtering for v4l2: ${filtered.length}`); return filtered; @@ -311,5 +319,3 @@ var HelperWebcam = GObject.registerClass({ } } }); - -export {HelperWebcam}; diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/battery-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/battery-symbolic.svg index 70df9ee..28a9887 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/battery-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/battery-symbolic.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/cpu-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/cpu-symbolic.svg index 86ca8bf..31c397b 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/cpu-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/cpu-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/fan-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/fan-symbolic.svg index ea2b44f..234f797 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/fan-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/fan-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/gpu-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/gpu-symbolic.svg index d5cf157..b59beda 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/gpu-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/gpu-symbolic.svg @@ -1,15 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/memory-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/memory-symbolic.svg index 1946901..7fb2200 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/memory-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/memory-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-download-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-download-symbolic.svg index 4fc170b..7ec91a8 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-download-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-download-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-symbolic.svg index 2ff9778..125ba60 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-upload-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-upload-symbolic.svg index 0d67f65..bd31f33 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-upload-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/network-upload-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/storage-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/storage-symbolic.svg index 30d9007..b0d4753 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/storage-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/storage-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/system-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/system-symbolic.svg index bfbf1bd..a041518 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/system-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/system-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/temperature-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/temperature-symbolic.svg index e00a2eb..ed976bf 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/temperature-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/temperature-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/voltage-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/voltage-symbolic.svg index 1aa2210..c786442 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/voltage-symbolic.svg +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/icons/gnome/voltage-symbolic.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/ar/LC_MESSAGES/vitals.mo b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/ar/LC_MESSAGES/vitals.mo new file mode 100644 index 0000000000000000000000000000000000000000..5d1d5ac21c2ef3a3a572919de4a3fdd83ce5e18a GIT binary patch literal 13793 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 Ezs`_Pm;e9( literal 0 HcmV?d00001 diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/cs/LC_MESSAGES/vitals.mo b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/cs/LC_MESSAGES/vitals.mo index b468c532dd2eaf1e587f516d09a20b840ac91d2e..1b2495dd43485b14cc809392fcceccc2bf452f87 100644 GIT binary patch literal 11758 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 delta 3164 zcmYk6du)?c7>Ca`keiGR*%)Pm4q+GA=EhAB6eu7t#vMT%x3240S+}ybo0LfknM6S_ z;s+u@BZEYu0VB)=f&~6RqDGCFAOwM#EXKrWATtId2K4!DXM~gfzUSP&_q^|W-mkaI z56+0U4eYVs(6*vX)T4(n$KW5mc+g(&YfL}5({exLXIgmlgvVhYcnUrN&)M;1C=)-y z!LS`-+T4S^;eU|#jjd4b4z5d;s&|+0G5d`~qdTZ+~O>85a+xOdd>v6QCTN z43!BFya~&o9L`Vfio6(VeF9Vf(_k*=n>lpSUDuw;=MwuB1 zb?_7@gR?BlAiW=T* z`Bc2s!P#&S%!gd7c@E0ad3L-I%F$J@5LQ6he=CLj%Yh?ID5al3rRa0ZOHhWsx8o~N z2ed&Q{2P?v4yYQs2UTpcuJsI<0o^bMPKG1kdb{47O8)iY8+KwZRD=hi96AA28)u;$ zxeAri8&DZ(hYFwra<;h-SHfiSt@SEM8JGsBbDE*-?1ZxOX5239hca*o>cHbrDg6rS zgCg%e-~liIfs>iq_osqcRu9Tmk% z%PUY<@i(Ne>!GoUh(2X&|8p&anQ`)~wo4lISm6oOLL1hu{$y5S)x1Lxpycpd7Xf1n&lVo|lw4=Ru>NODaP)c?$E zJ6{gtiXccwFErT=d+dgzmY>=6OHdA7gCxh?g4Cb6Yv=p$|EjASV3`4n7-vHrycp_A ztDw%S&(i-ton|KVx$TA;AB6J!h~3x<71<@INWX(h@ioZxnl`(B7s~JhI0mM0(c)C7 z{nb!K8G<@5I*j})HQSk>@XfoBpE=G$k$wYp@DEU*<8?c}4dvinI2!ii9yA^cmC>0{ z2QGyQXcbfqRoHPDDuYdNI{9?=L9X4Lw;Qfowp;!V^H~22DwSF8F2~0~9b5`^Ksl7d zHI@-52b!QFeidqcFHC@O^swnJi_s)Iqs%CsYEzJka1IKhjYw@XlEL+8CQ^F}Da{K| z15%?lO%2+DrlDns7B?QAv(Q!zA8GR*>6g+Ug`Tu?1&^$awEaz%igpcBHq^$UwWwYL zS{TI;C1S>R$3L5a?yU)}Lv^STtwKt-S}t0O79k(XMq|-br0-g73F2cg6)1$%RDk`^ zd<|#;l!VIBYURHQ%|*|kN1N`e40)06cp-|SiKqyvz&0SY#b^TRi~Oj&x#;vnub>y~ zl$kP;egK@bXRm)?eZ~F9clr!7ddCL_9f67*Nf RL#MuQk>XS!&V|C<{{iwcd@TR~ diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/uk/LC_MESSAGES/vitals.mo b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/uk/LC_MESSAGES/vitals.mo index c24b01bae2958aa89d815b602c200fbd2c0f01bf..9f11b14fef86567f669ab57fd9bf9b288342c11b 100644 GIT binary patch literal 15510 zcmcJV36Nb?na8g|M1m_S3OaI$Kqn;K>Fy+eO%{@dKqP@Coe)t$ZohZC-z9J3EuC~k zP0}O*K>`SgVptX2W~9kN7Lrg}<5RDk_rGWV&bOWK+?Rhl^YssTe4c^c2R(SI=lv3V(;0m6nRtum>G4^I$H3{7Uj*su zeGfbx{2}-b@Tac)d+;>M)81;^r-LfL6MP%^K3CuA@Dhhh9bV&bE%*lde;j;0I1IiK zTn}pflEY1)`fUc!26uoR;1l3X@I_GL{tHyUKY{(=G?)=z%R$v&>&k0E$>S#Qo!};i zI~{)6;bHLowEsQ$7vO(@UEmpS_q=n#KJXmyBj9_%GN^v{gO`HOfZgCPzze{$&$RuP zfExEva27ZUs{L^g*1f+0-wb{qd=vOn@D%Vjp!WGYP^T9o! z^z3I+o-#5DQ&7ky}1hwDKg4)L}hmV5%c~A2t`#lC~ zz8676;>94Wdp`li_wOB^`fgi3)8VJ5llQi}_J=@J>OJMk z2VMJjLGAbZuKrh``2Hg(ex|+0mfsD^&&~z4?~7b{E~x$Xft_GKsC8}w#m_jX{prmPUz;hffb~xm4J1D-s z4qgcU0Gt8-FQ|29VAPubB2eXSQ1ZAG6yGaB`N@r-_$`Cd+a^%*-2zGv_kr5)S3ue6 zK5zl}*WfzvkD&UmW-|Fn07@P?Q0tF@n*Yj!=UDmLG9jRXA-OAeoM_)b z7B9p`z#oDuz)pm;5ZnM>5AFw5|Av`14iA8m|0ajKK=HlTmA?xrzW)TwybgbvW%rl6 z$l~pwu@?@#^Jcb zFMybW_Y5ex`~$cYe1DhcT@2m=t^s$0lFLir8^Od}tM@ec7RnpIH-X#1kAj~Awa;IJ zn5y^YZi^RzY}vaC6hF6tZw7aO^T3BdMC!c=%I|;U@YEh#KHFg@h>ESN^=i zBCocC#5oRo>4*#lF;SA*hv9SCdQ7^v~z1m!2+0XKouK1dz-Nl^QngL4w{y_KNm z9|k3dJ3!5QKll#taZvN^2gT3dfj5EEVTP%_6sYzmK#e~HYW#OVt@Az52Y>6z?}90< zw*Wi?90VoTkAoVQclc@W6w3EHd;okM<=devq3TC#tc0$Ed`LEhsJuPUr=Sri18FbY zp?5=HhOUS7nGSskngeZs^pPIcKzV2o(nov!FqDASLHaxmeGS?PMUXyY5Ud&-R9QBy z&rArDFrVA_MvUIQwrIW|;u{k;GLc<`&@Sk1=nCi#2-SHvLi!Y;FF?0KTOfT#Eg1ja z#Pbg5W035x0O_+Cx*7U7bPMzWXgP$NdLMyG(AS~r=My}f2W4HwY2ew=XI=UA;2WS7 zuDsjfR`49C8+r!%CZx}5=&R5JPzqA)k>1}5$qwEQJqXFhra{{v+0`Ow9BTYLPC>qS zCNvwm5V`^SOGux)ESUU%BhR06<$FN+%GJ;e=oILDsPQA4e#%um0)85r=gOaV_#`+4 zErZrWX{h>nxcUIf-aiQ~g|3BikUsCTV7}kO_cvVmi{Mw>^L-$$W9}@SuI^pnRgnDg zR97dsyy1C(=hLCbppQaNKzBk(=rfQ$AF^QLk{-*@UqMTti=oEPTvvE6_)hnHKe!fp z)RhC_($)Qbf4NWyvnBJqD%coh${F*#CMb-AR1f9Ke5cd7L{JKoJmpitP*{pKg?=&2 z7ITH7w{$d!(!o$Vz+n(jO#Jq5Vz*=|njVw|;*vGZbaRq<=$@E}L#yzg!Ic zk!U0sVxXTZ@H`Zm=V1z&Fq316{@`W$6-zm@&;B4EB%%@{5Mfww;FnS%Q)SD3DQBLe zL@w(W!jYhmOozpypBpyS`CKt7MKncOTMn{e+Uw61LjMA`F_xgScSV?pGC>+l2V*{x z-w=jbCwf1hOQ)mkh<8O)%$sH-_c4Fj(ly=fDtp>h_D-toU$t!V@Jx^>W)hu4c8S`U zL{-MF!A}OIU~=oI(SR=@7sGUzz?OVFLRM1ce;C0Ra;3mXB_E=YC|fRtwRWo?TP4iQkZGmL_HD< zN@dIk0~-wrQLbEsjZ8k5#XRd$9?hjocif2cfCT;dO;!vOyqjWB$FVc@3<;qamv zsZuFl?3+7xBr2uKLtSt@H-Qr*a!G7^?hR2XNEhcu#Uhi2g`$k1l*{7`1zWo*EacFh30Nz#iFBD6JLJ$E{)QB;kHMJmhHRu<8{llf9rGFo z^qlN~-jf=jAaPOynghtm3^n1bx-|+twS7|Ptrbkzs&;E$t=8v6&R*}->e#iGh6v$Z z6NdSkhU;3in!mN2$xA~)K_+DTIyL*mb>iI6n4in0$NXX{w?RE^aHwkj8U>NGx017# zZ~52Ca8!>`u_VW>h7wMgAx>iEXgNk!=7OZ(vmoQy2Zxkb1?xj|+?W$8VGb@1_EmT$ zp@Yg2&*m7kz)9BF!l@RdHw0rumfFx{rAMmV-N(2x=gC>`);cBIjM z#~i=I%3Dtbh1rf-O}+Cbc^Dv|hU9Y`ciwVZF2 z4QCi`(k3opa*5Zb4-xET`w+BF+{ebL6ZdI0p($pxN_8A-Z$o6F=4?|AYBsO|mkv3J zN`-)}ai00XFzJAwbV=M`F0nr3BpxKu2>G^Iq{AjhtJdXZDUAh_LS?Lz5jMQR4ME-; zw5DpocLwZgt3@3a#)sC_69uo~*)QY8-WpO@*U>MOv-Zfbp5VJxIm=5WWvzq&@}KpX zhel~Q)+#HFMhZbP?2v3ah64`yY$}W}SQB=T4(6h?7aNgPR3)mcxxvYhF!L5L&!WGS zJZdzo71tOem0kOC4$qd?ivP9wlFWT=QEs)CTw^%eh%0W0lBHB}Qbpt8tIjDL3w4o5 zBuG)n+^9@?H-y<_uHfBZ(t+$dpcCJWv-VheVNgwjf1{t=(V6{yjxUO?`s7xxC z?Iga0eSU9u@BGg01)V)Te$V{A-rm{W^SZmIuMCQ%&NU=SMeanoLZ81h9d7j5Oe*jf zj&=o%R4Wv_YAHUsSQFU8ZQ52VXv zSe?qhihX`IZ;Hi5^Dp!5^^T1GFjqxyQam9daF$f z7tPn>OpWMX*wgLbe!Cq)pYB0wOoWk`F?WO4Ug+S$|F+517ir@OEB;@RCyG5y1x zHWxIa9>|4BykcJ0{H|VFY_W40Ik5b?&+qE0*A9k3A(7I_(AnMR(txg8i)}mf^i>mp zse1JG$%==IQ?<|QGdI)~INVfS=JzR*Szn#1&jJ|X>YWLSb904}u90jm6Lu9-VLIJa z8(ZueH7R`8i0#_7F_Uh)tBb2Vm!s+C9Ynl4o~Ue&C*p&)xQE9hl`Zk1_-JK3K58qU zuI!4RuiWFskJ0tGudn!E<<9sJPY2>-@v+KIFMfbA`_<7@9rxnLO|PxYebI?lTBgLK$Z*~-WlSb^!Dh!2?M_ES9I#rMG` z3_{OWc50BOYg^s6(x1uf+gJ*|nD9`1cvkyEl^#U)xABi0^Dlkl# z3U<9K-dleG6WM z?x?G853SFs(r4@;4U<5n0u5_WV7!mH_QBD!mMdxRS**g;Yn@vCeyPSse-rW14k@X! zOL{exEM!=Ffi-rx*>`C1qyOK0c<~)fdJM~wImw7+!rP4%Zmn!~c8VpL4zMFDWrVEs zUUA>pyE0Aamm;N^!=CY3Sf_B5Y6*?b&-rwaIOQ|es`1PCXtT#n;Hct@ zzRw!&pL2dGeK4@eq3m_zBnR}I>M=L0JgV^fH55{LDx4#{Q*As{s7IvaM-$sdx&Bpf!a-xsv=;Hj24wN*SaSY9lJ4 zO)ESP9jlB_H64aiz#_f zh%#pj;f&4tCuGWOu0H7;9~Ut$geyvP@+ADe@}OdcJa4LH5z{!zz)jtIYW zfvILxT$S~rn0>EwriU~!I^$5|tRg9}=Fg67h_``sg5;p3rw#^uj3wK&aS|{mNfm7m z81*%IDW|t-KCH!k*$^|~g@|BBOPlPKyr|wvzGkC5r%vTAc#u6+?qJWyU>O&V5Br!K zN0J!iY$6C8i4QIDNj1hX&wE%8?zYJ4=eR@49#u?Ck^w`n{;hGm%P{7YNU~sdVbyoo z_?#qXH0+WGX^jcK9ko5}o5L1yZdKxdWCd0@&v^oKJdZ>kT~k6l)_IkSV4Hs>d@+1+%onPaof61;?Zt(V{( z)@!KL-%Hs;8GV2lKl?yIQ4iEqz^{)>7NNhsIIvYLczEg%A0+!iu73%SD%4!prz8X*%IcIlav@ zxywFjiUc1Qmm9p@TuiFIevb+GE*jlSP*(&bymLn%H@OF~hfI(QyGe1He7@;+fR}T) zy1R%M?@>h6L|*(wH7OR_BkFNeRJbBFe1i3K?PSeKv$?=ata;X)KI1k-6Mb}U)vh3# zi9T@F62l&GB2~7ecuhyT?&MdO$~G^avh_rbW~4hZ;M+vzDQ|n)T|LFIH!a;6AA=ir zr$qvfvKbO>dT!T+SDCl2lbh{5+_7webNwE?$3%PdC==bw)|kR*uHkN~98ULggae;Q z-(AQi)p6&VREJMC*IAEju4C;0U1ST&G({0~Tw9bU-*G&YsZC;1% zDLZaTbM>OCxtCeXrLMNsF)p?mk`Ny!mU-!3VIvuC)3i$>krYvR(B&KOhNsx;+Ytp6 z$(swOdEa)}=AKG5jAy!za%QP6KEmR->On>j{lv@T)E=a*_EL{(Iiy;fe3#!TniE_7 zs)iVv-=^3~*lNge`PJ=}FJps%GTJ){Ee$U|s^L=sS(h|LS0#t6<+LvEQjXMM1V#|` zTOEQv%n^Zuo5Y#~TO#;sRRgtI5st(v>o>1L?X2}m^D<})nd5QXz`Uxn@8XOu?CTs| zln)wfCCsvb=Ax%&Y7mXWk!~hR_V+iu_Oa91H?QWUk8DU?YcE<`iZTxS9%6DNZm&;e zyaXs`TCD-xo{(IZ+Xe{tYvhtwJx5Q+tDmFy)y`p3y;sRcb5IjUldb9%$eK3+=GvoF z+#~@e-8Sh0HO%^$oEQt@kdfc}6nTHHIIiQDP))5eckW3#cMfrp;4#)hY+`Th zNptCKg-H{huoiC}P@S4y<-XEGampC`RjsZUV+Y+UFZCz ziJ4>Qp~_uiNeP}VMzvp8S_jrPE4>qRls!LUY?eTS@G+}rqqZBrtXMJ^V8#|3#7#~MrQm4J67;f0P(Y!m2-HUEk_Zrg!!z%skD;%~P UAMmug7&V?b!T%$$|CiwZ0949`6aWAK delta 3321 zcmYk-4Qy5A9mnzKmI{Tfg%)X{bZ{zgX_da*Vu3;xxG)v%KzUI_5lXpjFSfm|y)X;9 zi*1k>je?JqIZZ^D3}XaJujQqsHCy7#G8WHSj4-EcBb$z7(XeF6!sfQ`@7~j}hyL&9 zJm;L}dH&CHo^$BwytpoLIWP0Dp*&3#5t*6B9K*kj;fJzsoH5_Q{l15hKl27ZH{m-t z7W;4_p7-l6s*BIC0Iwijo9mc`|3%s-OcuSXqa5FxaW?frEWt3U!Q(g@eK)1`F{bPQ}0D_b}(X##G`QoW=NNBL}*n8`a=-EX9G;4aWQ#)$zD&WB4TtPl9Wq(77L~we%)=(+&+OzU9}i$cH@?9EeVgORpE=J@E?)5K zmr>WhMm^(i{qwnGtAUI0W-LV>tGN@E=nB8S5|!w~ScY3r{U4mb`YVAqIiV#zfm)(L z-}g}+eeBmiK@D&jHSkqb$JbDM=sIe%sdrtUjFZv9AlBe5xY@tnoy+>G;dB0pL#P?P zf=cK(YHtjn68RLhq`yb4$Q9HCt|4QaZ}B0_VZC*|5!nW2J8GP6R6qMs{k)LyFC0d7 z@G5G+cTh|E5vsu#s0LRsHFK<@ehnGZ%p_|$54A$~pb}eyx_=X@eG_Vh+x+v1C;bb% zF@x>A7nS(|c8C&q1yhd(mDnIE(TjKo{?)GsS$DOYk4y0`R3iIOkI16>dkxj!DI}qU z8Rnpg6Ypa?mhr&U(NScdnUkoQyoYM|Yt+D(@HWinRauE)T!M#iG5!{pVIJ>vBR+_$ zaR^u71ZGpK_kRNi4{+iL>cUkl#kqV{I5Zo5J5e(@?APB$eNaBY)&SoLRD!FgrQL*@ zNDFGkc3~Kw$2;+3tkV0RGd;azOK~mrZrp*FP#vstjClkfLk&29jAbtQ{sZ;>$SY27 zwi296eICxjZCHs1{rWFZ?Z3i=W|+x4!Lf00Hil6HZ9{di&##|A&F})w!QUY{n$a`T z&p3#hX$30rC8(ueg}35qswIn@}YE=6$@?x0>Q0*hAJ@8b5gN+;v;sTt)&eIL6 zQ7aKeb+7}wa1UyrET-*X397yVHGwEmHLsyo>Mc}1=X^iH0Cnbnqwp?kfZ=~?(Q{@TYEYynX+o7U2;W6Tes!;Te=_IsTw~x&K`&6_% zyNFFh8?l3Un9!@G!lO-nKvrP`q5V)rXdmc*H5GkF^lEJ(VuXr5QhF5ksX~boqlia{ zN45Tq#6849;{S`De;rXz=ozjg;>0|noES|s5i0i+)xEjJNQ5qcw3wDImB z#u5o_maW8t#7KFFgZX|%|9i1F&5wv?qJwaVr9=jyqMfb6-c0>B%ic$SA=K$~w8Y|0Jm$2<+M@ATy9r0*9VQ%WinT_c z&_S#tZo-}MNQYTg-_RVfN5?m0$J!&#tgU8QXG2S*!#+A8I3`>lk4M@&ZB1?>c`Y}Z zVShC#&wev$V`g2XF>V|3m)qg|pe-vXAJtgjX7?1ll$<^}BVhk9<&-^ESZx1O*lu@D zZ3{I=8=9TA?X8jaXhVIAvnAbYI>(OY*!GsK&W>ojzNKR%UHj$K+A;oZwz#O+-dj|Y zT~$`OpsZ@XQx#fRU6VXm^ju(6s66zuY11<147q3BbB_0nJLnF3U5@*%JLtXWxaZwr zcgXAUx;VR=TZY`E*KPmk*1z8_pG;$fWwb9>;x;+Xpyxh858~&l>y5qTRMDG|{fEt^FU1 CjRtH0 diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json index 4c78f3a..cddf98d 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json @@ -9,9 +9,10 @@ "settings-schema": "org.gnome.shell.extensions.vitals", "shell-version": [ "45", - "46" + "46", + "47" ], "url": "https://github.com/corecoding/Vitals", "uuid": "Vitals@CoreCoding.com", - "version": 66 + "version": 69 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/prefs.ui b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/prefs.ui index ab07185..537decf 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/prefs.ui +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/prefs.ui @@ -1222,6 +1222,7 @@ BAT0 BAT1 BAT2 + BATT CMB0 macsmc-battery diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js index 2ba8c2e..10f93c7 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js @@ -140,6 +140,8 @@ export const Sensors = GObject.registerClass({ let used = total - avail let utilized = used / total; + let swapUsed = swapTotal - swapFree + let swapUtilized = swapUsed / swapTotal; this._returnValue(callback, 'Usage', utilized, 'memory', 'percent'); this._returnValue(callback, 'memory', utilized, 'memory-group', 'percent'); @@ -148,7 +150,10 @@ export const Sensors = GObject.registerClass({ this._returnValue(callback, 'Allocated', used, 'memory', 'memory'); this._returnValue(callback, 'Cached', cached, 'memory', 'memory'); this._returnValue(callback, 'Free', memFree, 'memory', 'memory'); - this._returnValue(callback, 'Swap', swapTotal - swapFree, 'memory', 'memory'); + this._returnValue(callback, 'Swap Total', swapTotal, 'memory', 'memory'); + this._returnValue(callback, 'Swap Free', swapFree, 'memory', 'memory'); + this._returnValue(callback, 'Swap Used', swapUsed, 'memory', 'memory'); + this._returnValue(callback, 'Swap Usage', swapUtilized, 'memory', 'percent'); }).catch(err => { }); } @@ -373,9 +378,11 @@ export const Sensors = GObject.registerClass({ // addresses issue #161 let battery_key = 'BAT'; // BAT0, BAT1 and BAT2 if (battery_slot == 3) { + battery_slot = 'T'; + } else if (battery_slot == 4) { battery_key = 'CMB'; // CMB0 battery_slot = 0; - } else if (battery_slot == 4) { + } else if (battery_slot == 5) { battery_key = 'macsmc-battery'; // supports Asahi linux battery_slot = ''; } diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/appIndicator.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/appIndicator.js index bbcaac6..944afcc 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/appIndicator.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/appIndicator.js @@ -37,6 +37,7 @@ Gio._promisify(GdkPixbuf.Pixbuf, 'get_file_info_async'); Gio._promisify(GdkPixbuf.Pixbuf, 'new_from_stream_at_scale_async', 'new_from_stream_finish'); Gio._promisify(St.IconInfo.prototype, 'load_symbolic_async'); +Gio._promisify(Gio.DBusConnection.prototype, 'call'); const MAX_UPDATE_FREQUENCY = 30; // In ms const FALLBACK_ICON_NAME = 'image-loading-symbolic'; @@ -199,10 +200,10 @@ class AppIndicatorProxy extends DBusProxy { })); } - _onSignal(...args) { - this._onSignalAsync(...args).catch(e => { + _onSignal(sender, signal, ...args) { + this._onSignalAsync(sender, signal, ...args).catch(e => { if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - logError(e); + logError(e, `Error while processing signal '${signal}'`); }); } @@ -311,7 +312,10 @@ class AppIndicatorProxy extends DBusProxy { } catch (e) { if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { // the property may not even exist, silently ignore it - Util.Logger.debug(`While refreshing property ${propertyName}: ${e}`); + Util.Logger.debug(`Error when calling 'Get(${propertyName})' ` + + `in ${this.gName}, ${this.gObjectPath}, ` + + `org.freedesktop.DBus.Properties, ${this.gInterfaceName} ` + + `while refreshing property ${propertyName}: ${e}`); this.set_cached_property(propertyName, null); this._cancellables.delete(propertyName); delete this._changedProperties[propertyName]; @@ -435,6 +439,25 @@ export class AppIndicator extends Signals.EventEmitter { } } + // We try to lookup the activate method to see if the app supports it + try { + const introspectionVariant = await this._proxy.gConnection.call( + this._proxy.gNameOwner, this._proxy.gObjectPath, + 'org.freedesktop.DBus.Introspectable', 'Introspect', null, null, + Gio.DBusCallFlags.NONE, -1, cancellable); + const [introspectionXml] = introspectionVariant.deep_unpack(); + const nodeInfo = Gio.DBusNodeInfo.new_for_xml(introspectionXml); + const interfaceInfo = nodeInfo.lookup_interface(this._proxy.gInterfaceName); + this.supportsActivation = !!interfaceInfo.lookup_method('Activate'); + this._hasAyatanaSecondaryActivate = + !!interfaceInfo.lookup_method('XAyatanaSecondaryActivate'); + } catch (e) { + if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { + Util.Logger.debug( + `${this.uniqueId}, check for Activation support: ${e.message}`); + } + } + try { this._commandLine = await Util.getProcessName(this.busName, cancellable, GLib.PRIORITY_LOW); diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/dbusMenu.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/dbusMenu.js index 4f9467f..95dcea0 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/dbusMenu.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/dbusMenu.js @@ -130,6 +130,11 @@ export class DbusMenuItem extends Signals.EventEmitter { this.emit('property-changed', prop, this.propertyGetVariant(prop)); } + resetProperties() { + Object.entries(PropertyStore.DefaultValues).forEach(([prop, value]) => + this.propertySet(prop, value)); + } + getChildrenIds() { return this._children_ids.concat(); // clone it! } @@ -297,6 +302,8 @@ export const DBusClient = GObject.registerClass({ if (!item) return; + item.resetProperties(); + for (const [prop, value] of Object.entries(properties)) item.propertySet(prop, value); }); @@ -495,6 +502,9 @@ export const DBusClient = GObject.registerClass({ // we don't need to cache and burst-send that since it will not happen that frequently async sendAboutToShow(id) { + if (this._hasAboutToShow === false) + return; + /* Some indicators (you, dropbox!) don't use the right signature * and don't return a boolean, so we need to support both cases */ try { @@ -507,6 +517,13 @@ export const DBusClient = GObject.registerClass({ ret.is_of_type(new GLib.VariantType('()'))) this._requestLayoutUpdate(); } catch (e) { + Util.Logger.debug('Error when calling \'AboutToShow()\' in ' + + `${this.gName}, ${this.gObjectPath}, ${this.gInterfaceName}`); + if (e.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD) || + e.matches(Gio.DBusError, Gio.DBusError.FAILED)) { + this._hasAboutToShow = false; + return; + } if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) logError(e); } diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/extension.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/extension.js index 16e6596..6f69aa1 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/extension.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/extension.js @@ -22,7 +22,7 @@ import * as TrayIconsManager from './trayIconsManager.js'; import * as Util from './util.js'; import {SettingsManager} from './settingsManager.js'; -export default class DashToDockExtension extends Extension.Extension { +export default class AppIndicatorExtension extends Extension.Extension { constructor(...args) { super(...args); diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/iconCache.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/iconCache.js index b775307..3610184 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/iconCache.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/iconCache.js @@ -49,7 +49,7 @@ export class IconCache { } const oldIcon = this._cache.get(id); - if (!oldIcon || !oldIcon.equals(icon)) { + if (!oldIcon || !oldIcon.equal(icon)) { Util.Logger.debug(`IconCache: adding ${id}: ${icon}`); this._cache.set(id, icon); } else { diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/indicatorStatusIcon.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/indicatorStatusIcon.js index 5ef516c..49ecde8 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/indicatorStatusIcon.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/indicatorStatusIcon.js @@ -276,15 +276,15 @@ class IndicatorStatusIcon extends BaseStatusIcon { yAlign: Clutter.ActorAlign.CENTER, }); this._label = new St.Label(); - this._labelBin.add_actor(this._label); - this._box.add_actor(this._labelBin); + Util.addActor(this._labelBin, this._label); + Util.addActor(this._box, this._labelBin); } this._label.set_text(label); if (!this._box.contains(this._labelBin)) - this._box.add_actor(this._labelBin); // FIXME: why is it suddenly necessary? + Util.addActor(this._box, this._labelBin); // FIXME: why is it suddenly necessary? } else if (this._label) { this._labelBin.destroy_all_children(); - this._box.remove_actor(this._labelBin); + Util.removeActor(this._box, this._labelBin); this._labelBin.destroy(); delete this._labelBin; delete this._label; @@ -420,13 +420,6 @@ class IndicatorStatusIcon extends BaseStatusIcon { return Clutter.EVENT_PROPAGATE; } - vfunc_button_release_event(event) { - if (!this._indicator.supportsActivation) - return this._maybeHandleDoubleClick(event); - - return Clutter.EVENT_PROPAGATE; - } - vfunc_scroll_event(event) { // Since Clutter 1.10, clutter will always send a smooth scrolling event // with explicit deltas, no matter what input device is used diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo index c66d72ef88af4d23c37db2b16f784624bb96bd87..93c4c6dea5b7f7aeae3f3fc3471a4c17fe3809b0 100644 GIT binary patch delta 949 zcma*k&ubGw6u|LG)1+!_w6V3ZF>wS1JtS$;P$l+IK@UPHD%OjFteap%mff&P3K1mY z)gPDOp%jGN3jT<-|A88?7wJLtqJrXC^rqm!@7wO7-W)Rf*~z}$H}B2b$d6e2b8PUT zVjN-~WR3=uI*z*sxG}Q<#_%o5hrXa}?7P2?3@XJ>#kmY&5-0E|4&yBD#d(b2HOyiaL%4!cNEc6# zUp?Vwia);L0gMxMg)Zb#5as=B)v~z!;clxYtT(`=4u6)BVTl$h~wDdXC zvFp0ttkoR1q5J@AE1)3(mF)rRr-JVT!-e$ZbUJrZ=W@l|WG59GPs}w-<*L5iD!GQ9 zv6gtzo^58T`HXq9vk>|aEMy9uZ1~xQ^UjiE>6%j_TT|B?hTHGHdTK7}O4YHoZD^~~ k?>1hqsQ(S@d<-uq=gT#>-&?fGCEKYt)W6I1J44yPUy0z4O8@`> delta 758 zcmYk(J4ho@6vpuzllaJ*)x>Aqbsb9!<3vSK0xF1w!Xg%1ZxDsxXut~5N#B;6^m^xg#CZx2wph+=FZH$=bn51#ZO{|hj?h)Fj|SvL?~cP z2R@<3W|=W{xP=kiLko|w9RFY?-r*Pgi`8g?uST(*X$w|i+II{;8B;KmJjD6npcWQT z2PyjVeGD-_#|pf_7QDtNK42|A;Rk%dF05iv7za=XAHsed#~$3k1o_Q558tWwH!5+8 zve?6X#RN{FHgHgt=24Zd<44@}Enyq;OH?8E{`*J&{WEI61XVO*54MxvjPt;)83%RZ z9P+POK`mHAwcrP8;Q{JESJ;QYQ2z%xos8fp#xRZFQ0;Y5U2P_s2<0qjL;B!dVGYIz z4fRS%S!3!6a(LIvC3(rgyDc41Lx~#*weoG~b~Kb+h3Qt`584;^dinlkwR>20bhZ<` z2}HX)?cPp%z_RVZRG+&ZZn8!*3)vaRnp#+7Dwj}4Dp=@M}W3p5A1E=v<)E;Mb`FisoiE5~^g-Lvda)Ng#8~cD3evaC4W|aesp^Trw1)N7oRSV^Y?%@(X z!e)`mPb!lCv)l^@53f@uBBd%tk!zF%_fzCwkYI>9Kw<50(;OV3!E+-?!VMyL3_E9AFJ7cJQKlWp{mY*%in4d`B9${IU(TpySz& hHeT7>4A$L-Sqs){M*a7|A`58G+%byU#+Cl**gty1m#6>$ delta 717 zcmY+?ze@sP9LMn|e_UExrj|d-vN2LSuc3?}A_!~>YOSGJ`WKFbAgG}@8mpT7hxWhP$rrvK@Ob$0zLFK z?8XO7VjY9n!VtEx7dtqGekOUbfD(KGXK)3lv5X16uWDSJu-Ye-AlocUlI~yz_nrRE z@zJ^8z&@UTIr>PKr;nk`FQR;S4P{3+aR~QN=AB`h@2d(IQEZ|l{y+)xi3WC@UT2>Z z^h+o&*uX_BAsJK!Wk+st9qU-cIBCXk3t6X%Ghz%*N|};~bFjCt9|ssx{MJ5q-eHF$ zgT1|MlD#Uhk4XYaNq|9y1ph4wDJB0cSr{ktuLv8q&+_lxfOYA*s-C(>T_Gcz&u4Wb jt?P4oVN%aq4ez~mqs25Mr_bgLYgfxyP3^6k@)ca)x}`oo diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/uk/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/uk/LC_MESSAGES/AppIndicatorExtension.mo new file mode 100644 index 0000000000000000000000000000000000000000..88c7fbcfe7da1f164b22ece3fe18fb3e8e121df9 GIT binary patch literal 3061 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 this._toggle()); + // On theme changed, need to update the bg color to match style, + // This may not be required anymore on newer shell versions that use + // ARGBA visuals. + this._styleChangedID = Main.panel.connect('style-changed', () => { + const panelBgColor = this._getPanelBgColor(); + const {bgColor} = this._tray ?? {bgColor: null}; + if (bgColor === panelBgColor || bgColor?.equal(panelBgColor)) + return; + + this._disable(); + this._toggle(); + }); + this._toggle(); } @@ -55,11 +68,16 @@ export class TrayIconsManager extends Signals.EventEmitter { this._disable(); } + _getPanelBgColor() { + return Main.panel?.get_parent() + ? Main.panel.get_theme_node()?.get_background_color() : null; + } + _enable() { if (this._tray) return; - this._tray = new Shell.TrayManager(); + this._tray = new Shell.TrayManager({bgColor: this._getPanelBgColor()}); Util.connectSmart(this._tray, 'tray-icon-added', this, this.onTrayIconAdded); Util.connectSmart(this._tray, 'tray-icon-removed', this, this.onTrayIconRemoved); @@ -71,14 +89,8 @@ export class TrayIconsManager extends Signals.EventEmitter { return; IndicatorStatusIcon.getTrayIcons().forEach(i => i.destroy()); - if (this._tray.unmanage_screen) { - this._tray.unmanage_screen(); - this._tray = null; - } else { - // FIXME: This is very ugly, but it's needed by old shell versions - this._tray = null; - imports.system.gc(); // force finalizing tray to unmanage screen - } + this._tray.unmanage_screen(); + this._tray = null; } onTrayIconAdded(_tray, icon) { @@ -98,6 +110,7 @@ export class TrayIconsManager extends Signals.EventEmitter { destroy() { this.emit('destroy'); SettingsManager.getDefaultGSettings().disconnect(this._changedId); + Main.panel.disconnect(this._styleChangedID); this._disable(); trayIconsManager = null; } diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/util.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/util.js index d2cb352..0aba244 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/util.js +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/util.js @@ -19,8 +19,6 @@ import GLib from 'gi://GLib'; import GObject from 'gi://GObject'; import St from 'gi://St'; -const ByteArray = imports.byteArray; - import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as Config from 'resource:///org/gnome/shell/misc/config.js'; import * as Signals from 'resource:///org/gnome/shell/misc/signals.js'; @@ -102,7 +100,8 @@ export async function getProcessName(connectionName, cancellable = null, const cmdFile = Gio.File.new_for_path(`/proc/${pid}/cmdline`); const inputStream = await cmdFile.read_async(priority, cancellable); const bytes = await inputStream.read_bytes_async(2048, priority, cancellable); - return ByteArray.toString(bytes.toArray().map(v => !v ? 0x20 : v)); + const textDecoder = new TextDecoder(); + return textDecoder.decode(bytes.toArray().map(v => !v ? 0x20 : v)); } export async function* introspectBusObject(bus, name, cancellable, @@ -376,6 +375,20 @@ export function tryCleanupOldIndicators() { new Set(indicators).forEach(i => i.destroy()); } +export function addActor(obj, actor) { + if (obj.add_actor) + obj.add_actor(actor); + else + obj.add_child(actor); +} + +export function removeActor(obj, actor) { + if (obj.remove_actor) + obj.remove_actor(actor); + else + obj.remove_child(actor); +} + export const CancellableChild = GObject.registerClass({ Properties: { 'parent': GObject.ParamSpec.object( diff --git a/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json b/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json index 230b379..7757c11 100644 --- a/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json @@ -11,11 +11,10 @@ "original-author": "mi-jan-sena@proton.me", "settings-schema": "org.gnome.shell.extensions.auto-activities", "shell-version": [ - "45", - "46" + "47" ], "url": "https://github.com/CleoMenezesJr/auto-activities", "uuid": "auto-activities@CleoMenezesJr.github.io", - "version": 13, - "version-name": "46.1" + "version": 14, + "version-name": "47.0" } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js index d16f32b..8824777 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js @@ -1,11 +1,22 @@ import Shell from 'gi://Shell'; import Clutter from 'gi://Clutter'; +import Cogl from 'gi://Cogl'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import { adjustAnimationTime } from 'resource:///org/gnome/shell/misc/animationUtils.js'; -import { PaintSignals } from '../effects/paint_signals.js'; +import { PaintSignals } from '../conveniences/paint_signals.js'; +// TODO drop Tweener in favour of Clutter's `ease` (will need to extend the blur effect for it) const Tweener = imports.tweener.tweener; -const transparent = Clutter.Color.from_pixel(0x00000000); +// TODO: Drop GNOME 46 backwards compatibility +const transparent = Clutter.Color ? + Clutter.Color.from_pixel(0x00000000) : + new Cogl.Color({ + red: 0, + green: 0, + blue: 0, + alpha: 0 + }); const FOLDER_DIALOG_ANIMATION_TIME = 200; const DIALOGS_STYLES = [ @@ -43,7 +54,7 @@ let _zoomAndFadeIn = function () { { radius: sigma * 2, brightness: brightness, - time: FOLDER_DIALOG_ANIMATION_TIME / 1000, + time: adjustAnimationTime(FOLDER_DIALOG_ANIMATION_TIME / 1000), transition: 'easeOutQuad' } ); @@ -87,7 +98,7 @@ let _zoomAndFadeOut = function () { { radius: 0, brightness: 1.0, - time: FOLDER_DIALOG_ANIMATION_TIME / 1000, + time: adjustAnimationTime(FOLDER_DIALOG_ANIMATION_TIME / 1000), transition: 'easeInQuad' } ); @@ -120,6 +131,8 @@ let _zoomAndFadeOut = function () { export const AppFoldersBlur = class AppFoldersBlur { + // we do not use the effects manager and dummy pipelines here because we + // really want to manage our sigma value ourself during the transition constructor(connections, settings, _) { this.connections = connections; this.paint_signals = new PaintSignals(connections); @@ -129,12 +142,8 @@ export const AppFoldersBlur = class AppFoldersBlur { enable() { this._log("blurring appfolders"); - brightness = this.settings.appfolder.CUSTOMIZE - ? this.settings.appfolder.BRIGHTNESS - : this.settings.BRIGHTNESS; - sigma = this.settings.appfolder.CUSTOMIZE - ? this.settings.appfolder.SIGMA - : this.settings.SIGMA; + brightness = this.settings.appfolder.BRIGHTNESS; + sigma = this.settings.appfolder.SIGMA; let appDisplay = Main.overview._overview.controls._appDisplay; @@ -143,15 +152,15 @@ export const AppFoldersBlur = class AppFoldersBlur { } this.connections.connect( - appDisplay, 'view-loaded', this.blur_appfolders.bind(this) + appDisplay, 'view-loaded', _ => this.blur_appfolders() ); } blur_appfolders() { let appDisplay = Main.overview._overview.controls._appDisplay; - if (this.settings.HACKS_LEVEL === 1 || this.settings.HACKS_LEVEL === 2) - this._log(`appfolders hack level ${this.settings.HACKS_LEVEL}`); + if (this.settings.HACKS_LEVEL === 1) + this._log("appfolders hack level 1"); appDisplay._folderIcons.forEach(icon => { icon._ensureFolderDialog(); @@ -197,7 +206,7 @@ export const AppFoldersBlur = class AppFoldersBlur { // // [1]: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 - if (this.settings.HACKS_LEVEL === 1 || this.settings.HACKS_LEVEL === 2) { + if (this.settings.HACKS_LEVEL === 1) { this.paint_signals.disconnect_all_for_actor(icon._dialog); this.paint_signals.connect(icon._dialog, blur_effect); } else { @@ -218,11 +227,6 @@ export const AppFoldersBlur = class AppFoldersBlur { this.blur_appfolders(); } - // not implemented for dynamic blur - set_color(c) { } - set_noise_amount(n) { } - set_noise_lightness(l) { } - disable() { this._log("removing blur from appfolders"); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js index 1a454ca..e2a8bdf 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js @@ -1,24 +1,20 @@ -import Shell from 'gi://Shell'; -import Clutter from 'gi://Clutter'; import Meta from 'gi://Meta'; import Gio from 'gi://Gio'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { PaintSignals } from '../effects/paint_signals.js'; import { ApplicationsService } from '../dbus/services.js'; +import { PaintSignals } from '../conveniences/paint_signals.js'; +import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; export const ApplicationsBlur = class ApplicationsBlur { - constructor(connections, settings, _) { + constructor(connections, settings, effects_manager) { this.connections = connections; this.settings = settings; + this.effects_manager = effects_manager; this.paint_signals = new PaintSignals(connections); - this.mutter_gsettings = new Gio.Settings({ schema: 'org.gnome.mutter' }); - - // stores every blurred window - this.window_map = new Map(); - // stores every blur actor - this.blur_actor_map = new Map(); + // stores every blurred meta window + this.meta_window_map = new Map(); } enable() { @@ -28,6 +24,8 @@ export const ApplicationsBlur = class ApplicationsBlur { this.service = new ApplicationsService; this.service.export(); + this.mutter_gsettings = new Gio.Settings({ schema: 'org.gnome.mutter' }); + // blur already existing windows this.update_all_windows(); @@ -38,16 +36,42 @@ export const ApplicationsBlur = class ApplicationsBlur { (_meta_display, meta_window) => { this._log("window created"); - if (meta_window) { - let window_actor = meta_window.get_compositor_private(); - this.track_new(window_actor, meta_window); - } + if (meta_window) + this.track_new(meta_window); + } + ); + + // update window blur when focus is changed + this.focused_window_pid = null; + this.init_dynamic_opacity(); + this.connections.connect( + global.display, + 'focus-window', + (_meta_display, meta_window, _p0) => { + if (meta_window && meta_window.bms_pid != this.focused_window_pid) + this.set_focus_for_window(meta_window); + else if (!meta_window) + this.set_focus_for_window(null); } ); this.connect_to_overview(); } + /// Initializes the dynamic opacity for windows, without touching to the connections. + /// This is used both when enabling the component, and when changing the dynamic-opacity pref. + init_dynamic_opacity() { + if (this.settings.applications.DYNAMIC_OPACITY) { + // make the currently focused window solid + if (global.display.focus_window) + this.set_focus_for_window(global.display.focus_window); + } else { + // remove old focused window if the pref was changed + if (this.focused_window_pid) + this.set_focus_for_window(null); + } + } + /// Connect to the overview being opened/closed to force the blur being /// shown on every window of the workspaces viewer. connect_to_overview() { @@ -58,9 +82,9 @@ export const ApplicationsBlur = class ApplicationsBlur { // allows the blur to be shown too) this.connections.connect( Main.overview, 'showing', - _ => this.window_map.forEach((meta_window, _pid) => { + _ => this.meta_window_map.forEach((meta_window, _pid) => { let window_actor = meta_window.get_compositor_private(); - window_actor.show(); + window_actor?.show(); }) ); @@ -69,7 +93,7 @@ export const ApplicationsBlur = class ApplicationsBlur { this.connections.connect( Main.overview, 'hidden', _ => { - this.window_map.forEach((meta_window, _pid) => { + this.meta_window_map.forEach((meta_window, _pid) => { let window_actor = meta_window.get_compositor_private(); if ( @@ -86,7 +110,7 @@ export const ApplicationsBlur = class ApplicationsBlur { update_all_windows() { // remove all previously blurred windows, in the case where the // whitelist was changed - this.window_map.forEach(((_meta_window, pid) => { + this.meta_window_map.forEach(((_meta_window, pid) => { this.remove_blur(pid); })); @@ -98,82 +122,81 @@ export const ApplicationsBlur = class ApplicationsBlur { let workspace = global.workspace_manager.get_workspace_by_index(i); let windows = workspace.list_windows(); - windows.forEach(meta_window => { - let window_actor = meta_window.get_compositor_private(); - - // disconnect previous signals - this.connections.disconnect_all_for(window_actor); - - this.track_new(window_actor, meta_window); - }); + windows.forEach(meta_window => this.track_new(meta_window)); } } /// Adds the needed signals to every new tracked window, and adds blur if /// needed. - track_new(window_actor, meta_window) { - let pid = ("" + Math.random()).slice(2, 16); + /// Accepts only untracked meta windows (i.e no `bms_pid` set) + track_new(meta_window) { + // create a pid that will follow the window during its whole life + const pid = ("" + Math.random()).slice(2, 16); + meta_window.bms_pid = pid; - window_actor['blur_provider_pid'] = pid; - meta_window['blur_provider_pid'] = pid; + this._log(`new window tracked, pid: ${pid}`); - // remove the blur when the window is destroyed - this.connections.connect(window_actor, 'destroy', window_actor => { - let pid = window_actor.blur_provider_pid; - if (this.blur_actor_map.has(pid)) { - this.remove_blur(pid); - } - this.window_map.delete(pid); - }); + // register the blurred window + this.meta_window_map.set(pid, meta_window); - // update the blur when mutter-hint or wm-class is changed - for (const prop of ['mutter-hints', 'wm-class']) { - this.connections.connect( - meta_window, - `notify::${prop}`, - _ => { - let pid = meta_window.blur_provider_pid; - this._log(`${prop} changed for pid ${pid}`); - - let window_actor = meta_window.get_compositor_private(); - this.check_blur(pid, window_actor, meta_window); - } - ); - } + // update the blur when wm-class is changed + this.connections.connect( + meta_window, 'notify::wm-class', + _ => this.check_blur(meta_window) + ); // update the position and size when the window size changes - this.connections.connect(meta_window, 'size-changed', () => { - if (this.blur_actor_map.has(pid)) { - let allocation = this.compute_allocation(meta_window); - let blur_actor = this.blur_actor_map.get(pid); + this.connections.connect( + meta_window, 'size-changed', + _ => this.update_size(pid) + ); + + // remove the blur when the window is unmanaged + this.connections.connect( + meta_window, 'unmanaging', + _ => this.untrack_meta_window(pid) + ); + + this.check_blur(meta_window); + } + + /// Updates the size of the blur actor associated to a meta window from its pid. + /// Accepts only tracked meta window (i.e `bms_pid` set), be it blurred or not. + update_size(pid) { + if (this.meta_window_map.has(pid)) { + const meta_window = this.meta_window_map.get(pid); + const blur_actor = meta_window.blur_actor; + if (blur_actor) { + const allocation = this.compute_allocation(meta_window); blur_actor.x = allocation.x; blur_actor.y = allocation.y; blur_actor.width = allocation.width; blur_actor.height = allocation.height; } - }); - - this.check_blur(pid, window_actor, meta_window); + } else + // the pid was visibly not removed + this.untrack_meta_window(pid); } /// Checks if the given actor needs to be blurred. + /// Accepts only tracked meta window, be it blurred or not. /// /// In order to be blurred, a window either: /// - is whitelisted in the user preferences if not enable-all /// - is not blacklisted if enable-all - /// - has a correct mutter hint, set to `blur-provider=sigma_value` - check_blur(pid, window_actor, meta_window) { - let mutter_hint = meta_window.get_mutter_hints(); - let window_wm_class = meta_window.get_wm_class(); + check_blur(meta_window) { + const window_wm_class = meta_window.get_wm_class(); + const enable_all = this.settings.applications.ENABLE_ALL; + const whitelist = this.settings.applications.WHITELIST; + const blacklist = this.settings.applications.BLACKLIST; + if (window_wm_class) + this._log(`pid ${meta_window.bms_pid} associated to wm class name ${window_wm_class}`); - let enable_all = this.settings.applications.ENABLE_ALL; - let whitelist = this.settings.applications.WHITELIST; - let blacklist = this.settings.applications.BLACKLIST; - this._log(`checking blur for ${pid}`); - - // either the window is included in whitelist - if (window_wm_class !== "" + // if we are in blacklist mode and the window is not blacklisted + // or if we are in whitelist mode and the window is whitelisted + if ( + window_wm_class !== "" && ((enable_all && !blacklist.includes(window_wm_class)) || (!enable_all && whitelist.includes(window_wm_class)) ) @@ -183,209 +206,114 @@ export const ApplicationsBlur = class ApplicationsBlur { Meta.FrameType.MODAL_DIALOG ].includes(meta_window.get_frame_type()) ) { - this._log(`application ${pid} listed, blurring it`); - - // get blur effect parameters - - let brightness, sigma; - - if (this.settings.applications.CUSTOMIZE) { - brightness = this.settings.applications.BRIGHTNESS; - sigma = this.settings.applications.SIGMA; - } else { - brightness = this.settings.BRIGHTNESS; - sigma = this.settings.SIGMA; - } - - this.update_blur(pid, window_actor, meta_window, brightness, sigma); + // only blur the window if it is not already done + if (!meta_window.blur_actor) + this.create_blur_effect(meta_window); } - // or blur is asked by window itself - else if ( - mutter_hint != null && - mutter_hint.includes("blur-provider") - ) { - this._log(`application ${pid} has hint ${mutter_hint}, parsing`); - - // get blur effect parameters - let [brightness, sigma] = this.parse_xprop(mutter_hint); - - this.update_blur(pid, window_actor, meta_window, brightness, sigma); - } - - // remove blur if the mutter hint is no longer valid, and the window - // is not explicitly whitelisted or un-blacklisted - else if (this.blur_actor_map.has(pid)) { - this.remove_blur(pid); - } - } - - /// When given the xprop property, returns the brightness and sigma values - /// matching. If one of the two values is invalid, or missing, then it uses - /// default values. - /// - /// An xprop property is valid if it is in one of the following formats: - /// - /// blur-provider=sigma:60,brightness:0.9 - /// blur-provider=s:10,brightness:0.492 - /// blur-provider=b:1.0,s:16 - /// - /// Brightness is a floating-point between 0.0 and 1.0 included. - /// Sigma is an integer between 0 and 999 included. - /// - /// If sigma is set to 0, then the blur is removed. - /// Setting "default" instead of the two values will make the - /// extension use its default value. - /// - /// Note that no space can be inserted. - /// - parse_xprop(property) { - // set brightness and sigma to default values - let brightness, sigma; - if (this.settings.applications.CUSTOMIZE) { - brightness = this.settings.applications.BRIGHTNESS; - sigma = this.settings.applications.SIGMA; - } else { - brightness = this.settings.BRIGHTNESS; - sigma = this.settings.SIGMA; - } - - // get the argument of the property - let arg = property.match("blur-provider=(.*)"); - this._log(`argument = ${arg}`); - - // if argument is valid, parse it - if (arg != null) { - // verify if there is only one value: in this case, this is sigma - let maybe_sigma = parseInt(arg[1]); - - if ( - !isNaN(maybe_sigma) && - maybe_sigma >= 0 && - maybe_sigma <= 999 - ) { - sigma = maybe_sigma; - } else { - // perform pattern matching - let res_b = arg[1].match("(brightness|b):(default|0?1?\.[0-9]*)"); - let res_s = arg[1].match("(sigma|s):(default|\\d{1,3})"); - - // if values are valid and not default, change them to the xprop one - if ( - res_b != null && res_b[2] !== 'default' - ) { - brightness = parseFloat(res_b[2]); - } - - if ( - res_s != null && res_s[2] !== 'default' - ) { - sigma = parseInt(res_s[2]); - } - } - } - - this._log(`brightness = ${brightness}, sigma = ${sigma}`); - - return [brightness, sigma]; - } - - /// Updates the blur on a window which needs to be blurred. - update_blur(pid, window_actor, meta_window, brightness, sigma) { - // the window is already blurred, update its blur effect - if (this.blur_actor_map.has(pid)) { - // window is already blurred, but sigma is null: remove the blur - if (sigma === 0) { - this.remove_blur(pid); - } - // window is already blurred and sigma is non-null: update it - else { - this.update_blur_effect( - this.blur_actor_map.get(pid), - brightness, - sigma - ); - } - } - - // the window is not blurred, and sigma is a non-null value: blur it - else if (sigma !== 0) { - // window is not blurred, blur it - this.create_blur_effect( - pid, - window_actor, - meta_window, - brightness, - sigma - ); - } + // remove blur it is not explicitly whitelisted or un-blacklisted + else if (meta_window.blur_actor) + this.remove_blur(meta_window.bms_pid); } /// Add the blur effect to the window. - create_blur_effect(pid, window_actor, meta_window, brightness, sigma) { - let blur_effect = new Shell.BlurEffect({ - radius: sigma * 2, - brightness: brightness, - mode: Shell.BlurMode.BACKGROUND - }); + /// Accepts only tracked meta window that is NOT already blurred. + create_blur_effect(meta_window) { + const pid = meta_window.bms_pid; + const window_actor = meta_window.get_compositor_private(); - let blur_actor = this.create_blur_actor( - meta_window, - window_actor, - blur_effect + const pipeline = new DummyPipeline(this.effects_manager, this.settings.applications); + let [blur_actor, bg_manager] = pipeline.create_background_with_effect( + window_actor, 'bms-application-blurred-widget' ); + meta_window.blur_actor = blur_actor; + meta_window.bg_manager = bg_manager; + // if hacks are selected, force to repaint the window - if (this.settings.HACKS_LEVEL === 1 || this.settings.HACKS_LEVEL === 2) { - this._log("applications hack level 1 or 2"); + if (this.settings.HACKS_LEVEL === 1) { + this._log("hack level 1"); - this.paint_signals.disconnect_all(); - this.paint_signals.connect(blur_actor, blur_effect); + this.paint_signals.disconnect_all_for_actor(blur_actor); + this.paint_signals.connect(blur_actor, pipeline.effect); } else { - this.paint_signals.disconnect_all(); + this.paint_signals.disconnect_all_for_actor(blur_actor); } - // insert the blurred widget - window_actor.insert_child_at_index(blur_actor, 0); - // make sure window is blurred in overview if (this.settings.applications.BLUR_ON_OVERVIEW) this.enforce_window_visibility_on_overview_for(window_actor); + // update the size + this.update_size(pid); + // set the window actor's opacity this.set_window_opacity(window_actor, this.settings.applications.OPACITY); + // now set up the signals, for the window actor only: they are disconnected + // in `remove_blur`, whereas the signals for the meta window are disconnected + // only when the whole component is disabled + + // update the window opacity when it changes, else we don't control it fully this.connections.connect( - window_actor, - 'notify::opacity', - _ => this.set_window_opacity(window_actor, this.settings.applications.OPACITY) + window_actor, 'notify::opacity', + _ => { + if (this.focused_window_pid != pid) + this.set_window_opacity(window_actor, this.settings.applications.OPACITY); + } ); - // register the blur actor/effect - blur_actor['blur_provider_pid'] = pid; - this.blur_actor_map.set(pid, blur_actor); - this.window_map.set(pid, meta_window); - - // hide the blur if window is invisible - if (!window_actor.visible) { - blur_actor.hide(); - } - // hide the blur if window becomes invisible + if (!window_actor.visible) + blur_actor.hide(); + this.connections.connect( window_actor, 'notify::visible', window_actor => { - let pid = window_actor.blur_provider_pid; - if (window_actor.visible) { - this.blur_actor_map.get(pid).show(); - } else { - this.blur_actor_map.get(pid).hide(); - } + if (window_actor.visible) + meta_window.blur_actor.show(); + else + meta_window.blur_actor.hide(); } ); } + /// With `focus=true`, tells us we are focused on said window (which can be null if + /// we are not focused anymore). It automatically removes the ancient focus. + /// With `focus=false`, just remove the focus from said window (which can still be null). + set_focus_for_window(meta_window, focus = true) { + let blur_actor = null; + let window_actor = null; + let new_pid = null; + if (meta_window) { + blur_actor = meta_window.blur_actor; + window_actor = meta_window.get_compositor_private(); + new_pid = meta_window.bms_pid; + } + + if (focus) { + // remove old focused window if any + if (this.focused_window_pid) { + const old_focused_window = this.meta_window_map.get(this.focused_window_pid); + if (old_focused_window) + this.set_focus_for_window(old_focused_window, false); + } + // set new focused window pid + this.focused_window_pid = new_pid; + // if we have blur, hide it and make the window opaque + if (this.settings.applications.DYNAMIC_OPACITY && blur_actor) { + blur_actor.hide(); + this.set_window_opacity(window_actor, 255); + } + } + // if we remove the focus and have blur, show it and make the window transparent + else if (blur_actor) { + blur_actor.show(); + this.set_window_opacity(window_actor, this.settings.applications.OPACITY); + } + } + /// Makes sure that, when the overview is visible, the window actor will /// stay visible no matter what. /// We can instead hide the last child of the window actor, which will @@ -412,12 +340,24 @@ export const ApplicationsBlur = class ApplicationsBlur { /// Set the opacity of the window actor that sits on top of the blur effect. set_window_opacity(window_actor, opacity) { - window_actor.get_children().forEach(child => { + window_actor?.get_children().forEach(child => { if (child.name !== "blur-actor" && child.opacity != opacity) child.opacity = opacity; }); } + /// Update the opacity of all window actors. + set_opacity() { + let opacity = this.settings.applications.OPACITY; + + this.meta_window_map.forEach(((meta_window, pid) => { + if (pid != this.focused_window_pid && meta_window.blur_actor) { + let window_actor = meta_window.get_compositor_private(); + this.set_window_opacity(window_actor, opacity); + } + })); + } + /// Compute the size and position for a blur actor. /// If `scale-monitor-framebuffer` experimental feature if on, we don't need to manage scaling. /// Else, on wayland, we need to divide by the scale to get the correct result. @@ -442,107 +382,68 @@ export const ApplicationsBlur = class ApplicationsBlur { }; } - /// Returns a new already blurred widget, configured to follow the size and - /// position of its target window. - create_blur_actor(meta_window, window_actor, blur_effect) { - // compute the size and position - let allocation = this.compute_allocation(meta_window); - - // create the actor - let blur_actor = new Clutter.Actor({ - x: allocation.x, - y: allocation.y, - width: allocation.width, - height: allocation.height - }); - - // add the effect - blur_actor.add_effect_with_name('blur-effect', blur_effect); - - return blur_actor; - } - - /// Updates the blur effect by overwriting its sigma and brightness values. - update_blur_effect(blur_actor, brightness, sigma) { - let effect = blur_actor.get_effect('blur-effect'); - effect.radius = sigma * 2; - effect.brightness = brightness; - } - - /// Removes the blur actor from the shell and unregister it. + /// Removes the blur actor to make a blurred window become normal again. + /// It however does not untrack the meta window itself. + /// Accepts a pid corresponding (or not) to a blurred (or not) meta window. remove_blur(pid) { this._log(`removing blur for pid ${pid}`); - let meta_window = this.window_map.get(pid); - // disconnect needed signals and untrack window + let meta_window = this.meta_window_map.get(pid); if (meta_window) { - this.window_map.delete(pid); let window_actor = meta_window.get_compositor_private(); + let blur_actor = meta_window.blur_actor; + let bg_manager = meta_window.bg_manager; - let blur_actor = this.blur_actor_map.get(pid); - if (blur_actor) { - this.blur_actor_map.delete(pid); + if (blur_actor && window_actor) { + // reset the opacity + this.set_window_opacity(window_actor, 255); - if (window_actor) { - // reset the opacity - this.set_window_opacity(window_actor, 255); + // remove the blurred actor + window_actor.remove_child(blur_actor); + bg_manager._bms_pipeline.destroy(); + bg_manager.destroy(); + blur_actor.destroy(); - // remove the blurred actor - window_actor.remove_child(blur_actor); + // kinda untrack the blurred actor, as its presence is how we know + // whether we are blurred or not + delete meta_window.blur_actor; + delete meta_window.bg_manager; - // disconnect the signals about overview animation etc - this.connections.disconnect_all_for(window_actor); - } + // disconnect the signals of the window actor + this.paint_signals.disconnect_all_for_actor(blur_actor); + this.connections.disconnect_all_for(window_actor); } } } + /// Kinda the same as `remove_blur`, but better: it also untracks the window. + /// This needs to be called when the component is being disabled, else it + /// would cause havoc by having untracked windows during normal operations, + /// which is not the point at all! + /// Accepts a pid corresponding (or not) to a blurred (or not) meta window. + untrack_meta_window(pid) { + this.remove_blur(pid); + let meta_window = this.meta_window_map.get(pid); + if (meta_window) { + this.connections.disconnect_all_for(meta_window); + this.meta_window_map.delete(pid); + } + } + disable() { this._log("removing blur from applications..."); this.service?.unexport(); delete this.mutter_gsettings; - this.blur_actor_map.forEach(((_blur_actor, pid) => { - this.remove_blur(pid); - })); + this.meta_window_map.forEach((_meta_window, pid) => { + this.untrack_meta_window(pid); + }); this.connections.disconnect_all(); this.paint_signals.disconnect_all(); } - /// Update the opacity of all window actors. - set_opacity() { - let opacity = this.settings.applications.OPACITY; - - this.window_map.forEach(((meta_window, _pid) => { - let window_actor = meta_window.get_compositor_private(); - this.set_window_opacity(window_actor, opacity); - })); - } - - /// Updates each blur effect to use new sigma value - // FIXME set_sigma and set_brightness are called when the extension is - // loaded and when sigma is changed, and do not respect the per-app - // xprop behaviour - set_sigma(s) { - this.blur_actor_map.forEach((actor, _) => { - actor.get_effect('blur-effect').set_sigma(s); - }); - } - - /// Updates each blur effect to use new brightness value - set_brightness(b) { - this.blur_actor_map.forEach((actor, _) => { - actor.get_effect('blur-effect').set_brightness(b); - }); - } - - // not implemented for dynamic blur - set_color(c) { } - set_noise_amount(n) { } - set_noise_lightness(l) { } - _log(str) { if (this.settings.DEBUG) console.log(`[Blur my Shell > applications] ${str}`); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js new file mode 100644 index 0000000..e4b0f19 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js @@ -0,0 +1,91 @@ +import * as Main from "resource:///org/gnome/shell/ui/main.js"; + +import { PaintSignals } from "../conveniences/paint_signals.js"; +import { Pipeline } from "../conveniences/pipeline.js"; + +export const CoverflowAltTabBlur = class CoverflowAltTabBlur { + constructor(connections, settings, effects_manager) { + this.connections = connections; + this.settings = settings; + this.paint_signals = new PaintSignals(connections); + this.effects_manager = effects_manager; + this.background_actors = []; + this.background_managers = []; + } + + enable() { + this._log("blurring coverflow alt-tab"); + + this.update_backgrounds(); + + this.connections.connect( + Main.layoutManager.uiGroup, + "child-added", + (_, child) => this.try_blur(child) + ); + + this.connections.connect(Main.layoutManager, "monitors-changed", (_) => { + this.update_backgrounds(); + }); + } + + update_backgrounds() { + this.remove_background_actors(); + + Main.layoutManager.uiGroup + .get_children() + .forEach((child) => this.try_blur(child)); + } + + try_blur(actor) { + if ( + actor.constructor.name !== "Meta_BackgroundGroup" || + actor.get_name() !== "coverflow-alt-tab-background-group" + ) { + return; + } + + this._log("found coverflow alt-tab to blur"); + + for (let i = 0; i < Main.layoutManager.monitors.length; i++) { + const pipeline = new Pipeline( + this.effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.coverflow_alt_tab.PIPELINE + ); + + const background_actor = pipeline.create_background_with_effects( + i, + this.background_managers, + actor, + "bms-coverflow-alt-tab-blurred-widget" + ); + + this.background_actors.push(background_actor); + } + } + + remove_background_actors() { + this.background_actors.forEach((actor) => actor.destroy); + this.background_actors = []; + + this.background_managers.forEach((background_manager) => { + background_manager._bms_pipeline.destroy(); + background_manager.destroy(); + }); + this.background_managers = []; + } + + disable() { + this._log("removing blur from coverflow alt-tab"); + + this.remove_background_actors(); + this.connections.disconnect_all(); + } + + _log(str) { + if (this.settings.DEBUG) { + console.log(`[Blur my Shell > coverflow alt-tab] ${str}`); + } + } +}; diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js index 7d84c23..4ff212c 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js @@ -1,12 +1,11 @@ -import St from 'gi://St'; -import Shell from 'gi://Shell'; import Meta from 'gi://Meta'; -import Mtk from 'gi://Mtk'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -const Signals = imports.signals; +import * as Signals from 'resource:///org/gnome/shell/misc/signals.js'; -import { PaintSignals } from '../effects/paint_signals.js'; -import { BlurEffect } from '../effects/blur_effect.js'; +import { PaintSignals } from '../conveniences/paint_signals.js'; + +import { Pipeline } from '../conveniences/pipeline.js'; +import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; const DASH_STYLES = [ "transparent-dash", @@ -15,150 +14,65 @@ const DASH_STYLES = [ ]; -// An helper function to find the monitor in which an actor is situated, -/// there might be a pre-existing function in GLib already -function find_monitor_for(actor) { - let extents = actor.get_transformed_extents(); - let rect = new Mtk.Rectangle({ - x: extents.get_x(), - y: extents.get_y(), - width: extents.get_width(), - height: extents.get_height(), - }); - - let index = global.display.get_monitor_index_for_rect(rect); - - return Main.layoutManager.monitors[index]; -} - - /// This type of object is created for every dash found, and talks to the main /// DashBlur thanks to signals. /// /// This allows to dynamically track the created dashes for each screen. class DashInfos { - constructor(dash_blur, dash, dash_container, dash_background, background, background_parent, effect) { + constructor( + dash_blur, dash, dash_container, dash_background, + background, background_group, bg_manager + ) { // the parent DashBlur object, to communicate this.dash_blur = dash_blur; - this.dash_container = dash_container; - // the blurred dash this.dash = dash; + this.dash_container = dash_container; this.dash_background = dash_background; - this.background_parent = background_parent; this.background = background; - this.effect = effect; + this.background_group = background_group; + this.bg_manager = bg_manager; this.settings = dash_blur.settings; this.old_style = this.dash._background.style; - dash_blur.connections.connect(dash_blur, 'remove-dashes', () => { - this._log("removing blur from dash"); - this.dash.get_parent().remove_child(this.background_parent); - this.remove_style(); - }); + this.dash_destroy_id = dash.connect('destroy', () => this.remove_dash_blur(false)); + this.dash_blur_connections_ids = []; + this.dash_blur_connections_ids.push( + this.dash_blur.connect('remove-dashes', () => this.remove_dash_blur()), + this.dash_blur.connect('override-style', () => this.override_style()), + this.dash_blur.connect('remove-style', () => this.remove_style()), + this.dash_blur.connect('show', () => this.background_group.show()), + this.dash_blur.connect('hide', () => this.background_group.hide()), + this.dash_blur.connect('update-size', () => this.update_size()), + this.dash_blur.connect('change-blur-type', () => this.change_blur_type()), + this.dash_blur.connect('update-pipeline', () => this.update_pipeline()) + ); + } - dash_blur.connections.connect(dash_blur, 'update-sigma', () => { - if (this.dash_blur.is_static) { - this.dash_blur.update_size(); - } - this.effect.radius = 2 * this.dash_blur.sigma * this.effect.scale; - }); + // IMPORTANT: do never call this in a mutable `this.dash_blur.forEach` + remove_dash_blur(dash_not_already_destroyed = true) { + // remove the style and destroy the effects + this.remove_style(); + this.destroy_dash(dash_not_already_destroyed); - dash_blur.connections.connect(dash_blur, 'update-brightness', () => { - this.effect.brightness = this.dash_blur.brightness; - }); + // remove the dash infos from their list + const dash_infos_index = this.dash_blur.dashes.indexOf(this); + if (dash_infos_index >= 0) + this.dash_blur.dashes.splice(dash_infos_index, 1); - dash_blur.connections.connect(dash_blur, 'update-corner-radius', () => { - if (this.dash_blur.is_static) { - let monitor = find_monitor_for(this.dash); - let corner_radius = this.dash_blur.corner_radius * monitor.geometry_scale; - this.effect.corner_radius = Math.min( - corner_radius, this.effect.width / 2, this.effect.height / 2 - ); - } - }); + // disconnect everything + this.dash_blur_connections_ids.forEach(id => { if (id) this.dash_blur.disconnect(id); }); + this.dash_blur_connections_ids = []; + if (this.dash_destroy_id) + this.dash.disconnect(this.dash_destroy_id); + this.dash_destroy_id = null; + } - dash_blur.connections.connect(dash_blur, 'override-background', () => { - this.remove_style(); + override_style() { + this.remove_style(); - this.dash.set_style_class_name( - DASH_STYLES[this.settings.dash_to_dock.STYLE_DASH_TO_DOCK] - ); - }); - - dash_blur.connections.connect(dash_blur, 'reset-background', () => this.remove_style()); - - dash_blur.connections.connect(dash_blur, 'show', () => { - if (this.dash_blur.is_static) - this.background_parent.show(); - else - this.effect.radius = this.dash_blur.sigma * 2 * this.effect.scale; - }); - - dash_blur.connections.connect(dash_blur, 'hide', () => { - if (this.dash_blur.is_static) - this.background_parent.hide(); - else - this.effect.radius = 0; - }); - - dash_blur.connections.connect(dash_blur, 'update-wallpaper', () => { - if (this.dash_blur.is_static) { - let bg = Main.layoutManager._backgroundGroup.get_child_at_index( - Main.layoutManager.monitors.length - - find_monitor_for(this.dash).index - 1 - ); - if (bg && bg.get_content()) { - this.background.content.set({ - background: bg.get_content().background - }); - this._log('wallpaper updated'); - } else { - this._warn("could not get background for dash-to-dock"); - } - } - }); - - dash_blur.connections.connect(dash_blur, 'update-size', () => { - if (this.dash_blur.is_static) { - let [x, y] = this.get_dash_position(this.dash_container, this.dash_background); - - this.background.x = -x; - this.background.y = -y; - - this.effect.width = this.dash_background.width; - this.effect.height = this.dash_background.height; - - this.dash_blur.set_corner_radius(this.dash_blur.corner_radius); - - if (dash_container.get_style_class_name().includes("top")) { - this.background.set_clip(x, y + this.dash.y + this.dash_background.y, this.dash_background.width, this.dash_background.height); - } else if (dash_container.get_style_class_name().includes("bottom")) { - this.background.set_clip(x, y + this.dash.y + this.dash_background.y, this.dash_background.width, this.dash_background.height); - } else if (dash_container.get_style_class_name().includes("left")) { - this.background.set_clip(x + this.dash.x + this.dash_background.x, y + this.dash.y + this.dash_background.y, this.dash_background.width, this.dash_background.height); - } else if (dash_container.get_style_class_name().includes("right")) { - this.background.set_clip(x + this.dash.x + this.dash_background.x, y + this.dash.y + this.dash_background.y, this.dash_background.width, this.dash_background.height); - } - } else { - this.background.width = this.dash_background.width; - this.background.height = this.dash_background.height; - - this.background.x = this.dash_background.x; - this.background.y = this.dash_background.y + this.dash.y; - } - }); - - dash_blur.connections.connect(dash_blur, 'change-blur-type', () => { - this.background_parent.remove_child(this.background); - if (this.effect.chained_effect) - this.effect.get_actor()?.remove_effect(this.effect.chained_effect); - this.effect.get_actor()?.remove_effect(this.effect); - - let [background, effect] = this.dash_blur.add_blur(this.dash, this.dash_background, this.dash_container); - this.background = background; - this.effect = effect; - this.background_parent.add_child(this.background); - }); + this.dash.set_style_class_name( + DASH_STYLES[this.settings.dash_to_dock.STYLE_DASH_TO_DOCK] + ); } remove_style() { @@ -169,10 +83,88 @@ class DashInfos { ); } + destroy_dash(dash_not_already_destroyed = true) { + if (!dash_not_already_destroyed) + this.bg_manager.backgroundActor = null; + + this.paint_signals?.disconnect_all(); + this.dash.get_parent().remove_child(this.background_group); + this.bg_manager._bms_pipeline.destroy(); + this.bg_manager.destroy(); + this.background_group.destroy(); + } + + change_blur_type() { + this.destroy_dash(); + + let [ + background, background_group, bg_manager, paint_signals + ] = this.dash_blur.add_blur(this.dash); + + this.background = background; + this.background_group = background_group; + this.bg_manager = bg_manager; + this.paint_signals = paint_signals; + + this.dash.get_parent().insert_child_at_index(this.background_group, 0); + + this.update_size(); + } + + update_pipeline() { + this.bg_manager._bms_pipeline.change_pipeline_to( + this.settings.dash_to_dock.PIPELINE + ); + } + + update_size() { + if (this.dash_blur.is_static) { + let [x, y] = this.get_dash_position(this.dash_container, this.dash_background); + + this.background.x = -x; + this.background.y = -y; + + if (this.dash_container.get_style_class_name().includes("top")) + this.background.set_clip( + x, + y + this.dash.y + this.dash_background.y, + this.dash_background.width, + this.dash_background.height + ); + else if (this.dash_container.get_style_class_name().includes("bottom")) + this.background.set_clip( + x, + y + this.dash.y + this.dash_background.y, + this.dash_background.width, + this.dash_background.height + ); + else if (this.dash_container.get_style_class_name().includes("left")) + this.background.set_clip( + x + this.dash.x + this.dash_background.x, + y + this.dash.y + this.dash_background.y, + this.dash_background.width, + this.dash_background.height + ); + else if (this.dash_container.get_style_class_name().includes("right")) + this.background.set_clip( + x + this.dash.x + this.dash_background.x, + y + this.dash.y + this.dash_background.y, + this.dash_background.width, + this.dash_background.height + ); + } else { + this.background.width = this.dash_background.width; + this.background.height = this.dash_background.height; + + this.background.x = this.dash_background.x; + this.background.y = this.dash_background.y + this.dash.y; + } + } + get_dash_position(dash_container, dash_background) { var x, y; - let monitor = find_monitor_for(dash_container); + let monitor = Main.layoutManager.findMonitorForActor(dash_container); let dash_box = dash_container._slider.get_child(); if (dash_container.get_style_class_name().includes("top")) { @@ -202,19 +194,13 @@ class DashInfos { } } -export const DashBlur = class DashBlur { +export const DashBlur = class DashBlur extends Signals.EventEmitter { constructor(connections, settings, _) { + super(); this.dashes = []; this.connections = connections; this.settings = settings; this.paint_signals = new PaintSignals(connections); - this.sigma = this.settings.dash_to_dock.CUSTOMIZE - ? this.settings.dash_to_dock.SIGMA - : this.settings.SIGMA; - this.brightness = this.settings.dash_to_dock.CUSTOMIZE - ? this.settings.dash_to_dock.BRIGHTNESS - : this.settings.BRIGHTNESS; - this.corner_radius = this.settings.dash_to_dock.CORNER_RADIUS; this.is_static = this.settings.dash_to_dock.STATIC_BLUR; this.enabled = false; } @@ -231,7 +217,6 @@ export const DashBlur = class DashBlur { this.blur_existing_dashes(); this.connect_to_overview(); - this.update_wallpaper(); this.update_size(); this.enabled = true; @@ -246,7 +231,7 @@ export const DashBlur = class DashBlur { Main.uiGroup.get_children().filter((child) => { return (child.get_name() === "dashtodockContainer") && (child.constructor.name === 'DashToDock'); - }).forEach(this.try_blur.bind(this)); + }).forEach(dash_container => this.try_blur(dash_container)); } // Tries to blur the dash contained in the given actor @@ -254,9 +239,9 @@ export const DashBlur = class DashBlur { let dash_box = dash_container._slider.get_child(); // verify that we did not already blur that dash - if (!dash_box.get_children().some((child) => { - return child.get_name() === "dash-blurred-background-parent"; - })) { + if (!dash_box.get_children().some(child => + child.get_name() === "bms-dash-backgroundgroup" + )) { this._log("dash to dock found, blurring it"); // finally blur the dash @@ -270,48 +255,26 @@ export const DashBlur = class DashBlur { // Blurs the dash and returns a `DashInfos` containing its information blur_dash_from(dash, dash_container) { - // dash background parent, not visible - let background_parent = new St.Widget({ - name: 'dash-blurred-background-parent', - style_class: 'dash-blurred-background-parent', - width: 0, - height: 0 - }); + let [background, background_group, bg_manager, paint_signals] = this.add_blur(dash); - // finally blur the dash - let dash_background = dash.get_children().find(child => { - return child.get_style_class_name() === 'dash-background'; - }); - - let [background, effect] = this.add_blur(dash, dash_background, dash_container); - - this.update_wallpaper(); - this.update_size(); + // insert the background group to the right element + dash.get_parent().insert_child_at_index(background_group, 0); // updates size and position on change - this.connections.connect(dash, 'notify::width', _ => { - this.update_size(); - }); - this.connections.connect(dash, 'notify::height', _ => { - this.update_size(); - }); - this.connections.connect(dash_container, 'notify::width', _ => { - this.update_size(); - }); - this.connections.connect(dash_container, 'notify::height', _ => { - this.update_size(); - }); - this.connections.connect(dash_container, 'notify::y', _ => { - this.update_wallpaper(); - this.update_size(); - }); - this.connections.connect(dash_container, 'notify::x', _ => { - this.update_wallpaper(); - this.update_size(); - }); + this.connections.connect( + dash, + ['notify::width', 'notify::height'], + _ => this.update_size() + ); + this.connections.connect( + dash_container, + ['notify::width', 'notify::height', 'notify::y', 'notify::x'], + _ => this.update_size() + ); - background_parent.add_child(background); - dash.get_parent().insert_child_at_index(background_parent, 0); + const dash_background = dash.get_children().find(child => { + return child.get_style_class_name() === 'dash-background'; + }); // create infos let infos = new DashInfos( @@ -320,137 +283,81 @@ export const DashBlur = class DashBlur { dash_container, dash_background, background, - background_parent, - effect + background_group, + bg_manager, + paint_signals ); - // update the background + this.update_size(); this.update_background(); // returns infos return infos; } - add_blur(dash, dash_background, dash_container) { - let monitor = find_monitor_for(dash); + add_blur(dash) { + const monitor = Main.layoutManager.findMonitorForActor(dash); + if (!monitor) + return; - // dash background widget - let background = this.is_static - ? new Meta.BackgroundActor({ - meta_display: global.display, - monitor: monitor.index, - }) - : new St.Widget({ - name: 'dash-blurred-background', - style_class: 'dash-blurred-background', - x: dash_background.x, - y: dash_background.y + dash.y, - width: dash_background.width, - height: dash_background.height, - }); + const background_group = new Meta.BackgroundGroup({ + name: 'bms-dash-backgroundgroup', width: 0, height: 0 + }); - // the effect to be applied - let effect; - if (this.is_static) { - let corner_radius = this.corner_radius * monitor.geometry_scale; - corner_radius = Math.min(corner_radius, dash_background.width / 2, dash_background.height / 2); - - effect = new BlurEffect({ - radius: 2 * this.sigma * monitor.geometry_scale, - brightness: this.brightness, - width: dash_background.width, - height: dash_background.height, - corner_radius: corner_radius - }); - - // connect to every background change (even without changing image) - // FIXME this signal is fired very often, so we should find another one - // fired only when necessary (but that still catches all cases) - this.connections.connect( - Main.layoutManager._backgroundGroup, - 'notify', - _ => this.update_wallpaper() + let background, bg_manager, paint_signals; + let static_blur = this.settings.dash_to_dock.STATIC_BLUR; + if (static_blur) { + let bg_manager_list = []; + const pipeline = new Pipeline( + global.blur_my_shell._effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.dash_to_dock.PIPELINE ); - } else { - effect = new Shell.BlurEffect({ - brightness: this.brightness, - radius: this.sigma * 2 * monitor.geometry_scale, - mode: Shell.BlurMode.BACKGROUND - }); + background = pipeline.create_background_with_effects( + monitor.index, bg_manager_list, + background_group, 'bms-dash-blurred-widget' + ); + bg_manager = bg_manager_list[0]; + } + else { + const pipeline = new DummyPipeline( + global.blur_my_shell._effects_manager, + this.settings.dash_to_dock + ); + [background, bg_manager] = pipeline.create_background_with_effect( + background_group, 'bms-dash-blurred-widget' + ); + + paint_signals = new PaintSignals(this.connections); // HACK // //`Shell.BlurEffect` does not repaint when shadows are under it. [1] // // This does not entirely fix this bug (shadows caused by windows - // still cause artifacts), but it prevents the shadows of the panel - // buttons to cause artifacts on the panel itself + // still cause artifacts), but it prevents the shadows of the dash + // buttons to cause artifacts on the dash itself // // [1]: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 if (this.settings.HACKS_LEVEL === 1) { - this._log("dash hack level 1"); - this.paint_signals.disconnect_all(); + this._log("hack level 1"); - let rp = () => { - effect.queue_repaint(); - }; - - dash._box.get_children().forEach((icon) => { - try { - let zone = icon.get_child_at_index(0); - - this.connections.connect(zone, [ - 'enter-event', 'leave-event', 'button-press-event' - ], rp); - } catch (e) { - this._warn(`${e}, continuing`); - } - }); - - this.connections.connect(dash._box, 'actor-added', (_, actor) => { - try { - let zone = actor.get_child_at_index(0); - - this.connections.connect(zone, [ - 'enter-event', 'leave-event', 'button-press-event' - ], rp); - } catch (e) { - this._warn(`${e}, continuing`); - } - }); - - let show_apps = dash._showAppsIcon; - - this.connections.connect(show_apps, [ - 'enter-event', 'leave-event', 'button-press-event' - ], rp); - - this.connections.connect(dash, 'leave-event', rp); - } else if (this.settings.HACKS_LEVEL === 2) { - this._log("dash hack level 2"); - - this.paint_signals.connect(background, effect); + paint_signals.disconnect_all(); + paint_signals.connect(background, pipeline.effect); } else { - this.paint_signals.disconnect_all(); + paint_signals.disconnect_all(); } } - // store the scale in the effect in order to retrieve it in set_sigma - effect.scale = monitor.geometry_scale; - - background.add_effect(effect); - - return [background, effect]; + return [background, background_group, bg_manager, paint_signals]; } change_blur_type() { this.is_static = this.settings.dash_to_dock.STATIC_BLUR; - this.emit('change-blur-type', true); + this.emit('change-blur-type'); - this.update_wallpaper(); this.update_background(); - this.update_size(); } /// Connect when overview if opened/closed to hide/show the blur accordingly @@ -459,10 +366,10 @@ export const DashBlur = class DashBlur { if (this.settings.dash_to_dock.UNBLUR_IN_OVERVIEW) { this.connections.connect( - Main.overview, 'showing', this.hide.bind(this) + Main.overview, 'showing', _ => this.hide() ); this.connections.connect( - Main.overview, 'hidden', this.show.bind(this) + Main.overview, 'hidden', _ => this.show() ); } }; @@ -470,45 +377,32 @@ export const DashBlur = class DashBlur { /// Updates the background to either remove it or not, according to the /// user preferences. update_background() { + this._log("updating background"); if (this.settings.dash_to_dock.OVERRIDE_BACKGROUND) - this.emit('override-background', true); + this.emit('override-style'); else - this.emit('reset-background', true); + this.emit('remove-style'); } - update_wallpaper() { - if (this.is_static) - this.emit('update-wallpaper', true); + update_pipeline() { + this.emit('update-pipeline'); } update_size() { - this.emit('update-size', true); + this.emit('update-size'); } - set_sigma(sigma) { - this.sigma = sigma; - this.emit('update-sigma', true); + show() { + this.emit('show'); } - - set_brightness(brightness) { - this.brightness = brightness; - this.emit('update-brightness', true); + hide() { + this.emit('hide'); } - set_corner_radius(radius) { - this.corner_radius = radius; - this.emit('update-corner-radius', true); - } - - // not implemented for dynamic blur - set_color(c) { } - set_noise_amount(n) { } - set_noise_lightness(l) { } - disable() { this._log("removing blur from dashes"); - this.emit('remove-dashes', true); + this.emit('remove-dashes'); this.dashes = []; this.connections.disconnect_all(); @@ -516,13 +410,6 @@ export const DashBlur = class DashBlur { this.enabled = false; } - show() { - this.emit('show', true); - } - hide() { - this.emit('hide', true); - } - _log(str) { if (this.settings.DEBUG) console.log(`[Blur my Shell > dash manager] ${str}`); @@ -531,6 +418,4 @@ export const DashBlur = class DashBlur { _warn(str) { console.warn(`[Blur my Shell > dash manager] ${str}`); } -}; - -Signals.addSignalMethods(DashBlur.prototype); \ No newline at end of file +}; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js index 00895ea..7755ba9 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js @@ -1,19 +1,14 @@ -import St from 'gi://St'; -import Shell from 'gi://Shell'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Background from 'resource:///org/gnome/shell/ui/background.js'; import { UnlockDialog } from 'resource:///org/gnome/shell/ui/unlockDialog.js'; -let sigma; -let brightness; -let color; -let noise; -let lightness; +import { Pipeline } from '../conveniences/pipeline.js'; const original_createBackground = UnlockDialog.prototype._createBackground; const original_updateBackgroundEffects = UnlockDialog.prototype._updateBackgroundEffects; +const original_updateBackgrounds = + UnlockDialog.prototype._updateBackgrounds; export const LockscreenBlur = class LockscreenBlur { @@ -27,22 +22,6 @@ export const LockscreenBlur = class LockscreenBlur { enable() { this._log("blurring lockscreen"); - brightness = this.settings.lockscreen.CUSTOMIZE - ? this.settings.lockscreen.BRIGHTNESS - : this.settings.BRIGHTNESS; - sigma = this.settings.lockscreen.CUSTOMIZE - ? this.settings.lockscreen.SIGMA - : this.settings.SIGMA; - color = this.settings.lockscreen.CUSTOMIZE - ? this.settings.lockscreen.COLOR - : this.settings.COLOR; - noise = this.settings.lockscreen.CUSTOMIZE - ? this.settings.lockscreen.NOISE_AMOUNT - : this.settings.NOISE_AMOUNT; - lightness = this.settings.lockscreen.CUSTOMIZE - ? this.settings.lockscreen.NOISE_LIGHTNESS - : this.settings.NOISE_LIGHTNESS; - this.update_lockscreen(); this.enabled = true; @@ -53,103 +32,39 @@ export const LockscreenBlur = class LockscreenBlur { this._createBackground; UnlockDialog.prototype._updateBackgroundEffects = this._updateBackgroundEffects; + UnlockDialog.prototype._updateBackgrounds = + this._updateBackgrounds; } - _createBackground(monitorIndex) { - let monitor = Main.layoutManager.monitors[monitorIndex]; - let widget = new St.Widget({ - style_class: "screen-shield-background", - x: monitor.x, - y: monitor.y, - width: monitor.width, - height: monitor.height, - }); + _createBackground(monitor_index) { + let pipeline = new Pipeline( + global.blur_my_shell._effects_manager, global.blur_my_shell._pipelines_manager, + global.blur_my_shell._settings.lockscreen.PIPELINE + ); - let blur_effect = new Shell.BlurEffect({ - name: 'blur', - radius: sigma * 2, - brightness: brightness - }); - - // store the scale in the effect in order to retrieve later - blur_effect.scale = monitor.geometry_scale; - - let color_effect = global.blur_my_shell._lockscreen_blur.effects_manager.new_color_effect({ - name: 'color', - color: color - }, this.settings); - - let noise_effect = global.blur_my_shell._lockscreen_blur.effects_manager.new_noise_effect({ - name: 'noise', - noise: noise, - lightness: lightness - }, this.settings); - - widget.add_effect(color_effect); - widget.add_effect(noise_effect); - widget.add_effect(blur_effect); - - let bgManager = new Background.BackgroundManager({ - container: widget, - monitorIndex, - controlPosition: false, - }); - - this._bgManagers.push(bgManager); - - this._backgroundGroup.add_child(widget); + pipeline.create_background_with_effects( + monitor_index, + this._bgManagers, + this._backgroundGroup, + "screen-shield-background" + ); } _updateBackgroundEffects() { - for (const widget of this._backgroundGroup) { - const color_effect = widget.get_effect('color'); - const noise_effect = widget.get_effect('noise'); - const blur_effect = widget.get_effect('blur'); + this._updateBackgrounds(); + } - if (color_effect) - color_effect.set({ - color: color - }); - - if (noise_effect) { - noise_effect.set({ - noise: noise, - lightness: lightness, - }); - } - - if (blur_effect) { - blur_effect.set({ - brightness: brightness, - radius: sigma * 2 * blur_effect.scale, - }); - } + _updateBackgrounds() { + for (let i = 0; i < this._bgManagers.length; i++) { + this._bgManagers[i]._bms_pipeline.destroy(); + this._bgManagers[i].destroy(); } - } - set_sigma(s) { - sigma = s; - this.update_lockscreen(); - } + this._bgManagers = []; + this._backgroundGroup.destroy_all_children(); - set_brightness(b) { - brightness = b; - this.update_lockscreen(); - } - - set_color(c) { - color = c; - this.update_lockscreen(); - } - - set_noise_amount(n) { - noise = n; - this.update_lockscreen(); - } - - set_noise_lightness(l) { - lightness = l; - this.update_lockscreen(); + for (let i = 0; i < Main.layoutManager.monitors.length; i++) + this._createBackground(i); } disable() { @@ -159,6 +74,8 @@ export const LockscreenBlur = class LockscreenBlur { original_createBackground; UnlockDialog.prototype._updateBackgroundEffects = original_updateBackgroundEffects; + UnlockDialog.prototype._updateBackgrounds = + original_updateBackgrounds; this.connections.disconnect_all(); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js index d612370..1399234 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js @@ -1,10 +1,11 @@ -import Shell from 'gi://Shell'; import Meta from 'gi://Meta'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import { WorkspaceAnimationController } from 'resource:///org/gnome/shell/ui/workspaceAnimation.js'; const wac_proto = WorkspaceAnimationController.prototype; +import { Pipeline } from '../conveniences/pipeline.js'; + const OVERVIEW_COMPONENTS_STYLE = [ "overview-components-light", "overview-components-dark", @@ -15,40 +16,23 @@ const OVERVIEW_COMPONENTS_STYLE = [ export const OverviewBlur = class OverviewBlur { constructor(connections, settings, effects_manager) { this.connections = connections; - this.effects = []; this.settings = settings; this.effects_manager = effects_manager; - this._workspace_switch_bg_actors = []; + this.overview_background_managers = []; + this.overview_background_group = new Meta.BackgroundGroup( + { name: 'bms-overview-backgroundgroup' } + ); + this.animation_background_managers = []; + this.animation_background_group = new Meta.BackgroundGroup( + { name: 'bms-animation-backgroundgroup' } + ); this.enabled = false; + this.proto_patched = false; } enable() { this._log("blurring overview"); - // connect to every background change (even without changing image) - // FIXME this signal is fired very often, so we should find another one - // fired only when necessary (but that still catches all cases) - this.connections.connect( - Main.layoutManager._backgroundGroup, - 'notify', - _ => { - this._log("updated background"); - this.update_backgrounds(); - } - ); - - // connect to monitors change - this.connections.connect( - Main.layoutManager, - 'monitors-changed', - _ => { - if (Main.screenShield && !Main.screenShield.locked) { - this._log("changed monitors"); - this.update_backgrounds(); - } - } - ); - // add css class name for workspace-switch background Main.uiGroup.add_style_class_name("blurred-overview"); @@ -58,12 +42,16 @@ export const OverviewBlur = class OverviewBlur { // update backgrounds when the component is enabled this.update_backgrounds(); + // connect to monitors change + this.connections.connect(Main.layoutManager, 'monitors-changed', + _ => this.update_backgrounds() + ); // part for the workspace animation switch - // make sure not to do this part if the extension was enabled prior, as + // make sure not to do this part if the functions were patched prior, as // the functions would call themselves and cause infinite recursion - if (!this.enabled) { + if (!this.proto_patched) { // store original workspace switching methods for restoring them on // disable() this._original_PrepareSwitch = wac_proto._prepareWorkspaceSwitch; @@ -91,25 +79,20 @@ export const OverviewBlur = class OverviewBlur { ); } - Main.layoutManager.monitors.forEach(monitor => { - if ( - !( + Main.uiGroup.insert_child_above( + outer_this.animation_background_group, + global.window_group + ); + + outer_this.animation_background_managers.forEach(bg_manager => { + if (bg_manager._bms_pipeline.actor) + if ( Meta.prefs_get_workspaces_only_on_primary() && - (monitor !== Main.layoutManager.primaryMonitor) + bg_manager._monitorIndex !== Main.layoutManager.primaryMonitor.index ) - ) { - const bg_actor = outer_this.create_background_actor( - monitor, true - ); - - Main.uiGroup.insert_child_above( - bg_actor, - global.window_group - ); - - // store the actors so that we can delete them later - outer_this._workspace_switch_bg_actors.push(bg_actor); - } + bg_manager._bms_pipeline.actor.visible = false; + else + bg_manager._bms_pipeline.actor.visible = true; }); }; @@ -129,15 +112,10 @@ export const OverviewBlur = class OverviewBlur { ); } - outer_this.effects = outer_this.effects.filter( - effects_group => !effects_group.is_transition - ); - - outer_this._workspace_switch_bg_actors.forEach(actor => { - actor.destroy(); - }); - outer_this._workspace_switch_bg_actors = []; + Main.uiGroup.remove_child(outer_this.animation_background_group); }; + + this.proto_patched = true; } this.enabled = true; @@ -146,78 +124,30 @@ export const OverviewBlur = class OverviewBlur { update_backgrounds() { // remove every old background this.remove_background_actors(); - - // add new backgrounds - Main.layoutManager.monitors.forEach(monitor => { - const bg_actor = this.create_background_actor(monitor, false); - - Main.layoutManager.overviewGroup.insert_child_at_index( - bg_actor, - monitor.index + // create new backgrounds for the overview and the animation + for (let i = 0; i < Main.layoutManager.monitors.length; i++) { + const pipeline_overview = new Pipeline( + this.effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.overview.PIPELINE + ); + pipeline_overview.create_background_with_effects( + i, this.overview_background_managers, + this.overview_background_group, 'bms-overview-blurred-widget' ); - }); - } - create_background_actor(monitor, is_transition) { - let bg_actor = new Meta.BackgroundActor({ - name: "blur-my-shell_background_actor", - meta_display: global.display, - monitor: monitor.index - }); - let background_group = Main.layoutManager._backgroundGroup - .get_children() - .filter((child) => child instanceof Meta.BackgroundActor); - let background = - background_group[ - Main.layoutManager.monitors.length - monitor.index - 1 - ]; - - if (!background) { - this._warn("could not get background for overview"); - return bg_actor; + const pipeline_animation = new Pipeline( + this.effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.overview.PIPELINE + ); + pipeline_animation.create_background_with_effects( + i, this.animation_background_managers, + this.animation_background_group, 'bms-animation-blurred-widget' + ); } - - bg_actor.content.set({ - background: background.get_content().background - }); - - let blur_effect = new Shell.BlurEffect({ - brightness: this.settings.overview.CUSTOMIZE - ? this.settings.overview.BRIGHTNESS - : this.settings.BRIGHTNESS, - radius: (this.settings.overview.CUSTOMIZE - ? this.settings.overview.SIGMA - : this.settings.SIGMA) * 2 * monitor.geometry_scale, - mode: Shell.BlurMode.ACTOR - }); - - // store the scale in the effect in order to retrieve it in set_sigma - blur_effect.scale = monitor.geometry_scale; - - let color_effect = this.effects_manager.new_color_effect({ - color: this.settings.overview.CUSTOMIZE - ? this.settings.overview.COLOR - : this.settings.COLOR - }, this.settings); - - let noise_effect = this.effects_manager.new_noise_effect({ - noise: this.settings.overview.CUSTOMIZE - ? this.settings.overview.NOISE_AMOUNT - : this.settings.NOISE_AMOUNT, - lightness: this.settings.overview.CUSTOMIZE - ? this.settings.overview.NOISE_LIGHTNESS - : this.settings.NOISE_LIGHTNESS - }, this.settings); - - bg_actor.add_effect(color_effect); - bg_actor.add_effect(noise_effect); - bg_actor.add_effect(blur_effect); - this.effects.push({ blur_effect, color_effect, noise_effect, is_transition }); - - bg_actor.set_x(monitor.x); - bg_actor.set_y(monitor.y); - - return bg_actor; + // add the container widget for the overview only to the overview group + Main.layoutManager.overviewGroup.insert_child_at_index(this.overview_background_group, 0); } /// Updates the classname to style overview components with semi-transparent @@ -233,71 +163,43 @@ export const OverviewBlur = class OverviewBlur { ); } - set_sigma(s) { - this.effects.forEach(effect => { - effect.blur_effect.radius = s * 2 * effect.blur_effect.scale; - }); - } - - set_brightness(b) { - this.effects.forEach(effect => { - effect.blur_effect.brightness = b; - }); - } - - set_color(c) { - this.effects.forEach(effect => { - effect.color_effect.color = c; - }); - } - - set_noise_amount(n) { - this.effects.forEach(effect => { - effect.noise_effect.noise = n; - }); - } - - set_noise_lightness(l) { - this.effects.forEach(effect => { - effect.noise_effect.lightness = l; - }); - } - remove_background_actors() { - Main.layoutManager.overviewGroup.get_children().forEach(child => { - if (child instanceof Meta.BackgroundActor - && child.get_name() == "blur-my-shell_background_actor" - ) { - child.get_effects().forEach(effect => { - this.effects_manager.remove(effect); - }); - Main.layoutManager.overviewGroup.remove_child(child); - child.destroy(); - } + this.overview_background_group.remove_all_children(); + this.animation_background_group.remove_all_children(); + this.overview_background_managers.forEach(background_manager => { + background_manager._bms_pipeline.destroy(); + background_manager.destroy(); }); - this.effects = []; + this.animation_background_managers.forEach(background_manager => { + background_manager._bms_pipeline.destroy(); + background_manager.destroy(); + }); + this.overview_background_managers = []; + this.animation_background_managers = []; } disable() { this._log("removing blur from overview"); + this.remove_background_actors(); Main.uiGroup.remove_style_class_name("blurred-overview"); OVERVIEW_COMPONENTS_STYLE.forEach( style => Main.uiGroup.remove_style_class_name(style) ); - // make sure to absolutely not do this if the component was not enabled - // prior, as this would cause infinite recursion - if (this.enabled) { - // restore original behavior + this.connections.disconnect_all(); + this.enabled = false; + } + + restore_patched_proto() { + if (this.proto_patched) { if (this._original_PrepareSwitch) wac_proto._prepareWorkspaceSwitch = this._original_PrepareSwitch; if (this._original_FinishSwitch) wac_proto._finishWorkspaceSwitch = this._original_FinishSwitch; - } - this.connections.disconnect_all(); - this.enabled = false; + this.proto_patched = false; + } } _log(str) { diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js index d1d3edb..df1be7b 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js @@ -1,10 +1,11 @@ import St from 'gi://St'; -import Shell from 'gi://Shell'; import Meta from 'gi://Meta'; -import Mtk from 'gi://Mtk'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { PaintSignals } from '../effects/paint_signals.js'; +import { PaintSignals } from '../conveniences/paint_signals.js'; + +import { Pipeline } from '../conveniences/pipeline.js'; +import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; const DASH_TO_PANEL_UUID = 'dash-to-panel@jderose9.github.com'; const PANEL_STYLES = [ @@ -56,26 +57,9 @@ export const PanelBlur = class PanelBlur { // update the classname if the panel to have or have not light text this.update_light_text_classname(); - // connect to every background change (even without changing image) - // FIXME this signal is fired very often, so we should find another one - // fired only when necessary (but that still catches all cases) - this.connections.connect( - Main.layoutManager._backgroundGroup, - 'notify', - _ => this.actors_list.forEach(actors => - this.update_wallpaper(actors) - ) - ); - - // connect to monitors change - this.connections.connect( - Main.layoutManager, - 'monitors-changed', - _ => { - if (Main.screenShield && !Main.screenShield.locked) { - this.reset(); - } - } + // connect to workareas change + this.connections.connect(global.display, 'workareas-changed', + _ => this.reset() ); this.enabled = true; @@ -131,9 +115,6 @@ export const PanelBlur = class PanelBlur { if (!actors) // if the actors is not blurred, blur it this.blur_panel(panel); - else - // if it is blurred, update the blur anyway - this.change_blur_type(actors); } /// Blur a panel @@ -145,71 +126,74 @@ export const PanelBlur = class PanelBlur { panel_box = panel_box.get_parent(); } - let monitor = this.find_monitor_for(panel); + let monitor = Main.layoutManager.findMonitorForActor(panel); if (!monitor) return; - let background_parent = new St.Widget({ - name: 'topbar-blurred-background-parent', - x: 0, y: 0, width: 0, height: 0 - }); + let background_group = new Meta.BackgroundGroup( + { name: 'bms-panel-backgroundgroup', width: 0, height: 0 } + ); - let background = this.settings.panel.STATIC_BLUR - ? new Meta.BackgroundActor({ - meta_display: global.display, - monitor: monitor.index - }) - : new St.Widget; + let background, bg_manager; + let static_blur = this.settings.panel.STATIC_BLUR; + if (static_blur) { + let bg_manager_list = []; + const pipeline = new Pipeline( + this.effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.panel.PIPELINE + ); + background = pipeline.create_background_with_effects( + monitor.index, bg_manager_list, + background_group, 'bms-panel-blurred-widget' + ); + bg_manager = bg_manager_list[0]; + } + else { + const pipeline = new DummyPipeline(this.effects_manager, this.settings.panel); + [background, bg_manager] = pipeline.create_background_with_effect( + background_group, 'bms-panel-blurred-widget' + ); - background_parent.add_child(background); + let paint_signals = new PaintSignals(this.connections); - // insert background parent - panel_box.insert_child_at_index(background_parent, 0); + // HACK + // + //`Shell.BlurEffect` does not repaint when shadows are under it. [1] + // + // This does not entirely fix this bug (shadows caused by windows + // still cause artifacts), but it prevents the shadows of the panel + // buttons to cause artifacts on the panel itself + // + // [1]: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 - let blur = new Shell.BlurEffect({ - brightness: this.settings.panel.CUSTOMIZE - ? this.settings.panel.BRIGHTNESS - : this.settings.BRIGHTNESS, - radius: (this.settings.panel.CUSTOMIZE - ? this.settings.panel.SIGMA - : this.settings.SIGMA) * 2 * monitor.geometry_scale, - mode: this.settings.panel.STATIC_BLUR - ? Shell.BlurMode.ACTOR - : Shell.BlurMode.BACKGROUND - }); + { + if (this.settings.HACKS_LEVEL === 1) { + this._log("panel hack level 1"); - // store the scale in the effect in order to retrieve it in set_sigma - blur.scale = monitor.geometry_scale; + paint_signals.disconnect_all(); + paint_signals.connect(background, pipeline.effect); + } else { + paint_signals.disconnect_all(); + } + } + } - let color = this.effects_manager.new_color_effect({ - color: this.settings.panel.CUSTOMIZE - ? this.settings.panel.COLOR - : this.settings.COLOR - }, this.settings); - - let noise = this.effects_manager.new_noise_effect({ - noise: this.settings.panel.CUSTOMIZE - ? this.settings.panel.NOISE_AMOUNT - : this.settings.NOISE_AMOUNT, - lightness: this.settings.panel.CUSTOMIZE - ? this.settings.panel.NOISE_LIGHTNESS - : this.settings.NOISE_LIGHTNESS - }, this.settings); - - let paint_signals = new PaintSignals(this.connections); + // insert the background group to the panel box + panel_box.insert_child_at_index(background_group, 0); + // the object that is used to remembering each elements that is linked to the blur effect let actors = { - widgets: { panel, panel_box, background, background_parent }, - effects: { blur, color, noise }, - paint_signals, + widgets: { panel, panel_box, background, background_group }, + static_blur, monitor, + bg_manager, is_dtp_panel }; - this.actors_list.push(actors); - // perform updates - this.change_blur_type(actors); + // update the size of the actor + this.update_size(actors); // connect to panel, panel_box and its parent position or size change // this should fire update_size every time one of its params change @@ -228,157 +212,47 @@ export const PanelBlur = class PanelBlur { 'notify::position', _ => this.update_size(actors) ); - } - update_all_blur_type() { - this.actors_list.forEach(actors => this.change_blur_type(actors)); - } - - change_blur_type(actors) { - let is_static = this.settings.panel.STATIC_BLUR; - - // reset widgets to right state - actors.widgets.background_parent.remove_child(actors.widgets.background); - this.effects_manager.remove(actors.effects.blur); - this.effects_manager.remove(actors.effects.color); - this.effects_manager.remove(actors.effects.noise); - - // create new background actor - actors.widgets.background = is_static - ? new Meta.BackgroundActor({ - meta_display: global.display, - monitor: this.find_monitor_for(actors.widgets.panel).index - }) - : new St.Widget; - - // change blur mode - actors.effects.blur.set_mode(is_static ? 0 : 1); - - // disable other effects if the blur is dynamic, as they makes it opaque - actors.effects.color._static = is_static; - actors.effects.noise._static = is_static; - actors.effects.color.update_enabled(); - actors.effects.noise.update_enabled(); - - // add the effects in order - actors.widgets.background.add_effect(actors.effects.color); - actors.widgets.background.add_effect(actors.effects.noise); - actors.widgets.background.add_effect(actors.effects.blur); - - // add the background actor behing the panel - actors.widgets.background_parent.add_child(actors.widgets.background); - - // perform updates - this.update_wallpaper(actors); - this.update_size(actors); - - - // HACK - // - //`Shell.BlurEffect` does not repaint when shadows are under it. [1] - // - // This does not entirely fix this bug (shadows caused by windows - // still cause artifacts), but it prevents the shadows of the panel - // buttons to cause artifacts on the panel itself - // - // [1]: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 - - if (!is_static) { - if (this.settings.HACKS_LEVEL === 1) { - this._log("panel hack level 1"); - actors.paint_signals.disconnect_all(); - - let rp = () => { actors.effects.blur.queue_repaint(); }; - - this.connections.connect(actors.widgets.panel, [ - 'enter-event', 'leave-event', 'button-press-event' - ], rp); - - actors.widgets.panel.get_children().forEach(child => { - this.connections.connect(child, [ - 'enter-event', 'leave-event', 'button-press-event' - ], rp); - }); - } else if (this.settings.HACKS_LEVEL === 2) { - this._log("panel hack level 2"); - actors.paint_signals.disconnect_all(); - - actors.paint_signals.connect( - actors.widgets.background, actors.effects.blur - ); - } else { - actors.paint_signals.disconnect_all(); - } - } - } - - update_wallpaper(actors) { - // if static blur, get right wallpaper and update blur with it - if (this.settings.panel.STATIC_BLUR) { - let bg = Main.layoutManager._backgroundGroup.get_child_at_index( - Main.layoutManager.monitors.length - - this.find_monitor_for(actors.widgets.panel).index - 1 - ); - if (bg && bg.get_content()) - actors.widgets.background.content.set({ - background: bg.get_content().background - }); - else - this._warn("could not get background for panel"); - } + // connect to the panel getting destroyed + this.connections.connect( + panel, + 'destroy', + _ => this.destroy_blur(actors, true) + ); } update_size(actors) { let panel = actors.widgets.panel; let panel_box = actors.widgets.panel_box; let background = actors.widgets.background; - let monitor = this.find_monitor_for(panel); - if (!monitor) - return; - let [width, height] = panel_box.get_size(); - background.width = width; - background.height = height; // if static blur, need to clip the background - if (this.settings.panel.STATIC_BLUR) { + if (actors.static_blur) { + let monitor = Main.layoutManager.findMonitorForActor(panel); + if (!monitor) + return; + // an alternative to panel.get_transformed_position, because it // sometimes yields NaN (probably when the actor is not fully // positionned yet) let [p_x, p_y] = panel_box.get_position(); let [p_p_x, p_p_y] = panel_box.get_parent().get_position(); - let x = p_x + p_p_x - monitor.x; - let y = p_y + p_p_y - monitor.y; + let x = p_x + p_p_x - monitor.x + (width - panel.width) / 2; + let y = p_y + p_p_y - monitor.y + (height - panel.height) / 2; - background.set_clip(x, y, width, height); - background.x = -x; - background.y = -y; - - // fixes a bug where the blur is washed away when changing the sigma - this.invalidate_blur(actors); + background.set_clip(x, y, panel.width, panel.height); + background.x = (width - panel.width) / 2 - x; + background.y = .5 + (height - panel.height) / 2 - y; } else { background.x = panel.x; background.y = panel.y; + background.width = panel.width; + background.height = panel.height; } // update the monitor panel is on - actors.monitor = this.find_monitor_for(panel); - } - - /// An helper function to find the monitor in which an actor is situated, - /// there might be a pre-existing function in GLib already - find_monitor_for(actor) { - let extents = actor.get_transformed_extents(); - let rect = new Mtk.Rectangle({ - x: extents.get_x(), - y: extents.get_y(), - width: extents.get_width(), - height: extents.get_height(), - }); - - let index = global.display.get_monitor_index_for_rect(rect); - - return Main.layoutManager.monitors[index]; + actors.monitor = Main.layoutManager.findMonitorForActor(panel); } /// Connect when overview if opened/closed to hide/show the blur accordingly @@ -396,22 +270,22 @@ export const PanelBlur = class PanelBlur { ) { if (!this.settings.hidetopbar.COMPATIBILITY) { this.connections.connect( - Main.overview, 'showing', this.hide.bind(this) + Main.overview, 'showing', _ => this.hide() ); this.connections.connect( - Main.overview, 'hidden', this.show.bind(this) + Main.overview, 'hidden', _ => this.show() ); } else { let appDisplay = Main.overview._overview._controls._appDisplay; this.connections.connect( - appDisplay, 'show', this.hide.bind(this) + appDisplay, 'show', _ => this.hide() ); this.connections.connect( - appDisplay, 'hide', this.show.bind(this) + appDisplay, 'hide', _ => this.show() ); this.connections.connect( - Main.overview, 'hidden', this.show.bind(this) + Main.overview, 'hidden', _ => this.show() ); } @@ -425,12 +299,12 @@ export const PanelBlur = class PanelBlur { ) { // connect to overview opening/closing this.connections.connect(Main.overview, ['showing', 'hiding'], - this.update_visibility.bind(this) + _ => this.update_visibility() ); // connect to session mode update this.connections.connect(Main.sessionMode, 'updated', - this.update_visibility.bind(this) + _ => this.update_visibility() ); // manage already-existing windows @@ -450,7 +324,7 @@ export const PanelBlur = class PanelBlur { // connect to a workspace change this.connections.connect(global.window_manager, 'switch-workspace', - this.update_visibility.bind(this) + _ => this.update_visibility() ); // perform early update @@ -600,75 +474,45 @@ export const PanelBlur = class PanelBlur { ); } - /// Fixes a bug where the blur is washed away when changing the sigma, or - /// enabling/disabling other effects. - invalidate_blur(actors) { - if (this.settings.panel.STATIC_BLUR && actors.widgets.background) - actors.widgets.background.get_content()?.invalidate(); - } - - invalidate_all_blur() { - this.actors_list.forEach(actors => this.invalidate_blur(actors)); - } - - set_sigma(s) { - this.actors_list.forEach(actors => { - actors.effects.blur.radius = s * 2 * actors.effects.blur.scale; - this.invalidate_blur(actors); - }); - } - - set_brightness(b) { - this.actors_list.forEach(actors => { - actors.effects.blur.brightness = b; - }); - } - - set_color(c) { - this.actors_list.forEach(actors => { - actors.effects.color.color = c; - }); - } - - set_noise_amount(n) { - this.actors_list.forEach(actors => { - actors.effects.noise.noise = n; - }); - } - - set_noise_lightness(l) { - this.actors_list.forEach(actors => { - actors.effects.noise.lightness = l; - }); + update_pipeline() { + this.actors_list.forEach(actors => + actors.bg_manager._bms_pipeline.change_pipeline_to( + this.settings.panel.PIPELINE + ) + ); } show() { this.actors_list.forEach(actors => { - actors.widgets.background_parent.show(); + actors.widgets.background.show(); }); } hide() { this.actors_list.forEach(actors => { - actors.widgets.background_parent.hide(); + actors.widgets.background.hide(); }); } - // destroy every blurred background left, necessary after sleep - destroy_blur_effects() { - Main.panel?.get_parent()?.get_children().forEach( - child => { - if (child.name === 'topbar-blurred-background-parent') { - child.get_children().forEach(meta_background_actor => { - meta_background_actor.get_effects().forEach(effect => { - this.effects_manager.remove(effect); - }); - }); - child.destroy_all_children(); - child.destroy(); - } - } - ); + // IMPORTANT: do never call this in a mutable `this.actors_list.forEach` + destroy_blur(actors, panel_already_destroyed) { + this.set_should_override_panel(actors, false); + + actors.bg_manager._bms_pipeline.destroy(); + + if (panel_already_destroyed) + actors.bg_manager.backgroundActor = null; + actors.bg_manager.destroy(); + + if (!panel_already_destroyed) { + actors.widgets.panel_box.remove_child(actors.widgets.background_group); + actors.widgets.background_group.destroy_all_children(); + actors.widgets.background_group.destroy(); + } + + let index = this.actors_list.indexOf(actors); + if (index >= 0) + this.actors_list.splice(index, 1); } disable() { @@ -678,21 +522,8 @@ export const PanelBlur = class PanelBlur { this.update_light_text_classname(true); - this.actors_list.forEach(actors => { - this.set_should_override_panel(actors, false); - this.effects_manager.remove(actors.effects.noise); - this.effects_manager.remove(actors.effects.color); - this.effects_manager.remove(actors.effects.blur); - try { - actors.widgets.panel_box.remove_child( - actors.widgets.background_parent - ); - } catch (e) { } - actors.widgets.background_parent?.destroy(); - }); - - this.destroy_blur_effects(); - + const immutable_actors_list = [...this.actors_list]; + immutable_actors_list.forEach(actors => this.destroy_blur(actors, false)); this.actors_list = []; this.connections.disconnect_all(); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js index 8241f0c..dcf05eb 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js @@ -1,41 +1,21 @@ -import Shell from 'gi://Shell'; -import Meta from 'gi://Meta'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import { Pipeline } from '../conveniences/pipeline.js'; export const ScreenshotBlur = class ScreenshotBlur { constructor(connections, settings, effects_manager) { this.connections = connections; - this.effects = []; this.settings = settings; + this.screenshot_background_managers = []; this.effects_manager = effects_manager; } enable() { this._log("blurring screenshot's window selector"); - // connect to every background change (even without changing image) - // FIXME this signal is fired very often, so we should find another one - // fired only when necessary (but that still catches all cases) - this.connections.connect( - Main.layoutManager._backgroundGroup, - 'notify', - _ => { - this._log("updated background for screenshot's window selector"); - this.update_backgrounds(); - } - ); - // connect to monitors change - this.connections.connect( - Main.layoutManager, - 'monitors-changed', - _ => { - if (Main.screenShield && !Main.screenShield.locked) { - this._log("changed monitors for screenshot's window selector"); - this.update_backgrounds(); - } - } + this.connections.connect(Main.layoutManager, 'monitors-changed', + _ => this.update_backgrounds() ); // update backgrounds when the component is enabled @@ -44,121 +24,78 @@ export const ScreenshotBlur = class ScreenshotBlur { update_backgrounds() { // remove every old background - this.remove(); - - // add new backgrounds + this.remove_background_actors(); + // create new backgrounds for the screenshot window selector for (let i = 0; i < Main.screenshotUI._windowSelectors.length; i++) { - const actor = Main.screenshotUI._windowSelectors[i]; - const monitor = Main.layoutManager.monitors[i]; + const window_selector = Main.screenshotUI._windowSelectors[i]; + const pipeline = new Pipeline( + this.effects_manager, + global.blur_my_shell._pipelines_manager, + this.settings.screenshot.PIPELINE + ); + pipeline.create_background_with_effects( + window_selector._monitorIndex, this.screenshot_background_managers, + window_selector, 'bms-screenshot-blurred-widget', false + ); - if (!monitor) - continue; + // prevent old `BackgroundActor` from being accessed, which creates a whole bug of logs + this.connections.connect(window_selector.get_parent(), 'destroy', _ => { + this.screenshot_background_managers.forEach(background_manager => { + if (background_manager.backgroundActor) { + let widget = background_manager.backgroundActor.get_parent(); + let parent = widget?.get_parent(); - const bg_actor = this.create_background_actor(monitor); - actor.insert_child_at_index(bg_actor, 0); - actor._blur_actor = bg_actor; + if (parent == window_selector) { + background_manager._bms_pipeline.destroy(); + parent.remove_child(widget); + } + } + background_manager.destroy(); + }); + + window_selector.get_children().forEach(child => { + if (child.get_name() == 'bms-screenshot-blurred-widget') + window_selector.remove_child(child); + }); + + let index = this.screenshot_background_managers.indexOf(window_selector); + this.screenshot_background_managers.splice(index, 1); + }); } } - create_background_actor(monitor) { - let bg_actor = new Meta.BackgroundActor({ - meta_display: global.display, - monitor: monitor.index + update_pipeline() { + this.screenshot_background_managers.forEach(background_manager => + background_manager._bms_pipeline.change_pipeline_to( + this.settings.screenshot.PIPELINE + ) + ); + } + + remove_background_actors() { + this.screenshot_background_managers.forEach(background_manager => { + background_manager._bms_pipeline.destroy(); + if (background_manager.backgroundActor) { + let widget = background_manager.backgroundActor.get_parent(); + widget?.get_parent()?.remove_child(widget); + } + background_manager.destroy(); }); - let background = Main.layoutManager._backgroundGroup.get_child_at_index( - Main.layoutManager.monitors.length - monitor.index - 1 + + Main.screenshotUI._windowSelectors.forEach(window_selector => + window_selector.get_children().forEach(child => { + if (child.get_name() == 'bms-screenshot-blurred-widget') + window_selector.remove_child(child); + }) ); - if (!background) { - this._warn("could not get background for screenshot's window selector"); - return bg_actor; - } - - bg_actor.content.set({ - background: background.get_content().background - }); - - let blur_effect = new Shell.BlurEffect({ - brightness: this.settings.screenshot.CUSTOMIZE - ? this.settings.screenshot.BRIGHTNESS - : this.settings.BRIGHTNESS, - radius: (this.settings.screenshot.CUSTOMIZE - ? this.settings.screenshot.SIGMA - : this.settings.SIGMA) * 2 * monitor.geometry_scale, - mode: Shell.BlurMode.ACTOR - }); - - // store the scale in the effect in order to retrieve it in set_sigma - blur_effect.scale = monitor.geometry_scale; - - let color_effect = this.effects_manager.new_color_effect({ - color: this.settings.screenshot.CUSTOMIZE - ? this.settings.screenshot.COLOR - : this.settings.COLOR - }, this.settings); - - let noise_effect = this.effects_manager.new_noise_effect({ - noise: this.settings.screenshot.CUSTOMIZE - ? this.settings.screenshot.NOISE_AMOUNT - : this.settings.NOISE_AMOUNT, - lightness: this.settings.screenshot.CUSTOMIZE - ? this.settings.screenshot.NOISE_LIGHTNESS - : this.settings.NOISE_LIGHTNESS - }, this.settings); - - bg_actor.add_effect(color_effect); - bg_actor.add_effect(noise_effect); - bg_actor.add_effect(blur_effect); - this.effects.push({ blur_effect, color_effect, noise_effect }); - - return bg_actor; - } - - set_sigma(s) { - this.effects.forEach(effect => { - effect.blur_effect.radius = s * 2 * effect.blur_effect; - }); - } - - set_brightness(b) { - this.effects.forEach(effect => { - effect.blur_effect.brightness = b; - }); - } - - set_color(c) { - this.effects.forEach(effect => { - effect.color_effect.color = c; - }); - } - - set_noise_amount(n) { - this.effects.forEach(effect => { - effect.noise_effect.noise = n; - }); - } - - set_noise_lightness(l) { - this.effects.forEach(effect => { - effect.noise_effect.lightness = l; - }); - } - - remove() { - Main.screenshotUI._windowSelectors.forEach(actor => { - if (actor._blur_actor) { - actor.remove_child(actor._blur_actor); - actor._blur_actor.destroy(); - delete actor._blur_actor; - } - }); - this.effects = []; + this.screenshot_background_managers = []; } disable() { this._log("removing blur from screenshot's window selector"); - this.remove(); + this.remove_background_actors(); this.connections.disconnect_all(); } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js index 2ba50b4..6ab0644 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js @@ -1,15 +1,16 @@ -import Shell from 'gi://Shell'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { PaintSignals } from '../effects/paint_signals.js'; +import { PaintSignals } from '../conveniences/paint_signals.js'; +import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; export const WindowListBlur = class WindowListBlur { - constructor(connections, settings, _) { + constructor(connections, settings, effects_manager) { this.connections = connections; this.settings = settings; this.paint_signals = new PaintSignals(connections); - this.effects = []; + this.effects_manager = effects_manager; + this.pipelines = []; } enable() { @@ -37,36 +38,35 @@ export const WindowListBlur = class WindowListBlur { }); } - try_blur(child) { + try_blur(actor) { if ( - child.constructor.name === "WindowList" && - child.style !== "background:transparent;" + actor.constructor.name === "WindowList" && + actor.style !== "background:transparent;" ) { this._log("found window list to blur"); - let blur_effect = new Shell.BlurEffect({ - name: 'window-list-blur', - radius: (this.settings.window_list.CUSTOMIZE - ? this.settings.window_list.SIGMA - : this.settings.SIGMA) * 2, - brightness: this.settings.window_list.CUSTOMIZE - ? this.settings.window_list.BRIGHTNESS - : this.settings.BRIGHTNESS, - mode: Shell.BlurMode.BACKGROUND - }); + const pipeline = new DummyPipeline( + this.effects_manager, this.settings.window_list + ); + pipeline.attach_effect_to_actor(actor); + this.pipelines.push(pipeline); - child.set_style("background:transparent;"); - child.add_effect(blur_effect); - this.effects.push({ blur_effect }); + actor.set_style("background:transparent;"); - child._windowList.get_children().forEach( - window => this.blur_window_button(window) + actor._windowList.get_children().forEach( + window => this.style_window_button(window) ); this.connections.connect( - child._windowList, + actor._windowList, 'child-added', - (_, window) => this.blur_window_button(window) + (_, window) => this.style_window_button(window) + ); + + this.connections.connect( + actor, + 'destroy', + _ => this.destroy_blur(pipeline, true) ); @@ -83,75 +83,61 @@ export const WindowListBlur = class WindowListBlur { if (this.settings.HACKS_LEVEL === 1) { this._log("window list hack level 1"); - this.paint_signals.connect(child, blur_effect); - - } else if (this.settings.HACKS_LEVEL === 2) { - this._log("window list hack level 2"); - - this.paint_signals.connect(child, blur_effect); + this.paint_signals.disconnect_all_for_actor(actor); + this.paint_signals.connect(actor, pipeline.effect); } else { - this.paint_signals.disconnect_all(); + this.paint_signals.disconnect_all_for_actor(actor); } } } - blur_window_button(window) { + style_window_button(window) { window.get_child_at_index(0).set_style( "box-shadow:none; background-color:rgba(0,0,0,0.2); border-radius:5px;" ); } - try_remove_blur(child) { - if ( - child.constructor.name === "WindowList" && - child.style === "background:transparent;" - ) { - child.style = null; - child.remove_effect_by_name('window-list-blur'); + // IMPORTANT: do never call this in a mutable `this.pipelines.forEach` + destroy_blur(pipeline, actor_destroyed = false) { + if (!actor_destroyed) { + this.remove_style(pipeline.actor); + this.paint_signals.disconnect_all_for_actor(pipeline.actor); + } - child._windowList.get_children().forEach( + pipeline.destroy(); + + let index = this.pipelines.indexOf(pipeline); + if (index >= 0) + this.pipelines.splice(pipeline, 1); + } + + remove_style(actor) { + if ( + actor.constructor.name === "WindowList" && + actor.style === "background:transparent;" + ) { + actor.style = null; + actor._windowList.get_children().forEach( child => child.get_child_at_index(0).set_style(null) ); } } - set_sigma(s) { - this.effects.forEach(effect => { - effect.blur_effect.radius = s * 2; - }); - } - - set_brightness(b) { - this.effects.forEach(effect => { - effect.blur_effect.brightness = b; - }); - } - - // not implemented for dynamic blur - set_color(c) { } - set_noise_amount(n) { } - set_noise_lightness(l) { } - hide() { - this.set_sigma(0); + this.pipelines.forEach(pipeline => pipeline.effect?.set_enabled(false)); } show() { - this.set_sigma( - this.settings.window_list.CUSTOMIZE - ? this.settings.window_list.SIGMA - : this.settings.SIGMA - ); + this.pipelines.forEach(pipeline => pipeline.effect?.set_enabled(true)); } disable() { this._log("removing blur from window list"); - Main.layoutManager.uiGroup.get_children().forEach( - child => this.try_remove_blur(child) - ); + const immutable_pipelines_list = [...this.pipelines]; + immutable_pipelines_list.forEach(pipeline => this.destroy_blur(pipeline)); - this.effects = []; + this.pipelines = []; this.connections.disconnect_all(); } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js index c15ef48..0583db3 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js @@ -53,6 +53,7 @@ export const Connections = class Connections { this.buffer.splice(index, 1); } }); + infos.destroy_id = destroy_id; } this.buffer.push(infos); @@ -66,10 +67,12 @@ export const Connections = class Connections { ); // remove each of them - actor_connections.forEach((connection) => { + actor_connections.forEach(connection => { // disconnect try { connection.actor.disconnect(connection.id); + if ('destroy_id' in connection) + connection.actor.disconnect(connection.destroy_id); } catch (e) { this._warn(`error removing connection: ${e}; continuing`); } @@ -82,10 +85,12 @@ export const Connections = class Connections { /// Disconnect every connection for each actor. disconnect_all() { - this.buffer.forEach((connection) => { + this.buffer.forEach(connection => { // disconnect try { connection.actor.disconnect(connection.id); + if ('destroy_id' in connection) + connection.actor.disconnect(connection.destroy_id); } catch (e) { this._warn(`error removing connection: ${e}; continuing`); } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js new file mode 100644 index 0000000..544d68c --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js @@ -0,0 +1,112 @@ +import St from 'gi://St'; +import Clutter from 'gi://Clutter'; + +/// A dummy `Pipeline`, for dynamic blur only. +/// Instead of a pipeline id, we take the settings of the component we want to blur. +export const DummyPipeline = class DummyPipeline { + constructor(effects_manager, settings, actor = null) { + this.effects_manager = effects_manager; + this.settings = settings; + this.effect = null; + this.attach_effect_to_actor(actor); + } + + create_background_with_effect( + background_group, + widget_name + ) { + // create the new actor + this.actor = new St.Widget({ name: widget_name }); + + this.attach_effect_to_actor(this.actor); + + // a dummy `BackgroundManager`, just to access the pipeline easily + let bg_manager = new Clutter.Actor; + bg_manager.backgroundActor = this.actor; + bg_manager._bms_pipeline = this; + + background_group.insert_child_at_index(this.actor, 0); + + return [this.actor, bg_manager]; + }; + + attach_effect_to_actor(actor) { + // set the actor + if (actor) + this.actor = actor; + else { + this.remove_pipeline_from_actor(); + return; + } + + // build the new effect to be added + this.build_effect({ + unscaled_radius: 2 * this.settings.SIGMA, + brightness: this.settings.BRIGHTNESS, + }); + + this.actor_destroy_id = this.actor.connect( + "destroy", () => this.remove_pipeline_from_actor() + ); + + // add the effect to the actor + if (this.actor) + this.actor.add_effect(this.effect); + else + this._warn(`could not add effect to actor, actor does not exist anymore`); + } + + remove_pipeline_from_actor() { + this.remove_effect(); + if (this.actor && this.actor_destroy_id) + this.actor.disconnect(this.actor_destroy_id); + this.actor_destroy_id = null; + this.actor = null; + } + + build_effect(params) { + // create the effect + this.effect = this.effects_manager.new_native_dynamic_gaussian_blur_effect(params); + + // connect to settings changes, using the true gsettings object + this._sigma_changed_id = this.settings.settings.connect( + 'changed::sigma', () => this.effect.unscaled_radius = 2 * this.settings.SIGMA + ); + this._brightness_changed_id = this.settings.settings.connect( + 'changed::brightness', () => this.effect.brightness = this.settings.BRIGHTNESS + ); + } + + repaint_effect() { + this.effect?.queue_repaint(); + } + + /// Remove every effect from the actor it is attached to. Please note that they are not + /// destroyed, but rather stored (thanks to the `EffectManager` class) to be reused later. + remove_effect() { + if (this.effect) + this.effects_manager.remove(this.effect); + this.effect = null; + + if (this._sigma_changed_id) + this.settings.settings.disconnect(this._sigma_changed_id); + if (this._brightness_changed_id) + this.settings.settings.disconnect(this._brightness_changed_id); + delete this._sigma_changed_id; + delete this._brightness_changed_id; + } + + /// Do nothing for this dummy pipeline. + /// Note: exposed to public API. + change_pipeline_to() { return; } + + /// Note: exposed to public API. + destroy() { + this.remove_effect(); + this.remove_pipeline_from_actor(); + } + + _warn(str) { + console.warn(`[Blur my Shell > dummy pip] ${str}`); + } +}; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js index 7ef7b22..947d535 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js @@ -1,21 +1,41 @@ -import { ColorEffect } from '../effects/color_effect.js'; -import { NoiseEffect } from '../effects/noise_effect.js'; - +import { get_supported_effects } from '../effects/effects.js'; /// An object to manage effects (by not destroying them all the time) export const EffectsManager = class EffectsManager { constructor(connections) { this.connections = connections; this.used = []; - this.color_effects = []; - this.noise_effects = []; + this.SUPPORTED_EFFECTS = get_supported_effects(); + + Object.keys(this.SUPPORTED_EFFECTS).forEach(effect_name => { + // init the arrays containing each unused effect + this[effect_name + '_effects'] = []; + + // init the functions for each effect + this['new_' + effect_name + '_effect'] = function (params) { + let effect; + if (this[effect_name + '_effects'].length > 0) { + effect = this[effect_name + '_effects'].splice(0, 1)[0]; + effect.set({ + ...this.SUPPORTED_EFFECTS[effect_name].class.default_params, ...params + }); + } else + effect = new this.SUPPORTED_EFFECTS[effect_name].class({ + ...this.SUPPORTED_EFFECTS[effect_name].class.default_params, ...params + }); + + this.used.push(effect); + this.connect_to_destroy(effect); + return effect; + }; + }); } connect_to_destroy(effect) { effect.old_actor = effect.get_actor(); if (effect.old_actor) effect.old_actor_id = effect.old_actor.connect('destroy', _ => { - this.remove(effect); + this.remove(effect, true); }); this.connections.connect(effect, 'notify::actor', _ => { @@ -24,42 +44,22 @@ export const EffectsManager = class EffectsManager { if (effect.old_actor && actor != effect.old_actor) effect.old_actor.disconnect(effect.old_actor_id); - if (actor) { + if (actor && actor != effect.old_actor) { effect.old_actor_id = actor.connect('destroy', _ => { - this.remove(effect); + this.remove(effect, true); }); } }); } - new_color_effect(params, settings) { - let effect; - if (this.color_effects.length > 0) { - effect = this.color_effects.splice(0, 1)[0]; - effect.set(params); - } else - effect = new ColorEffect(params, settings); - - this.used.push(effect); - this.connect_to_destroy(effect); - return effect; - } - - new_noise_effect(params, settings) { - let effect; - if (this.noise_effects.length > 0) { - effect = this.noise_effects.splice(0, 1)[0]; - effect.set(params); - } else - effect = new NoiseEffect(params, settings); - - this.used.push(effect); - this.connect_to_destroy(effect); - return effect; - } - - remove(effect) { - effect.get_actor()?.remove_effect(effect); + // IMPORTANT: do never call this in a mutable `this.used.forEach` + remove(effect, actor_already_destroyed = false) { + if (!actor_already_destroyed) + try { + effect.get_actor()?.remove_effect(effect); + } catch (e) { + this._warn(`could not remove the effect, continuing: ${e}`); + } if (effect.old_actor) effect.old_actor.disconnect(effect.old_actor_id); delete effect.old_actor; @@ -69,21 +69,22 @@ export const EffectsManager = class EffectsManager { if (index >= 0) { this.used.splice(index, 1); - if (effect instanceof ColorEffect) - this.color_effects.push(effect); - else if (effect instanceof NoiseEffect) - this.noise_effects.push(effect); + Object.keys(this.SUPPORTED_EFFECTS).forEach(effect_name => { + if (effect instanceof this.SUPPORTED_EFFECTS[effect_name].class) + this[effect_name + '_effects'].push(effect); + }); } } destroy_all() { - this.used.forEach(effect => { this.remove(effect); }); - [ - this.used, - this.color_effects, - this.noise_effects - ].forEach(array => { - array.splice(0, array.length); + const immutable_used_list = [...this.used]; + immutable_used_list.forEach(effect => this.remove(effect)); + Object.keys(this.SUPPORTED_EFFECTS).forEach(effect_name => { + this[effect_name + '_effects'].splice(0, this[effect_name + '_effects'].length); }); } + + _warn(str) { + console.warn(`[Blur my Shell > effects mng] ${str}`); + } }; diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js index 71a357c..1e1dba8 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js @@ -1,15 +1,10 @@ import { Type } from './settings.js'; // This lists the preferences keys -export const Keys = [ +export const KEYS = [ { component: "general", schemas: [ - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, - { type: Type.B, name: "color-and-noise" }, + { type: Type.PIPELINES, name: "pipelines" }, { type: Type.I, name: "hacks-level" }, { type: Type.B, name: "debug" }, ] @@ -17,37 +12,25 @@ export const Keys = [ { component: "overview", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, + { type: Type.S, name: "pipeline" }, { type: Type.I, name: "style-components" }, ] }, { component: "appfolder", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, { type: Type.I, name: "sigma" }, { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, { type: Type.I, name: "style-dialogs" }, ] }, { component: "panel", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, + { type: Type.B, name: "static-blur" }, + { type: Type.S, name: "pipeline" }, { type: Type.I, name: "sigma" }, { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, - { type: Type.B, name: "static-blur" }, { type: Type.B, name: "unblur-in-overview" }, { type: Type.B, name: "force-light-text" }, { type: Type.B, name: "override-background" }, @@ -58,29 +41,22 @@ export const Keys = [ { component: "dash-to-dock", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, + { type: Type.B, name: "static-blur" }, + { type: Type.S, name: "pipeline" }, { type: Type.I, name: "sigma" }, { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, - { type: Type.B, name: "static-blur" }, { type: Type.B, name: "unblur-in-overview" }, { type: Type.B, name: "override-background" }, { type: Type.I, name: "style-dash-to-dock" }, - { type: Type.I, name: "corner-radius" }, ] }, { component: "applications", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, { type: Type.I, name: "sigma" }, { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, { type: Type.I, name: "opacity" }, + { type: Type.B, name: "dynamic-opacity" }, { type: Type.B, name: "blur-on-overview" }, { type: Type.B, name: "enable-all" }, { type: Type.AS, name: "whitelist" }, @@ -90,34 +66,27 @@ export const Keys = [ { component: "lockscreen", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, + { type: Type.S, name: "pipeline" }, ] }, { component: "window-list", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, + { type: Type.S, name: "pipeline" }, { type: Type.I, name: "sigma" }, { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "coverflow-alt-tab", schemas: [ + { type: Type.B, name: "blur" }, + { type: Type.S, name: "pipeline" }, ] }, { component: "screenshot", schemas: [ { type: Type.B, name: "blur" }, - { type: Type.B, name: "customize" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.C, name: "color" }, - { type: Type.D, name: "noise-amount" }, - { type: Type.D, name: "noise-lightness" }, + { type: Type.S, name: "pipeline" }, ] }, { @@ -130,4 +99,90 @@ export const Keys = [ { type: Type.B, name: "blur-original-panel" }, ] }, +]; + + +// This lists the deprecated preferences keys +export const DEPRECATED_KEYS = [ + { + component: "general", schemas: [ + { type: Type.I, name: "sigma" }, + { type: Type.D, name: "brightness" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + { type: Type.B, name: "color-and-noise" }, + ] + }, + { + component: "overview", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.I, name: "sigma" }, + { type: Type.D, name: "brightness" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "appfolder", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "panel", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "dash-to-dock", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + { type: Type.I, name: "corner-radius" }, + ] + }, + { + component: "applications", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "lockscreen", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.I, name: "sigma" }, + { type: Type.D, name: "brightness" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "window-list", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, + { + component: "screenshot", schemas: [ + { type: Type.B, name: "customize" }, + { type: Type.I, name: "sigma" }, + { type: Type.D, name: "brightness" }, + { type: Type.C, name: "color" }, + { type: Type.D, name: "noise-amount" }, + { type: Type.D, name: "noise-lightness" }, + ] + }, ]; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/paint_signals.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js similarity index 92% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/paint_signals.js rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js index 84a895b..5fbfee4 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/paint_signals.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js @@ -37,7 +37,8 @@ export const PaintSignals = class PaintSignals { ) ) this.connections.connect(actor, 'destroy', () => { - this.buffer.forEach(infos => { + const immutable_buffer = [...this.buffer]; + immutable_buffer.forEach(infos => { if (infos.actor === actor) { // remove from buffer let index = this.buffer.indexOf(infos); @@ -50,7 +51,8 @@ export const PaintSignals = class PaintSignals { } disconnect_all_for_actor(actor) { - this.buffer.forEach(infos => { + const immutable_buffer = [...this.buffer]; + immutable_buffer.forEach(infos => { if (infos.actor === actor) { this.connections.disconnect_all_for(infos.paint_effect); infos.actor.remove_effect(infos.paint_effect); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js new file mode 100644 index 0000000..84b1d7a --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js @@ -0,0 +1,223 @@ +import St from 'gi://St'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as Background from 'resource:///org/gnome/shell/ui/background.js'; + +/// A `Pipeline` object is a handy way to manage the effects attached to an actor. It only manages +/// one actor at a time (so blurring multiple widgets will need multiple `Pipeline`), and is +/// linked to a `pipeline_id` that has been (hopefully) defined in the settings. +/// +/// It communicates with the settings through the `PipelinesManager` object, and receives different +/// signals (with `pipeline_id` being an unique string): +/// - `'pipeline_id'::pipeline-updated`, handing a new pipeline descriptor object, when the pipeline +/// has been changed enough that it needs to rebuild the effects configuration +/// - `'pipeline_id'::pipeline-destroyed`, when the pipeline has been destroyed; thus making the +/// `Pipeline` change its id to `pipeline_default` +/// +/// And each effect, with an unique `id`, is connected to the `PipelinesManager` for the signals: +/// - `'pipeline_id'::effect-'id'-key-removed`, handing the key that was removed +/// - `'pipeline_id'::effect-'id'-key-updated`, handing the key that was changed and its new value +/// - `'pipeline_id'::effect-'id'-key-added`, handing the key that was added and its value +export const Pipeline = class Pipeline { + constructor(effects_manager, pipelines_manager, pipeline_id, actor = null) { + this.effects_manager = effects_manager; + this.pipelines_manager = pipelines_manager; + this.effects = []; + this.set_pipeline_id(pipeline_id); + this.attach_pipeline_to_actor(actor); + } + + /// Create a background linked to the monitor with index `monitor_index`, with a + /// `BackgroundManager` that is appended to the list `background_managers`. The background actor + /// will be given the name `widget_name` and inserted into the given `background_group`. + /// If `use_absolute_position` is false, then the position used is at (0,0); useful when the + /// positioning is relative. + /// Note: exposed to public API. + create_background_with_effects( + monitor_index, + background_managers, + background_group, + widget_name, + use_absolute_position = true + ) { + let monitor = Main.layoutManager.monitors[monitor_index]; + + // create the new actor + this.actor = new St.Widget({ + name: widget_name, + x: use_absolute_position ? monitor.x : 0, + y: .5 + (use_absolute_position ? monitor.y : 0), // add 1 to correct z-position + z_position: 1, // seems to fix the multi-monitor glitch + width: monitor.width, + height: monitor.height + }); + + // remove the effects, wether or not we attach the pipeline to the actor: if they are fired + // while the actor has changed, this could go bad + this.remove_all_effects(); + if (this.pipeline_id) + this.attach_pipeline_to_actor(this.actor); + + let bg_manager = new Background.BackgroundManager({ + container: this.actor, + monitorIndex: monitor_index, + controlPosition: false, + }); + bg_manager._bms_pipeline = this; + + background_managers.push(bg_manager); + background_group.insert_child_at_index(this.actor, 0); + + return this.actor; + }; + + /// Set the pipeline id, correctly connecting the `Pipeline` object to listen the pipelines + /// manager for pipeline-wide changes. This does not update the effects in consequence, call + /// `change_pipeline_to` instead if you want to reconstruct the effects too. + set_pipeline_id(pipeline_id) { + // disconnect ancient signals + this.remove_connections(); + + // change the id + this.pipeline_id = pipeline_id; + + // connect to settings changes + this._pipeline_changed_id = this.pipelines_manager.connect( + this.pipeline_id + '::pipeline-updated', + (_, new_pipeline) => this.update_effects_from_pipeline(new_pipeline) + ); + this._pipeline_destroyed_id = this.pipelines_manager.connect( + this.pipeline_id + '::pipeline-destroyed', + _ => this.change_pipeline_to("pipeline_default") + ); + } + + /// Disconnect the signals for the pipeline changes. Please note that the signals related to the + /// effects are stored with them and removed with `remove_all_effects`. + remove_connections() { + if (this._pipeline_changed_id) + this.pipelines_manager.disconnect(this._pipeline_changed_id); + if (this._pipeline_destroyed_id) + this.pipelines_manager.disconnect(this._pipeline_destroyed_id); + this._pipeline_changed_id = null; + this._pipeline_destroyed_id = null; + } + + /// Attach a Pipeline object with `pipeline_id` already set to an actor. + attach_pipeline_to_actor(actor) { + // set the actor + if (actor) + this.actor = actor; + else { + this.remove_pipeline_from_actor(); + return; + } + + // attach the pipeline + let pipeline = this.pipelines_manager.pipelines[this.pipeline_id]; + if (!pipeline) { + this._warn(`could not attach pipeline to actor, pipeline "${this.pipeline_id}" not found`); + // do not recurse... + if ("pipeline_default" in this.pipelines_manager.pipelines) { + this.set_pipeline_id("pipeline_default"); + pipeline = this.pipelines_manager.pipelines["pipeline_default"]; + } else + return; + } + + this.actor_destroy_id = this.actor.connect( + "destroy", () => this.remove_pipeline_from_actor() + ); + + // update the effects + this.update_effects_from_pipeline(pipeline); + } + + remove_pipeline_from_actor() { + this.remove_all_effects(); + if (this.actor && this.actor_destroy_id) + this.actor.disconnect(this.actor_destroy_id); + this.actor_destroy_id = null; + this.actor = null; + } + + /// Update the effects from the given pipeline object, the hard way. + update_effects_from_pipeline(pipeline) { + // remove all effects + this.remove_all_effects(); + + // build the new effects to be added + pipeline.effects.forEach(effect => { + if ('new_' + effect.type + '_effect' in this.effects_manager) + this.build_effect(effect); + else + this._warn(`could not add effect to actor, effect "${effect.type}" not found`); + }); + this.effects.reverse(); + + // add the effects to the actor + if (this.actor) + this.effects.forEach(effect => this.actor.add_effect(effect)); + else + this._warn(`could not add effect to actor, actor does not exist anymore`); + } + + /// Given an `effect_infos` object containing the effect type, id and params, build an effect + /// and append it to the effects list + build_effect(effect_infos) { + let effect = this.effects_manager['new_' + effect_infos.type + '_effect'](effect_infos.params); + this.effects.push(effect); + + // connect to settings changes + effect._effect_key_removed_id = this.pipelines_manager.connect( + this.pipeline_id + '::effect-' + effect_infos.id + '-key-removed', + (_, key) => effect[key] = effect.constructor.default_params[key] + ); + effect._effect_key_updated_id = this.pipelines_manager.connect( + this.pipeline_id + '::effect-' + effect_infos.id + '-key-updated', + (_, key, value) => effect[key] = value + ); + effect._effect_key_added_id = this.pipelines_manager.connect( + this.pipeline_id + '::effect-' + effect_infos.id + '-key-added', + (_, key, value) => effect[key] = value + ); + } + + /// Remove every effect from the actor it is attached to. Please note that they are not + /// destroyed, but rather stored (thanks to the `EffectManager` class) to be reused later. + remove_all_effects() { + this.effects.forEach(effect => { + this.effects_manager.remove(effect); + [ + effect._effect_key_removed_id, + effect._effect_key_updated_id, + effect._effect_key_added_id + ].forEach( + id => { if (id) this.pipelines_manager.disconnect(id); } + ); + delete effect._effect_key_removed_id; + delete effect._effect_key_updated_id; + delete effect._effect_key_added_id; + }); + this.effects = []; + } + + /// Change the pipeline id, and update the effects according to this change. + /// Note: exposed to public API. + change_pipeline_to(pipeline_id) { + this.set_pipeline_id(pipeline_id); + this.attach_pipeline_to_actor(this.actor); + } + + /// Resets the `Pipeline` object to a sane state, removing every effect and signal. + /// Note: exposed to public API. + destroy() { + this.remove_all_effects(); + this.remove_connections(); + this.remove_pipeline_from_actor(); + this.pipeline_id = null; + } + + _warn(str) { + console.warn(`[Blur my Shell > pipeline] ${str}`); + } +}; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js new file mode 100644 index 0000000..0fdfe9e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js @@ -0,0 +1,168 @@ +const Signals = imports.signals; + +/// The `PipelinesManager` object permits to store the list of pipelines and their effects in +/// memory. It is meant to *always* be in sync with the `org.gnome.shell.extensions.blur-my-shell`'s +/// `pipelines` gschema. However, we do not want to re-create every effect each time this schema is +/// changed, so the pipelines manager handles it, and dispatches the updates with targeted signals. +/// +/// It is only connected to ONE signal (the pipelines schema being changed), and emits numerous +/// which are connected to by both the different `Pipeline` objects in the extension, and by the +/// different pages of the extension preferences. +/// It emits three different types of signals: +/// +/// - general changes to the pipelines list, connected to by the extension preferences: +/// - `pipeline-list-changed`, when the list of pipelines has changed (by creation or deletion) +/// - `pipeline-names-changed`, when the name of a pipeline is changed +/// +/// - signals that are targeted towards a given pipeline, with `pipeline_id` being its unique id: +/// - `'pipeline_id'::pipeline-updated`, handing a new pipeline descriptor object, when the +/// pipeline has been changed quite a bit (added/destroyed/reordered the effects) +/// - `'pipeline_id'::pipeline-destroyed`, when the pipeline has been destroyed +/// - `'pipeline_id'::pipeline-renamed`, handing the new name, when the pipeline has been +/// renamed, which is only important for the preferences +/// +/// - signals that are targeted towards a given effect, with `effect_id` being its unique id, and +/// `pipeline_id` the unique id of the pipeline it is attached to: +/// - `'pipeline_id'::effect-'effect_id'-key-removed`, handing the key that was removed +/// - `'pipeline_id'::effect-'effect_id'-key-updated`, handing the key that was changed and its +/// new value +/// - `'pipeline_id'::effect-'effect_id'-key-added`, handing the key that was added and its +/// value +export class PipelinesManager { + constructor(settings) { + this.settings = settings; + this.pipelines = this.settings.PIPELINES; + this.settings.PIPELINES_changed(_ => this.on_pipeline_update()); + } + + create_pipeline(name, effects = []) { + // select a random id for the pipeline + let id = "pipeline_" + ("" + Math.random()).slice(2, 16); + // add a random ID for each effect, to help tracking them + effects.forEach(effect => effect.id = "effect_" + ("" + Math.random()).slice(2, 16)); + + this.pipelines[id] = { name, effects }; + this.settings.PIPELINES = this.pipelines; + this._emit('pipeline-created', id, this.pipelines[id]); + this._emit('pipeline-list-changed'); + return id; + } + + duplicate_pipeline(id) { + if (!(id in this.pipelines)) { + this._warn(`could not duplicate pipeline, id ${id} does not exist`); + return; + } + const pipeline = this.pipelines[id]; + this.create_pipeline(pipeline.name + " - duplicate", [...pipeline.effects]); + this.settings.PIPELINES = this.pipelines; + } + + delete_pipeline(id) { + if (!(id in this.pipelines)) { + this._warn(`could not delete pipeline, id ${id} does not exist`); + return; + } + if (id == "pipeline_default") { + this._warn(`could not delete pipeline "pipeline_default" as it is immutable`); + return; + } + delete this.pipelines[id]; + this.settings.PIPELINES = this.pipelines; + this._emit(id + '::pipeline-destroyed'); + this._emit('pipeline-list-changed'); + } + + update_pipeline_effects(id, effects, emit_update_signal = true) { + if (!(id in this.pipelines)) { + this._warn(`could not update pipeline effects, id ${id} does not exist`); + return; + } + this.pipelines[id].effects = [...effects]; + this.settings.PIPELINES = this.pipelines; + if (emit_update_signal) + this._emit(id + '::pipeline-updated'); + } + + rename_pipeline(id, name) { + if (!(id in this.pipelines)) { + this._warn(`could not rename pipeline, id ${id} does not exist`); + return; + } + this.pipelines[id].name = name.slice(); + this.settings.PIPELINES = this.pipelines; + this._emit(id + '::pipeline-renamed', name); + this._emit('pipeline-names-changed'); + } + + on_pipeline_update() { + const old_pipelines = this.pipelines; + this.pipelines = this.settings.PIPELINES; + + for (var pipeline_id in old_pipelines) { + // if we find a pipeline that does not exist anymore, signal it + if (!(pipeline_id in this.pipelines)) { + this._emit(pipeline_id + '::pipeline-destroyed'); + continue; + } + + const old_pipeline = old_pipelines[pipeline_id]; + const new_pipeline = this.pipelines[pipeline_id]; + + // verify if both pipelines have effects in the same order + // if they have, then check for their parameters + if ( + old_pipeline.effects.length == new_pipeline.effects.length && + old_pipeline.effects.every((effect, i) => effect.id === new_pipeline.effects[i].id) + ) { + for (let i = 0; i < old_pipeline.effects.length; i++) { + const old_effect = old_pipeline.effects[i]; + const new_effect = new_pipeline.effects[i]; + const id = old_effect.id; + for (let key in old_effect.params) { + // if a key was removed, we emit to tell the effect to use the default value + if (!(key in new_effect.params)) + this._emit( + pipeline_id + '::effect-' + id + '-key-removed', key + ); + // if a key was updated, we emit to tell the effect to change its value + else if (old_effect.params[key] != new_effect.params[key]) + this._emit( + pipeline_id + '::effect-' + id + '-key-updated', key, new_effect.params[key] + ); + } + for (let key in new_effect.params) { + // if a key was added, we emit to tell the effect the key and its value + if (!(key in old_effect.params)) + this._emit( + pipeline_id + '::effect-' + id + '-key-added', key, new_effect.params[key] + ); + } + } + } + // if either the order has changed, or there are new effects, then rebuild it + else + this._emit(pipeline_id + '::pipeline-updated', new_pipeline); + } + } + + destroy() { + this.settings.PIPELINES_disconnect(); + } + + _emit(signal, ...args) { + this.emit(signal, ...args); + this._log(`signal: '${signal}', arguments: ${args}`); + } + + _log(str) { + if (this.settings.DEBUG) + console.log(`[Blur my Shell > pipelines] ${str}`); + } + + _warn(str) { + console.warn(`[Blur my Shell > pipelines] ${str}`); + } +} + +Signals.addSignalMethods(PipelinesManager.prototype); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js index d2bef17..53f8497 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js @@ -1,5 +1,4 @@ import GLib from 'gi://GLib'; - const Signals = imports.signals; /// An enum non-extensively describing the type of gsettings key. @@ -9,7 +8,8 @@ export const Type = { D: 'Double', S: 'String', C: 'Color', - AS: 'StringArray' + AS: 'StringArray', + PIPELINES: 'Pipelines' }; /// An object to get and manage the gsettings preferences. @@ -118,20 +118,197 @@ export const Settings = class Settings { } }); break; + + case Type.PIPELINES: + Object.defineProperty(component, property_name, { + get() { + let pips = component_settings.get_value(key.name).deep_unpack(); + Object.keys(pips).forEach(pipeline_id => { + let pipeline = pips[pipeline_id]; + + if (!('name' in pipeline)) { + this._warn('impossible to get pipelines, pipeline has not name, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + let name = pipeline.name.deep_unpack(); + if (typeof name !== 'string') { + this._warn('impossible to get pipelines, pipeline name is not a string, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + + if (!('effects' in pipeline)) { + this._warn('impossible to get pipelines, pipeline has not effects, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + let effects = pipeline.effects.deep_unpack(); + if (!Array.isArray(effects)) { + this._warn('impossible to get pipelines, pipeline effects is not an array, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + + effects = effects.map(effect => effect.deep_unpack()); + effects.forEach(effect => { + if (!('type' in effect)) { + this._warn('impossible to get pipelines, effect has not type, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + let type = effect.type.deep_unpack(); + if (typeof type !== 'string') { + this._warn('impossible to get pipelines, effect type is not a string, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + + if (!('id' in effect)) { + this._warn('impossible to get pipelines, effect has not id, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + let id = effect.id.deep_unpack(); + if (typeof id !== 'string') { + this._warn('impossible to get pipelines, effect id is not a string, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + + let params = {}; + if ('params' in effect) + params = effect.params.deep_unpack(); + if (!(params && typeof params === 'object' && params.constructor === Object)) { + this._warn('impossible to get pipelines, effect params is not an object, resetting'); + component[property_name + '_reset'](); + return component[property_name]; + } + Object.keys(params).forEach(param_key => { + params[param_key] = params[param_key].deep_unpack(); + }); + + effect.type = type; + effect.id = id; + effect.params = params; + }); + pipeline.name = name; + pipeline.effects = effects; + }); + return pips; + }, + set(pips) { + let pipelines = {}; + Object.keys(pips).forEach(pipeline_id => { + let pipeline = pips[pipeline_id]; + if (!(pipeline && typeof pipeline === 'object' && pipeline.constructor === Object)) { + this._warn('impossible to set pipelines, pipeline is not an object'); + return; + } + + if (!('name' in pipeline)) { + this._warn('impossible to set pipelines, pipeline has no name'); + return; + } + if (typeof pipeline.name !== 'string') { + this._warn('impossible to set pipelines, pipeline name is not a string'); + return; + } + + if (!('effects' in pipeline)) { + this._warn('impossible to set pipelines, pipeline has no effect'); + return; + } + if (!Array.isArray(pipeline.effects)) { + this._warn('impossible to set pipelines, effects is not an array'); + return; + } + + let gvariant_effects = []; + pipeline.effects.forEach(effect => { + if (!(effect instanceof Object)) { + this._warn('impossible to set pipelines, effect is not an object'); + return; + } + + if (!('type' in effect)) { + this._warn('impossible to set pipelines, effect has not type'); + return; + } + if (typeof effect.type !== 'string') { + this._warn('impossible to set pipelines, effect type is not a string'); + return; + } + + if (!('id' in effect)) { + this._warn('impossible to set pipelines, effect has not id'); + return; + } + if (typeof effect.id !== 'string') { + this._warn('impossible to set pipelines, effect id is not a string'); + return; + } + + let params = {}; + if ('params' in effect) { + params = effect.params; + } + let gvariant_params = {}; + Object.keys(params).forEach(param_key => { + let param = params[param_key]; + if (typeof param === 'boolean') + gvariant_params[param_key] = GLib.Variant.new_boolean(param); + else if (typeof param === 'number') { + if (Number.isInteger(param)) + gvariant_params[param_key] = GLib.Variant.new_int32(param); + else + gvariant_params[param_key] = GLib.Variant.new_double(param); + } else if (typeof param === 'string') + gvariant_params[param_key] = GLib.Variant.new_string(param); + else if (Array.isArray(param) && param.length == 4) + gvariant_params[param_key] = new GLib.Variant("(dddd)", param); + else + this._warn('impossible to set pipeline, effect parameter type is unknown'); + }); + + gvariant_effects.push( + new GLib.Variant("a{sv}", { + type: GLib.Variant.new_string(effect.type), + id: GLib.Variant.new_string(effect.id), + params: new GLib.Variant("a{sv}", gvariant_params) + }) + ); + }); + + pipelines[pipeline_id] = { + name: GLib.Variant.new_string(pipeline.name), + effects: new GLib.Variant("av", gvariant_effects) + }; + }); + let val = new GLib.Variant("a{sa{sv}}", pipelines); + component_settings.set_value(key.name, val); + } + }); + break; } + component[property_name + '_reset'] = function () { return component_settings.reset(key.name); }; + component[property_name + '_signal_ids'] = []; component[property_name + '_changed'] = function (cb) { - return component_settings.connect('changed::' + key.name, cb); + component[property_name + '_signal_ids'].push( + component_settings.connect('changed::' + key.name, cb) + ); }; component[property_name + '_disconnect'] = function () { - return component_settings.disconnect.apply( - component_settings, arguments + component[property_name + '_signal_ids'].forEach( + id => component_settings.disconnect(id) ); + component[property_name + '_signal_ids'] = []; }; }); }); @@ -177,6 +354,10 @@ export const Settings = class Settings { }); }); } + + _warn(str) { + console.warn(`[Blur my Shell > settings] ${str}`); + } }; Signals.addSignalMethods(Settings.prototype); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js new file mode 100644 index 0000000..2affbc1 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js @@ -0,0 +1,40 @@ +import { Settings } from './settings.js'; +import { KEYS, DEPRECATED_KEYS } from './keys.js'; + +const CURRENT_SETTINGS_VERSION = 2; + +export function update_from_old_settings(gsettings) { + const preferences = new Settings(KEYS, gsettings); + const deprecated_preferences = new Settings(DEPRECATED_KEYS, gsettings); + const old_version = preferences.settings.get_int('settings-version'); + + if (old_version < CURRENT_SETTINGS_VERSION) { + // set artifacts hacks to be 1 at most, as it should be suitable now that most big bugs have + // been resolved (and especially because hack levels to 2 now means disabling clipped + // redraws entirely, which is very much not what we want for users that update) + if (preferences.HACKS_LEVEL > 1) + preferences.HACKS_LEVEL = 1; + + // enable dash-to-dock blurring, as most disabled it due to the lack of rounded corners; set + // it to static blur by default too and with transparent background + preferences.dash_to_dock.BLUR = true; + preferences.dash_to_dock.STATIC_BLUR = true; + preferences.dash_to_dock.STYLE_DASH_TO_DOCK = 0; + + // 'customize' has been removed: we merge the current used settings + ['appfolder', 'panel', 'dash_to_dock', 'applications', 'window_list'].forEach( + component_name => { + const deprecated_component = deprecated_preferences[component_name]; + const new_component = preferences[component_name]; + if (!deprecated_component.CUSTOMIZE) { + new_component.SIGMA = deprecated_preferences.SIGMA; + new_component.BRIGHTNESS = deprecated_preferences.BRIGHTNESS; + } + }); + + // remove old preferences in order not to clutter the gsettings + deprecated_preferences.reset(); + } + + preferences.settings.set_int('settings-version', CURRENT_SETTINGS_VERSION); +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js new file mode 100644 index 0000000..0277e0e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js @@ -0,0 +1,38 @@ +import GLib from 'gi://GLib'; + +export const IS_IN_PREFERENCES = typeof global === 'undefined'; + +// Taken from https://github.com/Schneegans/Burn-My-Windows/blob/main/src/utils.js +// This method can be used to import a module in the GNOME Shell process only. This +// is useful if you want to use a module in extension.js, but not in the preferences +// process. This method returns null if it is called in the preferences process. +export async function import_in_shell_only(module) { + if (IS_IN_PREFERENCES) + return null; + return (await import(module)).default; +} + +// In use for the effects, to prevent boilerplate code +export function setup_params(outer_this, params) { + // setup each parameter, either with the given or the default value + for (const params_name in outer_this.constructor.default_params) { + outer_this["_" + params_name] = null; + outer_this[params_name] = params_name in params ? + params[params_name] : + outer_this.constructor.default_params[params_name]; + } +}; + +export const get_shader_source = (Shell, shader_filename, self_uri) => { + if (!Shell) + return; + const shader_path = GLib.filename_from_uri( + GLib.uri_resolve_relative(self_uri, shader_filename, GLib.UriFlags.NONE) + )[0]; + try { + return Shell.get_file_contents_utf8_sync(shader_path); + } catch (e) { + console.warn(`[Blur my Shell > effect] error loading shader from ${shader_path}: ${e}`); + return null; + } +}; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.glsl deleted file mode 100644 index 37059ae..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.glsl +++ /dev/null @@ -1,114 +0,0 @@ -uniform sampler2D tex; -uniform float sigma; -uniform int dir; -uniform float brightness; -uniform float corner_radius; -uniform float width; -uniform float height; - -float circleBounds(vec2 p, vec2 center, float clip_radius) { - vec2 delta = p - center; - float dist_squared = dot(delta, delta); - - float outer_radius = clip_radius + 0.5; - if (dist_squared >= (outer_radius * outer_radius)) - return 0.0; - - float inner_radius = clip_radius - 0.5; - if (dist_squared <= (inner_radius * inner_radius)) - return 1.0; - - return outer_radius - sqrt(dist_squared); -} - -vec4 shapeCorner(vec4 pixel, vec2 p, vec2 center, float clip_radius) { - float alpha = circleBounds(p, center, clip_radius); - return vec4(pixel.rgb * alpha, min(alpha, pixel.a)); -} - -vec4 getTexture(vec2 uv) { - if (uv.x < 2. / width) - uv.x = 2. / width; - - if (uv.y < 2. / height) - uv.y = 2. / height; - - if (uv.x > 1. - 3. / width) - uv.x = 1. - 3. / width; - - if (uv.y > 1. - 3. / height) - uv.y = 1. - 3. / height; - - return texture2D(tex, uv); -} - -void main(void) { - vec2 uv = cogl_tex_coord_in[0].xy; - - vec2 pos = uv * vec2(width, height); - - vec2 direction = vec2(dir, (1.0 - dir)); - - float pixel_step; - if (dir == 0) - pixel_step = 1.0 / height; - else - pixel_step = 1.0 / width; - - vec3 gauss_coefficient; - gauss_coefficient.x = 1.0 / (sqrt(2.0 * 3.14159265) * sigma); - gauss_coefficient.y = exp(-0.5 / (sigma * sigma)); - gauss_coefficient.z = gauss_coefficient.y * gauss_coefficient.y; - - float gauss_coefficient_total = gauss_coefficient.x; - - vec4 ret = getTexture(uv) * gauss_coefficient.x; - gauss_coefficient.xy *= gauss_coefficient.yz; - - int n_steps = int(ceil(1.5 * sigma)) * 2; - - for (int i = 1; i <= n_steps; i += 2) { - float coefficient_subtotal = gauss_coefficient.x; - gauss_coefficient.xy *= gauss_coefficient.yz; - coefficient_subtotal += gauss_coefficient.x; - - float gauss_ratio = gauss_coefficient.x / coefficient_subtotal; - - float foffset = float(i) + gauss_ratio; - vec2 offset = direction * foffset * pixel_step; - - ret += getTexture(uv + offset) * coefficient_subtotal; - ret += getTexture(uv - offset) * coefficient_subtotal; - - gauss_coefficient_total += 2.0 * coefficient_subtotal; - gauss_coefficient.xy *= gauss_coefficient.yz; - } - vec4 outColor = ret / gauss_coefficient_total; - - // apply brightness and rounding on the second pass (dir==0 comes last) - if (dir == 0) { - // left side - if (pos.x < corner_radius) { - // top left corner - if (pos.y < corner_radius) { - outColor = shapeCorner(outColor, pos, vec2(corner_radius + 2., corner_radius + 2.), corner_radius); - // bottom left corner - } else if (pos.y > height - corner_radius) { - outColor = shapeCorner(outColor, pos, vec2(corner_radius + 2., height - corner_radius - 1.), corner_radius); - } - // right side - } else if (pos.x > width - corner_radius) { - // top right corner - if (pos.y < corner_radius) { - outColor = shapeCorner(outColor, pos, vec2(width - corner_radius - 1., corner_radius + 2.), corner_radius); - // bottom right corner - } else if (pos.y > height - corner_radius) { - outColor = shapeCorner(outColor, pos, vec2(width - corner_radius - 1., height - corner_radius - 1.), corner_radius); - } - } - - outColor.rgb *= brightness; - } - - cogl_color_out = outColor; -} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.js deleted file mode 100644 index 71d28d0..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/blur_effect.js +++ /dev/null @@ -1,236 +0,0 @@ -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; -import Shell from 'gi://Shell'; - -const SHADER_PATH = GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, 'blur_effect.glsl', GLib.UriFlags.NONE))[0]; - - -const get_shader_source = _ => { - try { - return Shell.get_file_contents_utf8_sync(SHADER_PATH); - } catch (e) { - console.warn(`[Blur my Shell] error loading shader from ${SHADER_PATH}: ${e}`); - return null; - } -}; - -export const BlurEffect = new GObject.registerClass({ - GTypeName: "BlurEffect", - Properties: { - 'radius': GObject.ParamSpec.double( - `radius`, - `Radius`, - `Blur radius`, - GObject.ParamFlags.READWRITE, - 0.0, 2000.0, - 200.0, - ), - 'brightness': GObject.ParamSpec.double( - `brightness`, - `Brightness`, - `Blur brightness`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.6, - ), - 'width': GObject.ParamSpec.double( - `width`, - `Width`, - `Width`, - GObject.ParamFlags.READWRITE, - 0.0, Number.MAX_SAFE_INTEGER, - 0.0, - ), - 'height': GObject.ParamSpec.double( - `height`, - `Height`, - `Height`, - GObject.ParamFlags.READWRITE, - 0.0, Number.MAX_SAFE_INTEGER, - 0.0, - ), - 'corner_radius': GObject.ParamSpec.double( - `corner_radius`, - `Corner Radius`, - `Corner Radius`, - GObject.ParamFlags.READWRITE, - 0, Number.MAX_SAFE_INTEGER, - 0, - ), - 'direction': GObject.ParamSpec.int( - `direction`, - `Direction`, - `Direction`, - GObject.ParamFlags.READWRITE, - 0, 1, - 0, - ), - 'chained_effect': GObject.ParamSpec.object( - `chained_effect`, - `Chained Effect`, - `Chained Effect`, - GObject.ParamFlags.READABLE, - GObject.Object, - ), - } -}, class BlurEffect extends Clutter.ShaderEffect { - constructor(params, settings) { - super(params); - - this._sigma = null; - this._brightness = null; - this._width = null; - this._height = null; - this._corner_radius = null; - - this._static = true; - this._settings = settings; - - this._direction = 0; - - this._chained_effect = null; - - if (params.sigma) - this.sigma = params.sigma; - if (params.brightness) - this.brightness = params.brightness; - if (params.width) - this.width = params.width; - if (params.height) - this.height = params.height; - if (params.corner_radius) - this.corner_radius = params.corner_radius; - if (params.direction) - this.direction = params.direction; - - // set shader source - this._source = get_shader_source(); - if (this._source) - this.set_shader_source(this._source); - } - - get radius() { - return this._radius; - } - - set radius(value) { - if (this._radius !== value) { - this._radius = value; - - // like Clutter, we use the assumption radius = 2*sigma - this.set_uniform_value('sigma', parseFloat(this._radius / 2 - 1e-6)); - - if (this._chained_effect) { - this._chained_effect.radius = value; - } - } - } - - get brightness() { - return this._brightness; - } - - set brightness(value) { - if (this._brightness !== value) { - this._brightness = value; - - this.set_uniform_value('brightness', parseFloat(this._brightness - 1e-6)); - - if (this._chained_effect) { - this._chained_effect.brightness = value; - } - } - } - - get width() { - return this._width; - } - - set width(value) { - if (this._width !== value) { - this._width = value; - - this.set_uniform_value('width', parseFloat(this._width + 3.0 - 1e-6)); - - if (this._chained_effect) { - this._chained_effect.width = value; - } - } - } - - get height() { - return this._height; - } - - set height(value) { - if (this._height !== value) { - this._height = value; - - this.set_uniform_value('height', parseFloat(this._height + 3.0 - 1e-6)); - - if (this._chained_effect) { - this._chained_effect.height = value; - } - } - } - - get corner_radius() { - return this._corner_radius; - } - - set corner_radius(value) { - if (this._corner_radius !== value) { - this._corner_radius = value; - - this.set_uniform_value('corner_radius', parseFloat(this._corner_radius - 1e-6)); - - if (this._chained_effect) { - this._chained_effect.corner_radius = value; - } - } - } - - get direction() { - return this._direction; - } - - set direction(value) { - if (this._direction !== value) { - this._direction = value; - } - } - - get chained_effect() { - return this._chained_effect; - } - - vfunc_set_actor(actor) { - super.vfunc_set_actor(actor); - - if (this._direction == 0) { - this._chained_effect = new BlurEffect({ - radius: this.radius, - brightness: this.brightness, - width: this.width, - height: this.height, - corner_radius: this.corner_radius, - direction: 1 - }); - if (actor !== null) - actor.add_effect(this._chained_effect); - } - } - - vfunc_paint_target(paint_node = null, paint_context = null) { - this.set_uniform_value("tex", 0); - this.set_uniform_value("dir", this._direction); - - if (paint_node && paint_context) - super.vfunc_paint_target(paint_node, paint_context); - else if (paint_node) - super.vfunc_paint_target(paint_node); - else - super.vfunc_paint_target(); - } -}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl similarity index 100% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.glsl rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js new file mode 100644 index 0000000..7de753d --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js @@ -0,0 +1,140 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'color.glsl'; +const DEFAULT_PARAMS = { + color: [0.0, 0.0, 0.0, 0.0] +}; + + +export const ColorEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "ColorEffect", + Properties: { + 'red': GObject.ParamSpec.double( + `red`, + `Red`, + `Red value in shader`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.0, + ), + 'green': GObject.ParamSpec.double( + `green`, + `Green`, + `Green value in shader`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.0, + ), + 'blue': GObject.ParamSpec.double( + `blue`, + `Blue`, + `Blue value in shader`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.0, + ), + 'blend': GObject.ParamSpec.double( + `blend`, + `Blend`, + `Amount of blending between the colors`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.0, + ), + } + }, class ColorEffect extends Clutter.ShaderEffect { + constructor(params) { + // initialize without color as a parameter + const { color, ...parent_params } = params; + super(parent_params); + + this._red = null; + this._green = null; + this._blue = null; + this._blend = null; + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + + // set shader color + this.color = 'color' in params ? color : this.constructor.default_params.color; + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get red() { + return this._red; + } + + set red(value) { + if (this._red !== value) { + this._red = value; + + this.set_uniform_value('red', parseFloat(this._red - 1e-6)); + } + } + + get green() { + return this._green; + } + + set green(value) { + if (this._green !== value) { + this._green = value; + + this.set_uniform_value('green', parseFloat(this._green - 1e-6)); + } + } + + get blue() { + return this._blue; + } + + set blue(value) { + if (this._blue !== value) { + this._blue = value; + + this.set_uniform_value('blue', parseFloat(this._blue - 1e-6)); + } + } + + get blend() { + return this._blend; + } + + set blend(value) { + if (this._blend !== value) { + this._blend = value; + + this.set_uniform_value('blend', parseFloat(this._blend - 1e-6)); + this.set_enabled(this.blend > 0); + } + } + + set color(rgba) { + let [r, g, b, a] = rgba; + this.red = r; + this.green = g; + this.blue = b; + this.blend = a; + } + + get color() { + return [this.red, this.green, this.blue, this.blend]; + } + + /// False set function, only cares about the color. Too hard to change. + set(params) { + this.color = params.color; + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.js deleted file mode 100644 index 2ae9191..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/color_effect.js +++ /dev/null @@ -1,181 +0,0 @@ -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; -import Shell from 'gi://Shell'; - - -const SHADER_PATH = GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, 'color_effect.glsl', GLib.UriFlags.NONE))[0]; - - -const get_shader_source = _ => { - try { - return Shell.get_file_contents_utf8_sync(SHADER_PATH); - } catch (e) { - console.warn(`[Blur my Shell] error loading shader from ${SHADER_PATH}: ${e}`); - return null; - } -}; - -/// New Clutter Shader Effect that simply mixes a color in, the class applies -/// the GLSL shader programmed into vfunc_get_static_shader_source and applies -/// it to an Actor. -/// -/// Clutter Shader Source Code: -/// https://github.com/GNOME/clutter/blob/master/clutter/clutter-shader-effect.c -/// -/// GJS Doc: -/// https://gjs-docs.gnome.org/clutter10~10_api/clutter.shadereffect -export const ColorEffect = new GObject.registerClass({ - GTypeName: "ColorEffect", - Properties: { - 'red': GObject.ParamSpec.double( - `red`, - `Red`, - `Red value in shader`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.4, - ), - 'green': GObject.ParamSpec.double( - `green`, - `Green`, - `Green value in shader`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.4, - ), - 'blue': GObject.ParamSpec.double( - `blue`, - `Blue`, - `Blue value in shader`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.4, - ), - 'blend': GObject.ParamSpec.double( - `blend`, - `Blend`, - `Amount of blending between the colors`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.4, - ), - } -}, class ColorShader extends Clutter.ShaderEffect { - constructor(params, settings) { - // initialize without color as a parameter - let _color = params.color; - delete params.color; - - super(params); - - this._red = null; - this._green = null; - this._blue = null; - this._blend = null; - - this._static = true; - this._settings = settings; - - // set shader source - this._source = get_shader_source(); - if (this._source) - this.set_shader_source(this._source); - - // set shader color - if (_color) - this.color = _color; - - this.update_enabled(); - } - - get red() { - return this._red; - } - - set red(value) { - if (this._red !== value) { - this._red = value; - - this.set_uniform_value('red', parseFloat(this._red - 1e-6)); - } - } - - get green() { - return this._green; - } - - set green(value) { - if (this._green !== value) { - this._green = value; - - this.set_uniform_value('green', parseFloat(this._green - 1e-6)); - } - } - - get blue() { - return this._blue; - } - - set blue(value) { - if (this._blue !== value) { - this._blue = value; - - this.set_uniform_value('blue', parseFloat(this._blue - 1e-6)); - } - } - - get blend() { - return this._blend; - } - - set blend(value) { - if (this._blend !== value) { - this._blend = value; - - this.set_uniform_value('blend', parseFloat(this._blend - 1e-6)); - } - this.update_enabled(); - } - - set color(rgba) { - let [r, g, b, a] = rgba; - this.red = r; - this.green = g; - this.blue = b; - this.blend = a; - } - - get color() { - return [this.red, this.green, this.blue, this.blend]; - } - - /// False set function, only cares about the color. Too hard to change. - set(params) { - this.color = params.color; - } - - update_enabled() { - // don't anything if this._settings is undefined (when calling super) - if (this._settings === undefined) - return; - - this.set_enabled( - this.blend > 0 && - this._settings.COLOR_AND_NOISE && - this._static - ); - } - - - vfunc_paint_target(paint_node = null, paint_context = null) { - this.set_uniform_value("tex", 0); - - if (paint_node && paint_context) - super.vfunc_paint_target(paint_node, paint_context); - else if (paint_node) - super.vfunc_paint_target(paint_node); - else - super.vfunc_paint_target(); - } -}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl new file mode 100644 index 0000000..760798a --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl @@ -0,0 +1,93 @@ +// Heavily based on https://github.com/yilozt/rounded-window-corners +// which is itself based on upstream Mutter code + +uniform sampler2D tex; +uniform float radius; +uniform float width; +uniform float height; +uniform bool corners_top; +uniform bool corners_bottom; + +uniform float clip_x0; +uniform float clip_y0; +uniform float clip_width; +uniform float clip_height; + +float circle_bounds(vec2 p, vec2 center, float clip_radius) { + vec2 delta = p - center; + float dist_squared = dot(delta, delta); + + float outer_radius = clip_radius + 0.5; + if (dist_squared >= (outer_radius * outer_radius)) + return 0.0; + + float inner_radius = clip_radius - 0.5; + if (dist_squared <= (inner_radius * inner_radius)) + return 1.0; + + return outer_radius - sqrt(dist_squared); +} + +vec4 getTexture(vec2 uv) { + if (uv.x < 2. / width) + uv.x = 2. / width; + + if (uv.y < 2. / height) + uv.y = 2. / height; + + if (uv.x > 1. - 3. / width) + uv.x = 1. - 3. / width; + + if (uv.y > 1. - 3. / height) + uv.y = 1. - 3. / height; + + return texture2D(tex, uv); +} + +float rounded_rect_coverage(vec2 p, vec4 bounds, float clip_radius) { + // Outside the bounds + if (p.x < bounds.x || p.x > bounds.z || p.y < bounds.y || p.y > bounds.w) { + return 0.; + } + + vec2 center; + + float center_left = bounds.x + clip_radius; + float center_right = bounds.z - clip_radius; + + if (p.x < center_left) + center.x = center_left + 2.; + else if (p.x > center_right) + center.x = center_right - 1.; + else + return 1.0; + + float center_top = bounds.y + clip_radius; + float center_bottom = bounds.w - clip_radius; + + if (corners_top && p.y < center_top) + center.y = center_top + 2.; + else if (corners_bottom && p.y > center_bottom) + center.y = center_bottom - 1.; + else + return 1.0; + + return circle_bounds(p, center, clip_radius); +} + +void main(void) { + vec2 uv = cogl_tex_coord_in[0].xy; + vec2 pos = uv * vec2(width, height); + vec4 c = getTexture(uv); + + vec4 bounds; + if (clip_width < 0. || clip_height < 0.) { + bounds = vec4(clip_x0, clip_y0, clip_x0 + width, clip_y0 + height); + } else { + bounds = vec4(clip_x0, clip_y0, clip_x0 + clip_width, clip_y0 + clip_height); + } + + float alpha = rounded_rect_coverage(pos, bounds, radius); + + cogl_color_out = vec4(c.rgb * alpha, min(alpha, c.a)); +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js new file mode 100644 index 0000000..109be12 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js @@ -0,0 +1,211 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const St = await utils.import_in_shell_only('gi://St'); +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'corner.glsl'; +const DEFAULT_PARAMS = { + radius: 12, width: 0, height: 0, + corners_top: true, corners_bottom: true, + clip: [0, 0, -1, -1] +}; + + +export const CornerEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "CornerEffect", + Properties: { + 'radius': GObject.ParamSpec.double( + `radius`, + `Corner Radius`, + `Corner Radius`, + GObject.ParamFlags.READWRITE, + 0, Number.MAX_SAFE_INTEGER, + 12, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'corners_top': GObject.ParamSpec.boolean( + `corners_top`, + `Round top corners`, + `Round top corners`, + GObject.ParamFlags.READWRITE, + true, + ), + 'corners_bottom': GObject.ParamSpec.boolean( + `corners_bottom`, + `Round bottom corners`, + `Round bottom corners`, + GObject.ParamFlags.READWRITE, + true, + ), + // FIXME this works but it logs an error, because I'm not a double... + // I don't want to fiddle with GVariants again + 'clip': GObject.ParamSpec.double( + `clip`, + `Clip`, + `Clip`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + } + }, class CornerEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + this._clip_x0 = null; + this._clip_y0 = null; + this._clip_width = null; + this._clip_height = null; + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + + const theme_context = St.ThemeContext.get_for_stage(global.stage); + theme_context.connectObject('notify::scale-factor', _ => this.update_radius(), this); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get radius() { + return this._radius; + } + + set radius(value) { + if (this._radius !== value) { + this._radius = value; + + this.update_radius(); + } + } + + update_radius() { + const theme_context = St.ThemeContext.get_for_stage(global.stage); + let radius = Math.min( + this.radius * theme_context.scale_factor, + this.width / 2, this.height / 2 + ); + if (this._clip_width >= 0 || this._clip_height >= 0) + radius = Math.min(radius, this._clip_width / 2, this._clip_height / 2); + + this.set_uniform_value('radius', parseFloat(radius - 1e-6)); + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width + 3.0 - 1e-6)); + this.update_radius(); + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height + 3.0 - 1e-6)); + this.update_radius(); + } + } + + get corners_top() { + return this._corners_top; + } + + set corners_top(value) { + if (this._corners_top !== value) { + this._corners_top = value; + + this.set_uniform_value('corners_top', this._corners_top ? 1 : 0); + } + } + + get corners_bottom() { + return this._corners_bottom; + } + + set corners_bottom(value) { + if (this._corners_bottom !== value) { + this._corners_bottom = value; + + this.set_uniform_value('corners_bottom', this._corners_bottom ? 1 : 0); + } + } + + get clip() { + return [this._clip_x0, this._clip_y0, this._clip_width, this._clip_height]; + } + + set clip(value) { + [this._clip_x0, this._clip_y0, this._clip_width, this._clip_height] = value; + this.set_uniform_value('clip_x0', parseFloat(this._clip_x0 - 1e-6)); + this.set_uniform_value('clip_y0', parseFloat(this._clip_y0 - 1e-6)); + this.set_uniform_value('clip_width', parseFloat(this._clip_width + 3 - 1e-6)); + this.set_uniform_value('clip_height', parseFloat(this._clip_height + 3 - 1e-6)); + this.update_radius(); + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (this._actor_connection_clip_rect_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_clip_rect_id); + } + + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + + this.clip = actor.has_clip ? actor.get_clip() : [0, 0, -10, -10]; + this._actor_connection_clip_rect_id = actor.connect('notify::clip-rect', _ => { + this.clip = actor.has_clip ? actor.get_clip() : [0, 0, -10, -10]; + }); + } + else { + this._actor_connection_size_id = null; + this._actor_connection_clip_rect_id = null; + } + + super.vfunc_set_actor(actor); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl new file mode 100644 index 0000000..64c1682 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl @@ -0,0 +1,71 @@ +uniform sampler2D tex; +uniform int operation; +uniform float width; +uniform float height; + +#define CORRECTION 2.25 +#define SIZE_ADDITION 3 + +vec4 get_texture_at_position(vec2 position) { + vec2 raw_position = position + vec2(CORRECTION, CORRECTION); + vec2 raw_uv = raw_position / vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + + return texture2D(tex, raw_uv); +} + +vec4 try_get_texture_at_position(vec2 position, inout int count) { + if (any(greaterThanEqual(position, vec2(width, height))) || + any(lessThan(position, vec2(0, 0)))) { + return vec4(0); + } else { + count++; + return get_texture_at_position(position); + } +} + +ivec2 get_corrected_position() { + vec2 raw_uv = cogl_tex_coord0_in.st; + vec2 raw_position = raw_uv * vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + return ivec2(raw_position - vec2(CORRECTION, CORRECTION)); +} + +void main() { + ivec2 corrected_position = get_corrected_position(); + + // 1-step derivative + if (operation == 0) { + vec4 color = vec4(0); + int c = 0; + color += try_get_texture_at_position(corrected_position + vec2(0, 1), c); + color -= try_get_texture_at_position(corrected_position + vec2(0, 0), c); + color += try_get_texture_at_position(corrected_position + vec2(1, 0), c); + color -= try_get_texture_at_position(corrected_position + vec2(0, 0), c); + if (c < 4) { + color = vec4(0); + } + cogl_color_out = vec4(color.xyz, 1); + } else + // 2-step derivative + if (operation == 1) { + vec4 color = vec4(0); + int c = 0; + color += try_get_texture_at_position(corrected_position + vec2(0, 1), c); + color -= try_get_texture_at_position(corrected_position + vec2(0, -1), c); + color += try_get_texture_at_position(corrected_position + vec2(1, 0), c); + color -= try_get_texture_at_position(corrected_position + vec2(-1, 0), c); + if (c < 4) { + color = vec4(0); + } + cogl_color_out = vec4(color.xyz / 2, 1); + } else + // laplacian + if (operation == 2) { + vec4 color = vec4(0); + color = -4 * get_texture_at_position(corrected_position); + color += get_texture_at_position(corrected_position + vec2(0, 1)); + color += get_texture_at_position(corrected_position + vec2(0, -1)); + color += get_texture_at_position(corrected_position + vec2(1, 0)); + color += get_texture_at_position(corrected_position + vec2(-1, 0)); + cogl_color_out = vec4(color.xyz, 1); + } +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js new file mode 100644 index 0000000..04d6100 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js @@ -0,0 +1,120 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'derivative.glsl'; +const DEFAULT_PARAMS = { + operation: 0, width: 0, height: 0 +}; + + +export const DerivativeEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "DerivativeEffect", + Properties: { + 'operation': GObject.ParamSpec.int( + `operation`, + `Operation`, + `Operation`, + GObject.ParamFlags.READWRITE, + 0, 2, + 0, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ) + } + }, class DerivativeEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get operation() { + return this._operation; + } + + set operation(value) { + if (this._operation !== value) { + this._operation = value; + + this.set_uniform_value('operation', this._operation); + } + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width - 1e-6)); + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height - 1e-6)); + } + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + } + else + this._actor_connection_size_id = null; + + super.vfunc_set_actor(actor); + } + + vfunc_paint_target(paint_node, paint_context) { + // force setting nearest-neighbour texture filtering + this.get_pipeline().set_layer_filters(0, 9728, 9728); + + super.vfunc_paint_target(paint_node, paint_context); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl new file mode 100644 index 0000000..9871268 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl @@ -0,0 +1,76 @@ +uniform sampler2D tex; +uniform int divider; +uniform float width; +uniform float height; +uniform int downsampling_mode; + +#define CORRECTION 2.25 +#define SIZE_ADDITION 3 + +vec4 get_texture_at_position(vec2 position) { + vec2 raw_position = position + vec2(CORRECTION, CORRECTION); + vec2 raw_uv = raw_position / vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + + return texture2D(tex, raw_uv); +} + +vec2 get_corrected_position() { + vec2 raw_uv = cogl_tex_coord0_in.st; + vec2 raw_position = raw_uv * vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + return raw_position - vec2(CORRECTION, CORRECTION); +} + +void main() { + ivec2 corrected_position = ivec2(get_corrected_position()); + vec2 multiplied_position = corrected_position * divider; + + if (any(greaterThan(multiplied_position, vec2(width, height)))) { + discard; + } + + // mode 0: boxcar downsampling + if (downsampling_mode == 0) { + + vec4 color = vec4(0.); + int count = 0; + for (int i = 0; i < divider; i++) { + for (int j = 0; j < divider; j++) { + vec2 lookup_position = multiplied_position + vec2(i, j); + if (all(greaterThanEqual(lookup_position, vec2(0, 0))) && + all(lessThan(lookup_position, vec2(width, height)))) { + color += get_texture_at_position(lookup_position); + count += 1; + } + } + } + cogl_color_out = color / count; + + } else + // mode 1: triangular downsampling + if (downsampling_mode == 1) { + + vec4 color = vec4(0.); + int count = 0; + int force = 1; + for (int i = 0; i < divider; i++) { + for (int j = 0; j < divider; j++) { + vec2 lookup_position = multiplied_position + vec2(i, j); + if (all(greaterThanEqual(lookup_position, vec2(0, 0))) && + all(lessThan(lookup_position, vec2(width, height)))) { + force = 1 + divider - int(abs(divider - i - j)); + color += get_texture_at_position(lookup_position) * force; + count += force; + } + } + } + cogl_color_out = color / count; + + } else + // mode 2: Dirac downsampling + if (downsampling_mode == 2) { + + vec2 lookup_position = min(multiplied_position + vec2(divider, divider) / 2, vec2(width - 1, height - 1)); + cogl_color_out = get_texture_at_position(lookup_position); + + } +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js new file mode 100644 index 0000000..8103486 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js @@ -0,0 +1,140 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'downscale.glsl'; +const DEFAULT_PARAMS = { + divider: 8, downsampling_mode: 0, width: 0, height: 0 +}; + + +export const DownscaleEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "DownscaleEffect", + Properties: { + 'divider': GObject.ParamSpec.int( + `divider`, + `Divider`, + `Divider`, + GObject.ParamFlags.READWRITE, + 0, 64, + 8, + ), + 'downsampling_mode': GObject.ParamSpec.int( + `downsampling_mode`, + `Downsampling mode`, + `Downsampling mode`, + GObject.ParamFlags.READWRITE, + 0, 2, + 0, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ) + } + }, class DownscaleEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get divider() { + return this._divider; + } + + set divider(value) { + if (this._divider !== value) { + this._divider = value; + + this.set_uniform_value('divider', this._divider); + } + } + + get downsampling_mode() { + return this._downsampling_mode; + } + + set downsampling_mode(value) { + if (this._downsampling_mode !== value) { + this._downsampling_mode = value; + + this.set_uniform_value('downsampling_mode', this._downsampling_mode); + } + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width - 1e-6)); + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height - 1e-6)); + } + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + } + else + this._actor_connection_size_id = null; + + super.vfunc_set_actor(actor); + } + + vfunc_paint_target(paint_node, paint_context) { + // force setting nearest-neighbour texture filtering + this.get_pipeline().set_layer_filters(0, 9728, 9728); + + super.vfunc_paint_target(paint_node, paint_context); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js new file mode 100644 index 0000000..8678d9a --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js @@ -0,0 +1,332 @@ +import { NativeDynamicBlurEffect } from '../effects/native_dynamic_gaussian_blur.js'; +import { NativeStaticBlurEffect } from '../effects/native_static_gaussian_blur.js'; +import { GaussianBlurEffect } from '../effects/gaussian_blur.js'; +import { MonteCarloBlurEffect } from '../effects/monte_carlo_blur.js'; +import { ColorEffect } from '../effects/color.js'; +import { NoiseEffect } from '../effects/noise.js'; +import { CornerEffect } from '../effects/corner.js'; +import { DownscaleEffect } from './downscale.js'; +import { UpscaleEffect } from './upscale.js'; +import { PixelizeEffect } from './pixelize.js'; +import { DerivativeEffect } from './derivative.js'; +import { RgbToHslEffect } from './rgb_to_hsl.js'; +import { HslToRgbEffect } from './hsl_to_rgb.js'; + +// We do in this way because I've not found another way to store our preferences in a dictionnary +// while calling `gettext` on it while in preferences. Not so pretty, but works. +export function get_effects_groups(_ = _ => "") { + return { + blur_effects: { + name: _("Blur effects"), + contains: [ + "native_static_gaussian_blur", + "gaussian_blur", + "monte_carlo_blur" + ] + }, + texture_effects: { + name: _("Texture effects"), + contains: [ + "downscale", + "upscale", + "pixelize", + "derivative", + "noise", + "color", + "rgb_to_hsl", + "hsl_to_rgb" + ] + }, + shape_effects: { + name: _("Shape effects"), + contains: [ + "corner" + ] + } + }; +}; + +export function get_supported_effects(_ = () => "") { + return { + native_dynamic_gaussian_blur: { + class: NativeDynamicBlurEffect + }, + + native_static_gaussian_blur: { + class: NativeStaticBlurEffect, + name: _("Native gaussian blur"), + description: _("An optimized blur effect that smoothly blends pixels within a given radius."), + is_advanced: false, + editable_params: { + unscaled_radius: { + name: _("Radius"), + description: _("The intensity of the blur effect."), + type: "float", + min: 0., + max: 100., + increment: 1.0, + big_increment: 10., + digits: 0 + }, + brightness: { + name: _("Brightness"), + description: _("The brightness of the blur effect, a high value might make the text harder to read."), + type: "float", + min: 0., + max: 1., + increment: 0.01, + big_increment: 0.1, + digits: 2 + }, + } + }, + + gaussian_blur: { + class: GaussianBlurEffect, + name: _("Gaussian blur (advanced effect)"), + description: _("A blur effect that smoothly blends pixels within a given radius. This effect is more precise, but way less optimized."), + is_advanced: true, + editable_params: { + radius: { + name: _("Radius"), + description: _("The intensity of the blur effect. The bigger it is, the slower it will be."), + type: "float", + min: 0., + max: 100., + increment: .1, + big_increment: 10., + digits: 1 + }, + brightness: { + name: _("Brightness"), + description: _("The brightness of the blur effect, a high value might make the text harder to read."), + type: "float", + min: 0., + max: 1., + increment: 0.01, + big_increment: 0.1, + digits: 2 + }, + } + }, + + monte_carlo_blur: { + class: MonteCarloBlurEffect, + name: _("Monte Carlo blur"), + description: _("A blur effect that mimics a random walk, by picking pixels further and further away from its origin and mixing them all together."), + is_advanced: false, + editable_params: { + radius: { + name: _("Radius"), + description: _("The maximum travel distance for each step in the random walk. A higher value will make the blur more randomized."), + type: "float", + min: 0., + max: 10., + increment: 0.01, + big_increment: 0.1, + digits: 2 + }, + iterations: { + name: _("Iterations"), + description: _("The number of iterations. The more there are, the smoother the blur is."), + type: "integer", + min: 0, + max: 50, + increment: 1 + }, + brightness: { + name: _("Brightness"), + description: _("The brightness of the blur effect, a high value might make the text harder to read."), + type: "float", + min: 0., + max: 1., + increment: 0.01, + big_increment: 0.1, + digits: 2 + }, + use_base_pixel: { + name: _("Use base pixel"), + description: _("Whether or not the original pixel is counted for the blur. If it is, the image will be more legible."), + type: "boolean" + } + } + }, + + color: { + class: ColorEffect, + name: _("Color"), + description: _("An effect that blends a color into the pipeline."), + is_advanced: false, + // TODO make this RGB + blend + editable_params: { + color: { + name: _("Color"), + description: _("The color to blend in. The blending amount is controled by the opacity of the color."), + type: "rgba" + } + } + }, + + pixelize: { + class: PixelizeEffect, + name: _("Pixelize"), + description: _("An effect that pixelizes the image."), + is_advanced: false, + editable_params: { + factor: { + name: _("Factor"), + description: _("How much to scale down the image."), + type: "integer", + min: 1, + max: 50, + increment: 1 + }, + downsampling_mode: { + name: _("Downsampling mode"), + description: _("The downsampling method that is used."), + type: "dropdown", + options: [ + _("Boxcar"), + _("Triangular"), + _("Dirac") + ] + } + } + }, + + downscale: { + class: DownscaleEffect, + name: _("Downscale (advanced effect)"), + description: _("An effect that downscales the image and put it on the top-left corner."), + is_advanced: true, + editable_params: { + divider: { + name: _("Factor"), + description: _("How much to scale down the image."), + type: "integer", + min: 1, + max: 50, + increment: 1 + }, + downsampling_mode: { + name: _("Downsampling mode"), + description: _("The downsampling method that is used."), + type: "dropdown", + options: [ + _("Boxcar"), + _("Triangular"), + _("Dirac") + ] + } + } + }, + + upscale: { + class: UpscaleEffect, + name: _("Upscale (advanced effect)"), + description: _("An effect that upscales the image from the top-left corner."), + is_advanced: true, + editable_params: { + factor: { + name: _("Factor"), + description: _("How much to scale up the image."), + type: "integer", + min: 1, + max: 50, + increment: 1 + } + } + }, + + derivative: { + class: DerivativeEffect, + name: _("Derivative"), + description: _("Apply a spatial derivative, or a laplacian."), + is_advanced: false, + editable_params: { + operation: { + name: _("Operation"), + description: _("The mathematical operation to apply."), + type: "dropdown", + options: [ + _("1-step derivative"), + _("2-step derivative"), + _("Laplacian") + ] + } + } + }, + + noise: { + class: NoiseEffect, + name: _("Noise"), + description: _("An effect that adds a random noise. Prefer the Monte Carlo blur for a more organic effect if needed."), + is_advanced: false, + editable_params: { + noise: { + name: _("Noise"), + description: _("The amount of noise to add."), + type: "float", + min: 0., + max: 1., + increment: 0.01, + big_increment: 0.1, + digits: 2 + }, + lightness: { + name: _("Lightness"), + description: _("The luminosity of the noise. A setting of '1.0' will make the effect transparent."), + type: "float", + min: 0., + max: 2., + increment: 0.01, + big_increment: 0.1, + digits: 2 + } + } + }, + + rgb_to_hsl: { + class: RgbToHslEffect, + name: _("RGB to HSL (advanced effect)"), + description: _("Converts the image from RGBA colorspace to HSLA."), + is_advanced: true, + editable_params: {} + }, + + hsl_to_rgb: { + class: HslToRgbEffect, + name: _("HSL to RGB (advanced effect)"), + description: _("Converts the image from HSLA colorspace to RGBA."), + is_advanced: true, + editable_params: {} + }, + + corner: { + class: CornerEffect, + name: _("Corner"), + description: _("An effect that draws corners. Add it last not to have the other effects perturb the corners."), + is_advanced: false, + editable_params: { + radius: { + name: _("Radius"), + description: _("The radius of the corner. GNOME apps use a radius of 12 px by default."), + type: "integer", + min: 0, + max: 50, + increment: 1, + }, + corners_top: { + name: _("Top corners"), + description: _("Whether or not to round the top corners."), + type: "boolean" + }, + corners_bottom: { + name: _("Bottom corners"), + description: _("Whether or not to round the bottom corners."), + type: "boolean" + } + } + } + }; +}; \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl new file mode 100644 index 0000000..809cc93 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl @@ -0,0 +1,70 @@ +uniform sampler2D tex; +uniform float sigma; +uniform int dir; +uniform float brightness; +uniform float width; +uniform float height; + +vec4 getTexture(vec2 uv) { + if (uv.x < 3. / width) + uv.x = 3. / width; + + if (uv.y < 3. / height) + uv.y = 3. / height; + + if (uv.x > 1. - 3. / width) + uv.x = 1. - 3. / width; + + if (uv.y > 1. - 3. / height) + uv.y = 1. - 3. / height; + + return texture2D(tex, uv); +} + +void main(void) { + vec2 uv = cogl_tex_coord_in[0].xy; + vec2 direction = vec2(dir, (1.0 - dir)); + + float pixel_step; + if (dir == 0) + pixel_step = 1.0 / height; + else + pixel_step = 1.0 / width; + + vec3 gauss_coefficient; + gauss_coefficient.x = 1.0 / (sqrt(2.0 * 3.14159265) * sigma); + gauss_coefficient.y = exp(-0.5 / (sigma * sigma)); + gauss_coefficient.z = gauss_coefficient.y * gauss_coefficient.y; + + float gauss_coefficient_total = gauss_coefficient.x; + + vec4 ret = getTexture(uv) * gauss_coefficient.x; + gauss_coefficient.xy *= gauss_coefficient.yz; + + int n_steps = int(ceil(1.5 * sigma)) * 2; + + for (int i = 1; i <= n_steps; i += 2) { + float coefficient_subtotal = gauss_coefficient.x; + gauss_coefficient.xy *= gauss_coefficient.yz; + coefficient_subtotal += gauss_coefficient.x; + + float gauss_ratio = gauss_coefficient.x / coefficient_subtotal; + + float foffset = float(i) + gauss_ratio; + vec2 offset = direction * foffset * pixel_step; + + ret += getTexture(uv + offset) * coefficient_subtotal; + ret += getTexture(uv - offset) * coefficient_subtotal; + + gauss_coefficient_total += 2.0 * coefficient_subtotal; + gauss_coefficient.xy *= gauss_coefficient.yz; + } + vec4 outColor = ret / gauss_coefficient_total; + + // apply brightness on the second pass (dir==0 comes last) + if (dir == 0) { + outColor.rgb *= brightness; + } + + cogl_color_out = outColor; +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js new file mode 100644 index 0000000..113a6fd --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js @@ -0,0 +1,213 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const St = await utils.import_in_shell_only('gi://St'); +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'gaussian_blur.glsl'; +const DEFAULT_PARAMS = { + radius: 30, brightness: .6, + width: 0, height: 0, direction: 0, chained_effect: null +}; + + +export const GaussianBlurEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "GaussianBlurEffect", + Properties: { + 'radius': GObject.ParamSpec.double( + `radius`, + `Radius`, + `Blur radius`, + GObject.ParamFlags.READWRITE, + 0.0, 2000.0, + 30.0, + ), + 'brightness': GObject.ParamSpec.double( + `brightness`, + `Brightness`, + `Blur brightness`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.6, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'direction': GObject.ParamSpec.int( + `direction`, + `Direction`, + `Direction`, + GObject.ParamFlags.READWRITE, + 0, 1, + 0, + ), + 'chained_effect': GObject.ParamSpec.object( + `chained_effect`, + `Chained Effect`, + `Chained Effect`, + GObject.ParamFlags.READWRITE, + GObject.Object, + ), + } + }, class GaussianBlurEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + + const theme_context = St.ThemeContext.get_for_stage(global.stage); + theme_context.connectObject( + 'notify::scale-factor', _ => + this.set_uniform_value('sigma', + parseFloat(this.radius * theme_context.scale_factor / 2 - 1e-6) + ), + this + ); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get radius() { + return this._radius; + } + + set radius(value) { + if (this._radius !== value) { + this._radius = value; + + const scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + + // like Clutter, we use the assumption radius = 2*sigma + this.set_uniform_value('sigma', parseFloat(this._radius * scale_factor / 2 - 1e-6)); + this.set_enabled(this.radius > 0.); + + if (this.chained_effect) + this.chained_effect.radius = value; + } + } + + get brightness() { + return this._brightness; + } + + set brightness(value) { + if (this._brightness !== value) { + this._brightness = value; + + this.set_uniform_value('brightness', parseFloat(this._brightness - 1e-6)); + + if (this.chained_effect) + this.chained_effect.brightness = value; + } + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width + 3.0 - 1e-6)); + + if (this.chained_effect) + this.chained_effect.width = value; + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height + 3.0 - 1e-6)); + + if (this.chained_effect) + this.chained_effect.height = value; + } + } + + get direction() { + return this._direction; + } + + set direction(value) { + if (this._direction !== value) + this._direction = value; + } + + get chained_effect() { + return this._chained_effect; + } + + set chained_effect(value) { + this._chained_effect = value; + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + } + else + this._actor_connection_size_id = null; + + super.vfunc_set_actor(actor); + + if (this.direction == 0) { + if (this.chained_effect) + this.chained_effect.get_actor()?.remove_effect(this.chained_effect); + else + this.chained_effect = new GaussianBlurEffect({ + radius: this.radius, + brightness: this.brightness, + width: this.width, + height: this.height, + direction: 1 + }); + if (actor !== null) + actor.add_effect(this.chained_effect); + } + } + + vfunc_paint_target(paint_node, paint_context) { + this.set_uniform_value("dir", this.direction); + + super.vfunc_paint_target(paint_node, paint_context); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl new file mode 100644 index 0000000..58d2694 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl @@ -0,0 +1,14 @@ +uniform sampler2D tex; + +vec3 hsl_to_rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main(void) { + vec2 uv = cogl_tex_coord_in[0].xy; + vec4 hsla = texture2D(tex, uv); + vec4 rgba = vec4(hsl_to_rgb(hsla.xyz), hsla.w); + cogl_color_out = rgba; +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js new file mode 100644 index 0000000..fe53114 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js @@ -0,0 +1,31 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'hsl_to_rgb.glsl'; +const DEFAULT_PARAMS = {}; + + +export const HslToRgbEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "HslToRgbEffect", + Properties: {} + }, class HslToRgbEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl new file mode 100644 index 0000000..4142a46 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl @@ -0,0 +1,44 @@ +uniform sampler2D tex; +uniform float radius; +uniform int iterations; +uniform float brightness; +uniform float width; +uniform float height; +uniform bool use_base_pixel; + +float srand(vec2 a) { + return sin(dot(a, vec2(1233.224, 1743.335))); +} + +float rand(inout float r) { + r = fract(3712.65 * r + 0.61432); + return (r - 0.5) * 2.0; +} + +void main() { + vec2 uv = cogl_tex_coord0_in.st; + vec2 p = 16 * radius / vec2(width, height); + float r = srand(uv); + vec2 rv; + + int count = 0; + vec4 c = vec4(0.); + + for (int i = 0; i < iterations; i++) { + rv.x = rand(r); + rv.y = rand(r); + vec2 new_uv = uv + rv * p; + if (new_uv.x > 2. / width && new_uv.y > 2. / height && new_uv.x < 1. - 3. / width && new_uv.y < 1. - 3. / height) { + c += texture2D(tex, new_uv); + count += 1; + } + } + + if (count == 0 || use_base_pixel) { + c += texture2D(tex, uv); + count += 1; + } + + c.xyz *= brightness; + cogl_color_out = c / count; +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js new file mode 100644 index 0000000..fbf01a7 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js @@ -0,0 +1,187 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const St = await utils.import_in_shell_only('gi://St'); +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'monte_carlo_blur.glsl'; +const DEFAULT_PARAMS = { + radius: 2., iterations: 5, brightness: .6, + width: 0, height: 0, use_base_pixel: true +}; + + +export const MonteCarloBlurEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "MonteCarloBlurEffect", + Properties: { + 'radius': GObject.ParamSpec.double( + `radius`, + `Radius`, + `Blur radius`, + GObject.ParamFlags.READWRITE, + 0.0, 2000.0, + 2.0, + ), + 'iterations': GObject.ParamSpec.int( + `iterations`, + `Iterations`, + `Blur iterations`, + GObject.ParamFlags.READWRITE, + 0, 64, + 5, + ), + 'brightness': GObject.ParamSpec.double( + `brightness`, + `Brightness`, + `Blur brightness`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.6, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'use_base_pixel': GObject.ParamSpec.boolean( + `use_base_pixel`, + `Use base pixel`, + `Use base pixel`, + GObject.ParamFlags.READWRITE, + true, + ), + } + }, class MonteCarloBlurEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + + const theme_context = St.ThemeContext.get_for_stage(global.stage); + theme_context.connectObject( + 'notify::scale-factor', + _ => this.set_uniform_value('radius', + parseFloat(this._radius * theme_context.scale_factor - 1e-6) + ), + this + ); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get radius() { + return this._radius; + } + + set radius(value) { + if (this._radius !== value) { + this._radius = value; + + const scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor; + + this.set_uniform_value('radius', parseFloat(this._radius * scale_factor - 1e-6)); + this.set_enabled(this.radius > 0. && this.iterations > 0); + } + } + + get iterations() { + return this._iterations; + } + + set iterations(value) { + if (this._iterations !== value) { + this._iterations = value; + + this.set_uniform_value('iterations', this._iterations); + this.set_enabled(this.radius > 0. && this.iterations > 0); + } + } + + get brightness() { + return this._brightness; + } + + set brightness(value) { + if (this._brightness !== value) { + this._brightness = value; + + this.set_uniform_value('brightness', parseFloat(this._brightness - 1e-6)); + } + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width + 3.0 - 1e-6)); + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height + 3.0 - 1e-6)); + } + } + + get use_base_pixel() { + return this._use_base_pixel; + } + + set use_base_pixel(value) { + if (this._use_base_pixel !== value) { + this._use_base_pixel = value; + + this.set_uniform_value('use_base_pixel', this._use_base_pixel ? 1 : 0); + } + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + } + else + this._actor_connection_size_id = null; + + super.vfunc_set_actor(actor); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js new file mode 100644 index 0000000..556ffa4 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js @@ -0,0 +1,43 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const St = await utils.import_in_shell_only('gi://St'); +const Shell = await utils.import_in_shell_only('gi://Shell'); + +const DEFAULT_PARAMS = { + unscaled_radius: 30, brightness: 0.6 +}; + + +export const NativeDynamicBlurEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "NativeDynamicBlurEffect" + }, class NativeDynamicBlurEffect extends Shell.BlurEffect { + constructor(params) { + const { unscaled_radius, brightness, ...parent_params } = params; + super({ ...parent_params, mode: Shell.BlurMode.BACKGROUND }); + + this._theme_context = St.ThemeContext.get_for_stage(global.stage); + this._theme_context.connectObject( + 'notify::scale-factor', + _ => this.radius = this.unscaled_radius * this._theme_context.scale_factor, + this + ); + + utils.setup_params(this, params); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get unscaled_radius() { + return this._unscaled_radius; + } + + set unscaled_radius(value) { + this._unscaled_radius = value; + this.radius = value * this._theme_context.scale_factor; + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js new file mode 100644 index 0000000..fe003f5 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js @@ -0,0 +1,43 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const St = await utils.import_in_shell_only('gi://St'); +const Shell = await utils.import_in_shell_only('gi://Shell'); + +const DEFAULT_PARAMS = { + unscaled_radius: 30, brightness: 0.6 +}; + + +export const NativeStaticBlurEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "NativeStaticBlurEffect" + }, class NativeStaticBlurEffect extends Shell.BlurEffect { + constructor(params) { + const { unscaled_radius, brightness, ...parent_params } = params; + super({ ...parent_params, mode: Shell.BlurMode.ACTOR }); + + this._theme_context = St.ThemeContext.get_for_stage(global.stage); + this._theme_context.connectObject( + 'notify::scale-factor', + _ => this.radius = this.unscaled_radius * this._theme_context.scale_factor, + this + ); + + utils.setup_params(this, params); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get unscaled_radius() { + return this._unscaled_radius; + } + + set unscaled_radius(value) { + this._unscaled_radius = value; + this.radius = value * this._theme_context.scale_factor; + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl similarity index 100% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.glsl rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js new file mode 100644 index 0000000..3049fa1 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js @@ -0,0 +1,76 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'noise.glsl'; +const DEFAULT_PARAMS = { + noise: 0.4, lightness: 0.4 +}; + + +export const NoiseEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "NoiseEffect", + Properties: { + 'noise': GObject.ParamSpec.double( + `noise`, + `Noise`, + `Amount of noise integrated with the image`, + GObject.ParamFlags.READWRITE, + 0.0, 1.0, + 0.4, + ), + 'lightness': GObject.ParamSpec.double( + `lightness`, + `Lightness`, + `Lightness of the grey used for the noise`, + GObject.ParamFlags.READWRITE, + 0.0, 2.0, + 0.4, + ), + } + }, class NoiseEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get noise() { + return this._noise; + } + + set noise(value) { + if (this._noise !== value) { + this._noise = value; + + this.set_uniform_value('noise', parseFloat(this._noise - 1e-6)); + this.set_enabled(this.noise > 0. && this.lightness != 1); + } + } + + get lightness() { + return this._lightness; + } + + set lightness(value) { + if (this._lightness !== value) { + this._lightness = value; + + this.set_uniform_value('lightness', parseFloat(this._lightness - 1e-6)); + this.set_enabled(this.noise > 0. && this.lightness != 1); + } + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.js deleted file mode 100644 index 8d9464c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/noise_effect.js +++ /dev/null @@ -1,109 +0,0 @@ -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; -import Shell from 'gi://Shell'; - - -const SHADER_PATH = GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, 'noise_effect.glsl', GLib.UriFlags.NONE))[0]; - -const get_shader_source = _ => { - try { - return Shell.get_file_contents_utf8_sync(SHADER_PATH); - } catch (e) { - console.warn(`[Blur my Shell] error loading shader from ${SHADER_PATH}: ${e}`); - return null; - } -}; - -export const NoiseEffect = new GObject.registerClass({ - GTypeName: "NoiseEffect", - Properties: { - 'noise': GObject.ParamSpec.double( - `noise`, - `Noise`, - `Amount of noise integrated with the image`, - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 0.4, - ), - 'lightness': GObject.ParamSpec.double( - `lightness`, - `Lightness`, - `Lightness of the grey used for the noise`, - GObject.ParamFlags.READWRITE, - 0.0, 2.0, - 0.4, - ), - } -}, class NoiseShader extends Clutter.ShaderEffect { - constructor(params, settings) { - super(params); - - this._noise = null; - this._lightness = null; - - this._static = true; - this._settings = settings; - - if (params.noise) - this.noise = params.noise; - if (params.lightness) - this.lightness = params.lightness; - - // set shader source - this._source = get_shader_source(); - if (this._source) - this.set_shader_source(this._source); - - this.update_enabled(); - } - - get noise() { - return this._noise; - } - - set noise(value) { - if (this._noise !== value) { - this._noise = value; - - this.set_uniform_value('noise', parseFloat(this._noise - 1e-6)); - } - this.update_enabled(); - } - - get lightness() { - return this._lightness; - } - - set lightness(value) { - if (this._lightness !== value) { - this._lightness = value; - - this.set_uniform_value('lightness', parseFloat(this._lightness - 1e-6)); - } - } - - update_enabled() { - // don't anything if this._settings is undefined (when calling super) - if (this._settings === undefined) - return; - - this.set_enabled( - this.noise > 0 && - this._settings.COLOR_AND_NOISE && - this._static - ); - } - - - vfunc_paint_target(paint_node = null, paint_context = null) { - this.set_uniform_value("tex", 0); - - if (paint_node && paint_context) - super.vfunc_paint_target(paint_node, paint_context); - else if (paint_node) - super.vfunc_paint_target(paint_node); - else - super.vfunc_paint_target(); - } -}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js new file mode 100644 index 0000000..e9cad9b --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js @@ -0,0 +1,88 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +import { UpscaleEffect } from './upscale.js'; +import { DownscaleEffect } from './downscale.js'; + +const DEFAULT_PARAMS = { + factor: 8, downsampling_mode: 0 +}; + + +export const PixelizeEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "PixelizeEffect", + Properties: { + 'factor': GObject.ParamSpec.int( + `factor`, + `Factor`, + `Factor`, + GObject.ParamFlags.READWRITE, + 0, 64, + 8, + ), + 'downsampling_mode': GObject.ParamSpec.int( + `downsampling_mode`, + `Downsampling mode`, + `Downsampling mode`, + GObject.ParamFlags.READWRITE, + 0, 2, + 0, + ) + } + }, class PixelizeEffect extends Clutter.Effect { + constructor(params) { + super(); + + this.upscale_effect = new UpscaleEffect({}); + this.downscale_effect = new DownscaleEffect({}); + + utils.setup_params(this, params); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get factor() { + // should be the same as `this.downscale_effect.divider` + return this.upscale_effect.factor; + } + + set factor(value) { + this.upscale_effect.factor = value; + this.downscale_effect.divider = value; + } + + get downsampling_mode() { + return this.downscale_effect.downsampling_mode; + } + + set downsampling_mode(value) { + this.downscale_effect.downsampling_mode = value; + } + + vfunc_set_actor(actor) { + // deattach effects from old actor + this.upscale_effect?.actor?.remove_effect(this.upscale_effect); + this.downscale_effect?.actor?.remove_effect(this.downscale_effect); + // attach effects to new actor + if (actor) { + if (this.upscale_effect) + actor.add_effect(this.upscale_effect); + if (this.downscale_effect) + actor.add_effect(this.downscale_effect); + } + + super.vfunc_set_actor(actor); + } + + vfunc_set_enabled(is_enabled) { + this.upscale_effect?.set_enabled(is_enabled); + this.downscale_effect?.set_enabled(is_enabled); + super.vfunc_set_enabled(is_enabled); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl new file mode 100644 index 0000000..b7a35ac --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl @@ -0,0 +1,18 @@ +uniform sampler2D tex; + +vec3 rgb_to_hsl(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +void main(void) { + vec2 uv = cogl_tex_coord_in[0].xy; + vec4 rgba = texture2D(tex, uv); + vec4 hsla = vec4(rgb_to_hsl(rgba.xyz), rgba.w); + cogl_color_out = hsla; +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js new file mode 100644 index 0000000..5c4eb05 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js @@ -0,0 +1,31 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'rgb_to_hsl.glsl'; +const DEFAULT_PARAMS = {}; + + +export const RgbToHslEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "RgbToHslEffect", + Properties: {} + }, class RgbToHslEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl new file mode 100644 index 0000000..5cc06ec --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl @@ -0,0 +1,57 @@ +uniform sampler2D tex; +uniform int factor; +uniform float width; +uniform float height; + +#define CORRECTION 2.25 +#define SIZE_ADDITION 3 + +vec4 get_texture_at_position(vec2 position) { + vec2 raw_position = position + vec2(CORRECTION, CORRECTION); + vec2 raw_uv = raw_position / vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + + return texture2D(tex, raw_uv); +} + +ivec2 get_corrected_position() { + vec2 raw_uv = cogl_tex_coord0_in.st; + vec2 raw_position = raw_uv * vec2(width + SIZE_ADDITION, height + SIZE_ADDITION); + return ivec2(raw_position - vec2(CORRECTION, CORRECTION)); +} + +void main() { + ivec2 corrected_position = get_corrected_position(); + + vec2 adjusted_position = corrected_position / factor; + + cogl_color_out = get_texture_at_position(adjusted_position); + + // round + if (distance(corrected_position, (floor(adjusted_position) + 0.5) * factor) < factor / 2.5) { + //cogl_color_out = get_texture_at_position(adjusted_position); + } else { + //cogl_color_out = vec4(0, 0, 0, 1); + } + + // square + if (mod(corrected_position.x, factor) >= 2 && mod(corrected_position.y, factor) >= 2) { + //cogl_color_out = get_texture_at_position(adjusted_position); + } else { + //cogl_color_out = vec4(0, 0, 0, 1); + } + + // local mix + vec4 color = vec4(0); + int count = 0; + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + vec2 lookup_position = adjusted_position + vec2(i, j); + if (all(greaterThanEqual(lookup_position, vec2(0, 0))) && + all(lessThan(lookup_position, vec2(width, height) / factor))) { + color += get_texture_at_position(lookup_position); + count += 1; + } + } + } + //cogl_color_out = color / count; +} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js new file mode 100644 index 0000000..fb719c3 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js @@ -0,0 +1,120 @@ +import GObject from 'gi://GObject'; + +import * as utils from '../conveniences/utils.js'; +const Shell = await utils.import_in_shell_only('gi://Shell'); +const Clutter = await utils.import_in_shell_only('gi://Clutter'); + +const SHADER_FILENAME = 'upscale.glsl'; +const DEFAULT_PARAMS = { + factor: 8, width: 0, height: 0 +}; + + +export const UpscaleEffect = utils.IS_IN_PREFERENCES ? + { default_params: DEFAULT_PARAMS } : + new GObject.registerClass({ + GTypeName: "UpscaleEffect", + Properties: { + 'factor': GObject.ParamSpec.int( + `factor`, + `Factor`, + `Factor`, + GObject.ParamFlags.READWRITE, + 0, 64, + 8, + ), + 'width': GObject.ParamSpec.double( + `width`, + `Width`, + `Width`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ), + 'height': GObject.ParamSpec.double( + `height`, + `Height`, + `Height`, + GObject.ParamFlags.READWRITE, + 0.0, Number.MAX_SAFE_INTEGER, + 0.0, + ) + } + }, class UpscaleEffect extends Clutter.ShaderEffect { + constructor(params) { + super(params); + + utils.setup_params(this, params); + + // set shader source + this._source = utils.get_shader_source(Shell, SHADER_FILENAME, import.meta.url); + if (this._source) + this.set_shader_source(this._source); + } + + static get default_params() { + return DEFAULT_PARAMS; + } + + get factor() { + return this._factor; + } + + set factor(value) { + if (this._factor !== value) { + this._factor = value; + + this.set_uniform_value('factor', this._factor); + } + } + + get width() { + return this._width; + } + + set width(value) { + if (this._width !== value) { + this._width = value; + + this.set_uniform_value('width', parseFloat(this._width - 1e-6)); + } + } + + get height() { + return this._height; + } + + set height(value) { + if (this._height !== value) { + this._height = value; + + this.set_uniform_value('height', parseFloat(this._height - 1e-6)); + } + } + + vfunc_set_actor(actor) { + if (this._actor_connection_size_id) { + let old_actor = this.get_actor(); + old_actor?.disconnect(this._actor_connection_size_id); + } + if (actor) { + this.width = actor.width; + this.height = actor.height; + this._actor_connection_size_id = actor.connect('notify::size', _ => { + this.width = actor.width; + this.height = actor.height; + }); + } + else + this._actor_connection_size_id = null; + + super.vfunc_set_actor(actor); + } + + vfunc_paint_target(paint_node, paint_context) { + // force setting nearest-neighbour texture filtering + this.get_pipeline().set_layer_filters(0, 9728, 9728); + + super.vfunc_paint_target(paint_node, paint_context); + } + }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/extension.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/extension.js index cd65616..443d7b6 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/extension.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/extension.js @@ -4,10 +4,12 @@ import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; +import { update_from_old_settings } from './conveniences/settings_updater.js'; +import { PipelinesManager } from './conveniences/pipelines_manager.js'; import { EffectsManager } from './conveniences/effects_manager.js'; import { Connections } from './conveniences/connections.js'; import { Settings } from './conveniences/settings.js'; -import { Keys } from './conveniences/keys.js'; +import { KEYS } from './conveniences/keys.js'; import { PanelBlur } from './components/panel.js'; import { OverviewBlur } from './components/overview.js'; @@ -15,16 +17,10 @@ import { DashBlur } from './components/dash_to_dock.js'; import { LockscreenBlur } from './components/lockscreen.js'; import { AppFoldersBlur } from './components/appfolders.js'; import { WindowListBlur } from './components/window_list.js'; +import { CoverflowAltTabBlur } from './components/coverflow_alt_tab.js'; import { ApplicationsBlur } from './components/applications.js'; import { ScreenshotBlur } from './components/screenshot.js'; -// This lists the components that need to be connected in order to either use -// general sigma/brightness or their own. -const INDEPENDENT_COMPONENTS = [ - "overview", "appfolder", "panel", "dash_to_dock", "applications", - "lockscreen", "window_list", "screenshot" -]; - /// The main extension class, created when the GNOME Shell is loaded. export default class BlurMyShell extends Extension { @@ -34,9 +30,12 @@ export default class BlurMyShell extends Extension { // create it first as it is very useful when debugging crashes global.blur_my_shell = this; + // update from old settings, very important for hacks level specifically + update_from_old_settings(this.getSettings()); + // create a Settings instance, to manage extension's preferences // it needs to be loaded before logging, as it checks for DEBUG - this._settings = new Settings(Keys, this.getSettings()); + this._settings = new Settings(KEYS, this.getSettings()); this._log("enabling extension..."); @@ -49,8 +48,11 @@ export default class BlurMyShell extends Extension { // create a global effects manager (to prevent RAM bleeding) this._effects_manager = new EffectsManager(this._connection); + // create a global pipelines manager, that helps talking with preferences + this._pipelines_manager = new PipelinesManager(this._settings); + // create an instance of each component, with its associated Connections - let init = _ => { + let init = () => { // create a Connections instance, to manage signals let connection = new Connections; @@ -66,6 +68,7 @@ export default class BlurMyShell extends Extension { this._lockscreen_blur = new LockscreenBlur(...init()); this._appfolder_blur = new AppFoldersBlur(...init()); this._window_list_blur = new WindowListBlur(...init()); + this._coverflow_alt_tab_blur = new CoverflowAltTabBlur(...init()); this._applications_blur = new ApplicationsBlur(...init()); this._screenshot_blur = new ScreenshotBlur(...init()); @@ -82,7 +85,7 @@ export default class BlurMyShell extends Extension { // watch for changes to the session mode this._connection.connect(Main.sessionMode, 'updated', - _ => this._on_session_mode_changed(Main.sessionMode) + () => this._on_session_mode_changed(Main.sessionMode) ); } @@ -100,11 +103,10 @@ export default class BlurMyShell extends Extension { this._connection.connect( Main.layoutManager, 'startup-complete', - this._enable_components.bind(this) + () => this._enable_components() ); - } else { + } else this._enable_components(); - } // try to enable the components as soon as possible anyway, this way the // overview may load before the user sees it @@ -155,6 +157,7 @@ export default class BlurMyShell extends Extension { // disable every component from user session mode if (this._user_session_mode_enabled) this._disable_user_session(); + this._overview_blur.restore_patched_proto(); // disable lockscreen blur too this._lockscreen_blur.disable(); @@ -166,6 +169,7 @@ export default class BlurMyShell extends Extension { this._appfolder_blur = null; this._lockscreen_blur = null; this._window_list_blur = null; + this._coverflow_alt_tab_blur = null; this._applications_blur = null; this._screenshot_blur = null; @@ -199,6 +203,7 @@ export default class BlurMyShell extends Extension { this._overview_blur.disable(); this._appfolder_blur.disable(); this._window_list_blur.disable(); + this._coverflow_alt_tab_blur.disable(); this._applications_blur.disable(); this._screenshot_blur.disable(); @@ -240,7 +245,7 @@ export default class BlurMyShell extends Extension { /// the user really needs it, as clipped redraws are a huge performance /// boost for the compositor. _update_clipped_redraws() { - if (this._settings.HACKS_LEVEL === 3) + if (this._settings.HACKS_LEVEL === 2) this._disable_clipped_redraws(); else this._reenable_clipped_redraws(); @@ -283,6 +288,9 @@ export default class BlurMyShell extends Extension { if (this._settings.window_list.BLUR) this._window_list_blur.enable(); + if (this._settings.coverflow_alt_tab.BLUR) + this._coverflow_alt_tab_blur.enable(); + if (this._settings.screenshot.BLUR) this._screenshot_blur.enable(); @@ -291,58 +299,31 @@ export default class BlurMyShell extends Extension { /// Updates needed things in each component when a preference changed _connect_to_settings() { - - // global blur values changed, update everybody - - this._settings.SIGMA_changed(() => { - this._update_sigma(); - }); - this._settings.BRIGHTNESS_changed(() => { - this._update_brightness(); - }); - this._settings.COLOR_changed(() => { - this._update_color(); - }); - this._settings.NOISE_AMOUNT_changed(() => { - this._update_noise_amount(); - }); - this._settings.NOISE_LIGHTNESS_changed(() => { - this._update_noise_lightness(); - }); - this._settings.COLOR_AND_NOISE_changed(() => { - // both updating noise amount and color calls `update_enabled` on - // each color and noise effects - this._update_noise_amount(); - this._update_color(); - }); - // restart the extension when hacks level is changed, easier than // restarting individual components and should not happen often either - this._settings.HACKS_LEVEL_changed(_ => this._restart()); + this._settings.HACKS_LEVEL_changed(() => this._restart()); - // connect each component to use the proper sigma/brightness/color - INDEPENDENT_COMPONENTS.forEach(component => { - this._connect_to_individual_settings(component); - }); - - // other component's preferences changed // ---------- OVERVIEW ---------- // toggled on/off this._settings.overview.BLUR_changed(() => { - if (this._settings.overview.BLUR) { + if (this._settings.overview.BLUR) this._overview_blur.enable(); - } else { + else this._overview_blur.disable(); - } + }); + + // overview pipeline changed + this._settings.overview.PIPELINE_changed(() => { + if (this._settings.overview.BLUR) + this._overview_blur.update_backgrounds(); }); // overview components style changed this._settings.overview.STYLE_COMPONENTS_changed(() => { - if (this._settings.overview.BLUR) { + if (this._settings.overview.BLUR) this._overview_blur.update_components_classname(); - } }); @@ -350,11 +331,26 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.appfolder.BLUR_changed(() => { - if (this._settings.appfolder.BLUR) { + if (this._settings.appfolder.BLUR) this._appfolder_blur.enable(); - } else { + else this._appfolder_blur.disable(); - } + }); + + // appfolder sigma changed + this._settings.appfolder.SIGMA_changed(() => { + if (this._settings.appfolder.BLUR) + this._appfolder_blur.set_sigma( + this._settings.appfolder.SIGMA + ); + }); + + // appfolder brightness changed + this._settings.appfolder.BRIGHTNESS_changed(() => { + if (this._settings.appfolder.BLUR) + this._appfolder_blur.set_brightness( + this._settings.appfolder.BRIGHTNESS + ); }); // appfolder dialogs style changed @@ -368,24 +364,22 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.panel.BLUR_changed(() => { - if (this._settings.panel.BLUR) { - this._panel_blur.enable(); - } else { - this._panel_blur.disable(); - } - }); - - this._settings.COLOR_AND_NOISE_changed(() => { - // permits making sure that the blur is not washed out when disabling - // the other effects if (this._settings.panel.BLUR) - this._panel_blur.invalidate_all_blur(); + this._panel_blur.enable(); + else + this._panel_blur.disable(); }); - // static blur toggled on/off + // static blur toggled on/off, really we can just reload the blur at this point this._settings.panel.STATIC_BLUR_changed(() => { if (this._settings.panel.BLUR) - this._panel_blur.update_all_blur_type(); + this._panel_blur.reset(); + }); + + // panel pipeline changed + this._settings.panel.PIPELINE_changed(() => { + if (this._settings.panel.BLUR) + this._panel_blur.update_pipeline(); }); // panel blur's overview connection toggled on/off @@ -422,11 +416,10 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.dash_to_dock.BLUR_changed(() => { - if (this._settings.dash_to_dock.BLUR) { + if (this._settings.dash_to_dock.BLUR) this._dash_to_dock_blur.enable(); - } else { + else this._dash_to_dock_blur.disable(); - } }); // static blur toggled on/off @@ -435,10 +428,10 @@ export default class BlurMyShell extends Extension { this._dash_to_dock_blur.change_blur_type(); }); - // dash-to-dock corner radius changed - this._settings.dash_to_dock.CORNER_RADIUS_changed(() => { - if (this._settings.dash_to_dock.STATIC_BLUR) - this._dash_to_dock_blur.set_corner_radius(this._settings.dash_to_dock.CORNER_RADIUS); + // overview pipeline changed + this._settings.dash_to_dock.PIPELINE_changed(() => { + if (this._settings.dash_to_dock.BLUR) + this._dash_to_dock_blur.update_pipeline(); }); // dash-to-dock override background toggled on/off @@ -464,35 +457,40 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.applications.BLUR_changed(() => { - if (this._settings.applications.BLUR) { + if (this._settings.applications.BLUR) this._applications_blur.enable(); - } else { + else this._applications_blur.disable(); - } }); // application opacity changed - this._settings.applications.OPACITY_changed(_ => { + this._settings.applications.OPACITY_changed(() => { if (this._settings.applications.BLUR) this._applications_blur.set_opacity( this._settings.applications.OPACITY ); }); + // application dynamic-opacity changed + this._settings.applications.DYNAMIC_OPACITY_changed(() => { + if (this._settings.applications.BLUR) + this._applications_blur.init_dynamic_opacity(); + }); + // application blur-on-overview changed - this._settings.applications.BLUR_ON_OVERVIEW_changed(_ => { + this._settings.applications.BLUR_ON_OVERVIEW_changed(() => { if (this._settings.applications.BLUR) this._applications_blur.connect_to_overview(); }); // application enable-all changed - this._settings.applications.ENABLE_ALL_changed(_ => { + this._settings.applications.ENABLE_ALL_changed(() => { if (this._settings.applications.BLUR) this._applications_blur.update_all_windows(); }); // application whitelist changed - this._settings.applications.WHITELIST_changed(_ => { + this._settings.applications.WHITELIST_changed(() => { if ( this._settings.applications.BLUR && !this._settings.applications.ENABLE_ALL @@ -501,7 +499,7 @@ export default class BlurMyShell extends Extension { }); // application blacklist changed - this._settings.applications.BLACKLIST_changed(_ => { + this._settings.applications.BLACKLIST_changed(() => { if ( this._settings.applications.BLUR && this._settings.applications.ENABLE_ALL @@ -514,11 +512,16 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.lockscreen.BLUR_changed(() => { - if (this._settings.lockscreen.BLUR) { + if (this._settings.lockscreen.BLUR) this._lockscreen_blur.enable(); - } else { + else this._lockscreen_blur.disable(); - } + }); + + // lockscreen pipeline changed + this._settings.lockscreen.PIPELINE_changed(() => { + if (this._settings.lockscreen.BLUR) + this._lockscreen_blur.update_lockscreen(); }); @@ -526,11 +529,21 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.window_list.BLUR_changed(() => { - if (this._settings.window_list.BLUR) { + if (this._settings.window_list.BLUR) this._window_list_blur.enable(); - } else { + else this._window_list_blur.disable(); - } + }); + + + // ---------- COVERFLOW ALT-TAB ---------- + + // toggled on/off + this._settings.coverflow_alt_tab.BLUR_changed(() => { + if (this._settings.coverflow_alt_tab.BLUR) + this._coverflow_alt_tab_blur.enable(); + else + this._coverflow_alt_tab_blur.disable(); }); @@ -556,157 +569,16 @@ export default class BlurMyShell extends Extension { // toggled on/off this._settings.screenshot.BLUR_changed(() => { - if (this._settings.screenshot.BLUR) { + if (this._settings.screenshot.BLUR) this._screenshot_blur.enable(); - } else { + else this._screenshot_blur.disable(); - } - }); - } - - /// Select the component by its name and connect it to its preferences - /// changes for general values, sigma and brightness. - /// - /// Doing this in such a way is less accessible but prevents a lot of - /// boilerplate and headaches. - _connect_to_individual_settings(name) { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // general values switch is toggled - component_settings.CUSTOMIZE_changed(() => { - if (component_settings.CUSTOMIZE) { - component.set_sigma(component_settings.SIGMA); - component.set_brightness(component_settings.BRIGHTNESS); - component.set_color(component_settings.COLOR); - component.set_noise_amount(component_settings.NOISE_AMOUNT); - component.set_noise_lightness(component_settings.NOISE_LIGHTNESS); - } - else { - component.set_sigma(this._settings.SIGMA); - component.set_brightness(this._settings.BRIGHTNESS); - component.set_color(this._settings.COLOR); - component.set_noise_amount(this._settings.NOISE_AMOUNT); - component.set_noise_lightness(this._settings.NOISE_LIGHTNESS); - } }); - // sigma is changed - component_settings.SIGMA_changed(() => { - if (component_settings.CUSTOMIZE) - component.set_sigma(component_settings.SIGMA); - else - component.set_sigma(this._settings.SIGMA); - }); - - // brightness is changed - component_settings.BRIGHTNESS_changed(() => { - if (component_settings.CUSTOMIZE) - component.set_brightness(component_settings.BRIGHTNESS); - else - component.set_brightness(this._settings.BRIGHTNESS); - }); - - // color is changed - component_settings.COLOR_changed(() => { - if (component_settings.CUSTOMIZE) - component.set_color(component_settings.COLOR); - else - component.set_color(this._settings.COLOR); - }); - - // noise amount is changed - component_settings.NOISE_AMOUNT_changed(() => { - if (component_settings.CUSTOMIZE) - component.set_noise_amount(component_settings.NOISE_AMOUNT); - else - component.set_noise_amount(this._settings.NOISE_AMOUNT); - }); - - // noise lightness is changed - component_settings.NOISE_LIGHTNESS_changed(() => { - if (component_settings.CUSTOMIZE) - component.set_noise_lightness(component_settings.NOISE_LIGHTNESS); - else - component.set_noise_lightness(this._settings.NOISE_LIGHTNESS); - }); - } - - /// Update each component's sigma value - _update_sigma() { - INDEPENDENT_COMPONENTS.forEach(name => { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // update sigma accordingly - if (component_settings.CUSTOMIZE) { - component.set_sigma(component_settings.SIGMA); - } - else { - component.set_sigma(this._settings.SIGMA); - } - }); - } - - /// Update each component's brightness value - _update_brightness() { - INDEPENDENT_COMPONENTS.forEach(name => { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // update brightness accordingly - if (component_settings.CUSTOMIZE) - component.set_brightness(component_settings.BRIGHTNESS); - else - component.set_brightness(this._settings.BRIGHTNESS); - }); - } - - /// Update each component's color value - _update_color() { - INDEPENDENT_COMPONENTS.forEach(name => { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // update color accordingly - if (component_settings.CUSTOMIZE) - component.set_color(component_settings.COLOR); - else - component.set_color(this._settings.COLOR); - }); - } - - /// Update each component's noise amount value - _update_noise_amount() { - INDEPENDENT_COMPONENTS.forEach(name => { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // update color accordingly - if (component_settings.CUSTOMIZE) - component.set_noise_amount(component_settings.NOISE_AMOUNT); - else - component.set_noise_amount(this._settings.NOISE_AMOUNT); - }); - } - - /// Update each component's noise lightness value - _update_noise_lightness() { - INDEPENDENT_COMPONENTS.forEach(name => { - // get component and preferences needed - let component = this['_' + name + '_blur']; - let component_settings = this._settings[name]; - - // update color accordingly - if (component_settings.CUSTOMIZE) - component.set_noise_lightness(component_settings.NOISE_LIGHTNESS); - else - component.set_noise_lightness(this._settings.NOISE_LIGHTNESS); + // screenshot pipeline changed + this._settings.screenshot.PIPELINE_changed(() => { + if (this._settings.screenshot.BLUR) + this._screenshot_blur.update_pipeline(); }); } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-window-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg similarity index 100% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-window-symbolic.svg rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg new file mode 100644 index 0000000..652f8c0 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg new file mode 100644 index 0000000..925e900 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg new file mode 100644 index 0000000..c37b9aa --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg new file mode 100644 index 0000000..f4115ad --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg @@ -0,0 +1,14 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/general-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/general-symbolic.svg deleted file mode 100644 index e11da07..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/general-symbolic.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-filled-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-filled-symbolic.svg deleted file mode 100644 index 8378c9c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-filled-symbolic.svg +++ /dev/null @@ -1,40 +0,0 @@ - - diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg new file mode 100644 index 0000000..fa045a8 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg new file mode 100644 index 0000000..d451b23 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-window-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg similarity index 100% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-window-symbolic.svg rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-mode-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-mode-symbolic.svg deleted file mode 100644 index cad2da8..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-mode-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg new file mode 100644 index 0000000..e6d2d9e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg new file mode 100644 index 0000000..5b0eb20 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo index a190bd4e1bfad65e8a3eef6418f046ec0c023368..9228b72cb3cfcae96fe60b20b1efa0f81b858f4e 100644 GIT binary patch delta 1895 zcmYk+Sxi({9LMqhj0{q!3y7#V$RaXQZ~>J?DWHgA!G*dI;u1BXE`h38XzG%Y#wLxi zse0m)7!x-h+^Xijxy3eZ-Qt5rV$z4I^`RP@)Fsx$81?%bhQ^cp=X2)Hz2~0uKmRiw zjpxh5ei4l2gOj3GVj|zG zQTI0>@3zG_0GlukzrhOLZ+q#Kap5jjVlty@=JRn1E=Lw`oj4Fr;urV}YDKvTX6-l; zxnyTC884tFatk$qho}iXL1p9_7V&=b@wQeh!AW=mXXD?hT9` zLXu-Ia0tFZ-Ivn0dqP3fI3di(amdiN6vOJY(9r`MP&3|w1-J_}(_fJ>?GEa`zi=)- zLe)eWH#K4dmg8A$z^7P&HKeH$zei2v8rES~fAX&zvUqDQE=P93wxe#`gL=VX+~+g9 zh^mzZEI$i3qZV)wHQ*_niLY@m*02wHei^DpHX%P*2QoL?olO3fx=t=Iw*7>o@iNxq zzc>yjv+>&7Hq=VDpfd3XYM}e53_V5F%3IV611W3+#`B@yGf@j1gA8q@VLBt|%tEc; zE1ZEpV+|&7rgY;xT!^bsFa8bF@dmELCzynbS@u?3i<;O=WGD+z80?k>Q47w)UKk!v zN2w}7?Oi>t#~qlDG30M97NAo79jfYgp;meXmD1z54KGEn&luWWjB`-;twv2~9V(L@ zI7;V#J00!yIn=~xO#>97&ijw3mET6q{2gk7vE+LsCLy(GpAgy_J)_@C2(=1A&yfhL zCU{TeSZ8A;q4p_JP6T-W|4k=AE3S=RsY6m^#e|Bnr{zRD+Q+hJpE*XFGBAzMKdIV8 zLaQzyl(j-a+3jiJDtctrW<{@1xRF1R3>-@+b!0MftdtcMSx-|%`=ehEhWW4gb;_M=CWA+N4*Pe6P V=gyDZ>i$U|;fR70;~K3Bgd^eY(5c)m2SZ z^$ZgS$wU?gBqA%3MNk0Y@RV365AYDlFNrn}LFU!wA&7vb*oshODN>|JQI!1t=bWmp zo*iS-+UoyQb)D~g=ezvB@0|U~jn_OM@fmV`i0jPNQS@c-kFVp4&$q9SqTdEz0Dlww zdvFE(XYd60I=BXQ-xWm`oPj?CUj;t^eutM0_!4*n_+#)U@ZZ4qfmgjdirx?22r?wP zHQaZ=+qi!)+*?rdY=K?y??6OEZ-B?a{{TPs4lX8{a$mkDimnBJ21<`NK>kJl%a_Kz z=e<$%Yv4`bHDD*;LGV|&zYo;-Q{X$n^Wd+7m%!fwC*VWim%#_XAAk>o*Rd$A^8|Pl z+yrIHuYtb~ehVCe-v_nsoB7%TS3%A59q=&tBKS%04N&?%f>P4=94P(zd}*FJsBwP+ zO5d-5h>o5E?*+dN7T}LS$^H0^tOfich{>W?LCJXyyac`pYWxWnE4?p)lK%uK`9qL@ zQOeg>!KXn&AbKy#eGvQrsP_(l()&J8^Be_N!E>PIdn(|UK)wGwh>Fo)f(O9wg3{w( zK>6)WQ1AT@D0x?7%n|rLa0A>16`wDIcZ08kzYpI08^jPe2erQMgYw%A1jWPP8Bp@R z3Z4PK4&D#G4xR;XAz1bP6ucAsE~q&D5vXxL12ylzgMUH%U5^oNK;U&45( z6nzT(Eckg)^S=o`173BjU;ne9?D-t{IQSD#df)fEUau1%sTn;1O1~*6yFCS74L$?P z?q32Q1YZD4@TcG^xQX(LuP=b|<13)_cn$nC_@AKsa}lTO_XH$mqb=|{@L5p5|0(zt z@UO!2&h0*5?gsVVIZ%3E1m!0ScEA~^IQteTxqkz`6MPAj-!FsrfUkgrZ1nCsydJlL z*K)rfl)m?Zvg0Z655bo}Oc~vDXA~U*4}%um0`CHU44wzy{}G>0p8++`^Pu#58I+t? z!DHZEANBs*0grP33Ml*C#Fy504AeT#fJ_}d4!#4_TJ(`EN!bYZM}NSj&ox{u%Y7aQ zDA0PO>jf^RasE3865{T2gm3A3FV|!4iT{#)^TeIncoPIHmQF0KuDKNo4`>?rt-ybDTfq6ZuE6ewb^>rT9O=^)Q!weH)iP^6v&0lobuQl*jwI zuHsUx=_4-EM?RCE_1WZ7u64QAxD+oJx%82*KkokW@t{8m5%)R3w_^H3T%Y06=MgSa zZRvB8yO>Kn6|I>xDJzo?&32Lv^6k=Od1b2H^wN3J-Q(xQPlJKEXSOi2q+iVo>m-z3m7X1=oZ*#bWxX9Uu)}zsR^63zOj+1|KAqZZU{T-p<9TVN zF9L^oF^#jnH8CQ}D()p|Qtgl?>y4_1e?ltS!n9Cv0YmI5n?*@z2ajJYiD1WmCN~E9}q~mW6d!O!!1=3*F5y zPY0M&zTE5iAc@m_q=oIIw*5l6bmJXxhZcTkbaW95PHgMmi#eL|hJr9Ust{svwcEpk zA{iwZ&dlP>%9+*JtjFb8hPj|e{C8v@o?kk_e5B{xwo>fJjVzYePOy{iM2L!8d43T6w&IQ%d zY?>i@#LXkJ$npfEd0hwwbcGc>eQ?JNaaq|x^vJxd@@eu%7O&?JPLp ztN3|tK`cw+zbaSs%aRzNPGE5d7zB&*%dM(FiXhz zg7{j}iM6Epc87#BHWqJMYkwBh>ukWA4=GMdKG#)5dGO}r4hP?2QM5!fuI z?+2WZG@B<2$2`M%s*n*YxB^Z2G-21E?4nUOF&*^Siri=Of)1LsYo1=ylht)zDmJoX z*BgaSY3f+m_1scIbZo|PpsWvc*?qBd42?y-)l-glqsQWcT|(WE!=Jgj%Pmo&>UPtJ`i3Yc4q9~-2kkMw+P3k; zC1$e%HjmMzaY6&GJ)1uPFz2A0`tLnzXiY|)Q-jW9VvjsKWMER&mCo66lngo$Q`yP zb7#iN#5DV6X`Ez-+2zLtzCChr^LXd}#d}&HyY|kpte+2P%nzCSdr7r&0X^chLl-$M z51DM{Zp$MF4;%mIk<5Jfh&gb05@(`Ieo5w@?!nH$ZmmSOXXeaK37uqS3u>eH zCw`_TOT>aaDz@Ty)P1Yh+OIs8+fgke3O9^q?>=(9A`;^f@;MkH12o})M`6+l`yZl_ zu-3zJVp-KB&#R7(g%-l%MpT{?MWaqj;=sc08a;wc#`vFVmpwa(%)_L=mX2iHhXN= z)Shn160;cxMeBZtiPi0(G`K=XCLPX-CJKJ_ugL1IoS!;{bW&s~Mmj1|pEk`2r8FTu zt(g=%t42n2Z{{=R*3SI|YU-4TZQ~>y63IgRvX+i$N%&Q#M5pIH5~ZN2Ew)ns<`xE? zVA0k=5s4ezDd$1)ovnOMys$UqSco2yQz7Tq)=z7!Q)fd&m=7frj)m5mP;fuUHqqjl zt5(s*HmavPW#neY_bQ6c?~5nglA0L@NHp@|ZX7g)AnS(ObyCgi^{Q<1MCND(Q5}}` zaJMg>CsnVoiIPu@%n*fXRfm)|V>H>dl9JfNHF8!PrazHOO zHfi#tOwq#Sh0=3OaO=I6W|RffEN?mB+mc5*hapcx`mrWXlE}TrKkB_E-IaBu6VN^b zwv`41J?rG5$aRqoYKV5slRLG54&JXV(>13!OR_1h8Cg0Ook;Bwl|;P`lTL<3`RFZq zePkzDGQ*Bks>)7mh6mh^rFDeFZ#HG8$m;`Y6?+(~vX+?%OKcKU3X>C=(xqoF|82IF z=GxayS((vPjn(5($C-dcqh`b+jJEwKC(ul7KIbR+kxb@P3HQy#N)_ECE^XfOV>pnO zX5-wmhyp0kU62yyRbE1wKB!J>y2yPyjv1j#T>3XTz(6&OGU~Ak7epuQq&{O}Lv#Tq zvn;xt;1kDSI`|;T_c&y7I=C!6p3mt%OG>kHa-)s`&Yl|UqIbx{)duYqf&OS?tR*TR}ege}=kUFv>{1;5pnz9k*s1#>J<5OL`0M z?UHxp^4MSJFpkQCPW)v9{%$W?KP~IpSWvI7DtAQQiq24{2+DZsn2apc>0pZ#*msc& zlW47ucGa&d>(=7;<+W-UCXGLs+IQHTV ztrnI(-DtywoXweS4%@3 zHl&q|!HUz^`cp32Xif{udQF}Rqg@5Lb@0_`89q9h6Yg~n!nqf>lkLzpaNt#v`UK*c zWaNvJ%My8iQA{{iA{~5uxbBZ~+n$0Pjek+mYlgRK=;iMXo$)*q8r_cLbV$Ehvm<=D zAQKTG0YTWP`YrLn!aD@OqJayYgtTr=tA)XHzA14>V3%Li(HH9@XE7TBU}besBX%y# zr4c&&>Y65#YSy5hG04Y~B@dP0P|%cm-HqB^m5i>g&=I~50)7`sH=*EsD++J~jCAo4VU_)yi7aG&gO+lN>C%^4(F_b6Qe;0s+^6e;_%g~0G(P^SsHdu1u zRzkDHI(>;55}WCoi)2YmJ^QZ%EkMkZ`qC2%}FosgpOhFB^C9W z)E=@`qN<^~^EJD_+Ca<1rVc=xAdD()ucRYq)L%Ge;E&dFsx6IMv7>|zhilsOkzkF~ zpu-)GUGHq?=8_ifAZ?NH-aKzN$fy0%sD{2FIJcLU^B0xAS+yU!YBC>sHKn%B&$L&m z2f_h$%i~+#mhk1)Cmz9;JqUol-F44InB3wT2X#x>h7rBQrs8O?BE;f*K4pY29GzBA zOgF>n3uLW?9VD0k+STh27rtxAbYwC>NwERltjlEb7yr7QiaResbh{CEjho-jwd%F& pV^Gg;7I%wKz%<2N45Vyvym%=IyI@zLMP0kv#0<7 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo index d44c239dfb548c33007d03c72d6f97e5bcf1c94a..782420bc163c041dd042682ddb9403b939841b61 100644 GIT binary patch delta 1901 zcmY+^drVhl9LMqJ_v0dgqFj|bf&$7-Ac277he+Th?bl_@7Q|?}MgkisUda6#k+aaX zJX8NDT{6@uEn#P{+Q>gzH`@Ax1(j=S6@NtWM^amttvTPH^EpW`DqhZ<8Vzg~q|sOwuW6sui* z7{hr3>i%Zr*`@{K@BpUaajfO}<|36E8oov!#?z}t{uFM5o|M-6BZm60VZ=lRCN(|WKHt8oGeFc4QUI8PtszP!AZ! zI5y@7xRvu6roRPOkY_DPB|d|Du?t60dn%cWKCHu796)90JZcZzN+AELd_hAVE}{k$ zpBQ{2p2WvFzlO@x->3(Lv(>fM&ml=LU8w6PQA_cfd)-3*&1DX{Z_@Q+EaZGPKt(h6 zt|LuY;Ccj=;@g;su?+haEJHo$ebj(I!6Ez=v#_6ZUBSyplkuel2k)iG#e2~z1B!B?^dGV!3EPc-<4N zbv{u>Xk%_9v^*+GcR8WYv^JlXGlSqQ?l2)#wh}74f;h+G|I~Tw{#RH+=hNHdwz4A5 zcVj0O5qx)?J;KXlb`UDL)}@G9Yb3J4@17z@1`YLwRu(c*}QK(_U8O+Uh8C0uU%T)@3mepUAPZ`D#L96 literal 13175 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo index c7e0d94ee179748e37badb449666c668a68c2a81..118ad996c8e5eaac3afd6b7041dbb48fea5269e8 100644 GIT binary patch literal 1254 zcmZ8g%Z?jG6fGdU38zo{4@9z{0sOG;4dJ?`1Pe#OmRbq_i=s$ z{2urt@J(Yw_~hhEU>lAnJ*IOJx;w zp{FXNo~a$F!9eu`g`5NVqAWvhCb&^H^Hk}vGM=93kZVg!Lw&9+InH$L6R}@aM)x`B z(t2^Q)$-yV*WPQk%Lw9r#eE$n;$-IX%pSRo+uMKxVLP z)jvTVIqvD4O|7Viu2k?yEgb{oC})=`N1-IAI7`H_E6-4)Jj~<|%6a6QE)``lkv><( z+~(Sm(nTgj1E0dIb*t|R~rxG?P0;%B>l4Z60hvA=An{Z#YIZ{Q{{TB z&)90Zm4{IIwAsu{A5@k+Q9UTDq;$h(wJORtV{iVe@w9Ptcywpmg`K3; z_^Px)StLHGP+4qXvofsh9`(^kuR`bh?p@j5`o#hV%E>#nUuN14Q)>5gXdELCHu7%i z3ZIg#mPg;&-J{jEW9h>V?d&xk$$QEww`$SDRY~-D(vq1vZwP!LZ3=yLv7R%^c&v@K z*`M#ms5y)rRf-^0DEoi)?<0q$n(Aqe91fnDj>GdB=j6!#4_gIT;Wr3_EeK z(SzpNVHrp~h{H_RuICr?OYuNWoR(J?i`ihn1A|AK`Hl_Pgjgwb)yQMW|8Kk|xQVAN z{<4al;l~h+VG{cB+0&6nU4;54C_E}sv6zMETaIg6u%BO|5%lbLShd|$k9PHR^iIUT DE7g?2 delta 675 zcmY*VO^eh(5be?NYY>Dvc@Qb)q_7732_u4D{DQ@MCsT2nbUNAY&fthJdssxTf``D$ z9`_=`;B_vN*+amSKfuF){tjQq5yv7gFP(Z_Rj+Uk+t>vt(i6_cNbg!Z*{^0y~3z_S-0PXr@y_~F7GZ z3WnzLQ55w_d&)k>lo6<;o};HOG0CtAEa2ThG*d z-qucysKm56d#lU@6Lq)D&K`m%-FXsQd%M=cxU}8Hvmwu|x^s5Y)@dr!U|jqLY3Sqa diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo index 2643e110d602b1b49c73c7a35f0a6c15b850695c..818a7e23bfcf957eb8460644755798b4b7b049ed 100644 GIT binary patch literal 3494 zcmcIkNo*WN6fJg`u!Mlb1*Fe`h{ZjgF+qfJ9D+lF0vMvi0S*YMJX4-2+{>uD$4lT~ z$HYW(j0uPcp%5W1NJt20SG?tjxK&*_n!X+kv}p5F*F>z?*fG4EzXq2k->&F5s8I{lI15gTOm)6ykYc0aypV1$+*81$ZZL3zA$xO*?_# zvE3~~Tn28qRfwm7KLAevAH6N(^9_*wz6WxhKLWX~UxAMTH{xRv*bihr0q{QHK_J)j z0q|qsS>RK^p$$Sz0pA7w1iTJT5%3pa2{;CFC{Jv{!~9U5%gZ%z{O%v?0^02#>vuPv zd+>mUfW+aJ#9u!gK(>xVJ~s0i^4jrfh2)aa-xr++ZmtH4R+Cp6lK)0&D2R-N|=IYpx}ymXpS6zi%Eok5@{*%b}}N#Cb5sw(!* zU#o&7h@!OSPoXvyR+3i237ytB998wW3Q=A~H#djT8i? z$X5yKsi)v}P*spMY`Hkj%|w#QksrmR!!+Vrk-4sX9V+M0cK@Sh|Egj!*pWODgAl2f zhNw^MV^LB8Jsu z+JF*SXR!vGk#;JIMjgMd=J!C@8cLyY={FRn098>S$CNWn5sqpyuAt%2CRP$6a!g32 z!bGQ2*9iF!EYLmFrK?rM)hX$u$E8dBXd?SEp)oBZXaE}qa#9D4fYMlwE1xPlNo818 zG>V=nS*}r%sya$?F}lV#PtQ1R2$`{SQQPF43T|#PpKL@pVb};p-~_dFyDL0#D22x? z#RMyoF$N8pWOwpH?aBAU?oksZ}QYCm6&g6%L4s|{II-msEEi3XJ~ z7}_ zZYR%qh;pau;KQ@lTlb|7`>BkXOH?{=V0gE;wPVM$Mpf+X3d>Oi7fXq@j_5SE7j;PA z+a1M0QlhZ#mdU{5{gk~9gbx)90|Q0cyqWm5@ZdnPNKaFNV2$NsgMsWOZ;jk4n2{7(yOTPoG@S6cg#7nY!8v0HcRG$ zS+(?^aHNxV#vUX1E}0d4yNKA`D-KJrK8*m!unX5|q+3JGIZgy)6ll)bBhDnt zfz88&3Xr75VacrK{}DAXSwXIoX3Z@9E;cj0x_08!<~-~Vvn@-&&joyhyE%gpPQ$ZM zkjq)hlljmtKsc1X(AL?Uf^IAJs6CQVU*-}JXU)z-Lnlm@X^kzGPzC~U2V71_!A`mi=IDShpW+o#TQ?1zVQL)+%q`{~ zErl7+@oW~n+3l-Jeh2M3gDIF6=5xEiM*yL*foG6R{(1R}!Zabjaq+snk^u@_m4ioC{Yp9?^onKb JzDtja-vGQCo)F7a1|VPrVi_P-0b*t#)&XJ=umEBnprj>`2C0F8$xf`nL6NSGLAt*F zx-O0i9{yIop4w6Vey&_TiNz(lAw`LK#W{&3`9)R=j-@5}xrrs2$%#2Rl?v&pd8tK- gC8;Sug?Z_viRr1jA*qSERtkCfd8w1l*)kXz0N%|a?*IS* diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo index f95a0e812e885da2b537a139519196eaa49755ed..5f80e8bfa61bc2e3b024a1f422b7c49c5bcf99d4 100644 GIT binary patch delta 237 zcmeBDy24w3Pl#nI0}!wSu?!H005LZZ_W&^n>;PgOAl?bYEI@n=h|7TZG!U}_u@fT$ zgFle=0Md~_dIpeQ3B;d(SOCbM!_2_I1*F#kX?>vB4j>IO?*-5>bw&m^hOa=zHlTnk z8v_GS9t?m?u;Cy_!2rl|pk4+hn1EwJK~83JVo7FxUh!lOmg}3{Ss9u5=U;5NuX@PJ^1JX{glvP-}iY&hB3C4w;=<&CJ@d zgpiXoNgJdF5C{nfsNspX#EBEfb~gV260@&>c*qO?2A}V}v$nT!gji|!?%X-|obUOb z?>RI7{?-e>4fuSO?|1nAjPE!3{)?|Z=5s+{SzlrO8|!se*)D!Q2wvxZ#M<*Oq3*Mg+JK}`>Up7m!e@(HXCQN(&VToh&0ij%lpHE~f4ZPDBprOZs(!)!1};&xQV zSz0vBVlOVR9t>*??>$mCb7#l zk8$2qin(@{WV@_Mjnaf_7qum$noe)k&eAf^5;)6N zOn*rJaVZMP!U;1@YmGToPoljYR_5dLYX$6vW4# zoow0W%duUlsT31l{zcZeCW%Tk0?vGjn2Gw|qqt>o27!8=*o&AKQYBtn5-MybS+{^@ zM8AwTDr-|$`_xhufaZ3PG@ zmC%tG(MUx*w}26Jde}rXSI?Gcb}-CoF6-lbrVxHU$XA&SCe@jW7CA-RyjHjq1XTAk z`ZKXzwQMsupJzX%CBk<*;SX&tLKYn6u)i8Q*}WMJQ(Inayzg=k&lKIb6TUU<7U5#H zU>fJoh40(tSO>$mA#K4No;&b&2m^q%{coWhtlpa>e_J8M*Riz)-dTtc?|t;^vZHjEX>aK zvZAz|=8A2p{>?1!&LSmcRLqKu-84RX)t%jQPsZKGnRm~e+M{5;IoCLe$m!8=adkji zC5o9HBvG6mW3)wiVaww`SbQfux@V{C7**k^w4HV0w7X!Aw&JpJ9vo2;BK&@_VA6rR zERG*OX8hmdsd?qNnLpO}ap7#~^L@A4#%_m=@uf+;O(L!<2EH$IcN_1c@ul%)uJ9sL{Ue{v z>3hxTJY7mV;~UkzYI}TB5PYUvZ0-19axkhM5acnzZpv-bRJYl4fJFw$jK&{pA-505 zSFqd?8Q46=<1RR;GeFw#AlLb`=BT_0FTWG+`!xlCxdJ0DH{*Of3b{#rAgA742cjw@ zY#>v~HmZjN--FvSmmMWmbxCDj~J6@dFR&7ta7@@a6lCiC%! z*lo%6A(sltInJekN0Ni{d8qmmEAignDJG4IJECcTm6~nqw1c+K#_xb zV@HIeL?mrCtT<#+6Gj;vgLr~xoH1hWo#fRvl2QGE(n!JZNhYV;8g5HFmG zu>)i~qxxSG)zxFjf(g8cS+&77D@t+HxFnxxD?}luQ$njYaLNr_)fp4OtKv@e$h`WT z%DgHGD(s$IMot;yk0$gf_uGJcI8|?tcZ(38Oj?ly#@A>HR%;3(5nQ_Os!1NI8l$tqxL}kUMyGWuYDe!GSZ5@!<71kssZl4x*!;e~7yyMuI>1P&Ia9+&7P0 zxP6{f)yE7gDPMVW#Fu*8X~zkTA3!)+adUkduErE}?aK<}w>7lHginIjphgeGzXa&V z_cOCj;OiRQ2hQl92O%oz9%AMq zO5id6cIT-dXcO6J=GDzFkRaXmtt9#cMUJIiH@(zFdWQX<&kLygR8jDV)`RLVE~M&m zeL|fYStCK->!?_hiAzVcJi%OaxT(4)FKLf+Q=^Nve!zTR(_sPE8T9i@KUxXypO=rE zFNN{Figit>pSE|9y@YhnF#bb^3t1;&kP%hTff%TczQ8-+4-wB8r?RZ3k3N+I1;+NAbBdf5rMe(T}f zwOR?h937mGG`c%~Oz83nU7;_z!iZ_{wD&mj)5|GDWpdqU1d^m>swQH}qfjqfp0Ul~ Ezi0~QTL1t6 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo index d397f3e367d335f1efa3bcfd41f10ea28964d2da..a03611b957d445d3b03d46ca625c8e498ba9f8b3 100644 GIT binary patch delta 224 zcmaFGdzQ2Qo)F7a1|VPuVi_O~0b*_-?g3&D*a5^mK)e%(1%UV%5Q_rwbs#PS;{0Xd4i~vb) B9i#vN delta 768 zcmY+AJ&P1U5Qh6c{J7Nv5fnj#VhvP~`41aubR2jHn)US7>^9fiy>|7iddX~L?t$4E z2p1TLpcfh*27+c6i!PYlUoi3Q*+uq>DW2}0>Z*R<9~-Be&CjdrZxmt!c?;P`ZX!P* zbNoVnNB%}$Mt)pT>IV1)yaJwp*T6sE1pEtL0OP7sPryC!9nMa`Q|u?}N?ii=Ii+qZ z)u<5`goD@Mb?`HI2z~=Eg8n?3fzLtoX&(x-fu0Ke+JX51R}{+BTHYY?ebwvtg-TaP zN`calNsq_Q8l7zL(iF5av_kkKS?8$aq^YXC$-lL;>1EN`2{ho;-Yr=YMV8tnp>Ytg zrQ`cF(z{GjN6s_MFa*I0qry11q1p6cE0B)KR@$W5^etK6{+~Ub9z0;rQ9GKw+NX!w z?2_XNyIeGmTybP?xaiO#RB!3^XEt+WDu5J1izRhgzp$h_S~<)P2Mr7QqqDj<9qW51UIqe(#ON>v#WtZ@zocdG~vKK1O>1?c(!2?-B6A3BLH;`!vscCipIg4}x#y{v_A~ z*FN3zUIab_J`X$ts_P@*h2W3f{bS$`?$24}d0W8U;2Q84_*dXxf_1R{49{B!ejU6O zJeSE|1?~oa5BwB(BluRrJnuQ+Av=bWYrvbp2Dlk~2-JT69o!239Mt^RLPX8834A`dAJjZe@P06L_fL7Q=P`x% zOmGIg3{?O3fTHXDU?2P>_+s#dmsq*l1Zus9K}h3;pynHbF9DB%djGQ^UA?b@djC;S zbpIKs_52?wI-G~F>G=dGzFrJ!pDzWk1p}}Peh8GjJe5uD2X}ze;0HnR@jpSW`+q^L z>q3;^so+aM%`*jR-m5_E`$kanzQX-}Hz>LX;C)~Zd@^`0OkkO{{_4pyoANbuG|7%34R)s-T7xwbp92naW7z#+Q+lNg(so&Ag00l z*=o;2MZEJbvv%(V;62=b6x4XD8BF~Sf}(R9lsvrw6yJ`4+V^pAGx&2*`@NdQEr2N) zgV$YQ*Y!#8cJ99hz7BjDllb5}!L8t@K=I|rpyc6Zh{=%NtH39N?*JvI?*S{|CqT*P zH^2+QM?vxXzd`NqyeX@1&jBSj>p;=33SJL>9Mt>Y2G##RK*`N7!E?c1gRcS4WwIZD zRq%Xp$68B|z2H;1zZ<*;oOSpSQ2oCFvK8-}pvFCSowa`xp!mBA)OeSJ;@4VG`@F$D z-wH}^cY?6edo?Kfz75oTUjTQ4kAYhMW;S^jxEIuTp9CfMe-6S5?<=6>>lfh1z$b06 z>zW4<3GdV3EcjLT{MxH5y*Gi!d433lwBCP#F9M%;wO!v0AfoK;16P5s2QjJMTR}w3 zI}U0cp9e1hzXNI=KXCUy0k!YPK&@MwdoeHpZUL_VuLE1)z2GO@{S?M9;ywhm?yrH* z0I%a^&A$^w1-;jS&jjBFo(Fyad^&g>)Ve+mYF%eQ@#8C?#`!w<4)FV+))yf(vfo`$ z@4Xwm2z)On{(b_4G~Q=Gz5fU(di)5~zJ3XcPv_iV*Ru)~9bW?K{mr1>-v#RZSArLV zHBfXv3S#=ahd{~Q0;u=D25LQzfa>={@M+*rK*`Ooz*mBoZuGqE;2S|m?R^oP1|I`8 z?w%Vxk4x_eD7)|wxD)(4Q1hRE6E+;&0P@KDGf?{RBM=gKJ2oM^;G04H{x_iJ{U1>J zx*y?1RK4E^wf=`e@!@lz`12(YmGiy>z80K7SuX*PfVY8f2VVyMBiIFh0ZQ(o&6dx{ zK=I?VpvM0KDEa#b5VL1KG2bl5tV0j9uGi4CZhf?l7n`f)U#N}w{2|{xnrM>J?x1PD zjJAy?-534JA6RcV9i-)-4{;$rwP_!uNj6?bdlyY|Az6EnCYr9L{XXpo?fJC#(fYKb zwEXjSF8GLGq-}8)&AWF>~H|y zLL1T^aL)v{yKCvWKF4TV%oTnDd@oJ9ExC9s{b; zXo#ALv83m(rs;Eq1*1EtfcJXZbKSEX5-wV_kI~l9cGL9nX{&U>=T_P?%$2oI?$Y}x z7jL7X4&EHCOVj5?7R>hxO4s*teVDe7b~WuOG<~E~`aH{mu|ZdHeTlml?4UiJb{VZf zyN0IE^JurxYP2TpX|%00eXh0O1rDddDs6_g!980oTtAg&VaKnB-KZaAQ9txHEPJxW zueN$!Kb)BfYnh)lg3ND6?WmUef!__{deZjif>v|VuMYf9RBJ}@EO<0*rT$E>n>E6& z&s(GGxnSVWbm={;N%~>8ABA(J0Vn-l>If@F zwK_oumcXg3*A2}GsU4ykLc6-5eZFH@S`TM}UMnlV=++!`I<2UN*d%dUnV3#|_+>W} zLbq<1(hbfeX&S+$Ne0duNpH5n*0Kh_*L$_F?z5Pgq}vYST9{7ygQVxzg4nM$k|Yhy zXktkc``>%Zhxa9Z(9NQmpq72_Eg#7#!Vmi;C;s=|`96OqbcB=ru%$P$fXHx5oU`7@ zZcs;D3dxNVWT4_7=!P?lAOi1A;wWQ^O5jcSa~ zTki(Qsr?bTmvqp%6~GTCyp5pm$ZBY2wHhvkUBsbkCeOPsrJPY}bfdJyW&7xLmhHmm zx+uHS;tPGVB3L#uzmrv23W>Y`S1}&6w)G-~q8TB8)|Fnak z2d$E+oWywXLo4XCf?5>B6>sZEiKUa}dpp-w-fYUMcw0v%HMKWzI9Fcxz?ep+>;!Sx zvP!cpNEt`q9a=$<~Gak2d!SH-8NVk&H|I4wA(lg_CBE( zmm3vlZRR38P#9-XH>6)ZN&{5dueG912b+cMGKz*x-m!20-tB(c2wN>I9Ol#XjM^QH zl&o178nsbkncR}4^V4WHj%F~Qan>5JPuU5+>6b;-s1;=c?&7SA>V|b)V%V{!qNgoMUrJ>e9y+32AdymGewBBE0&P5VST!-yCXcM;1$F3Y7MmaZHnWA?-tU90-r z66~gIa4t()gs3JrmXm{EM6Of1Y4ttL5C<#Z8ZQpA5WrOgZG12LZ6|g2M9#xs6V&_i zq;=<_F88)s9r3mYwT2PJBxb*wLS8WUN0a_sBhm}F-YRn5!1>0xgGI@4=A9(28w%r7 z{hc8ZRNYO{bfn z$QT7;usK+V*s|)mq}wzqNC-LNr;H4;+$OrL1u}MN(q;;%WyEOABw(h}o=n~j-c0c) zRyvk*6n%Aiz5=^P@sGDNs)xATY5=`+^U6cwud*TXcB1R;9=vCJ#&`RQMMj3Evcem^ zPWks;ajn&>6RwQQUh3^aDQ$S@?a95QwSE0hfSCJj<$yRt}1dy;1%THlWOF3NE{lD zN=s)Ivuc6eu#8 z{!5Y3=$WiiDYkJ2#aeU6x8OIiTf47J92~_HelIo&qzF8RQx}1uAwd!mvke4nsKD%P z(k`t~iCS?nGR}EqYJ)uUZ6ww^FbW{N17zAGhiL>-iK3!AET~fJ8exA*fW%})2AW^^ zdR{zExguX@q27URazw*);F(9Tpl!(DEH^_3O>XTSbVB5B#q}Qy(=fB&QMrp3G28T=4X$q);-Ph}*LH>DWE zFw#}`Ryic*my}SBcD>>$MmW*5nT_PVFE|%LF~=lvk}VTm+GW_{ zTRx%96e})Y!n+x%MZZR`t>55xj+Wv-JIqo?Ytwea1?~Loe)0)*uan74B1S+}0W&8%Gqe3zS`N8eO(W!`u(jgd*)YXng<__%CAlvO zCh}&oi#6GOjH^m`xtdh`U9JXV^~h$^&K50^`K6O!!PoCOUpSnX1GKn`Dg`a8C!Mx4k{ zlI}*oA2sVLrLy{)(jMfW;>r5Wa5PKeb`Z5HF!km1L*|GVrl!N7z0tpA7@|uzHL|Re zZd|*TR1y|c=EAD-o(d(@wG5yjBV8*iRP18OT`gTZ8hWE&ODFd3+Pi&30nGh`DkLcF z)HEfjjV5VZOEE5rZzO{ax;TeTw@=?Xb^Yi)=?aD3sqJx%WHp}M=wDxrvWWw%BWO*L z0k+ePe%vv)>87i0^zG%QHEZHco7P|M-|VmRH~MShmv7qOuU_rPH*LCF57+Z>!{s+l z+%>f$q>5sxcchsQW}&?+AWkVIJonFPty~C4KW2wQi1J7Ed$7pt^9fyD)E6lH%3Ed<%s) zK+Mod&fK>!pEY|tYimZ{WYBuj;7lf{*RX7pCl zKJ#F=hvR}X2?2$+!vvkh<6#<~dGN^My!NDOMLSNgBCO&B&v9EEy#z#|2_=k$Q^bJb zkTBIxnqll{Fps4seQ5_r7ETrR>-M*f8JqZ>XoMp!El&G`6(y1J zhk@T;oJSAifW^jvn}1;*VHtaov^;7COxUhW+|sB~v>{hU7*b>`PB?q0QN#+5w8DU1KL!C79Zvz)MOb=j&9)crQ3p*hFamY zW+?JevA7hvl3^ z@ANhl(h8kSmgqIv;6TB;j(9MQD2&xs z^Ik~GoC`c>Jx26Nb4$aGem;<(-f&OGjx?SqhRog`l-DBYTZM7FO}d8tt&9!g%!OS_ zesktn2z%$vp>h-l*2;1uF`8UsjBHNdNQyBEZg68-I*SkYW&9zK&VWV+BQG_XdO_ZU z)jQM0JW@Mn(DIj6yPxD8sSB*_XwOlWjBlrqOCuJe84DAIcDreaZ3msPJss-U)kK&GL+-nVOVGf5udtj{5$Z}f0CXqIaTR2HhWtFIo$|`G4I187~l=fFK!;47R zOXnYr{KG+;AY-tNqKyb%@$bmZE1Fm*s0>6B!k@MbB9T=O(+>wL6MN5Mq5NSjWO2iw zxiF92^AoB6Fz#izYN@@^;CwysSAxZ3d6v>K5`G!E#c>#?*l$IBZNwT?h=BJ#nFTCG z=Z)Qd;N4a_G}4_tG@_4u4&fWIx8)SlKO|VE%z~?yMp?n`slc;ECfXhyJ<(p~D2ZP7 z{ODlP7}J3EMyrK43ezy#W+xSIAE!hEBBdUY3OD^h z$3|nUW<>)sX?*y?35sTnpDPl^NS@o&&6;xDgkiwJ5VO$sha8km1!f#PR zC9EZ|mYAYSxQG`1O_SQVqT(M$&Wm^>A3*_U zs-#NhPd%2V{t(BLCL~LKuM1mc(uPRK>H3)mHG}bo7!-u|1SQ?H2m;-CR?=6DJSJiO zN;0BaGb>c(d8MBh9>5QWi}zA?tu>t>%IuVAe5gsTL|xVdQ+V6O`K$-c(nRxHD?0FY zQ&J$#b`s5|46Q1o=b|m~6Vd4MAWrJv=$hzwB;_ZZfZ0Q@8s}R@aA1$Tcy!2d%w3?W zVF+}W3oWvHy~!mNT^;wCT9=EN)olylOyBfBcvv|B1JLT)d~^7K9ga<+B|}= zVPyIh?b6bgtlpB=ULId5^~-I8N*WF+tX&(@ZaJ)*=&% z7^7BN$`c6hOuv#?7`uvqW=WHJJ92K-gF(%{2oI$R1kX*5qZH=quYuNqbP{>#Di2v& z95h-B^Aw}yK8>^^4o)}NXOV&{5j`fk*^DBWR%yF(y*-M-3OV-(! zriCrJ31zZ}3VUUZ+1O#49lsV!pEoRApkD zi@l(K8=hEEO%;MWAw!;`k$J*0wF4VZnXK2iY_mRjTvI*njr@*hO!1f++GQ%}AdAIv zP?Kj9CWJ5&udEGHn5P7{)G-JOhvbAv$-+q$P;&3%?c;~AU-+})hg1`qY)kHjJVDmK ziDy$`j9k~8ykQ2-$=k@rxXkr(JdUlh!022WYmGsbema0NV-{B>byKK-4^>=AE*Y9) zQb`%N>fkFsj~h<`mK8Ka7rA3oHJR=Qm}MB~#Ik%KCvU%9H6S8&b2R7ejd2?(UihTR z)_X-luh2wEEg?3BSbx|REu3l?!JdThGUW3`guc`}S^YC7b4KkNR3MIrxgM#iq@dZ& ziQe^Pq4=|oe;fY1ncph#mzxU-8w&w7N~rj`4~zFg<~pJN3K5apkEyEl2YFDV8jSld zj&p?QyV;Z`BiW@OW=dn&21P|Wq>Eb8VN5yUk0VFe_Q(DoQt@`F1Uih!R+iK2tiJ{_ zDN)5gb4tzn(C}fHt{h?}^@P;LrQmPS~q6kDKPETEQ zQ0&n-bb7no&TZEghfrWwQ8h~*+wTFQSpL^+j^yyU#dxYJxj|rHsf(#&$nz*pFH4V< zMIoLGO-SVCVZsV*lbA2gYlwWc{7D@j;=F;Yp^ofKA#tKvRnd=g{{do?QN>F}1}~wq zl$#G$O`)kclC$Lyze>b&S~en&$W66%{f5p_+q2jb-a~1Ktk$UD0xPx4W#yK~>5Is< z&fM2TDOKa4n$ufLoMx(w)T;(E+oo_S-n)@U1s_x4ErOC$Yc<636*>>3oRWn+(bugf z&>x^wm=m=I9I@qp1XNXx+vLc?-|`0rZX|N2yu&thbmBLPAA=PG+5>r&X)KyIBsH^> zq^Kejp1DtsSLU%`i!~mupEBllqR_?Pq0>71rwS3>YLJhuX;NR)KI~E5!NrG%8Z$4q zGBA7`21n$yZBRe5L;4dy>L09FAJAkrwV=@h8_!qW{>{danHaj(ujX5kE9T2AxukjB?vwg8q2{8pc p{=+l&iqp&`Z@6=aj?z5Uk2$1qj$NWY7CVelh7eK*7&gZC{vTGGkrn^| literal 12299 zcmb7~TZ|-EdB@8!*D-{Im|IBT#0kEHnVwx^j2Z8)z3Z{pYxb7iwM~Eos=Loj*K~DN zQ&rvLZeEB2*hnlANCY{~g-IkVCoC&P36>JAALtoS0uM+86e&^?Stv?~62U{1hbU2g z|8uIUt9QrPDQ)$?tNL8N^L_vCa?b2Oy#8fh2)H8dU*PUu9|U^wl~?eg>(xQ$)!3V&j;AcS#eh2(EcqfhC1YUmweZaSZuK^E%Zw60*uLIlQ&wv?7*WkCy z=ZoOYJpV!Yya#HY?}IJy%?u_vj)MZ`TKC8J7=xbyHP7`-em8gn_(AYED0%-Fl)PUB`4`Oi&^+G* z)$e&w^8OHHir`1!onY{KbPK!()VO~Fo&o$@=KK2+{{>Y0{{#^^_;2ta z_*#@Deci){rFw~@tfei;42}g#(fYx30?rd2JV1&f$wLLr@+sF>i3V}ZQ$FPRQx>ws{eUVa(tMN zZ^Fwd_)eaW;beNBfYQUKLCNk3kA=&rAOCYa;PvC^Nf;*t}{WqX^_+3!; z_%W#QUjBBkuh)Z!9NYv-pLc^SJs5!ZfS&-ho?Q@^5B>-IP4GGs1Rdo42q?Yo{*u@C z@=adu+dMx^v(1KdeSHbs#e+8=ljdXek_%=}Tt%I06_zL(W_;pZx{Sb}1U>E!__}8H3z3pan z0v-XytFXk6g6j8Mp!EA`5S0X<2j2t!8TbVF!}2-5#mCG)1;yJp-0J=L7VtFBcY)H= za>{|oSw;5WcmfhQr8^!YHTb_s~91_k&E@Nw{6;AcV2`*l$3 z_*?MR;158p^FP34@cLi%@$UdAzB~xZZX2M+&p_$#G4KiSv!M9+Cdewjd=zYfPk`db zv)~2rjSQ}M(g)T4X;AI1Tfw)$1EAI$g3|vG{2urn@FDQaG!DTZgYN^+uX?-wA*l84 zfj5AE2cq)e2OzX`T#-Lq&wVGiuGe{}KOf+meC$DPtwGmMaZ5k9b4x!bxlwt5`RYsh zJX=4_zd$|5HStrnc}@9~_=TF?rC1Vi8*cGPm-KVWee)l01>~zA;l7{y9&WAOa_d^- zmacS3$M108<{wMtSLyeW^7}Cm$~$hH2BkY()?KLD@~4nn{1B&fz1Kr<4umqn2e@U&=Ji@0#N{*G z8{Dtrmak*#pu_zZZgE!EUEJasGz)%>Ti0)J->Wa>C4bdLD0elBz8~hkgIipLYQYI^ zUE-Fzj+!{i3zKe`?I`J{+qp^7!W5}#$D^zjT>JCiPsn`KtEnSM;oDhn@ar zmX4CH2G$!txXEp7J4KqAC~>dzPG)VA_n7kG6U=tiIO*7C+}rDMeGZCiw9W0Z9C zYp8KrOBYhJX;HIuWl?`-bEL}6FwOI*9ouCy2>aILtVufU^wJdB)I1$(81wwcfA4f^ z!mNlk!cOu0$A7=lC_fyxiOs^;JpZZBn+LIkiS5|NYBS92hRrMsYb}}b3XaZYHydf( zMV+$ce($?c7^jY4q74%jG8!c4w&o)g z>9Cx5&btP^qd~X{?T#U1uSjg32lw^DWYgQqxkTvzG4px0OKvf(5KC$aZo&Aqb)c9Z zCNC+{3&&9^<#=!EPLgmCb-bSK#s)qGr(j1(Z!-?#k=1H?$Q4f(m_ABkqdbJjrV~fQA^w%wZWa<< z82tF@GpFu1dC$i2vU9LOh-(do5P8A(@@O-OHgKz?V8HgM!1hdm&kkc-Xp)WSF|QyI zr_{rO<~nIiuqm}BbI3X6L}5q%T>ju&b<(8B(iokk+h#Cg{hko4!bONE!ElaL3$tm4 z;668xf<=->D9y_P8IYBz;KK(`%n;^OL+Wgl4O z%|2uh#f#EqG+q)GHn=}=9952(=Z5m_TvJXPB~{WF3q~%I_%z4N2qfW}UhcgG4}T!d zNHDPihbd^`U(BbK{o55kAUj!d8*^h@#NAG_K1%GMiAKOI9a8?}vss=Fn1ZD`U6Usp zsjW(8Wx5EC$7!1=>w;Dz6e-~LS^{!A#M`UT&CAVRbCBG>`RK^y+Tdi=A;wz} zMF%J6Vc5CVDWzGN$QLLpt{AGvcFG`fU6UTvt+doUy;(97$#c$c%BqZ#XArG4-YwUm z(ItQ~87!owhW23)Y6!_l`%VcfoAJ9$-&LB{3X#6qcfK@AtG0>?D5{)JB&I+aLlsPf zCo4T97Q-W8W`}83U`$^CwSq?J!FOlq0o7hnJ=9hwcHdHn#ns>xgo!EB7d$4cdl_9+ z_rzMJ>>>Du(yy{hLVop=IA3u|mg)_&24{R656(#O!5Nm6!H`C^IDaP_H}ZDr&OYvx zHV9wLbWWC~bB(I8kxREpQ&Lu^j_jx~E0Z0w4_JmIR6SdNX)L=es(eM`KAmoYvvZdX z&PEh1b%1o_Qa!Cig*QexWhV~voZ^7V&SvSBejHMv1m{W?%i zq6~RV$zm`u=asNc1fy7ms?#;*uF_rbxz{O@)iAx9tY10ccRmjMdIk(i9R0b*|=LLm^ z^wZUpt!69ZVpm$bc5%MbRpm*!cVfLNMoZ@IBQ;|Ay3dtKINcy+`w-hr?I`@n-at-2 zT9MnLDc6^^lR1;%lHoXvVwV_Qt-X*qwcM*CnrCi3=nDrVFT;y;?^6E|0;pLC0wkJj zvRdwre6e`#@Z<=I)rhgHFE)pY|9Ld{fA{xcV_|^0s40SnmG~Noz1EEDR`b_|S-+{+ zOvuwKt|De1P?iKfWH4CHXbmF}(W#bk>SdCAqTo6&a;`S$(xLW|6J+eHP;_EvPt;sH zwAw!6Ya$n5>(IRHf<9%&C{`U?`0asdN1KLHd=QrGA}|wg9LLDU)QV}QtkEbfFvw37 z+wrn)uf*av*uM8%h3HOGh#1@Z{Z)CrfQ~74pT_JquD;Lr=vvl^%$~ilZ)Ny4U z1FV_b58Qso%7J&S9DJ`iaA57g!FL|uS~^K=T)7~6QU|8lni)s^t_}op~RI7HXN*(`=%CuJk%?SVZOGy+Do;KX>HrKs>@cIZLTta z@=d;~&{VJDs;5rAIv;w?bn>NBCr;fz*TBKnfhBE|aQu}ElOd~8)Lk9MVU*m>IY^jc z>%$LUcwptOc{?qRbB&ezlTO+toUNI=+EKA|7CFLrg*tnXubE`%9`nQRy4(1#hi|<# zIehrwZRQ?xz^s{DlOu<3H#gsGl0%2@(946oy#2Pjm)^hPN#(Tns9&*pckA6NsBtMc zZ>Qv2llE=0Z2I`aYzID4I}O6E*(E~kbP!HwJ5*M!W?R#*e@bST$kuyLM%|E#v7e;= z!EWJIbVt*BPg)vrIy4Qt;5dz=-HU8vnbVBTXzw{!xW##Y_RK(CdT4}pIUj@m$fWHo zoTlSG3ENFmjqC(#4m@O{UTnJ~rW&LjhM?%Wo?YQUYRcFqfn4F( z3#SFJ_G-ZzcS_9I+krSqsD*_byV-6EokzPDM_bAyra#`h97poXc8v6Umj@=-41FAX z-~*rAJ*T5mc&6x58*tv%4<%t^zLt5&b`!7vyqN89{E+J8t>1|VlLgb?*Xt0nsPY*j zpY8OLlv9Ncn@hVD+u`2M>=Gnr_8cYj_bxB=}2`Hv3)eX7-+-Lg@5IH<|GStrz6rz2_24Xl^=Yr#i4>2j4G7H#H96&Xp8#CW~p` zCkOlWS?Z)o%#K0lZmCnew|cI2mSV8d0|#(UBb0hg%GAG`@;I(JS;;3qNAX=azU>W+d26_@Bkb8D% z7S6<6BfwM4x@-Y9>Yb}Xx&hW*(N^fRf3nI@wGACM~gRBCaxP`Hx$RVijQ z4*l?I{9OG9vrB~`eC}RMW>>VhkivtQ;oKi>5!6kHgDthRCJ$J~BW981*b!uQ}L`>G@w{A@*Q$}W-7o#CO zrD8(&&gD^cW%*|J%I9Ca*Mc#8w~E8qV2sGDcrGnm==4}9X4gtM24GJ&iKFR=)X2kl zGMrsftU{XFf0{Z`{N5t13|*?3JBcjrE9(C2ip!XF_W@}p?G9nKH2#9gE>#Xj|717X z^MH&CIw|uf@Ae60E*w@XmvfUVhz>Bn&KIh-7CMu9CwLl@=HuO`iWrA+r-tq=v*$yG zaKxOtpyiTsQzQ-Vk})(7J1I?-?1ubd0v#*uH4LpkP?bJ9r>*=ZlB-Wq&vV2Mg|o!A zT}|z>H;0sU?&h?^XGeE9NHSJyQOV`cg$z*EP0tYI)P29=qKt2@q$*2_iRo8|k<=wR zz0@Q`G-!bnyEr>>K03lzad10k$Askd%3R!&6Sn}S2!VXDTw^Jw^NKTTAmW*%Q+_H^A2^7jweHZJjqek`O>Hh*=(OYG|!d` z?10fKL#g##9lB4JJnc#~*`Um_L_b-s43CKDP03#}8ZRr7c3k14fX&}6*hb-}r8|+f z=SE%3)zh#a?mb6FDn@kjg_uj%&f6NIyoCD3^=l~G#S7wfk@i#0zdlJ96wOdQ;^Xh!S0fXmJ9}l%OQltCx;AO2H))Ujv8D_&|JLBF@(6{x0teNL zEyR@uqmQv`tWQ6c03ivMxq@oql-iL)&$P!JjT-ctZI{-iy@1=>HIF|P7#bnENi)?J zqdG9cb}3%_EBJ%QElN4O4}n2S$foYPgB_{Y`sCm;qr)$s}Ww!XktjZ&4n=q)q;+FZosw%Fj>iwX#)DTFejDpU5cempg za?RfEC-i0Bc=uu-rihPh9Y?F=F1LN1;5hO^ssg|B;1qFjcj=Z|Cx9!f8sb_B%YdTF z5J6sQbMM%ktj-Tc70=H4M1EBfIFm?lT!*LruM<*K z)p%aul}u9%_KvY^6tBy15yhJrpTNk@yDznLaJtUPgq2@mg}yzXiqe}L*_b1|R) zOJHbIr8qVd`qL#2MtIQCMpe5|XxO;V-_<<#M*dV4%PEV=Z`fSo=u>FCw-a#?@9PrW z@g=TGm81)#$my6&hJuispHwdvhVt7GbUNRUG@X(-Ql|U*ciPq`KFVi!UGBm!f5@_!Aq_rz-Zx>3MLA2jk_56tK)(R=hBeuw&;>3$b}&hJ~Uj_&+h4PtE`U diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000000000000000000000000000000000000..155dcbb6f3faafe23c5efd60a31ceb7ab396d896 GIT binary patch literal 916 zcmZuv%}x|S5N;JTj(Xv2Vi9kep4}y&WMBy(phSoS)}Nc{-L9Q!ceZ=dRST@o;ME84 zE%5An_!i!+*#+02m3;Z8X6k>wp9^zemDnA@LqSJyPw+)h+lAn@;Je_yVE)FG7lae> z9|_+Uej>am+!FpKI1#)O|JO~W9tdyTQffi?K=`ikN8vip2|pIDge67I32Lk7k<>{{ z?O&OMsrlO3@(?O^L-!dibjwi$?Dw(9z=dI;VF+B5WBG#K5>)OSOM)}Uh4Ww_cc5JD1{dAd>lya0V0MU{oj9D#@#ZF%ggB0I%e;e<>Z5i-76>(;a=P Fegj4S3q1e; literal 0 HcmV?d00001 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo index 7785a819257c886d6baa226cf3fef7f17624221d..0a31cf83b4f4df6d0c7d0f5d7ea3f1a2e0b84905 100644 GIT binary patch literal 15289 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 literal 12116 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 Jz2C(M{tqvj6662? diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo index 5825103ff91832a7d306235661b301fef2caf5cb..fc3ca9baefcb18db688e98c6fad1643ea138f3ab 100644 GIT binary patch delta 1796 zcmYk+e`r-@9LMqR*}XP*?au4XxmIpob!vKZbGkWo)7`0?GZ+3CWI~_`69#LWYYf*9 zE@}!Ig?iATkVPfNLS-IO(A2O$oP<|btPzw_{+M9&-~LLp_vhRz^sw)Fo%5Wt=hydn z?qK)Pb;;Y&;9;XQ5|fD!vdo(C_aGNa$8%;yxE)`@0~o?@aTT7!T6}`}n8-GZ;hXq8 z_TYHjixE76Ie0StoV0#!)WB6N!Qj|*2Me&C=Vdqs_h1-5Mvd)g#^X4F=dV!TeTOt< z7x4xB5esn`Yj6~+v4T+~ENRxsjYjI>a{K|Aj0Kox9)_?RW2l+;a+!!hL;h z0E4I*592}{!A>k1XI6y=aV_4!arAG6^sWYGqZ%kfjl2>+!8ORB?KdpIzfj*jM%uP4 zmW8$~jIUw=^2+KnHle=Xf*SBPEW;g`)JXfd;mJ3%EX-!BD`lmq&0C3Du^!xmH}D`fy=b-@@8c9~VU&Hi57l3Jl66?h zO%2wt5+9;oT%tF1IKV~!cn@jQf}BxS-6rEajN=Y`3rBGXd+;Z={2irO zM^bx1Wg($-%^}FBUz9eL1kpffA8F5NKO`%-C?C(ta&DBr#%C27D^VLsOUxei&o{@~ zKi6aMHG<6f$1{cjqK?pJ(~pvh^3P9-eXYBa!%gddGpiM_o;q&eQ|+ztav2oM&b=#SA15$`>b>*;5L{4?47Qd6!4}lndkfm DOOU}y literal 15185 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 literal 12631 zcmb7~ZLA#ES;wa&X_A|!4QUF6QZjLA)3kTjc3zz1+D>BoUOOhX@2y{w6q=^9yJvUD zo}Jmu%-);pehE|*K9Gu3L{X)-l0m2hlA@@HN)bYZ%S$DS2q5@UDL^Dj0U=e0H}O*O z`=4{>W$o*@j6D0_nVmW3InT@gdCqhF`ps8AA8^E+Kf*bXtOeAeS_I1JrZRfs*?LQ1ko}xCnk3)O_Fc_-#J@_*CA@F&EQ1<&8DE<8p_JFKEd@v;7=p(7r}(<+jcm8 ze+EPa!7qZieDE@;d4Aj9|2imt`CCx_@@-J-|Bk=D;eGDCcY=~@2PnNA09U|s;6vam z;3MF_fLiARKj!TB2q?S%3Me^#9h6`HK8VSKdr`)(g2zG4|L@?F;CI2Nz>lMJ`Oj;h zo_`%A1cHABHP5xTJ3qb!yoT%df(#wJ4}1`O7|g(*17-jJ1ZB6w7*+as1(g4O4eWz| z4r=^8EK=hg1+N2F!K=Z?LCNt1_-U{JCEtI69q>AguJ`tUgha3pl)gU#-VZ+E@4w*j zCI9>Hg3`~QfQP_ufg$)IoZvR_5s;7#CZNXuDNy78Eci6|dC-9GT68@3NpKI>p97`O z*T7Y97ebx@p8+S}pModB{at6rUjX06^`C*_vDd-h1DAF>`TrNxJooN$dE^TqLkE8c z>b;vG0m*eMhzkXGgSe%QT|y+dic@mwc!z`f^Dy7!dk=FG?)LaTKCkDzlT+g!j{Z>_#+zTk?MW9|W^Tgj(mz=^r+q1cT%L(XeCbtqns+i&he@h9DXf^&sae)R~a z^q^yjQ##ghn)ChkTl2BtzoMexQUCoQC_jBG=Lt^vob0Rvlh_=s@8U-J!^b#f58T4? z>=|&GvpU9nxrwvKc`v7YRfjm^fc@q^ejJeh>X3aR&X03m!>L0)szW}3O9el{NvO>o zH*zHol0OYO6(5gt;u{2ieAV-MuN<4O z7xmAL@@$q4G_dZt!NbBNre9`x7^n7j(a()Zi!oE4Im&DojgzgLd_6WBtpOLqSrMlr zH)xb3(`ah)a2of^S#InIg%hP`#t0YkNWHS&W;igzXqJ@Sg%eDfn|?N#m~>ze-}Iwd zVI(gD4zqj`rF|1d3{jL(FHYieGmML3W{UPKe!|%Qv3+LZwlDIAT(hM@jg`r#~A$j3vUvteZs7Omj0dxnW`5h0q_t zfkyUlm?Z<$DO+xLe-KAWHqyd26Vra6n7eQW_@EYkM{uz51v_l(+6{9s;R!ima8NG9 z;wrQI8+km6QCv8UQX^xQ<8V1D#!}3hZn?*rwH5Bh_KsM+xtyUG^K^;#q0hxI9)@u# zqu~UDZZkreP5s1;-?iL3o%Q!d8IEae~M-KZ* zJe?9>xf$dU?84wjPOKhZ35&5wl0_R}lZeooOmXD7*el{u8V?Dpv}C~Eti<+ALCj7Q zQ)-f7{IpY$9LMWnPILV%fo#0iWDW(Vf+*@Mp8XH*seYE0d6uBFY$Ke^Sif@!R$&<; zPBENys=3)TLvYB>BeF=d7^OK`a0X!mhqmQ8Oq3YHyx1fXlKq+wJsF7`=Hlvi(fhtdj$c{Zs7 z$xdY7#DXTT7`7U`d%5?e4b(7?naiMLy3Jf(IQMAkcual&5CTo z6fD*1nmpM`ZB;V!=^{9iWIb5cl2(g~lyH?FH|@L%zAVMea6pqy{ku)r%RY(&MTCnk z9}%8ee8lJY*PKkOCCN5A1YB5b5-1b&)TFTB;do#mDXeZ9@{Dd=DH+3=rwPtCcPOl6UnpjZ_28il4lZk zTK5)fYP1Q!Cxf}P)Y3j4gc>3;(za9Lm2Lj^>AOnPS|QT6-))vgY1LCvfr~1q!^9LQ z>$nOgB9fIJQiI_UFgMdIFEOSofVx4e^x(TS^n_}!tS)M+!`-)+^5SZ63c@t>=?g!G z)}4%&)tzH4QuaW;k@TzVl9FHDBsNxTlBIgXtih_|@nBVo4^~-Hj)%0W#pa%D+{)WN zoE`6Y8$?$!ot0(bWUFdy<}8< zH6a_U#S|?yL0achJ*`AVG{yvFKZ%Nh;(*E4^6adBoKm3#C%p;7gJhADrZA=ZY!@Bw z&RiX$40%w=VzL>YQo;^nJc?DQO5N-RCspI)B>gO><_z;_5YLL>R8!U4AUkENejj4N zsdzMrf>RA02dA-3WF1KJIp#o<5xW7vT23-J3bA}NoF#H3afMCWB-POGB@}a%?_oq; zJvO5J=`5$NMkAW1S66CP_LqqD*paQ6eEl@B+-xgx2_cdW$5E~d8M$&BmKu}FKxJf8 zP-sXuUG1{fY@Qbf(%Pkqb1z*~p7^~J>s2x8J$D}$3ETAFp6 zicw0Q?%0Z$eSj|s9Az+A!DuZb!01%V1oa|GJ{7q(Mb5|xEN zeLH&(xSGfkY)#FJmh>qzW{K+9(rpjIUOWmZ#V3*XE{GYvu|7sNrdG^yWsO#8fkEC> zZ0ncx^GYmklPxc`FV-CD+X_vMtlf!Ch*cbr9@vkvm-eMrwfPn6b%RGE#G6%H6f#Pt zdV5_-LX}Kinmcu5#6+vIU>V!IUv8M_oF%1t1#G8-$Hp;R676DLPb54630L2@sVXXZ z?i?L-9u=Qv=~75;k*zw%i%~r2K-ER(bjIzq)y_$?9_yjbGRj^G@7#6g-JM-`b#~ty z?!I$r*X|GR;#fEa4|Yz=6{-2Md?_4}W6dZ_GZK3i?i=z`ryu2c_7E+X31Qwf#RI&S zj%MhqbJ|3crSKGf8neINH!jO*v9xpNIMbe`yJ31NCA(QZ+KCpGT#B9Iq0VH}IqyYR zrr6mGz7(2b;rP+xE6s9ucXuslPehb=PH#?GmMC`TG>PJLFHMgq$FTd)oIc#SuX#?Z zqlwX3N&DFV?pg}(>&4~58gfKQhoX8?EQRURUKacB+#9;D`_u5Y{o(Gt3y*i4i&*_U z=9U!R)4iuNFzXA!nN*QWw6T>A*AXmA@ppDB5fMS=iP?1pmJ+Naw`o???u$vw>Iym2qVk$r!xJv-G{64@k^52N!EY*x(V*!oJohX$r} zzxcv6wkt7u_VA_K$U23IxaMjZ(Xp{ml^zRg=&;X zGNvzqw`6L&u}0U9h^g`;I$rEb@{9~MaSLEyIEW|wh{JB;Gp_kIPzh|6Ilm%1Rb-oQ zeWHWrT)3iDso%ymTL9h+qperjn-=BP1u_bZSw`K3HQ6-l;e5n=k`>{^oF!it2&Z0L zG~gCxgL0>e$JMB@K6+f`4eou|H>>#SYCQ)6}JW%*Bq1 zoYa{+5z~~@U}JU=Cfm{K$SpVCVJ(b-^QpRs?y6cY^9C$7PMjkk?;zf~Krydxm1o!& z>+9-OX^NJedX`RYbQWrl^zXKx4Sh3j?kVpbjSSU|W7e@!Gs>g(xXzE~ysrA01B@IpsSSIR{V4*;@kB z1guB5`);zh4-Bo|h15lgzy;E+3-ktwwUtB}+s2o%nOf9EgsY&y!D)Pxwrvkwk;o4b zF_7Xsq9tmImVUK{${$eWqTIVb+hn&B71=h<@1qGBw4^FXP?0M(U<(`gS{1E4NQYUe zYvSJQtPMO##cCCU%*0}CZ6qmd^N>n~s-8uKk$44l*1baQVcp6g))tp6sz6c4JU62x zx#2=5KbdVNu2`;l@I9pS)FkRhFL`~Wy7MAYLE0Sm_#)d}-^3|e0%d_CL>Uq$+x-5+L+7ZD| zY?Pv$!ldmjdczydaoT*^X#d=w*#t5pg?jS$oZB~f-!g$4NcKcD<;b=iQD~cxm<`87 zknN_kv3i+Ns?hzO2f!H3o}o_^%YKf9-h3%i-PVhV?Sl}r{A~!Wt0}^&wiRw0=F=8O zOyJUvrI~rPF!0s|>h;WZEBSkj?ayfINvJAq`lRZAxJ0YfS}xD1mIUoQ2t(mvGo}c_ zgj5zBo|*i71dYh7^Q)2n^QW_t4JnaLcvt+xTv`w{ zgJNAR&6qFDh-rG!Suf1I(^*@NLcKqOunCwcM7`L$vq1jkp zL=RSdZgI9Iaf)s&Kn5zvu~o@5irAc?EK=EARS~SXCaIEN(>e_fBvdGEg-{BR58!fJ zExC><@emxcR%H>bP{k3pNo;D;QbzSKZH7qDC)@@rxmkT~ZTV|mJNN{Oa@{_LN9i?WlML3w>qv?? zMxF6oZaP3+m$`hn3{GV|D&~I9-@hzZSVad1(wWrM=)EGUrZ^&!uVnkK>%(qS zxjZ$C`SUkS&`ycv45lJVP^YaR*xK77)$e|q8rJgAoKmd!&R4Cj9-RvezX*D$HO~Yq zNqm-auaytw!J3!Mj3$;X zJluM@k4#9N82)yy<@v_3i{ExpWPepsosTlS2Y11ZRpZzUqTzg;GOvBDRgQ{xt5U2` zFe>b}dyynpt;b4h7X?>Pr`zkgiHvI0L-vj^H=1{atQ(%%`igWH7yPME`)8}>MoL!| zy3&U6(7d*=7n3`dW3MF6ta#X(kQH5aH*78Uro$odXr>K2c~+cEHlYWB4tra#;?dO1 zzS(TI9-B5=E>HW7@a?Q*o6qeVZY50JBpRjboaM=dTf6Y~0@@>7c}Pz`bh4X9vSgf1uoSw}OdU#wlo;Y#_omyy*E_BGNNi^xipND;Q_n^& zq3caQls1lbkBd7_J?Z=E)ODZvwXVZ$L}+uz{~S%-d67TI&`@pZWeVh-Ud}o^osduMtrf+(>N7Frf zwa`s%Cd+MiDx{X*b+ z3HK|wzsLP5ZhZtlxPAeC4Ezyn-MZa25Cf+`a>T zg0*|1+y4jfHLS}gg}4p;92j{11`P3k2f{@B2@E`r9P4-<2fmCo0pUWN0S3EwfX@SO z09Sw?08awH0rr7E0wwSmL^uO1fhT}p0`CI91%hUL7xE3h@havL{O`YlPLLtiB)kti zL+lrDgRX$|@q!dl+pq{Zg*1h4fUZN(~)JYNW|*MVnHW zQ#2S;t%jvCIdF@$qxH7&1vi9Ud(WG4OzRD-ly_tsl`9iBRB9`j!k{9lHF=wJuuczS z;3{iq zH_|I>oLIKTGhLRAwlSu74VcQa zbNE%Bl$(m-oVJ_Yn@xpo8K3}RViL#a#)b_T!T{dv9Eno zx)^hV%Pza%bRwZ;CsDw82=wK$r#&B ze76YC7g`4zsex#<9;byxp|W(72QcH*Hu>9dW%3poC2K6JJ}o$JO=$7+h4;1VPfs5- zny$Mv-EovwQnO%In-D3ub6DOtwCq9Vp*h0S~E@tG20JpG+N>Zhr0@b&vCgPR-Nox!(K9 zH8$a#2hr|!I?(C#Oix_jzL&QSdg17D>8EfK9bs&F=0*+3wdi2t9p^HGsbMr*xqV-iRNAs^)5B@Fb|Zwx zB#0!v9CSe$Q5hVh@ok2|90w9(Hm~v|4YD|t+xKe66$VW%C$rdvq$=rUDi-##4Xg%8 z>s~Wb2+)n-*PTOS-;5(XnuSmuk4~(8_WzUS&OnCTDiaG0XRQ-=Liour#yLPUW{1yX zH8KY$ayOEfK%^@pjMunyzHJ+|`{toi<3kKR6)Mr-Y(oK%K#@ad=}AoFNmH^$>7%24IaF<%p{#o)+c66s5g`uPiPB-Hj?#`%V+&+DVbpbC71}8t zk5nw7p}oX}m99GgUR>09cmyAKVf;sUMBsgqwY4}^f#p)G{;_F_%=SGFZH+Duj7G8w JIp__v=-*K*ed7QC literal 0 HcmV?d00001 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000000000000000000000000000000000000..09c4422105b74b4df2d4a605eedbee852561fda3 GIT binary patch literal 7609 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 literal 0 HcmV?d00001 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo index 0b253694253c2b24dc724791a2aa83441b4b90e8..1bb85eba81a7ea77a7bd865ec97c84d8b94fafd8 100644 GIT binary patch literal 17284 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 literal 12878 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 Vz_FkpCo?&*Br`v+cw^f;MgShw4I%&l delta 178 zcmX@jGL^Odo)F7a1|VPtVi_Pd0b*7l_5orLNC09UAWj5g2_Vh`;`@vY4DCP~B%aR1 zz@Px6OMo;`m;p$^0mw`S$AW^K%;dz9%>2A!6plhtPH7Rlf<{tmNuuV)*msPI*JoT` e3B*&cuT;3c3P{bqz5qzBQqZ_Q5hy%ClK}v5V=R&Y diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo index 91c892e7e1567898f56e141bbe73f746dd04490e..ee819a73273299b58c3665b8ddd7ba64573a0e8e 100644 GIT binary patch literal 25807 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 Q^*wK#219R!;eqIX0i^iLga7~l diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo index b1831e1e4ec873cf8c77695b6a1c08a75ee12f9d..f181edbc9dfc14c8c052be342c58e27d3983a334 100644 GIT binary patch delta 1899 zcmYk-eMr?;9LMqRy=s{*mk-&4*SflCnPzHb58m==W}8;C*i5!rL^ndTqJ~@b$BpWb z{-{6dR6}AchQV46s^1@jXoIa_YcSYAaY2Mz(8D%Z8SIZWw%(uL{S_Vf-q*RubI-%~ zoZrtsyT_Xnw{ucY8Kr}W5QAZ}KCDRNgEBV3Y!?2CGu1HBECUL#6-%)Zci=R<5-A$v7Y(uBPuZ(MzI0&7*#8O3!88YvUxj)Q*j8l;kT$Am1Uas z<8q|QE@2*CMJ?oK)B^6H7W4-yBag6_`7Ok3yKyPj;RRfW_mDoegzaj8X4C*}sGW4+ zF^nV0vBx+A|3&r7&q^*Rf*NNIR^UQpXxoelRr;vt2m4SfK7iGD0=3fX$e1>a>h~LN z!275>5u;NVcH&CBgq`>h>v1({YQQ6?h1|e)9GOD?)uEVK%Ww;F3U(CL@ic0JPjM(@ z_7$pM58E%nlbC~7a6bNs>+uN|;abjN9_~VI;0!85=TS#@Esy+bqG1|z3CD0bPUN89 z#wOGP2T+;1iEHsLDie$IlNqW*jnjrYs!r6U+=N=#R@CoLpeFtVU%`tBDw=p0Tkr{L z2aP;Sx_l>*EZZo?@h)nj_UXyrZAA8935??Zcow5`&dwClYS}YQ@d+Se)TW& zBI?zIj-`gs1$|Z$&D1zD|5mF}mxeoHQKE`iM{q*6hNvL)xIHU6ws7!e8I}_Z37vZh zp{%LANz@X0B6Rkx1liYx?6DLoI#-o9lK7tsUa0HhyjVB^|BkE<8ucjYz41CxN$}qB z{~782=CMmT54+~<8t-8C=8)H& zdoJWYn7YTCo&R0P>ziJY;_gJ=aq+?dS2*i&+J=4CzS!ZaiweEoqTUqeMRMIwC6!)Q c>0rofox48lF3-zxW##+5Tje=n=PGYL1+6f^I{*Lx literal 12140 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo index 2f8f20ff29535364ae5d1fdde658894b94620f5f..cf7176478bf43b27bfebdeadc91abcfc0aa62423 100644 GIT binary patch delta 3053 zcmb8wTWlQF9mnyrZph7Ga&er-3HFH-QX8C&W732)A#p;DfrJEXr@0b1yF0e0yE|*m z%*HWQWwo?|2hvK6Xe(4zfrpBgN^RMPR#ZSQ5~YgskWwgp38+-!(mt4~6-DYpzrWda zl9x*Dkw@f|AhRR_xMc#HBbNB$VI_7O$ zgYV;vZfqi4MYb3<(Ms&aP9%795cQ_V8^;f$zE?)2G{UX;b!1NSGbCp7+lFtT?tiy& z{R14~_>*Pie?5cynB`uqpo;57JdSVR9^A6Rn4=h=mgZF)z=gb?0v^JHID)!<9((W| zq5%0$pl(cqA9+mo6a4r4; zmD)MvndXy*H+;ID!S$#NXHm7X6T9*73UObU3TPi{jqgXD zKZdIE(@3&RzHz>ay6;O!?B-Fl_%y1he}SLHnSV7-WXX#rDB>afGHT6dQNIhXV;<*F z_l@$}PvaPNVTPMjD;rT6*ovx!K~x||Q1d;AEWat>ZtedngNPF^;4a+69z2XWBsTK` z>VdPU%v?rI_&$C#r!&HjnAXL_ajt>UPYyT7WKV9;%)dgwrKya?5s!Dg?fV? zRI0b5CK^N{H4mZI{JW^?{weB#ub>`u0rmY$cmOXW$uhUt`VZJ3>dha+qxc={pJ6b^ zK-If}t?)UV#69>tYQhh36hFoRJV?H8#&f9awT8b$l4ves2DOYTYPGxQD&*tzPtjGh z3VLP}AJkY{m5^>n1+jy!E!0F;Q|i>1J58U8ZVO$R7^15U)3t;urK@Qf z_2#`gsJ9ujvoYF>N}Jl9bQO`ZqFPY9o36K3vvhs}%r^QL=<{tW11;SHbk&NQGQ>)x zyGh5Yh0oBnomGEnm1=#}v_5KCx_*$fM{lRAX&X^%X;YfjRMFb^YDem%OVt>f`xtC) z98hoRKeG92TH*n%|7yAlYrd)I_S3i1PtcFio9P?rYA5TYpCgTNT4;^2_O;n(bERr% zy|FPbAKQ4s#WpHeD)B^Vnk!yVi0q_));m;+?35o*_udMr7zsJF(238Rt3pRZHtm`wk=Es+g54ZqXc?3=Z}wjq4i_yN4+eAXQNVOs(xn5 zFO_W0OZK*{Po8Q!QQNka1SF(|p zccHW8YN;C8f-7-nec5g7g|QdJ)vQft@dKYV&iNBum~=6(;Kgpzw?$@W=7OKDy(=+y z)+E1QyOsXt$@Hs5FAaf*ra@eLYwwk~T%r2^g_T^qX(0K2M@!Pz(Y1K~MU%rF`;%un zezWeV3j=2kRLaEa=lqf%yNJUe4qa3mTK~hQt^-%18k#SHZcq6tx!{Y{*abbwGaLJB z?{0iBbL-W6uNI7(axO5Ve!&&3V?n4KZ_E{IZ*CgQEF7*^PJ4HpJm0;cqaL2JS!@(e zdM5UY5#^H{>^XKSee{(~Wz9VS*^d-9#YI$CFWC{V?27EuoEN#UmnEzpvUWK(x9$$6 W-L*3$mwFzmg}0o_BtP!`-hTjV3>_u_ literal 11597 zcmb7~TZ|;vS;xy+J9fr47vtP;Vk!>AHlFUi*zsk3$?ojz&3n!6tT)Di)8h6Kegk-`HCNLJv1$TEaWq)5ndBuI#mOeDwy;_~~S zbE>*}b{0D=*ZjL`>zwnQ@B4q3^R@r!mTP}6;*)T_k87|iiuB-5-p(I=-VsH&1J{5* z560jM_%L`BJOUmBKLc9uRq&hO{k-&UaMz8D0dE6u0v`e210Dx|8tj2T0~R1dqu&bm z&wwA|{`2Af8=%(t2e1pihsh+zQSb` zuYywLkHL3>{{wD8T?&P>+E9jhrt`cr@*72JOjQ4-T-C@_g-)d)O*i@lKVMO>wE!R1-}Anz3&A4KB)Kq14QKLzrelV z%_vLy`Urm{&jnESv!LEDLCre{hv096=fQsi#nXfDilY0#kAqKw&w}gV55dR4J&;rT z%|Y4mufPM~^^jBZ9s^H;8=&5Q0eldA4Lk+Dm(6P25WE|F5fp#_2GscPfRf{1z|X_W zw{f$F`xkEW__rX`iFV<1lIs@mEO-%2!9N236nrOSLnYBGAVZ?>fztQ?hUYinoU+IJ z1MUT--@_oPh|Ym`fg@0Qd=`}4FM#{N?}C#1)?Z)@csuw2@(#dX;r?^6*Y}S>UXA`6 zl-%$8fak?Mpyaz3lwFR2@~6|F?0G&sx1e}51~EZYf-(3z;3MFd!4HGq5BIm<;m1D( zp62-k6d(T#L^aXNU>|%9)H>@QjH2HMp8&P~zk>(B{{%0A5B#Fn%NIcD>m^Y7csby= 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo index f1eb271637bcdc8c19eb971f0bebb6f7cfa806a9..484f405068d1f7b720535d2d1433292d4a3104ec 100644 GIT binary patch literal 15008 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 literal 12696 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 delta 1244 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 literal 4499 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 MM=D1>ccALxYfulf#{d8T literal 11317 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 AXaE2J diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo index e0be4d03e32e5ab2099e762168975e44981378a7..fdca0515aec9120491c7a7d3b75f41c971a11ca7 100644 GIT binary patch literal 17057 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 literal 12435 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 Q`@m1PY6&xARc+D#0pocuwEzGB diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo index 6bf24751dd7a04d52dbe62ce8510872b0f2ee939..c872ad07bbf4b4f0094def207c10225fdf320fc3 100644 GIT binary patch delta 221 zcmaFPvw*Yyo)F7a1|VPuVi_O~0b*_-?g3&D*a5^mK)e%(1%UV%5Q_rwbs#PS;k delta 678 zcmY+9zl&2r5Xa|!sCVH65fuf6DHU?5{09P}2Z~r6f{nO&nY^so>^^q)1++=P!@^Rq zJ3))9P6QEANS9z|d9`Rj{39&%yDuT?uwOpAJ3F)UeYN>>Yxwo_`U^sALKmSnbP{?4 zrT7MYfxbgq(AyQF^WYdf1s;KC!5`oN`~{u>{VLHt@GPeQ-y!*qeCglDvt4v17w&2~F*%aop@ zs-JNU%4W+;n`^awqxa^?x-xzMlV_0DnGkB+P@)IyfQp{`kZ%E z)?*_BG3im^r6XQ!CXE^|f|~zK|KDNm@p3Y7<=y9xtHWE8=L}Q9Oh3WAHfZQ_uljw} z;A;}2uz2p^!U+5eW=h4|aNi3LovmGW9yd$FD%QDB0ludPjD;zAa;R-CcHylTCu1&c n8*L|t&B~aVxOBE{^ZUep~ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo index 2f3fe0618f477de0b8f79e3d6ab5fcf57ca48ce5..071cbd4fadc6eb3e87e65689d6448ebbfe08fda2 100644 GIT binary patch literal 14189 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 NoNAUrPLV?I{{cZ;rg8uP literal 11603 zcmb7~Ym6k1ek9X9Giy6`W_RsvyyELiWHEdXypKj@)4OYP9O=3gz(G;CsPS;4gqH;ID#x@DcD8a4+~b;C}ErCMEMc z3LXT{fnv%pfxig;5x5F|9h7YB156U=S1NVS`0)7^J7ZiODp_J%*5)}Q~e8@Nj zDDPbaMc>~A5gmL1{1o^VFa^H@irmLgB z_!=mB{3|Ga`vEA={Rk9!S7XdBcr$nw9Dx#_e+%9Zz5{*+yzRrp5LkdRzpsPhw;KtH z{orv>VBW8TVVDHP+X3xj_EMb3YK zV!t1Q60bLZ+|Bn^P;q@bDEd4CehK_NP~z~;yIj7W2j%_Cpv2>w{{DCU{R4M9c~633 zzZLKrZ~%&*Qt-FI-vVX)t8f;s59YvY!Mi}2_dFp(EW!vDB;6d;kAVUQI1KtSkYB)bHfD)g};8mc^MUH1V#cqT} zaDh_}u^;BL$6k*D;!ndV`Z2tfcM>Gj?XizfiTO`)K4tH?53!>hsAO~9UhpAye3(=8 zyqXh=u^jR~@YguySaD!&y_@e(`fGtFIK`L8I2GqZoTQb_;}3$*aDJL|>+v8rB(}v) zVq?jdM>r?P3BFv*64 zr$2Q%YQ?@29N?=wFYo0&qguM%@1{u+cSNwX=nsM0s=W zBtxdAoeTyh?ikcJZCzwW^hMxmk`8p-HcBHR%XKS^!hEd4EGtY_AH`2t4~J3M)_Iu3 zSyP?sg&EKCV#w$%lWVnF#BKRii=5`%xkPmhW)@o+%%7SJtui%CvMg*xW?l_+->8f^ ziA~$RBtbWMJQ<1@_4W&2KA9+;=HaSt=WoC8hZBqP!%-8PR7dLVm;OLKh9^{H)=ebO z3{$geQp3cWbIKpVfvN6lHHkWyQ+&D8{Z6Q(q$?8}N2dNjHgn+|aF0y<-r(Rg7OdFX zwG(qN;t2`D;Gl#Mlbg8R-$=u5h~d;w$3~o)_tasX^~5lz<(7MFI=9T-*f|g=52xvG^sTh638>TmxbLpTqUjI z9D%JO$M+0D&JH7!%OI=abIw2#INlC3mTM;wWaF(S?vUh^B+_lkXa9qHs-47nnnc(v z8L2_R{9QmW3(F8;jN@!j&5R}^1c&T6LKblnVl<}&(0EKdeu zY4Cai;pCyog2OuP^O5!Jhs24EQkyo1O{?ezhaG(dhrM;NW|b_Hd!wF-m7Xvz{)vrF zCvW(Gk{PU~$)HLkJCJ=751MqsuoL0UpY*=i!{?<8`?I`^3F2(1g@!5*)I@C694|0> zV#|^vjKhg>RcaDrl~Zcwn0Le~+3Y9-7SDakh`dm#ZH>Sgi|67yzAlRvrBixN|QFoN2eT>+~ z5;el~2`TyHs#%r{7=o!@%rEOBoe7OjYMo9~nwWL*}A}P31AIElFNxme;&2Yf9 zn)-LAX)pefJdliV+2u3BGmFpol=zy_iMd3{s6oQ1Y)qmIu+y}J1&@Ut10lCG**>9e zZgzWhA(^}L8-=a4!SS#S#~Tns2gj#0Y}4w5lv#0+Yfu`t8LDJkW58V7%7eV-JvA+F zhRQ_ooW?h8RZ7b<2phF~^A$DP0^p0mOj)W~p9sPXnu@gJkVIvjzkT_hlxdkE+SlKm zPL0;8B~1k(Dm5J@ra@UJRB#cQEaf3KI35L4GfdJPXSxQc8Pr-2zFS8R==So-Mdfw4 z`|ez#cp{vJFjl^N5y#NF)6ufJ3#@tC9>`aVeWkj@)K@o%%@tc@>E3W_aLVy`a7qjx zoMK8T5mM_Gr}xCiwYu%o+3}9|fxeRKtS)nBYF%TkmX0V>Vyt$>?3gh1#g5SjOhYu3 zezy8jo3?MNTt{O+t!;wS)07QPhcqn}LE7Mwep(6@*%*?P?MP=C%>jd*PLnnHaY%;} zobfJH2dN@wOlETTS#LVrotZvFD&#>a7K5=mD+ODHL=>}-E_K`t&QAMxn@(qKfA5ni zI2(2cIygHe-ryWw&^A;=vf~JBrs?|u>mwP>k%eWR)gqFR5mvATn)0dqszI`gMqOz- z=$;XB9~LPcG;^16T2)Ursq>;@C0pCx$ahKu%fhzj7A1s^RZpkV3!_(R6HsK*14zR- zZ5>3U8?Fk@$!MMdJF>diJ~{W&mPW*{l9;cwojyi)&>FQ|hi4li(rb{gP>4)d)(%ec zR@!mlW$h(1{K>5GGriuSNg+>ZEXY)Uksl;SD-V#OGK5k2h)r5CsKKZym%kkuC}N8eaXmU@!o&EP4WvPzgVO=G3%kc*f>m) zT2{Lkci-PwTx#66q!t&K7neS{$T4>uerTK%KhyOj>9R^6SR3~!YJ0IvH16klx*wb5 zN!%Qmhj~2i7TB(F&gj9iI-Q_NLp6f zZ@C&q3sc$4Y8cI(ICkR5bmmLV#W`6FkU5QW;~}#V##tCfI*j+Q+Se&Q-go}oqm75A z&&i}%y*G};?W9A4zN{W6J7pZmQR+1K8{Kyh;x@y+4(5Nyki~Nn(N6PfEO(9+VPnR`JI^AgF#ZED=`bk>S zVCuDv7u%{-Nh{T5p9X;4B=%<}k~+y?^VKM3EU!C*qEaTW_QOFaQ(z&^Zc<3tQi|D* zK-w@FB^}x)E$Ig%Q#?y1f^u=P`D#1dcu|Ey7Ay-VH>x3bGK6Mxsju5>VN*R?#QpY~ zR%^0rG!jvpm(@tE>JlYo!=*WQfL5SD!@k~l86DOlGt5|Lrlw?zNmIHoX=qX=J#4RS zTvEHlY3wAiwCsyHcOfq`j1sC{r@C*v9x*4`N;;jCAuGn7?kDs*q25*7LptMJYy1Y1 zIHgjW24Eb~^vc$e{NS3@*+&le8PcfO5E#n{QlI-F?x?NF&x3@+TG ztq?*`y82GiFK~!=yc3Vfl5}i0mEy5qzLwQe*mq!)%@~4HoUco(lasB>g4>L1gBt6m zrIDbmck%Q1h~Npmt2QqZX{Bvu-4sOv_DCxYt`L%s>r8@Wt(Y`k%) zpOrSU8K4{wb*C@xEw#@G8?3{mgiTSL5!k3o24hJrv!+JGo_)EgR;u^wgVe&ni}dj? z0j#&jFRNhq$o@7OJG;wzc=IAA2_-7p<;Eq+!(=2D!F%J(g*1`xHm5?Wwph1}b-NUO zN5jpF<9Opmn^MzU-gudQM|Qbt(qnD?vyIZG=Iz_vA{SMXNlhjEfg+pVPLsBfi*+<4 z#okf@*o`Ui-x|f3)o-Uv)CgZ?aOKzq7(F9IxP?WV!4r0S>WJJQPvpTpWicrDO?m>z zz_Jj5^@QJ_N=9QC5G}G|jr2&V?R0p-q0kIsevu6-7sEbH>tW9p6&qD9co5>f9ISXp zkN~2m#3@#t=H=w~dDZPOBTY5geAQM6@xfY0CZ7>#ygY;&` zOt!#^HT!iE+%q~-p0=BJk530IX`?43?NEn`l-nXzvO_%OxWYEFV*-CXkY!|P`WnjY z=#=~^$K!RX`>st%#K3N!3Pd(&C*Ij$?q9BplzS zzMnf`Q{NVG;+TxDRq3BOMF)`{f-zK)hV}TWaztMW=W$d zB}!gMs8kvo64&p#(VDnzI?0}?|83s0LnvuYYhif<25zd!R4gMgld1`EJXWM7?T}3a zF^h`BjKqVIr@aaRu%+%x?oYg8)O1S@XJiRIRP{29;%|}9u5{VWI7mApgkml17ptCK8tU}6`onrH{H7|P=^|EPexAcFWR_e*gN*ce4qc6_f7LWPB z&tW3pK55#mk|t0#CTvM{BigXRFS5-|Cxvzs-DlebmbL8Vl7Lh0oB5cJk!^@By=`lZ6g!HP0VBy*brC$|93@VXysJVR-R51(T#oxF z&8CUaj|576*z+UZ)k1&bn%R089E)QUoYWm`P}=S+xPVtSE)B&Z*5ecYu2J#WrSUd* zGx*#E-@(kYCL6c3ZMeL>I<`JKe#k~|yuQZdu`4_>!jS#YH4>6NuJv@SYBgKwk1EOu zEEUdXgVU4*@~Z}$OulcY7}yZ?oQWrqh3!h1PxaXWl$|;LEz5E{anR3;;DY!U_Virl z_WCF!7udHkIpM&zrEAV;aosIbySHT*kR<~XWgU&zn_Cq3MOId4tcM_9m)J~Ys=nVE zJTomiQrT!mC^}{~&}1bz>2(mcy~&vrHv+;JH0Eu`6o&VtHXzXCAK#?ybNS7ZXjHNs zywnk2u$*GyCnc}lYX()Xy}jeLByd@3j_+HEb=NBvd0KR0$sj69Zj;UyDHf*3?6%=} z}S;(>L)L}tPtVqVmatPgBuU=Qa zg$3;5QQAr&f6?AVF}j`JN`aJ^E3V~!%4;-^lsy*8dSNtAjhS#il*NXobnVD@ z_gF>lt&_3WM3#QcvfUSLXMSJUp3qKt`-;mh-l-EoaNgDmn2`=c4Da0M7KkB=`v7Cz zMvv+Xi*LVOQ(~>N`D&W*A89D1TG>5Aw)w2!X@n!&u^{xwcfb2E@4K|BMI$4mITyRQ zqRK2+>dU!`glwN7J%ebKv(CY~bVZZaeSTV@gmYc0CzgMao(WZu6~1*LpYi);L`sE| z9S^@4)RwHLD~5JRHy6fqiL>>M4UsJ(Myf5npX<_O1ESgrp~~12z diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo index 1387462e5a5209c31dfc757875aa41bc407589b4..8206001164eabd78615d3cc1744eb349e53e6d34 100644 GIT binary patch delta 3950 zcmaKtdyG_99mmh`T$WdPEzf1omhxD3ci2LCbV0fUw99h=0eKV7&fI0LdmqEScXnBt zbgHJcjr9+E(?XkKLb0h5jMk~CHd+f4qfKmxwiv~vf3zh0p<<#j(WX&9zdN%F{-Gy( z=5y}7=kfb}f4|?^Zyo*9p3+Ct$Go6uC+G|4lSV65f}f4$hxU*0N-c!{g!AB>I_AJt zupV~7Zny(xU<{AJ8*nyUIYB86w?kRi52wO2@IE=}83z2Rm#Qz+CAfs=H=%6!2bhM9 zoF)hEA%k+1>If>&T4yaw@5wMv2ZdJsb=uA1}=gDJObCl_u+0hfm5(q9fq>rg0kL);#dg34!;VC zikgKCbKyc*l8NgWh-Dk0Y_tuw!2?hhd>P`5`Whq}>Ln;jT&nT=Q1)&udbgBW!_@A54KK6|NRU~ypZJj5EkHH;9+H(!b55~bG@GzXi`RYvuL-2hl8+0#5KKLTs39rKwaKRF#9)*uX z3C&d~o=sRC%?dkI@g&$J3=DW>N{GVFz9A5iwF4`BYMy8LUbklY~&8W87MM zmPF~Mi#Nkfazff8bWv*)T~v`!iCV)Aags!pXHAz-NO&cOq)7-?O8iBV3|(Tmoi36# z(YYg%Cb@w?NuA4!^>nEaX_5!hR?v6QiBu9gptwSk|0gX_5?b20Dw5wX$gjj->iXW+ z&cjhUm6Y5C>DtGQu!}Cq#zm-h(WOZp*U{I|kJAs+C1FXYq)F~bld9RDjH)HOma&AC zf7%!7Hr4I13zlPhR(!MW+)+U^ zUz6vR+ouGnlF8ZJA&^-D~M=-VZHL+upFLffW{fFK2tF zbYyzddaD&!VoI_g8(1c?+O+HE?7kswyqwNijullUs2wp&&f^P$*dvOh%NM4OOU0X~ ztQ%yCS)o_TkXIyLKDU8p~d^R4O zb!c~11dt7T9gCA~FRk|zljKP}F|J=k3R`07MS<^FIo&%{jT>6q(UA80Y6^&y@6Bpn z@0v5VTXc045MoE?>@X7XHBr!(NE}91VOY2ThkaKM8mFH$iT5_lXmm|~RhC|dIJ!PE zR%h8~tz0~};bi-8ND{*>2~Xzc4&8zA@*So`>2y*0ir&r#m`2J05QBpw;gr*W34F zc<7kO4?6YEqOEtCAfjN-YQFaSgJHj|H#kMxr7-%tPPxW*(&TOV{M@=!YHfUR-tqc< z*6Cv9vX`|@{I_}Uln%I5ie(e9(?#NMk%D<685a3Tnb}zz*V}zvz{SejPGq}`O<=S& zU`HlMmieLfiv%;Q?KM($maBPL+f8k;!ahGah9bZlqjT}m#>w%j#_srBhWDN zSoU6gtz};+BOX;##Kl?11o(so7=hO~WO7MTiH^iBOccCJg_{odgMM?b~hzjxcVgliXmBr zKNKGKmJDjC^n7b``NQSKRQ%_*!95w0BFF7dxViB?DT0wo;;QSjIGnWM{QoyGEK)4V K#JIP8(|-W$S7Q?Z literal 11684 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo index a68cb99b634d27040e78b3862558c7368c414837..efcc80091af95f742b509d7088cbe4be8f3be7ca 100644 GIT binary patch literal 14652 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

! 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo index 491c32bb56104ed7fa1040ce83ad8fb98e9b48f5..efa421e7d41126c72b5727a2fd9da79bfbcec802 100644 GIT binary patch literal 14526 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 delta 5058 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 delta 5663 zcmai#3vg7`8OP5;ge#DQn6L?fAVeSukpe*o@)Cp!m(5MGb{}DP1Esb` zs8y<>(ywW&ReV4lu)0yUTAWVH^xY0tt1Y$DaXP7WI(CWRGq%6)-rWGLGd+{D zzkAO;=X|gKIXV0t-(yes27f&@Z^+R4=oR!`V~x2NJ~ECU+K(m}Qwe_z%i-^#AC8@9 z%xX9Vw!>}EfnS0z!w+C7JkMkc{uWM#d6SGOgGI2wm_c(54}}c0K-QRb+4rrmn)jaU z`%$Qdj>8}vf$B&ByM6?g!=*lBY#8PJ%lXD!1t(7N94UYdnHs3;nqe{aO&bq+3~bHv zW?01gZm1jVgX7@=I1LWMnNVOWd>$@?7hxL=5|&09hb!SHp(gVj48R}29{46K#J=eu z{QYnXR72bxCL z9p4Sr&aJQ>?uTmcgyvr#o?}24d=uiN`7T@lFF;M%cz)EOnNVvuAL{(;pl;j_d*OPx z8NL8jtP@L&Sp?_89dHM{9%kSQ_+AP5*NCr0s#?njU>kfD>c)jg^#)i0m%uPw51)iO z|F5tXHWIdq_hzW;x}iGI56>XVd*MOeSIqFlc^0~ zjCpvLF&lY(>1ty_&_CN49!(710w07L;X9D2X6_t1ydLg=VYm%`7iu8oe0&4;!bjj> zYn68%--P<%AMjgajrmD6lW^p|YrNFITSs(!&#U(g?1p+T+zGeB6HrU^KAa3E&NpTu zEP*Ys6YBiWz~%5HBqM|7EgoKEU{}z~#Iy#y<^2N0rg^B*nBT$gL*3vRgs}^rhZo_z zCNIKrtR2ANeNY|w18Mmed>=M4{*Pwwf~&sPbD#s(>G?mz1LZN#LJorYA=Fy_3bw(w z;Tc$k0B&QWU&1f(zJ;)^;r-80#agz^D?ulGi}zb0Q_Xt9rQGH&cr|b3as!Ve67_}>0hBn(%k0Vc&nghAO(L51}+u-qgDF7z zd*BMld^cLwx@}yRip6xBP6FNk5j&w?SQ;f)f!olf*`0mH5BCc1()wfD)X>!+32^@t zZim`P#1(BUZ&b_7rsvZsvD-pfDmXyyC6<>RQ*CJ3v=!6$=mU+am>aQg_R{@yErB*Y zHri&<^>Wb^k^r}YE~=gRBE(c#na$6e(LDE zvcrhoZ3X=5xh<#b-L7X`MYNu-r-jnH&B>Be?5cYV?4hf!ZlP;yqtBsVN7rW2Z=z4p zJF1k2o9WunmHUsS8kXolwv|CHEYqERUkZEat@J`VI&&NPb58(A-ALo)R=IofOUwKl z;wdZPgyPYt6YF-mt-Vgj9!NS?yvOQy5KTZIQsH>a*2!{9{@lq?`(uuk97s4;DlX6FH;iBH#GHg3 zk>BJ`EACG?Jx;>GOwey-o9ryuKHi$A+to^@V1ZmLSTgC-#H7qAOv-TKVV_@`ifUwf z+2mE~wcXzz35RSoZtaZ>ByAg&bBv^% zM9{C1NPp4FSkxxOXg@Qq$U!pP8w>ZaeJm9@Xzd+HSqC&^a@QYmQVwH1;g4IXKF2j} zIXyj2C>1mveRizZNxC0G@kl(Oxy{WAT3e*8ymSk@#8QcPBx&`<4_MIw91f>k=OSKR z!m(6*bk(K3bwAVL?y4n<#luADSx(BIi)Kt4NT%Y^@FyIrKM|*(sj!pGk(`;~~x1;faSSt52>I7x0Nl|NyvWEBDDdNIl_raJQrKAz9DA6Yv z)`EI*)}vV}VQcXa3WLGyz7h2x<|GS~45V<&bfFjIo_V~q)Hf*+zm?is{dTV-e=pk} z*n~@Zx@Pk#A$WKNUFWx4o6fL9F|m{-XXb2Js0HJnX{yJ z=0Byba_3;uvM-;Z#Rx~qVZ9ZNb9anhNU72LC_*G#lV~oK6FPGBRGgE$-T|n|rrus? zl#%Po;dsT|d}a@U)t`r{pd71=%Gp_W`xnk{Txu;?)Y7;hv)1bLjccCY?dR8IoBo!(GPhigEiEpwM$%7@q|c3{PrKhv z^Nkr&w6a)UuC^xg;rWsD$&ukhLBG7(JX3DlQ64(wE?~1Gx>&d5_mDe{=aad;(o7iL z{<)F#!|v3F-OsEX8cAmuVFphaWyXn-blQC$lKVTGrlw!W8FIZIJ`$A1hBEo`ytU(5 zbvLFY|E7utjNdVme$3tdF_!ZUQ+JJ|hjS4VAqJRnC}{a*d2RQE;d{KOq-Q=P@CXONMJzW|$R>*f2w(uY8Q_ITai**HJ zHH^bKzuaDTZ6Q&fB(r3NJRGUFr0Cj8DPI(yP|v7aiwm`Dsf8;Rw*CxyjIR{oRrT(GJQ#f>Q&JaS4Sj{n7-!zsD)9$Hnx|I z;V{@MO6BPr3-zpUh`fX11&R|xvhT)vnc5O49W|sSHX68_0cl%4YnrDjrjH(iGtxi5 zMBZ68L7En?na*~e6W&SkD#!GbvZ!;OJhWhH=FY`$kZcM6>%6cVlD(U#Ka)GNqx&3U6wx2n3Xe)nEhAm3 zq#0laQL*Rg5qYexM2_DWklVITnRB_To}aGVH8mQImPk|P=Uc8WZ!W8l4(jsYlKiHe z+_2;MfH{01S6NNXcLnCTh3d{(@<3N$vbxKCqiH!K=bNj><03^#%dxg+ig5`)^?b7> zYtT|!hTE$$@3uGPN#2^3^B5-ytk*+qJi&V&P>FkUqIlkt+ZWbJ;krP1Hl`1&`@tO* zb1nrp8Z@hmNJ(6g$C?{XEX&+^mu+2y#0#tF~MDQ=NTRTIa5 z+tr!xuX%B-ygf;zGND61U4ia=9FBe8xF~*cD2fLn;K-@#s}o3&0X?(`%HQL`hWyCPOa2r=?c$J zq8klcx6bU`mgmbS@bI0_|6FX=4 V`nOM#ik3;4ijOw?q+`#y{{URGzpKm`+N2ywxkx%&VDETGJ=FWe`)v%rGE^xWGs)82kuy8F&> zM+MXf@fkHDqL}p&-7-`XS1Y7SH)W`qP0IM95-Vj{iGM()Oe~X-@{c5%O6BuC=XBq` zGZ(?!nlsmAgb^Z`+ftSA2_P-Tm>E0};eclOboo@wy2(Ey?3_kKQ_5z*+ z)$eQI7VvKz{tSE`*AwU3bzcTTdT++zF;MHj1Jrmu@Jw(K)OdG;Oy#{B{59~C;OoJ! zg4cpS1Fr|Kdb!=-0G#IfK2Y<19n|=bgRcUg05$&qf)9YtgQ&WG7-T5#55YO`E1=%L z@RgR1mw=00UkzRWei4)$Jq~J}{|d5I@4rCJclLR_3tj+n%bNn#?>12U2tm!8f!g6Z|figJ&Upl8d{+gWy-d8E^xe6TjXBitj0?_1puV1%3q7Jf8wJ z@8?17_fJ5rXVpFbHYj?37koeX&*1aHMK;S4yn8^6^AM>090xW2AAu9#qoDdf2}&-0 z3~KzJy8CCqM9JaVAh*2pLDBh2cmH*u#@`EyjyHi@!8RzmJOFCk&pG@usQ!@0g6tG;ETZzf}-DN zK*{qTgRsh50oDIW@Bnx&o7x3-K*{$b;Mw5UK)wGh@DA{M;ESNwl`P^6u6J*?bl3;# z`eqPPc(*%zC-^+B9|2ji_a#vMegHlnd=iwL{}>cMUx0DczFrCHy^BGOw+Vza-VyL7 z@NQ6ie;j-Rcn+I+A$U7D2QGjb|2v@Q^F2`G{0Dd@c-}T>0$vE}dKJ|8-vmqWKi&QK zGRxl*e1!Y=gRs)O4CXPE_eN0jegG7GKLNf3JPB&Qt01c7Jq2oCzjB48*ZH8?pTkX{ z=)4V7|LedV;O*cv_$jalJ_%~SGZ;O|*>Ui8@VQr7e!mHnUf=2P{h-$O1yJKZ3TnTP zf#UPm-St0$TF*a$(u*I14}oVQ^yh$|22oY-OQ7t@cfoVP?}HlmDG*k8KLaH<6IWY0 zYzOuJeo*)C0LAAR^uf1)(xZn#t@HEl`pe+Uxc&=Jbog6Pdhv?ww%;}2i@4qcYCX3) zyaUwu9T3yy6`<(zVelCEZy>7Y?LoP8or4sPQhwxQSnPgVLABK=~&hVMTPjTR^Svy`bp*aZvpDH250u3*bEX zIQR3LgP@*&1C*V?#_nL4o7gxI* zsId3@H0jZWwD;5APTNG2Y)L*5Gh-J4^EuDqZ4S4CuXf)*243O5Uku(u3*7a)9R8le z=YqRwche--x6@=dQ4^yd(z#tU*@QRK&ZOzHmln|yUGTYyCONJ?Z{SPIUEJ?*E4Z2V zTeNd&zfG$?sGspKUGQ!0<_+KyZHv1W%+PXo{U-1X+7Wjx_yp~Iec3u$lwr^Bgn6_W zl+j}7ZCiI|%AbwVQF9idCF6XVNEc`5w=A+bfNTR#+Dla5{5XXL*&4+rs<&9ZEkz`r9 z5D!>en0AV4!lkHO&~W}ddr4VdC+Zh1e`X;nstxch$@0+eP}$=ku%&p_ov2?4*7X#*jVBeYU0BMLQ3}v{+y%M{i^mjNcq5TMYBXC|qg` zIN|pTM_4f`?gc$q0;kG;9-0vfJH%`V?K+0`)sA6lC!7oVaoOzX)*SSDanwd^vb1Pz zn8|$jWj7N-w>&I(4bEgm5y7Pi1}+z}{`>-4D;Id)>9@m<&tm4XJPFcvSWNhXtnasj z)Ne0jSrMAi#F8xapSbto1DPM>Wi%JG%O~#rWJM7k9F&~+Pu%xme-CtolZ#=j9%V4g zy3>mFMs|Y^;!;a)njr%%|4<&zF@gxZKTFHdzahwD%W0q0(cj2Smd^)i)UL*h=KM4a zJ4RSWCvj34`0XqZzm6sQ~MCPmvr!Q9Ka7JybHmiBdejA)oQpD=7__rnY?;^E#-_-qZ^GSuG>ey zw{90k*G1WJi?8*~ieS^o{6Z@3O$~(+j>T9sGvc`WohXR2`NA*CL5xxkUo1v0hVKvH zf6+tGgScTTCoo<-h=X1nw4)$xdDBBBmQFUW?OfCJ?8>Tm(?gS5*b6vZDX+U>Oe0hF zf;5b+((DL|1(~2jx@EhGvg@r!)p19LK7@Cbm<*I?!bfBg2y9@#kl31KINrEK-!^HVTG@nLu*v+(z2kcV@g8#f%Mzc{Il>@HQGDl~_j=o~iF{7fVwF*X` z_8i$a#RR;IV78@O{^8xzQyOpl3wpZd1&yH>WJv(#nTxX}e=05~XM))wYpf#d2=cBc zu`>TOp^+^k=sUvM{=B!tdJ3?PCU!XbL9bf4t9wfec<7+=bMPt+gWPjZ9pfcHX1^oy zY~F-N%wq$FdhpiMy)W`PJ<_z#=4DurLfjmI98^-=7-H?p(JN-pjGeXGz9Yj_%IsEB zq(z8c@>~@;h(F{lrH)p`ixNSwqOI}LpbP=LLy+KZ*>93{+#UG~|B|4yDCgO6Ug=VA zht&>mXV6|SLYSrOS5wIGRW4}4Us{ON0dG5tgfHN4)5@o!*ZA*VmUawAvoSxyKj+kwnnktIw4wTu{z7y}Gc(U-B?P0s=sVx?m}N6}QL z;bYi640*ggQ76R9&IZuCGOXMrJaF>q-4hxE_b|&OK?+RN<+M9lf;? zvv&XqAmMuj%TLqgo zZZrRl#CnH@p@DaZPR%71l|$j3cVRrfmF4AI0LhTgk0Gq=O%;G zo=EIko}SIt!D!{SHJ^JO?J+^23lS4z`;*Er$qD!iL9Xu_A&dGJ)Z08kBh!Jxq)}8_mx%zeyt|%nsd(xMO1A zS;SL(7(1DL6!()T&6*2wiTD&&xGY6cq-o>U)|QQS%$h@0hB!3ccElur*8C%|jv=|T z9Y!ul@DM+(C<*S0l71pfK!rf&y;SIAQv6WSlBtHdz@bswB9k^k!?tZ^VfI;L z2<$tyexwQ0elp8T>?NulrN6%ilWdvj(JsT*)2az=^4D^i5Z=v5E&4U= zwso7|yQ>l3*m72G3B)MKVJLxbKG^JPQ8rIoKfEJy!}V`| zh9!2CRu3JHUDq%0zV%Ea1Hi~Co1Pg8w>Og$7tZ%%Qlq1`wlcdyoH7U(J zDgcIaeIizc3pT%>PYFvWP4-IW?cTI*OoPn^{4@0)@8%#U^|qB!3Vo6j;^9Sk;>z-v ztkoJH8%NZ!3zQx6ez_C|T_fa;u(ajfvS8}H3dKyZN^)P|ro8JPkS})M#{{aC zPoBK7GkLQdWR`9>3O|_)EK{xz`e|6+ML42>ZgPJyA9W`2$HnAKw%y-w=-}kxa52)0 zlRJn6xBJ_+Y`c7N%hi)xFY~uty?yJJO#q`R3u^+cCi#_TRXF=WzSj`VA_4ps|xPl$hv(7;UDw7Nysa zo(4Id;ku(UyC$z1_LHJexSiaYw#h`(`R)Eyvr)O>5bFryNz%Kd*zTu2b6H%s?Hb>H zy)N}Hyw2Zx&4ybicZXCzENyPFTk@}HT{YPW7dLoYTYkB6iWtV*R)0GTMdyiJ`~go^ zPVxWr@s(3lnyKrRKE+^?IJ7lgJ=u+Eepo`jXaZ&Gl9|SoEc|YOM_)a@dNS=0sLx0E zyY9*fidVrx;P;n#M7c5KP9AoB;^>92M*%dC`?P?Y5~)_{n&6yDiP!Xyj&w(A&{pB=hbX-gX!hw?mi%!_7R*&}H+g<<16O z@$Xp;y7JMKAZ7Jrf;jmZen6&kEjZjBo1IM^A#L@Fk2VGXm*v(e0WV+Bkix8U_dKs{zW^Y)#Jn)^&w1weHy^hi=bjR z;fn}+(NtbiCG4s~+SL=JJPlWmi%RA~6;SM98ZEcHTGfzQxE8Z(KNPK5g4Bx0L!v}~ zr#tp|#_F6~)<|wz$>i!uqkYhGz}${`(-f(w_07XBBTCCol!(U>dk8zKGG+nZZsZBI zj(m|#gZe9v#_Y*RL=PgxKB89o-IYgAA7|lAn8%^f5g7_o7Yn--4)>Z4#yp_8%k>T& zRW+Msv>nNGoXwUioige!*1#4^BgvyyXQds{t_?vo`10 z{C`bP({ij4O=CHS!s~a*e$9@W{Y3Oyz8hU2SBWu-611;`@yImvhBZl4cjs>XechOn z2aIu2kWW}IfGr-NKHN8FK8574Z!~LwfN&I6nTT~`HJ-R7?3E@eGTD3(@q#avH* zDX#1l3aG+Iqhno!x3vUz3zv*>w`Fd;Mb+C`U~jLpcG!^t#|FW~Xeo=mrU<%>2!A7{ zNu*mdT64D}Mm4SNs zq*U!_!RSS0WXZ{#=A$rj$TIt`d%cID{&!@1j6xXu9qCvJBUo*A=)mOyI>DkD?6h1r zG-HSHcdZSwi{@N=tzGnS6nSs; zWSkg>fyfbfr#RneIZBKbD6#9DY_Xa}a!K5dmgmp%nw$&?D}ocn^Blw&6~*dQCf@F1 z<cD3kb|UF1bZ4aqBLY5B&ro<8nP4ZSRfmIw$(D;z=f zn-84(<;f+)=@4EqDMc{cEJtHj!#xhOq!oDLFy*8H^*{qmoWd3qi119$t&biJ2&%QA z^V6gmL`lu(&KjY0wa<A-VcyY(ZFHd(G$OpNH)Ud_>ICEITt_1xaK1zK$Ap(ymgbC#^mh@>;g!9ql@l_T zNmvrgEoa#5re`y9<)UBbFN{+oe8*%Y7_m>l~D7{!Y zwQ|Bn!<-ICkYpc51>HCX(#eRQGL+siQbwr?ckQ8_A{UP73X*5XHV4MZ?rl2GwG zMT|Mjt4z0&*2*H+qC}*$J``yl>J8~4FIx>jSsus9Pt248H^L9=#jF9dEH{46nY89x zq^_0d8)sn^c^EOw_S61Yi_R2d!%#G~5n~p-{)};xv1d&^<-j%=KzHQ&R2m}&uz7&t z*48ny0gG0|X=JxAo7IVO+F&EeT2;YbrW% zmTC-rHL#y``<&3rI>nlUfDm_U-H9_z)Eg8$P^}+50<1Xh-1RXf`SwhrW+oe!ei1Sc z(?KM@O7pz^L1|aRmQ)&`HD~Im#Gwk0w zPg;8?zSyM2SZjh|Q$JWk;zL8T(RB6l0e1H`s^$+0f@m<+ILRGtaW4hIxC@fAl_PtGA88eKDRha-ww>)$g^$<{fTn(ra|4JecxuTJ1=biooIi1>*d+t~g zwJ7XG=iuw*Y1 z)7nmBLzFcbpNQ;Kv6u8;GOnLpjY*wML30o+I@6CRV$x#iLfaiuHVr~mE9FO-q}56~ zI(^nKJ(TsThmx^Dwt5_I-sk_b>f;}%9O$g6+9JaIfYbTZ;TqSBH8RW4J{gZJ8k1}{ z7}#b7{R-x->EcEi20!YXFa>P=CgH6)-a zzbYRz#=~7yr0gfex`-e#ZdZ*h%!NgUK*@wAj+>`MO z#Bhkbq+iUd4JT4mMe0^3no&9uYZFf+N|i-IQQcvtE$f(qsWI&9OR)B2b6EAN=Bl~N zPKO1nVWd!hiyQ|>q7`fG@eel0Pe-_EnE*#vMZEU6(!7~3pJ|R z6Db5Ksx?u@0HGw5k>O8Od%|PGrPAb-d^hHj;fHRTHOojmi+5H&>Z*Fi>9VO2t*d!v zGBh89iTbttou(9TRF}P(TAy4#x`w`4ooecj6m_KL#xw(+WpKhbGBA8=a`S1sO=FLi cU3s%|s8f&_3YasW>bR$(C{DV$FB2O69}ad&@&Et; delta 5357 zcmZXWdyEy;9mmfq<*_2W!18wGxFE2yTozeCmdCO@#47KXE-G;L-nn~+nLD%2%w2lX z^je!(Bhgw%TMb%TtEIKA0k$qs-K_}!LbxZYrFPz7H zwtD{%l!LwtQ}Az43~6B38{tg2vQ8-j^V}c5QmHS&aT6+rG(aAy`B2_l2Aeovt>a=8 z5B65MA5P@{Ae0U6f@9zjI2o2;GmK#uJPlXFPvAP3!Y%RChwI@zP=fhuI0gO|X5n98 zBj>9PxIX~*Kso3S~Pn5VwbMYM91IJN=qKO0W z9rzw>foD)$3jPVo0b{Aj*{}(+x9WfrxouEFeyIAp10|BjAU>&=;Wqd-l&UGsWtT); z@Bj}6;DcEFHoS-XL)TQQ<6Vf2>U}7leqMb(7VE@-E1^`;d?;FIgV?T?K?+0df?~LV z^I;xdC%!(;#ZDf)0=wX(IZE9OcR>l!(@@Igc_m_3#bY4<};27DK1_q!lER4>8N@b_>Ge5ZQyh?y_ui*Y!I3AvY*rr~Fb&xRn8UoD6JC4wdU$ zn3CG-U+uV@n>9?dnlz%-)gMI%!vmcqr8uhkK+2D5ONON7 zP~|d-+)l}VFSDN6QT;(eCu25~6endT;g%u!-NckGcPCRuPX$T;kmy}sy%$InC3T_~ zDaV_b!$VSE+Q%Q#tL~^iT~TEN>|{z88_V3wBnwIYL=&5tGOP-ct|p?rjG1LhNs1<9 ztYgk$u42m2%v+fg#CGXQQl~OR3nIjMOj`8CF`X+>aHjfXCG2B%F&mjTGi7|4DSBDP zj5ki`ijPnDRjGcPAL+nK`}w@(WvqdR-my zeDjeP^*!zS zM;76=4vS%A<-=6`;q;DHyDz8jDkQp7TkN#ug%<3~MQV$mcEWUESzcoL;9E0R)RngR z+Td-LysB+UR7~D4co%Ojnni}^N6136(jG7oo?=3#=$Sm(cP06xF5t1`zT$ZsawkJZ z@=T6+n5rJ)ibb9kHikTiFjH->q1IBhm3RF&%lkPL@%ixpO%&Myoj2HGBnn4tQ)UvY_YE!#L0&eGtQ=88Fw3dq! zi7xgsm#FUzQCfOfW zv2@XrmAbvXvwg|Jc1HacBD!dgSnQg}4?6X3(;L{j{1lB)uPz#=5avv8?_m42jdi1! zEy`E}_3_u{=LSbF7+1Hde#dYl4mE0bOke_c=rsQv9r^)n%mhQHwP$54&n^3LHg~Xv3d|}bualED}-j`}F)$c9#u{4hZBX10yz+R`| zvPIrxhEB^pn;q3*`7GbFBnXjgpJ#j8%+Lwy;~WlWtcVarW+1eSIGf>%7PPUm&J=<| zK4WxCcT)FGq4gf3m8n#OZm%_f{v-bR%-0YJ!ot!bjQbBdUq% z^cDFwxN4sXLQ|CEMI8v((QKdB1c&!5KE(VNg2!2sm|;yNv6c0Gi2^V2azrdCwXuBm z+==p8r)mZ^**dhP@v~{hx_PAXLxez2Cl2!e7&PM4x{Bk3+_~s7p?5?|R7%z4xO>UW z_~DM_GkQ2KtDQwkUJ{hlE)-m|vvYmCEXoxQx8Y=pZ+B_1_yzSuU&}s7R z6+GQ%_mW{-z7@{!DP2pa9FT<728Xh&$x5xMgsvhE*P`C}j*gs_Gg&*ERJqz{JC2Fe z)UPKesZN+fx{zwHQL=<`WZ~@)^>ji%EkipEUg}oZ5N) zjNK!j7erkn!1!C8(@l-3!~V93)+>2JkLM7s2v|yATMm5@O;CCRR?%oaG<;_qO^uXK z^1RZD#D=8pQR_kcNaulg_3D}Nqn%B2C}MQT|0rrgI%E^;*8kRNvAR}F6q*+KHYI?gkNiGxR4`+zN(1s{bLrJ`Jk>aDuYsxPrU7u!g ZNlHcvL)N3}q-n|l@%DB1#P@b@{2w2*jT8U? diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo index 7a24fdd6ae3eb3db9c98fb87be2ebf4058ef8edc..38b4c47a27536d544ec15630ac564cfdf8e4fb25 100644 GIT binary patch literal 21285 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 aVNk7`&)_-%v2SBq3YV@r3p2-J!T$mOw*4yr delta 5718 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo index 5364ed46ec8c1a8ead403f71ab3dab8f4bcf6ada..38be0d019a2712b2458956b5aa717f307967df59 100644 GIT binary patch delta 2052 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_Hans/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_Hans/LC_MESSAGES/blur-my-shell@aunetx.mo index ad6d992567dd8d50607186d25fafd54c07aeb8c7..19e2cfb4bbc348828e86f010b766c85a786dfc1a 100644 GIT binary patch literal 13533 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 BnxX&z diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo index 4d7557c32854d570fa3f8b14be9fdd4e560b1b78..c18174dfaca03770d7dd2b354ab5a6907103ede1 100644 GIT binary patch delta 2860 zcmYk-e{ht=8Nl)9B!rj*1H_<&U|ygcf=L<_Q%z_{5#%?b31BO&yh+|9mmYWFy^8`J z8l4~oQ$Tnjfb#2Tt8^TQ^_byD0sm;LLu>noc50{7GBEVLOWF~~akSQs+V69>vE8}n z{p`NkcX!`?cQ*$f{bFv<)p0rdh15)x5fvjudT~xJ7t*3Uk-Km)mSP9yW3O=+E~I=2 zzlGQF4xDl_gIm|^XzMTDoBr!<&*QgEu6RWV2-pR^Z z)Pb~dc^Eg~NIZw5@iOw0x4G!MyoWh>)p!HP(!UIn(FZ@nQ78o>#gK=Sungy7EzZHs z*nnqI2mC3{!;uuUqeZCgJYrmfC6u4UHta^;T>gqr(Z9S;hQ6hhVc(8X)T!EvdcPmF z!363+e~vnZ16YG^po^bi9foeBbNm_dlaIM*hdDf??Ux{9mYLY24cCy-hU-z^d_L~P z$C1w|DV%^Gpw_#U)^uP+s12231qM;;HzMyOYf)z;WXfHr&u>9}!QL^<|12{5xk20V z7V;AEp3z5r;3L$A{*78spKgRPI2l_}7w0zoHYTth|AT9=c3k!o?!^Ym@1PF6xS09Z zDJti+^&3~=42+;IvV*7i8s7?tT)~Ny_wZrWQ>brz#rP-GPjdtB!_x8DdMog2 zlsi%D@9rVPVC1m5F<`uiI)E#t{4Vm7Yh0$|zfgBYIeSgZHfn=AP-m(ibx|HM(7{hC7g;LaxrkipVZlGLe?w>;K@Qf+{9`(6D zn(}pgkn$jEyHhw!^zRj@?LMew-Tw{d#&Xov-Gn;gR@Aj|5cR=VjptAs_>J*xbN^k` z4zHmOtdw(Gy$=`QGSqhW;xc>_dvx&>my6tub*K%uqIUd!ti~TAb!7ncP5yv7pg*H_ z;3Jzt9wWX<=$6%_b>EhD#IMF~nN~|Ds zru6V?BJ@<7Of(ZZAWhSVhch`2B3wi~NlYPhHnOQl{Zf+ZvO6Pk3Ubo&24>1;kg%pllcnZ%KhNw!|;UltRq2|XBedUf^ABZ5RZ zp(o-(qK@Fx%Du!AVmMi3SnN_u%qMi)eS^@%rpla%k6eH!SXCtII$hySRUOe-+-a?P+G(b~Qx$dF>%9>ZI&&7;k+>I~a57Ni z-B~(6H?@Cz>gZu_Rp}=0FB8{!i_0oTX78*oYw#|Wbrz;hCeq30hZ0BqqkUd*($c$z z61xX?ye{dN&iSX$r=EF5QUm)2FZRmdD|-iDxRjh(-WnL~_w7$T*C(d&oz{thvln^)B$h${t zI+osdZ0Oa4sr~_TE4?)_bm%qz(l3%Xr{)LBdUvPK9QS|RFaB%WQ;F?E$DbWKazgx_ z&-<76cq6854qiHu?t8}c;9orJUwB!DjvUrurqA?!)w%c4v~^x>aCFiQP74(J$1bFQ Oy35bB?Tx?t+5ZBFGU;Lf literal 10391 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 diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json index 497ccca..582a13f 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json @@ -1,6 +1,6 @@ { "_generated": "Generated by SweetTooth, do not edit", - "description": "Adds a blur look to different parts of the GNOME Shell, including the top panel, dash and overview.\n\nYou can support my work by sponsoring me on:\n- github: https://github.com/sponsors/aunetx\n- ko-fi: https://ko-fi.com/aunetx\n\nNote: if the extension shows an error after updating, please make sure to restart your session to see if it persists. This is due to a bug in gnome shell, which I can't fix by myself.", + "description": "Adds a blur look to different parts of the GNOME Shell, including the top panel, dash and overview.\n\nYou can support my work by sponsoring me on:\n- github: https://github.com/sponsors/aunetx\n- ko-fi: https://ko-fi.com/aunetx\n\nIf you use Ubuntu, you may want to change the radius of the corner effect for Dash-to-Dock in preferences, else you may see unpleasantly mixed radii in your dock.\n\nNote: if the extension shows an error after updating, please make sure to restart your session to see if it persists. This is due to a bug in gnome shell, which I can't fix by myself.", "donations": { "github": "aunetx", "kofi": "aunetx" @@ -16,9 +16,10 @@ ], "settings-schema": "org.gnome.shell.extensions.blur-my-shell", "shell-version": [ - "46" + "46", + "47" ], "url": "https://github.com/aunetx/blur-my-shell", "uuid": "blur-my-shell@aunetx", - "version": 59 + "version": 67 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications.js index 6bac74c..620d59e 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications.js @@ -3,7 +3,7 @@ import GLib from 'gi://GLib'; import GObject from 'gi://GObject'; import Gio from 'gi://Gio'; -import { WindowRow } from './window_row.js'; +import { ApplicationRow } from './applications_management/application_row.js'; const make_array = prefs_group => { @@ -30,8 +30,10 @@ export const Applications = GObject.registerClass({ Template: GLib.uri_resolve_relative(import.meta.url, '../ui/applications.ui', GLib.UriFlags.NONE), InternalChildren: [ 'blur', - 'customize', + 'sigma', + 'brightness', 'opacity', + 'dynamic_opacity', 'blur_on_overview', 'enable_all', 'whitelist', @@ -54,6 +56,10 @@ export const Applications = GObject.registerClass({ 'opacity', this._opacity, 'value', Gio.SettingsBindFlags.DEFAULT ); + this.preferences.applications.settings.bind( + 'dynamic-opacity', this._dynamic_opacity, 'active', + Gio.SettingsBindFlags.DEFAULT + ); this.preferences.applications.settings.bind( 'blur-on-overview', this._blur_on_overview, 'active', Gio.SettingsBindFlags.DEFAULT @@ -62,8 +68,14 @@ export const Applications = GObject.registerClass({ 'enable-all', this._enable_all, 'active', Gio.SettingsBindFlags.DEFAULT ); - - this._customize.connect_to(this.preferences, this.preferences.applications, false); + this.preferences.applications.settings.bind( + 'sigma', this._sigma, 'value', + Gio.SettingsBindFlags.DEFAULT + ); + this.preferences.applications.settings.bind( + 'brightness', this._brightness, 'value', + Gio.SettingsBindFlags.DEFAULT + ); // connect 'enable all' button to whitelist/blacklist visibility this._enable_all.bind_property( @@ -82,16 +94,16 @@ export const Applications = GObject.registerClass({ // listen to app row addition this._add_window_whitelist.connect('clicked', - _ => this.add_to_whitelist() + () => this.add_to_whitelist() ); this._add_window_blacklist.connect('clicked', - _ => this.add_to_blacklist() + () => this.add_to_blacklist() ); // add initial applications this.add_widgets_from_lists(); - this.preferences.connect('reset', _ => { + this.preferences.connect('reset', () => { this.remove_all_widgets(); this.add_widgets_from_lists(); }); @@ -137,12 +149,12 @@ export const Applications = GObject.registerClass({ } add_to_whitelist(app_name = null) { - let window_row = new WindowRow('whitelist', this, app_name); + let window_row = new ApplicationRow('whitelist', this, app_name); this._whitelist.add(window_row); } add_to_blacklist(app_name = null) { - let window_row = new WindowRow('blacklist', this, app_name); + let window_row = new ApplicationRow('blacklist', this, app_name); this._blacklist.add(window_row); } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/window_row.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js similarity index 83% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/window_row.js rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js index fd150e0..4af3bf8 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/window_row.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js @@ -4,19 +4,19 @@ import GObject from 'gi://GObject'; import Gio from 'gi://Gio'; import Gtk from 'gi://Gtk'; -import { pick, on_picking, on_picked } from '../dbus/client.js'; +import { pick, on_picking, on_picked } from '../../dbus/client.js'; -export const WindowRow = GObject.registerClass({ - GTypeName: 'WindowRow', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/window-row.ui', GLib.UriFlags.NONE), +export const ApplicationRow = GObject.registerClass({ + GTypeName: 'ApplicationRow', + Template: GLib.uri_resolve_relative(import.meta.url, '../../ui/application-row.ui', GLib.UriFlags.NONE), InternalChildren: [ 'window_picker', 'window_class', 'picking_failure_toast', 'window_not_found_toast' ], -}, class WindowRow extends Adw.ExpanderRow { +}, class ApplicationRow extends Adw.ExpanderRow { constructor(list, app_page, app_name) { super({}); this._list = list; @@ -25,7 +25,7 @@ export const WindowRow = GObject.registerClass({ // add a 'remove' button before the text let action_row = this.child.get_first_child().get_first_child(); let remove_button = new Gtk.Button({ - 'icon-name': 'remove-window-symbolic', + 'icon-name': 'remove-row-symbolic', 'width-request': 38, 'height-request': 38, 'margin-top': 6, @@ -36,7 +36,7 @@ export const WindowRow = GObject.registerClass({ action_row.add_prefix(remove_button); // connect the button to the whitelist / blacklist removal - remove_button.connect('clicked', _ => this._remove_row()); + remove_button.connect('clicked', () => this._remove_row()); // bind row title to text buffer this._window_class.buffer.bind_property( @@ -54,11 +54,11 @@ export const WindowRow = GObject.registerClass({ } // pick a window when the picker button is clicked - this._window_picker.connect('clicked', _ => this._do_pick_window()); + this._window_picker.connect('clicked', () => this._do_pick_window()); // update list on text buffer change this._window_class.connect('changed', - _ => this._update_rows_titles() + () => this._update_rows_titles() ); } @@ -74,7 +74,7 @@ export const WindowRow = GObject.registerClass({ // a mechanism to know if the extension is listening correcly let has_responded = false; let should_take_answer = true; - setTimeout(_ => { + setTimeout(() => { if (!has_responded) { // show toast about failure this._app_page._preferences_window.add_toast( @@ -90,7 +90,7 @@ export const WindowRow = GObject.registerClass({ } }, 250); - on_picking(_ => + on_picking(() => has_responded = true ); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/customize_row.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/customize_row.js deleted file mode 100644 index 0115966..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/customize_row.js +++ /dev/null @@ -1,163 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; -import Gtk from 'gi://Gtk'; - - -/// Given a component (described by its preferences node), a gschema key and -/// a Gtk.ColorButton, binds everything transparently. -let bind_color = function (component, key, widget) { - let property_name = key.replaceAll('-', '_').toUpperCase(); - - let parse_color = _ => { - let [r, g, b, a] = component[property_name]; - let w = widget.rgba; - w.red = r; - w.green = g; - w.blue = b; - w.alpha = a; - widget.rgba = w; - }; - component.settings.connect('changed::' + key, parse_color); - - widget.connect('color-set', _ => { - let c = widget.rgba; - component[property_name] = [c.red, c.green, c.blue, c.alpha]; - }); - - parse_color(); -}; - -export const CustomizeRow = GObject.registerClass({ - GTypeName: 'CustomizeRow', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/customize-row.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'sigma', - 'brightness', - 'color', - 'color_row', - 'noise_amount', - 'noise_amount_row', - 'noise_lightness', - 'noise_lightness_row', - 'noise_color_notice' - ], -}, class CustomizeRow extends Adw.ExpanderRow { - /// Makes the required connections between the widgets and the preferences. - /// - /// This function may be bound to another object than CustomizeRow, if we - /// are using it for the General page; some things will then change (no - /// expansion row, and no notice) - /// - /// The color_and_noise parameter is either a boolean (true by default) or - /// a widget; and permits selecting weather or not we want to show the color - /// and noise buttons to the user. If it is a widget, it means we need to - /// dynamically update their visibility, according to the widget's state. - connect_to(settings, component_settings, color_and_noise = true) { - let s = component_settings.settings; - - // is not fired if in General page - if (this instanceof CustomizeRow) - // bind the customize button - s.bind( - 'customize', this, 'enable-expansion', - Gio.SettingsBindFlags.DEFAULT - ); - - // bind sigma and brightness - s.bind( - 'sigma', this._sigma, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - s.bind( - 'brightness', this._brightness, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // bind the color button - bind_color(component_settings, 'color', this._color); - - // bind noise sliders - s.bind( - 'noise-amount', this._noise_amount, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - s.bind( - 'noise-lightness', this._noise_lightness, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // color_and_noise is either a boolean or a widget, if true, or it is a - // widget, this will appropriately show the required preferences about - // setting the color and noise - if (color_and_noise) { - // if we gave the static_blur widget, we are dealing with the panel, - // and binding it to enable/disable the required components when - // switching between static and dynamic blur - if (color_and_noise instanceof Gtk.Switch) { - // bind its state to dynamically toggle the notice and rows - color_and_noise.bind_property( - 'active', this._color_row, 'visible', - GObject.BindingFlags.SYNC_CREATE - ); - color_and_noise.bind_property( - 'active', this._noise_amount_row, 'visible', - GObject.BindingFlags.SYNC_CREATE - ); - color_and_noise.bind_property( - 'active', this._noise_lightness_row, 'visible', - GObject.BindingFlags.SYNC_CREATE - ); - color_and_noise.bind_property( - 'active', this._noise_color_notice, 'visible', - GObject.BindingFlags.INVERT_BOOLEAN - ); - - // only way to get the correct state when first opening the - // window... - setTimeout(_ => { - let is_visible = color_and_noise.active; - this._color_row.visible = is_visible; - this._noise_amount_row.visible = is_visible; - this._noise_lightness_row.visible = is_visible; - this._noise_color_notice.visible = !is_visible; - }, 10); - } - - // if in General page, there is no notice at all - if (this instanceof CustomizeRow) { - // disable the notice - this._noise_color_notice.visible = false; - } - } else { - // enable the notice and disable color and noise preferences - this._color_row.visible = false; - this._noise_amount_row.visible = false; - this._noise_lightness_row.visible = false; - this._noise_color_notice.visible = true; - } - - // now we bind the color-and-noise preference to the sensitivity of the - // associated widgets, this will grey them out if the user choose not to - // have color and noise enabled - // note: I would love to bind to the visibility instead, but this part - // is already dirty enough, it would look like I obfuscate my code - // intentionally... (I am not) - settings.settings.bind( - 'color-and-noise', - this._color_row, 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - settings.settings.bind( - 'color-and-noise', - this._noise_amount_row, 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - settings.settings.bind( - 'color-and-noise', - this._noise_lightness_row, 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - }; -}); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js index 3a42ff2..aae3768 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js @@ -9,31 +9,49 @@ export const Dash = GObject.registerClass({ Template: GLib.uri_resolve_relative(import.meta.url, '../ui/dash.ui', GLib.UriFlags.NONE), InternalChildren: [ 'blur', - 'customize', - 'static_blur', - 'corner_radius', + 'pipeline_choose_row', + 'mode_static', + 'mode_dynamic', + 'sigma_row', + 'sigma', + 'brightness_row', + 'brightness', 'override_background', 'style_dash_to_dock', 'unblur_in_overview' ], }, class Dash extends Adw.PreferencesPage { - constructor(preferences) { + constructor(preferences, pipelines_manager, pipelines_page) { super({}); this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.pipelines_page = pipelines_page; this.preferences.dash_to_dock.settings.bind( 'blur', this._blur, 'active', Gio.SettingsBindFlags.DEFAULT ); + + this._pipeline_choose_row.initialize( + this.preferences.dash_to_dock, this.pipelines_manager, this.pipelines_page + ); + + this.change_blur_mode(this.preferences.dash_to_dock.STATIC_BLUR, true); + + this._mode_static.connect('toggled', + () => this.preferences.dash_to_dock.STATIC_BLUR = this._mode_static.active + ); + this.preferences.dash_to_dock.STATIC_BLUR_changed( + () => this.change_blur_mode(this.preferences.dash_to_dock.STATIC_BLUR, false) + ); + this.preferences.dash_to_dock.settings.bind( - 'static-blur', - this._static_blur, 'active', + 'sigma', this._sigma, 'value', Gio.SettingsBindFlags.DEFAULT ); this.preferences.dash_to_dock.settings.bind( - 'corner-radius', - this._corner_radius, 'value', + 'brightness', this._brightness, 'value', Gio.SettingsBindFlags.DEFAULT ); this.preferences.dash_to_dock.settings.bind( @@ -49,7 +67,15 @@ export const Dash = GObject.registerClass({ 'unblur-in-overview', this._unblur_in_overview, 'active', Gio.SettingsBindFlags.DEFAULT ); + } - this._customize.connect_to(this.preferences, this.preferences.dash_to_dock, false); + change_blur_mode(is_static_blur, first_run) { + this._mode_static.set_active(is_static_blur); + if (first_run) + this._mode_dynamic.set_active(!is_static_blur); + + this._pipeline_choose_row.set_visible(is_static_blur); + this._sigma_row.set_visible(!is_static_blur); + this._brightness_row.set_visible(!is_static_blur); } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/general.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/general.js deleted file mode 100644 index 3067a2d..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/general.js +++ /dev/null @@ -1,49 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; - -import { CustomizeRow } from './customize_row.js'; - - -export const General = GObject.registerClass({ - GTypeName: 'General', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/general.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'sigma', - 'brightness', - 'color', - 'color_row', - 'noise_amount', - 'noise_amount_row', - 'noise_lightness', - 'noise_lightness_row', - 'color_and_noise', - 'hack_level', - 'debug', - 'reset' - ], -}, class General extends Adw.PreferencesPage { - constructor(preferences) { - super({}); - - this.preferences = preferences; - - CustomizeRow.prototype.connect_to.call(this, preferences, preferences); - - this.preferences.settings.bind( - 'color-and-noise', this._color_and_noise, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.settings.bind( - 'hacks-level', this._hack_level, 'selected', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.settings.bind( - 'debug', this._debug, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - this._reset.connect('clicked', _ => this.preferences.reset()); - } -}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js index 5ea2f3f..899fdcf 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js @@ -25,7 +25,8 @@ function addMenuToHeader(window, builder) { const pages_stack = page.get_parent(); // AdwViewStack const content_stack = pages_stack.get_parent().get_parent(); // GtkStack const preferences = content_stack.get_parent(); // GtkBox - const headerbar = preferences.get_first_child(); // AdwHeaderBar + const headerbar = preferences.get_first_child().get_next_sibling() + .get_first_child().get_first_child().get_first_child(); // AdwHeaderBar headerbar.pack_start(builder.get_object('info_menu')); // setup menu actions @@ -60,7 +61,7 @@ function addMenuToHeader(window, builder) { let act = new Gio.SimpleAction({ name: action.name }); act.connect( 'activate', - _ => Gtk.show_uri(window, action.link, Gdk.CURRENT_TIME) + () => Gtk.show_uri(window, action.link, Gdk.CURRENT_TIME) ); actionGroup.add_action(act); }); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js index d01f541..0fac364 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js @@ -9,41 +9,78 @@ export const Other = GObject.registerClass({ Template: GLib.uri_resolve_relative(import.meta.url, '../ui/other.ui', GLib.UriFlags.NONE), InternalChildren: [ 'lockscreen_blur', - 'lockscreen_customize', + 'lockscreen_pipeline_choose_row', 'screenshot_blur', - 'screenshot_customize', + 'screenshot_pipeline_choose_row', 'window_list_blur', - 'window_list_customize', + 'window_list_sigma', + 'window_list_brightness', + + 'coverflow_alt_tab_blur', + 'coverflow_alt_tab_pipeline_choose_row', + + 'hack_level', + 'debug', + 'reset' ], }, class Overview extends Adw.PreferencesPage { - constructor(preferences) { + constructor(preferences, pipelines_manager, pipelines_page) { super({}); this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.pipelines_page = pipelines_page; this.preferences.lockscreen.settings.bind( 'blur', this._lockscreen_blur, 'active', Gio.SettingsBindFlags.DEFAULT ); - this._lockscreen_customize.connect_to(this.preferences, this.preferences.lockscreen); + this._lockscreen_pipeline_choose_row.initialize( + this.preferences.lockscreen, this.pipelines_manager, this.pipelines_page + ); this.preferences.screenshot.settings.bind( 'blur', this._screenshot_blur, 'active', Gio.SettingsBindFlags.DEFAULT ); - this._screenshot_customize.connect_to(this.preferences, this.preferences.screenshot); + this._screenshot_pipeline_choose_row.initialize( + this.preferences.screenshot, this.pipelines_manager, this.pipelines_page + ); this.preferences.window_list.settings.bind( 'blur', this._window_list_blur, 'active', Gio.SettingsBindFlags.DEFAULT ); - - this._window_list_customize.connect_to( - this.preferences, this.preferences.window_list, false + this.preferences.window_list.settings.bind( + 'sigma', this._window_list_sigma, 'value', + Gio.SettingsBindFlags.DEFAULT ); + this.preferences.window_list.settings.bind( + 'brightness', this._window_list_brightness, 'value', + Gio.SettingsBindFlags.DEFAULT + ); + + this.preferences.coverflow_alt_tab.settings.bind( + 'blur', this._coverflow_alt_tab_blur, 'active', + Gio.SettingsBindFlags.DEFAULT + ); + this._coverflow_alt_tab_pipeline_choose_row.initialize( + this.preferences.coverflow_alt_tab, this.pipelines_manager, this.pipelines_page + ); + + this.preferences.settings.bind( + 'hacks-level', this._hack_level, 'selected', + Gio.SettingsBindFlags.DEFAULT + ); + this.preferences.settings.bind( + 'debug', this._debug, 'active', + Gio.SettingsBindFlags.DEFAULT + ); + + this._reset.connect('clicked', () => this.preferences.reset()); } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js index 2560e3b..f6fe592 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js @@ -9,39 +9,51 @@ export const Overview = GObject.registerClass({ Template: GLib.uri_resolve_relative(import.meta.url, '../ui/overview.ui', GLib.UriFlags.NONE), InternalChildren: [ 'overview_blur', - 'overview_customize', + 'pipeline_choose_row', 'overview_style_components', 'appfolder_blur', - 'appfolder_customize', + 'appfolder_sigma', + 'appfolder_brightness', 'appfolder_style_dialogs' ], }, class Overview extends Adw.PreferencesPage { - constructor(preferences) { + constructor(preferences, pipelines_manager, pipelines_page) { super({}); this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.pipelines_page = pipelines_page; this.preferences.overview.settings.bind( 'blur', this._overview_blur, 'active', Gio.SettingsBindFlags.DEFAULT ); + + this._pipeline_choose_row.initialize( + this.preferences.overview, this.pipelines_manager, this.pipelines_page + ); + this.preferences.overview.settings.bind( 'style-components', this._overview_style_components, 'selected', Gio.SettingsBindFlags.DEFAULT ); - this._overview_customize.connect_to(this.preferences, this.preferences.overview); - this.preferences.appfolder.settings.bind( 'blur', this._appfolder_blur, 'active', Gio.SettingsBindFlags.DEFAULT ); + this.preferences.appfolder.settings.bind( + 'sigma', this._appfolder_sigma, 'value', + Gio.SettingsBindFlags.DEFAULT + ); + this.preferences.appfolder.settings.bind( + 'brightness', this._appfolder_brightness, 'value', + Gio.SettingsBindFlags.DEFAULT + ); this.preferences.appfolder.settings.bind( 'style-dialogs', this._appfolder_style_dialogs, 'selected', Gio.SettingsBindFlags.DEFAULT ); - - this._appfolder_customize.connect_to(this.preferences, this.preferences.appfolder, false); } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js index 6243f1f..c49f323 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js @@ -9,8 +9,13 @@ export const Panel = GObject.registerClass({ Template: GLib.uri_resolve_relative(import.meta.url, '../ui/panel.ui', GLib.UriFlags.NONE), InternalChildren: [ 'blur', - 'customize', - 'static_blur', + 'pipeline_choose_row', + 'mode_static', + 'mode_dynamic', + 'sigma_row', + 'sigma', + 'brightness_row', + 'brightness', 'unblur_in_overview', 'force_light_text', 'override_background', @@ -20,17 +25,37 @@ export const Panel = GObject.registerClass({ 'dtp_blur_original_panel' ], }, class Panel extends Adw.PreferencesPage { - constructor(preferences) { + constructor(preferences, pipelines_manager, pipelines_page) { super({}); this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.pipelines_page = pipelines_page; this.preferences.panel.settings.bind( 'blur', this._blur, 'active', Gio.SettingsBindFlags.DEFAULT ); + + this._pipeline_choose_row.initialize( + this.preferences.panel, this.pipelines_manager, this.pipelines_page + ); + + this.change_blur_mode(this.preferences.panel.STATIC_BLUR, true); + + this._mode_static.connect('toggled', + () => this.preferences.panel.STATIC_BLUR = this._mode_static.active + ); + this.preferences.panel.STATIC_BLUR_changed( + () => this.change_blur_mode(this.preferences.panel.STATIC_BLUR, false) + ); + this.preferences.panel.settings.bind( - 'static-blur', this._static_blur, 'active', + 'sigma', this._sigma, 'value', + Gio.SettingsBindFlags.DEFAULT + ); + this.preferences.panel.settings.bind( + 'brightness', this._brightness, 'value', Gio.SettingsBindFlags.DEFAULT ); this.preferences.panel.settings.bind( @@ -55,9 +80,6 @@ export const Panel = GObject.registerClass({ this._override_background_dynamically, 'active', Gio.SettingsBindFlags.DEFAULT ); - - this._customize.connect_to(this.preferences, this.preferences.panel, this._static_blur); - this.preferences.hidetopbar.settings.bind( 'compatibility', this._hidetopbar_compatibility, 'active', Gio.SettingsBindFlags.DEFAULT @@ -67,4 +89,14 @@ export const Panel = GObject.registerClass({ Gio.SettingsBindFlags.DEFAULT ); } + + change_blur_mode(is_static_blur, first_run) { + this._mode_static.set_active(is_static_blur); + if (first_run) + this._mode_dynamic.set_active(!is_static_blur); + + this._pipeline_choose_row.set_visible(is_static_blur); + this._sigma_row.set_visible(!is_static_blur); + this._brightness_row.set_visible(!is_static_blur); + } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js new file mode 100644 index 0000000..158ea9a --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js @@ -0,0 +1,98 @@ +import Adw from 'gi://Adw'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; +import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + +import { PipelineGroup } from './pipelines_management/pipeline_group.js'; +import { EffectsDialog } from './pipelines_management/effects_dialog.js'; + + +export const Pipelines = GObject.registerClass({ + GTypeName: 'Pipelines', + Template: GLib.uri_resolve_relative(import.meta.url, '../ui/pipelines.ui', GLib.UriFlags.NONE), + InternalChildren: [ + 'add_pipeline' + ], +}, class Pipelines extends Adw.PreferencesPage { + constructor(preferences, pipelines_manager, window) { + super({}); + + this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.window = window; + + this.pipelines_map = new Map; + + for (let pipeline_id in this.pipelines_manager.pipelines) + this.add_pipeline(pipeline_id, false); + + this.preferences.connect('reset', _ => { + this.pipelines_map.forEach((_infos, pid) => this.remove_pipeline(pid)); + for (let pipeline_id in this.pipelines_manager.pipelines) + this.add_pipeline(pipeline_id, false); + }); + + this._add_pipeline.connect( + "clicked", + () => this.pipelines_manager.create_pipeline(_("New pipeline")) + ); + + this.pipelines_manager.connect( + "pipeline-created", + (_obj, id, _pipeline) => this.add_pipeline(id, true) + ); + } + + add_pipeline(pipeline_id, scroll_to_bottom) { + let pipeline = this.pipelines_manager.pipelines[pipeline_id]; + let pipeline_group = new PipelineGroup( + this.pipelines_manager, pipeline_id, pipeline, this + ); + + let pipeline_destroyed_id = this.pipelines_manager.connect( + pipeline_id + "::pipeline-destroyed", + () => this.remove_pipeline(pipeline_id) + ); + + let pipeline_renamed_id = this.pipelines_manager.connect( + pipeline_id + "::pipeline-renamed", + (_obj, name) => this.rename_pipeline(pipeline_id, name) + ); + + this.pipelines_map.set(pipeline_id, { + pipeline_group, pipeline_destroyed_id, pipeline_renamed_id + }); + + this.add(pipeline_group); + + // scroll to the bottom of the page + if (scroll_to_bottom) { + this.window.set_visible_page(this); + setTimeout(() => { + const scroll_adjustment = this.get_first_child().get_vadjustment(); + scroll_adjustment.value = scroll_adjustment.get_upper(); + }, 10); + pipeline_group._title.grab_focus(); + } + } + + remove_pipeline(pipeline_id) { + let pipeline_infos = this.pipelines_map.get(pipeline_id); + if (pipeline_infos) { + this.pipelines_manager.disconnect(pipeline_infos.pipeline_destroyed_id); + this.remove(pipeline_infos.pipeline_group); + this.pipelines_map.delete(pipeline_id); + } + } + + rename_pipeline(pipeline_id, name) { + let pipeline_infos = this.pipelines_map.get(pipeline_id); + if (pipeline_infos) + pipeline_infos.pipeline_group.set_title(name.length > 0 ? name : " "); + } + + open_effects_dialog(pipeline_id) { + let dialog = new EffectsDialog(this.pipelines_manager, pipeline_id); + dialog.present(this.window); + } +}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js new file mode 100644 index 0000000..130edfd --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js @@ -0,0 +1,222 @@ +import Adw from 'gi://Adw'; +import GObject from 'gi://GObject'; +import Gtk from 'gi://Gtk'; +import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + +import { get_supported_effects } from '../../effects/effects.js'; + + +export const EffectRow = GObject.registerClass({ + GTypeName: 'EffectRow', + InternalChildren: [], +}, class EffectRow extends Adw.ExpanderRow { + constructor(effect, effects_dialog) { + super({}); + + this.SUPPORTED_EFFECTS = get_supported_effects(_); + + this.effect = effect; + this.effects_dialog = effects_dialog; + this.pipeline_id = effects_dialog.pipeline_id; + this.pipelines_manager = effects_dialog.pipelines_manager; + + if (effect.type in this.SUPPORTED_EFFECTS) { + this.set_title(this.SUPPORTED_EFFECTS[effect.type].name); + this.set_subtitle(this.SUPPORTED_EFFECTS[effect.type].description); + this.populate_options(); + } + else { + this._warn(`could not assign effect ${effect.type} to its correct name`); + this.set_title(effect.type); + } + + let prefix_bin = new Gtk.Box({ + spacing: 6 + }); + this.add_prefix(prefix_bin); + + let move_bin = new Gtk.Box({ + orientation: Gtk.Orientation.VERTICAL, + 'width-request': 38, + 'height-request': 38, + 'margin-top': 6, + 'margin-bottom': 6 + }); + prefix_bin.append(move_bin); + move_bin.add_css_class('linked'); + + this._move_up_button = new Gtk.Button({ + 'icon-name': 'go-up-symbolic', + 'width-request': 38, + 'height-request': 19 + }); + this._move_down_button = new Gtk.Button({ + 'icon-name': 'go-down-symbolic', + 'width-request': 38, + 'height-request': 19 + }); + this._move_up_button.add_css_class('flat'); + this._move_down_button.add_css_class('flat'); + move_bin.append(this._move_up_button); + move_bin.append(this._move_down_button); + + this._move_up_button.connect('clicked', () => effects_dialog.move_row_by(this, -1)); + this._move_down_button.connect('clicked', () => effects_dialog.move_row_by(this, +1)); + + let remove_button = new Gtk.Button({ + 'icon-name': 'remove-row-symbolic', + 'width-request': 38, + 'height-request': 38, + 'margin-top': 6, + 'margin-bottom': 6, + 'valign': Gtk.Align.CENTER + }); + prefix_bin.append(remove_button); + remove_button.add_css_class('destructive-action'); + + remove_button.connect('clicked', () => effects_dialog.remove_row(this)); + } + + populate_options() { + const editable_params = this.SUPPORTED_EFFECTS[this.effect.type].editable_params; + + if (Object.keys(editable_params).length == 0) + this.enable_expansion = false; + + for (const param_key in editable_params) { + let param = editable_params[param_key]; + let row; + switch (param.type) { + case "integer": + row = new Adw.SpinRow({ + adjustment: new Gtk.Adjustment({ + lower: param.min, + upper: param.max, + step_increment: param.increment + }) + }); + row.adjustment.set_value(this.get_effect_param(param_key)); + row.adjustment.connect( + 'value-changed', () => this.set_effect_param(param_key, row.adjustment.value) + ); + break; + + case "float": + row = new Adw.ActionRow; + let scale = new Gtk.Scale({ + valign: Gtk.Align.CENTER, + hexpand: true, + width_request: 200, + draw_value: true, + value_pos: Gtk.PositionType.RIGHT, + digits: param.digits, + adjustment: new Gtk.Adjustment({ + lower: param.min, + upper: param.max, + step_increment: param.increment, + page_increment: param.big_increment + }) + }); + // TODO check if it's a good idea to set the default parameter, as the "good" + // value really change depending on the user wallpaper... if so, do for dynamic + // blur too + scale.add_mark( + this.get_default_effect_param(param_key), Gtk.PositionType.BOTTOM, null + ); + row.add_suffix(scale); + scale.adjustment.set_value(this.get_effect_param(param_key)); + scale.adjustment.connect( + 'value-changed', () => this.set_effect_param(param_key, scale.adjustment.value) + ); + break; + + case "boolean": + row = new Adw.SwitchRow; + row.set_active(this.get_effect_param(param_key)); + row.connect( + 'notify::active', () => this.set_effect_param(param_key, row.active) + ); + break; + + case "dropdown": + row = new Adw.ComboRow({ model: new Gtk.StringList }); + param.options.forEach(option => row.model.append(option)); + row.selected = this.get_effect_param(param_key); + row.connect( + 'notify::selected', () => this.set_effect_param(param_key, row.selected) + ); + break; + + case "rgba": + row = new Adw.ActionRow; + let color_button = new Gtk.ColorButton({ + valign: Gtk.Align.CENTER, + width_request: 75, + height_request: 45, + show_editor: true, + use_alpha: true + }); + row.add_suffix(color_button); + // set original color + let c = color_button.get_rgba().copy(); + [c.red, c.green, c.blue, c.alpha] = this.get_effect_param(param_key); + color_button.set_rgba(c); + // update on on 'color-set' + color_button.connect( + 'color-set', () => { + let c = color_button.get_rgba(); + this.set_effect_param(param_key, [c.red, c.green, c.blue, c.alpha]); + } + ); + break; + + default: + row = new Adw.ActionRow; + break; + } + row.set_title(param.name); + row.set_subtitle(param.description); + this.add_row(row); + } + } + + get_effect_param(key) { + let effects = this.pipelines_manager.pipelines[this.pipeline_id].effects; + const gsettings_effect = effects.find(e => e.id == this.effect.id); + + if ('params' in gsettings_effect && key in gsettings_effect.params) + return gsettings_effect.params[key]; + else + return this.get_default_effect_param(key); + } + + get_default_effect_param(key) { + return this.SUPPORTED_EFFECTS[this.effect.type].class.default_params[key]; + } + + set_effect_param(key, value) { + // we must pay attention not to change the effects in the pipelines manager before updating + // it in gsettings, else it won't be updated (or every effect will be) + let effects = this.pipelines_manager.pipelines[this.pipeline_id].effects; + const effect_index = effects.findIndex(e => e.id == this.effect.id); + + if (effect_index >= 0) { + effects[effect_index] = { + ...this.effect, params: { ...this.effect.params } + }; + effects[effect_index].params[key] = value; + this.effect = effects[effect_index]; + } + else + this._warn(`effect not found when setting key ${key}`); + + this.pipelines_manager.update_pipeline_effects(this.pipeline_id, effects, false); + } + + _warn(str) { + console.warn( + `[Blur my Shell > effect row] pipeline '${this.pipeline_id}',` + + ` effect '${this.effect.id}': ${str}` + ); + } +}); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js new file mode 100644 index 0000000..222a92e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js @@ -0,0 +1,174 @@ +import Adw from 'gi://Adw'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; +import Gtk from 'gi://Gtk'; +import Gio from 'gi://Gio'; +import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + +import { EffectRow } from './effect_row.js'; +import { get_effects_groups, get_supported_effects } from '../../effects/effects.js'; + +export const EffectsDialog = GObject.registerClass({ + GTypeName: 'EffectsDialog', + Template: GLib.uri_resolve_relative(import.meta.url, '../../ui/effects-dialog.ui', GLib.UriFlags.NONE), + InternalChildren: [ + "add_effect", + "add_effect_alt_menu", + "effects_list" + ], +}, class EffectsDialog extends Adw.PreferencesDialog { + constructor(pipelines_manager, pipeline_id) { + super({}); + + this.EFFECTS_GROUPS = get_effects_groups(_); + this.SUPPORTED_EFFECTS = get_supported_effects(_); + + this.pipelines_manager = pipelines_manager; + this.pipeline_id = pipeline_id; + + let pipeline = pipelines_manager.pipelines[pipeline_id]; + + this.set_title(pipeline.name.length > 0 ? _(`Effects for "${pipeline.name}"`) : _("Effects")); + + pipeline.effects.forEach(effect => { + const effect_row = new EffectRow(effect, this); + this._effects_list.add(effect_row); + this.update_rows_insensitive_mover(effect_row); + }); + + // setup advanced effects chooser action + this.show_advanced_effects = false; + let action_group = new Gio.SimpleActionGroup(); + this.insert_action_group('effects-dialog', action_group); + let advanced_effects_action = Gio.SimpleAction.new_stateful( + 'advanced-effects-bool', + null, + GLib.Variant.new_boolean(this.show_advanced_effects) + ); + advanced_effects_action.connect( + 'change-state', + (_, state) => { + this.show_advanced_effects = state.get_boolean(); + this.build_effects_chooser(); + advanced_effects_action.set_state(state); + } + ); + action_group.add_action(advanced_effects_action); + + this.build_effects_chooser(); + this._add_effect.connect('clicked', () => this.effects_chooser_dialog.present(this)); + } + + build_effects_chooser() { + this.effects_chooser_dialog = new Adw.Dialog({ + presentation_mode: Adw.DialogPresentationMode.BOTTOM_SHEET, + content_width: 450 + }); + + let page = new Adw.PreferencesPage; + this.effects_chooser_dialog.set_child(page); + + for (const effects_group in this.EFFECTS_GROUPS) { + const group_infos = this.EFFECTS_GROUPS[effects_group]; + + let group = new Adw.PreferencesGroup({ + title: group_infos.name + }); + page.add(group); + + for (const effect_type of group_infos.contains) { + if (!(effect_type in this.SUPPORTED_EFFECTS)) + continue; + + if (!this.show_advanced_effects && this.SUPPORTED_EFFECTS[effect_type].is_advanced) + continue; + + let action_row = new Adw.ActionRow({ + title: this.SUPPORTED_EFFECTS[effect_type].name, + subtitle: this.SUPPORTED_EFFECTS[effect_type].description + }); + let select_button = new Gtk.Button({ + 'icon-name': 'select-row-symbolic', + 'width-request': 38, + 'height-request': 38, + 'margin-top': 6, + 'margin-bottom': 6 + }); + group.add(action_row); + + select_button.add_css_class('flat'); + action_row.add_suffix(select_button); + action_row.set_activatable_widget(select_button); + select_button.connect('clicked', () => { + this.append_effect(effect_type); + this.effects_chooser_dialog.close(); + }); + } + } + } + + append_effect(effect_type) { + const effect = { + type: effect_type, id: "effect_" + ("" + Math.random()).slice(2, 16) + }; + this.pipelines_manager.update_pipeline_effects( + this.pipeline_id, + [...this.pipelines_manager.pipelines[this.pipeline_id].effects, effect] + ); + + const effect_row = new EffectRow(effect, this); + this._effects_list.add(effect_row); + this.move_row_by(effect_row, 0); + this.update_rows_insensitive_mover(effect_row); + } + + move_row_by(row, number) { + const effects = this.pipelines_manager.pipelines[this.pipeline_id].effects; + const effect_index = effects.findIndex(e => e.id == row.effect.id); + + if (effect_index >= 0) { + effects.splice(effect_index, 1); + effects.splice(effect_index + number, 0, row.effect); + + const listbox = row.get_parent(); + listbox.set_sort_func((row_a, row_b) => { + const id_a = effects.findIndex(e => e.id == row_a.effect.id); + const id_b = effects.findIndex(e => e.id == row_b.effect.id); + return id_a > id_b; + }); + + this.update_rows_insensitive_mover(row); + + this.pipelines_manager.update_pipeline_effects( + this.pipeline_id, effects + ); + } + } + + update_rows_insensitive_mover(any_row) { + if (this._insensitive_top) + this._insensitive_top.set_sensitive(true); + if (this._insensitive_bottom) + this._insensitive_bottom.set_sensitive(true); + + const listbox = any_row.get_parent(); + this._insensitive_top = listbox.get_first_child()._move_up_button; + this._insensitive_top?.set_sensitive(false); + this._insensitive_bottom = listbox.get_last_child()._move_down_button; + this._insensitive_bottom?.set_sensitive(false); + } + + remove_row(row) { + const effects = this.pipelines_manager.pipelines[this.pipeline_id].effects; + const effect_index = effects.findIndex(e => e.id == row.effect.id); + + if (effect_index >= 0) { + effects.splice(effect_index, 1); + this.pipelines_manager.update_pipeline_effects( + this.pipeline_id, effects + ); + } + + this._effects_list.remove(row); + } +}); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js new file mode 100644 index 0000000..e0c5165 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js @@ -0,0 +1,106 @@ +import Adw from 'gi://Adw'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; +import Gtk from 'gi://Gtk'; +import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + + +export const PipelineChooseRow = GObject.registerClass({ + GTypeName: 'PipelineChooseRow', + Template: GLib.uri_resolve_relative(import.meta.url, '../../ui/pipeline-choose-row.ui', GLib.UriFlags.NONE), + InternalChildren: [ + 'pipeline_choose', + 'pipeline_model', + 'pipeline_edit' + ], +}, class PipelineChooseRow extends Adw.ActionRow { + initialize(preferences, pipelines_manager, pipelines_page) { + this.preferences = preferences; + this.pipelines_manager = pipelines_manager; + this.pipelines_page = pipelines_page; + + this.create_pipelines_list(); + + // display the correct pipeline name in the drop-down instead of their ids + const closure_func = string_object => { + const pipeline_id = string_object.get_string(); + if (pipeline_id == 'create_new') + return _("Create new pipeline"); + if (pipeline_id in this.pipelines_manager.pipelines) + return this.pipelines_manager.pipelines[pipeline_id].name; + else + return ""; + }; + + const expression = new Gtk.ClosureExpression(GObject.TYPE_STRING, closure_func, []); + this._pipeline_choose.expression = expression; + + // TODO fix the expression not being re-evaluated other than by setting it again + this.pipelines_manager.connect( + 'pipeline-names-changed', + () => this._pipeline_choose.expression = new Gtk.ClosureExpression( + GObject.TYPE_STRING, closure_func, [] + ) + ); + + this.preferences.PIPELINE_changed(() => this.on_settings_pipeline_changed()); + + this.pipelines_manager.connect('pipeline-list-changed', () => this.create_pipelines_list()); + + this._pipeline_choose.connect('notify::selected', () => this.on_selected_pipeline_changed()); + + this._pipeline_edit.connect( + 'clicked', + () => this.pipelines_page.open_effects_dialog(this.preferences.PIPELINE) + ); + } + + on_selected_pipeline_changed() { + if (!this._pipeline_choose.selected_item || this._is_creating_pipelines_list) + return; + + const pipeline_id = this._pipeline_choose.selected_item.get_string(); + if (pipeline_id == 'create_new') { + const id = this.pipelines_manager.create_pipeline(_("New pipeline")); + this.preferences.PIPELINE = id; + } + else + this.preferences.PIPELINE = pipeline_id; + } + + on_settings_pipeline_changed() { + for (let i = 0; i < this._pipeline_model.n_items; i++) { + const pipeline_id = this._pipeline_model.get_string(i); + // if we have more pipelines than we should have: rebuild... + // that is the case when resetting the preferences for example + if (!(pipeline_id in this.pipelines_manager)) { + this.create_pipelines_list(); + return; + } + if (pipeline_id == this.preferences.PIPELINE) + this._pipeline_choose.set_selected(i); + } + } + + create_pipelines_list() { + // prevent the pipeline selector from being updated while re-creating the list + this._is_creating_pipelines_list = true; + + // remove ancient items + this._pipeline_model.splice(0, this._pipeline_model.n_items, null); + + // add new ones + let i = 0; + for (let pipeline_id in this.pipelines_manager.pipelines) { + this._pipeline_model.append(pipeline_id); + if (pipeline_id == this.preferences.PIPELINE) + this._pipeline_choose.set_selected(i); + i++; + } + this._pipeline_model.append('create_new'); + + // now update the drop-down selector + this._is_creating_pipelines_list = false; + this.on_selected_pipeline_changed(); + } +}); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js new file mode 100644 index 0000000..627b576 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js @@ -0,0 +1,99 @@ +import Adw from 'gi://Adw'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; +import Gtk from 'gi://Gtk'; +import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + +import { get_supported_effects } from '../../effects/effects.js'; + + +export const PipelineGroup = GObject.registerClass({ + GTypeName: 'PipelineGroup', + Template: GLib.uri_resolve_relative(import.meta.url, '../../ui/pipeline-group.ui', GLib.UriFlags.NONE), + InternalChildren: [ + "title", + "effects_description_row", + "manage_effects" + ], +}, class PipelineGroup extends Adw.PreferencesGroup { + constructor(pipelines_manager, pipeline_id, pipeline, pipelines_page) { + super({}); + + this.SUPPORTED_EFFECTS = get_supported_effects(_); + + this._pipelines_manager = pipelines_manager; + this._pipelines_page = pipelines_page; + this._pipeline_id = pipeline_id; + + // set the description + this.set_description(_(`Pipeline id: "${pipeline_id}"`)); + + // set the title and connect it to the text entry + this.set_title(pipeline.name.length > 0 ? pipeline.name : " "); + this._title.set_text(pipeline.name); + this._title.connect( + 'changed', + () => pipelines_manager.rename_pipeline(pipeline_id, this._title.get_text()) + ); + + // the bin containing the actions + let prefix_bin = new Gtk.Box; + prefix_bin.add_css_class('linked'); + this._title.add_prefix(prefix_bin); + + // add a 'remove' button if we are not the default pipeline + if (pipeline_id != "pipeline_default") { + let remove_button = new Gtk.Button({ + 'icon-name': 'remove-row-symbolic', + 'width-request': 38, + 'height-request': 38, + 'margin-top': 6, + 'margin-bottom': 6 + }); + remove_button.add_css_class('destructive-action'); + prefix_bin.append(remove_button); + remove_button.connect('clicked', () => pipelines_manager.delete_pipeline(pipeline_id)); + } + // add a 'duplicate' button + let duplicate_button = new Gtk.Button({ + 'icon-name': 'duplicate-row-symbolic', + 'width-request': 38, + 'height-request': 38, + 'margin-top': 6, + 'margin-bottom': 6 + }); + prefix_bin.append(duplicate_button); + duplicate_button.connect('clicked', () => pipelines_manager.duplicate_pipeline(pipeline_id)); + + this.update_effects_description_row(); + this._pipelines_manager.connect( + pipeline_id + '::pipeline-updated', + () => this.update_effects_description_row() + ); + + this._manage_effects.connect( + 'clicked', + () => pipelines_page.open_effects_dialog(pipeline_id) + ); + } + + update_effects_description_row() { + const effects = this._pipelines_manager.pipelines[this._pipeline_id].effects; + + if (effects.length == 0) + this._effects_description_row.set_title(_("No effect")); + else if (effects.length == 1) + this._effects_description_row.set_title(_("1 effect")); + else + this._effects_description_row.set_title(_(`${effects.length} effects`)); + + let subtitle = ""; + effects.forEach(effect => { + if (effect.type in this.SUPPORTED_EFFECTS) + subtitle += _(`${this.SUPPORTED_EFFECTS[effect.type].name}, `); + else + subtitle += _("Unknown effect, "); + }); + this._effects_description_row.set_subtitle(subtitle.slice(0, -2)); + } +}); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/prefs.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/prefs.js index df622ed..d90bdda 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/prefs.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/prefs.js @@ -2,17 +2,21 @@ import Gdk from 'gi://Gdk'; import Gtk from 'gi://Gtk'; import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; +import { update_from_old_settings } from './conveniences/settings_updater.js'; +import { PipelinesManager } from './conveniences/pipelines_manager.js'; import { Settings } from './conveniences/settings.js'; -import { Keys } from './conveniences/keys.js'; +import { KEYS } from './conveniences/keys.js'; import { addMenu } from './preferences/menu.js'; -import { General } from './preferences/general.js'; +import { Pipelines } from './preferences/pipelines.js'; import { Panel } from './preferences/panel.js'; import { Overview } from './preferences/overview.js'; import { Dash } from './preferences/dash.js'; import { Applications } from './preferences/applications.js'; import { Other } from './preferences/other.js'; +import './preferences/pipelines_management/pipeline_choose_row.js'; + export default class BlurMyShellPreferences extends ExtensionPreferences { constructor(metadata) { @@ -27,14 +31,20 @@ export default class BlurMyShellPreferences extends ExtensionPreferences { fillPreferencesWindow(window) { addMenu(window); - const preferences = new Settings(Keys, this.getSettings()); + // update from old settings, very important for hacks level specifically + update_from_old_settings(this.getSettings()); - window.add(new General(preferences)); - window.add(new Panel(preferences)); - window.add(new Overview(preferences)); - window.add(new Dash(preferences)); + const preferences = new Settings(KEYS, this.getSettings()); + const pipelines_manager = new PipelinesManager(preferences); + + const pipelines_page = new Pipelines(preferences, pipelines_manager, window); + + window.add(pipelines_page); + window.add(new Panel(preferences, pipelines_manager, pipelines_page)); + window.add(new Overview(preferences, pipelines_manager, pipelines_page)); + window.add(new Dash(preferences, pipelines_manager, pipelines_page)); window.add(new Applications(preferences, window)); - window.add(new Other(preferences)); + window.add(new Other(preferences, pipelines_manager, pipelines_page)); window.search_enabled = true; } diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/gschemas.compiled index 36fefef596a7827343c536a7c6cca7d6cb6b78c3..6f781f41c934e0bd159f143f60f2c83e4a608699 100644 GIT binary patch literal 9848 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 UAZN*W4!6%CXR8JFIjkT50~Q`;aR2}S literal 8296 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 Dg@E0D diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml index 1e237e7..5708ca3 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml @@ -3,6 +3,52 @@ + + + 1 +

The version of the settings to update from. +
+ + + , + 'effects': <[ + <{ + 'type': <'native_static_gaussian_blur'>, + 'id': <'effect_000000000000'>, + 'params': <{ + 'radius': <30>, + 'brightness': <0.6> + }> + }> + ]> + }, + 'pipeline_default_rounded': { + 'name': <'Default rounded'>, + 'effects': <[ + <{ + 'type': <'native_static_gaussian_blur'>, + 'id': <'effect_000000000001'>, + 'params': <{ + 'radius': <30>, + 'brightness': <0.6> + }> + }>, + <{ + 'type': <'corner'>, + 'id': <'effect_000000000002'>, + 'params': <{ + 'radius': <24> + }> + }> + ]> + } + } + ]]> + A dictionnary describing the different pipelines and their effects. + 30 @@ -36,7 +82,7 @@ 1 - Level of hacks to use (from 0 to 3, 3 disabling clipped redraws entirely) + Level of hacks to use (from 0 to 2, 2 disabling clipped redraws entirely) @@ -52,6 +98,7 @@ + @@ -64,6 +111,11 @@ true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -154,6 +206,11 @@ true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -221,9 +278,14 @@ path="/org/gnome/shell/extensions/blur-my-shell/dash-to-dock/"> - false + true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default_rounded" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -266,7 +328,7 @@ - 1 + 0 Enum to select the style of dash to dock (0 transparent, 1 light, 2 dark) @@ -321,9 +383,14 @@ - 230 + 215 Opacity of the window actor on top of the blur effect + + + true + Wether or not to make the focused window opaque + false @@ -354,6 +421,11 @@ true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -394,6 +466,11 @@ true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -434,6 +511,11 @@ true Boolean, whether to blur activate the blur for this component or not + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + false @@ -466,6 +548,21 @@ + + + + + true + Boolean, whether to blur activate the blur for this component or not + + + + "pipeline_default" + String, the name of the pipeline to use. It must exist, else "pipeline_default" will be used + + + diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css index 7cfc773..b61e530 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css @@ -123,12 +123,14 @@ .overview-components-transparent .overview-tile, .overview-components-transparent .overview-icon, +.overview-components-transparent .grid-search-result, .overview-components-transparent .list-search-result, .overview-components-transparent .search-provider-icon, /* prevents the extension from interfering with Just Perfection */ .overview-components-transparent.just-perfection .search-section-content, /* remove the rectangular background from the dash */ -.overview-components-transparent #dash .overview-tile { +.overview-components-transparent #dash .overview-tile, +.overview-components-transparent #dashtopanelScrollview .overview-tile { background-color: transparent; } @@ -146,6 +148,10 @@ .overview-components-transparent .overview-tile:focus, .overview-components-transparent .overview-tile:selected, .overview-components-transparent .overview-tile:highlighted, +.overview-components-transparent .grid-search-result:hover, +.overview-components-transparent .grid-search-result:focus, +.overview-components-transparent .grid-search-result:selected, +.overview-components-transparent .grid-search-result:highlighted, .overview-components-transparent .list-search-result:hover, .overview-components-transparent .list-search-result:focus, .overview-components-transparent .list-search-result:selected, @@ -168,6 +174,10 @@ .overview-components-transparent .overview-tile:drop, .overview-components-transparent .overview-tile:selected:hover, .overview-components-transparent .overview-tile:highlighted:hover, +.overview-components-transparent .grid-search-result:active, +.overview-components-transparent .grid-search-result:focus:hover, +.overview-components-transparent .grid-search-result:selected:hover, +.overview-components-transparent .grid-search-result:highlighted:hover, .overview-components-transparent .list-search-result:active, .overview-components-transparent .list-search-result:focus:hover, .overview-components-transparent .list-search-result:selected:hover, @@ -188,6 +198,9 @@ .overview-components-transparent .overview-tile:focus:active, .overview-components-transparent .overview-tile:selected:active, .overview-components-transparent .overview-tile:highlighted:active, +.overview-components-transparent .grid-search-result:focus:active, +.overview-components-transparent .grid-search-result:selected:active, +.overview-components-transparent .grid-search-result:highlighted:active, .overview-components-transparent .list-search-result:focus:active, .overview-components-transparent .list-search-result:selected:active, .overview-components-transparent .list-search-result:highlighted:active, @@ -216,12 +229,14 @@ .overview-components-light .overview-tile, .overview-components-light .overview-icon, +.overview-components-light .grid-search-result, .overview-components-light .list-search-result, .overview-components-light .search-provider-icon, /* prevents the extension from interfering with Just Perfection */ .overview-components-light.just-perfection .search-section-content, /* remove the rectangular background from the dash */ -.overview-components-light #dash .overview-tile { +.overview-components-light #dash .overview-tile, +.overview-components-light #dashtopanelScrollview .overview-tile { background-color: transparent; } @@ -239,6 +254,10 @@ .overview-components-light .overview-tile:focus, .overview-components-light .overview-tile:selected, .overview-components-light .overview-tile:highlighted, +.overview-components-light .grid-search-result:hover, +.overview-components-light .grid-search-result:focus, +.overview-components-light .grid-search-result:selected, +.overview-components-light .grid-search-result:highlighted, .overview-components-light .list-search-result:hover, .overview-components-light .list-search-result:focus, .overview-components-light .list-search-result:selected, @@ -261,6 +280,10 @@ .overview-components-light .overview-tile:drop, .overview-components-light .overview-tile:selected:hover, .overview-components-light .overview-tile:highlighted:hover, +.overview-components-light .grid-search-result:active, +.overview-components-light .grid-search-result:focus:hover, +.overview-components-light .grid-search-result:selected:hover, +.overview-components-light .grid-search-result:highlighted:hover, .overview-components-light .list-search-result:active, .overview-components-light .list-search-result:focus:hover, .overview-components-light .list-search-result:selected:hover, @@ -281,6 +304,9 @@ .overview-components-light .overview-tile:focus:active, .overview-components-light .overview-tile:selected:active, .overview-components-light .overview-tile:highlighted:active, +.overview-components-light .grid-search-result:focus:active, +.overview-components-light .grid-search-result:selected:active, +.overview-components-light .grid-search-result:highlighted:active, .overview-components-light .list-search-result:focus:active, .overview-components-light .list-search-result:selected:active, .overview-components-light .list-search-result:highlighted:active, @@ -309,12 +335,14 @@ .overview-components-dark .overview-tile, .overview-components-dark .overview-icon, +.overview-components-dark .grid-search-result, .overview-components-dark .list-search-result, .overview-components-dark .search-provider-icon, /* prevents the extension from interfering with Just Perfection */ .overview-components-dark.just-perfection .search-section-content, /* remove the rectangular background from the dash */ -.overview-components-dark #dash .overview-tile { +.overview-components-dark #dash .overview-tile, +.overview-components-dark #dashtopanelScrollview .overview-tile { background-color: transparent; } @@ -332,6 +360,10 @@ .overview-components-dark .overview-tile:focus, .overview-components-dark .overview-tile:selected, .overview-components-dark .overview-tile:highlighted, +.overview-components-dark .grid-search-result:hover, +.overview-components-dark .grid-search-result:focus, +.overview-components-dark .grid-search-result:selected, +.overview-components-dark .grid-search-result:highlighted, .overview-components-dark .list-search-result:hover, .overview-components-dark .list-search-result:focus, .overview-components-dark .list-search-result:selected, @@ -354,6 +386,10 @@ .overview-components-dark .overview-tile:drop, .overview-components-dark .overview-tile:selected:hover, .overview-components-dark .overview-tile:highlighted:hover, +.overview-components-dark .grid-search-result:active, +.overview-components-dark .grid-search-result:focus:hover, +.overview-components-dark .grid-search-result:selected:hover, +.overview-components-dark .grid-search-result:highlighted:hover, .overview-components-dark .list-search-result:active, .overview-components-dark .list-search-result:focus:hover, .overview-components-dark .list-search-result:selected:hover, @@ -374,6 +410,9 @@ .overview-components-dark .overview-tile:focus:active, .overview-components-dark .overview-tile:selected:active, .overview-components-dark .overview-tile:highlighted:active, +.overview-components-dark .grid-search-result:focus:active, +.overview-components-dark .grid-search-result:selected:active, +.overview-components-dark .grid-search-result:highlighted:active, .overview-components-dark .list-search-result:focus:active, .overview-components-dark .list-search-result:selected:active, .overview-components-dark .list-search-result:highlighted:active, diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/window-row.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui similarity index 96% rename from gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/window-row.ui rename to gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui index 953585f..2a26d14 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/window-row.ui +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui @@ -1,6 +1,6 @@ - + + 0 + 100 + 1 + + + + 0.0 + 1.0 + 0.01 + + Transparent @@ -110,10 +169,4 @@ Dark - - - 0 - 50 - 1 - \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui new file mode 100644 index 0000000..c6baf62 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui @@ -0,0 +1,77 @@ + + + + + +
+ + Include advanced effects + effects-dialog.advanced-effects-bool + +
+
+
\ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/general.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/general.ui deleted file mode 100644 index 73c6b29..0000000 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/general.ui +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - 0 - 200 - 1 - - - - 0.0 - 1.0 - 0.01 - - - - 0.0 - 1.0 - 0.01 - - - - 0.0 - 2.0 - 0.01 - - - - - High performances - Default - High quality - No artifact - - - \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui index e7b9210..6d2a474 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui @@ -30,7 +30,7 @@ info_menu_model - heart-filled-symbolic + heart-symbolic diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui index d1d24f8..e136e38 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui @@ -16,7 +16,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -52,11 +52,157 @@ - + + Sigma + The intensity of the blur. + window_list_sigma_scale + + + + center + true + 200px + true + right + 0 + window_list_sigma + + + + + + + + Brightness + The brightness of the blur effect, a high value might make the text harder to read. + window_list_brightness_scale + + + + + center + true + 200px + true + right + 2 + window_list_brightness + + + + + + Coverflow Alt-Tab extension blur + Make the coverflow alt-tab extension blurred, if it is used. + + + center + + + + + + + + + + + + + + Performance + Various options to tweak the performance. + + + + Hack level + Changes the behaviour of the dynamic blur effect. The default value is highly recommended. +The “No artifact” option will entirely disable clipped redraws in GNOME shell, and will impact your computer performances significantly. + hack_level + + + center + hack_level_model + + + + + + + + Debug + Makes the extension verbose in logs, activate when you need to report an issue. + debug + + + center + + + + + + + + + + + Reset preferences + Resets preferences of Blur my Shell irreversibly. + + + start + center + + + 20 + 20 + 6 + 6 + + + 6 + reset-symbolic + + + + + Reset + + + + + + + + + + + + 0 + 100 + 1 + + + + 0.0 + 1.0 + 0.01 + + + + + High performances + Default + No artifact + + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui index 191c70b..36b91fc 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui @@ -16,7 +16,7 @@ - + @@ -50,8 +50,44 @@ - + + Sigma + The intensity of the blur. + appfolder_sigma_scale + + + + center + true + 200px + true + right + 0 + appfolder_sigma + + + + + + + + Brightness + The brightness of the blur effect, a high value might make the text harder to read. + appfolder_brightness_scale + + + + + center + true + 200px + true + right + 2 + appfolder_brightness + + @@ -83,6 +119,19 @@ + + 0 + 100 + 1 + + + + 0.0 + 1.0 + 0.01 + + + Do not style diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui index f7a40e0..306f4ef 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui @@ -16,21 +16,93 @@ - + + Blur type + The dynamic blur is slower and only compatible with a gaussian blur effect. + blur_mode_choose + + + + + center + false + + + + + center + true + mode_dynamic + + + static-mode-symbolic + Static + + + + + + + center + true + + + dynamic-mode-symbolic + Dynamic + + + + + + + + + + + - - Static blur - Uses a static blurred image, more performant and stable. - static_blur + + Sigma + The intensity of the blur. + sigma_scale - + center + true + 200px + true + right + 0 + sigma + + + + + + + + Brightness + The brightness of the blur effect, a high value might make the text harder to read. + brightness_scale + + + + + center + true + 200px + true + right + 2 + brightness @@ -153,4 +225,16 @@ Recommended unless you want to customize your GNOME theme. Contrasted + + + 0 + 100 + 1 + + + + 0.0 + 1.0 + 0.01 + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui new file mode 100644 index 0000000..72b854b --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui @@ -0,0 +1,39 @@ + + + + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui new file mode 100644 index 0000000..19a12bf --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui @@ -0,0 +1,29 @@ + + + + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui new file mode 100644 index 0000000..555ec0a --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui @@ -0,0 +1,44 @@ + + + + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json index 2b9f450..76e0559 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json @@ -19,11 +19,23 @@ { "wmClass": "zoom", "mode": "float" }, { "wmClass": "firefox", "wmTitle": "About Mozilla Firefox", "mode": "float" }, { "wmClass": "firefox", "wmTitle": "!Mozilla Firefox", "mode": "float" }, - { "wmClass": "org.mozilla.firefox.desktop", "wmTitle": "About Mozilla Firefox", "mode": "float" }, + { + "wmClass": "org.mozilla.firefox.desktop", + "wmTitle": "About Mozilla Firefox", + "mode": "float" + }, { "wmClass": "org.mozilla.firefox.desktop", "wmTitle": "!Mozilla Firefox", "mode": "float" }, { "wmClass": "thunderbird", "wmTitle": "About Mozilla Thunderbird", "mode": "float" }, { "wmClass": "thunderbird", "wmTitle": "!Mozilla Thunderbird", "mode": "float" }, - { "wmClass": "org.mozilla.Thunderbird.desktop", "wmTitle": "About Mozilla Thunderbird", "mode": "float" }, - { "wmClass": "org.mozilla.Thunderbird.desktop", "wmTitle": "!Mozilla Thunderbird", "mode": "float" } + { + "wmClass": "org.mozilla.Thunderbird.desktop", + "wmTitle": "About Mozilla Thunderbird", + "mode": "float" + }, + { + "wmClass": "org.mozilla.Thunderbird.desktop", + "wmTitle": "!Mozilla Thunderbird", + "mode": "float" + } ] } diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js index ea0d767..0fa2981 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js @@ -17,6 +17,7 @@ */ // Gnome imports +import Clutter from "gi://Clutter"; import GObject from "gi://GObject"; import Meta from "gi://Meta"; import Shell from "gi://Shell"; @@ -490,11 +491,22 @@ export class Node extends GObject.Object { metaWin.activate(global.display.get_current_time()); }; - iconBin.connect("clicked", clickFn); - titleButton.connect("clicked", clickFn); - closeButton.connect("clicked", () => { + let closeFn = () => { metaWin.delete(global.get_current_time()); - }); + }; + + let middleClickCloseFn = (_, event) => { + if (event.get_button() === Clutter.BUTTON_MIDDLE) { + metaWin.delete(global.get_current_time()); + } + }; + + iconBin.connect("clicked", clickFn); + iconBin.connect("button-release-event", middleClickCloseFn); + titleButton.connect("clicked", clickFn); + titleButton.connect("button-release-event", middleClickCloseFn); + closeButton.connect("clicked", closeFn); + closeButton.connect("button-release-event", middleClickCloseFn); if (metaWin === global.display.get_focus_window()) { tabContents.add_style_class_name("window-tabbed-tab-active"); @@ -1215,6 +1227,18 @@ export class Tree extends Node { if (!this.extWm.floatingWindow(node)) cleanUpParent(existParent); } + // If only a single tab remains, exit tabbed layout + if ( + this.settings.get_boolean("auto-exit-tabbed") && + parentNode.nodeType === NODE_TYPES.CON && + parentNode.layout === LAYOUT_TYPES.TABBED && + parentNode.childNodes.length === 1 + ) { + parentNode.layout = this.extWm.determineSplitLayout(); + this.resetSiblingPercent(parentNode); + parentNode.lastTabFocus = null; + } + if (node === this.attachNode) { this.attachNode = null; } else { @@ -1511,7 +1535,6 @@ export class Tree extends Node { if (gap === 0) { adjustY = renderRect.y; - nodeY = renderRect.y + params.stackedHeight + adjust / 4; } let decoration = node.decoration; diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/utils.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/utils.js index 189a4b0..e9132e0 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/utils.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/utils.js @@ -261,11 +261,16 @@ export function positionFromGrabOp(grabOp) { } export function allowResizeGrabOp(grabOp) { + grabOp &= ~1024; // ignore META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED return ( grabOp === Meta.GrabOp.RESIZING_N || grabOp === Meta.GrabOp.RESIZING_E || grabOp === Meta.GrabOp.RESIZING_W || grabOp === Meta.GrabOp.RESIZING_S || + grabOp === Meta.GrabOp.RESIZING_NE || + grabOp === Meta.GrabOp.RESIZING_NW || + grabOp === Meta.GrabOp.RESIZING_SE || + grabOp === Meta.GrabOp.RESIZING_SW || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_N || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_E || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_W || @@ -275,11 +280,16 @@ export function allowResizeGrabOp(grabOp) { } export function grabMode(grabOp) { + grabOp &= ~1024; // ignore META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED if ( grabOp === Meta.GrabOp.RESIZING_N || grabOp === Meta.GrabOp.RESIZING_E || grabOp === Meta.GrabOp.RESIZING_W || grabOp === Meta.GrabOp.RESIZING_S || + grabOp === Meta.GrabOp.RESIZING_NE || + grabOp === Meta.GrabOp.RESIZING_NW || + grabOp === Meta.GrabOp.RESIZING_SE || + grabOp === Meta.GrabOp.RESIZING_SW || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_N || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_E || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_W || @@ -297,6 +307,22 @@ export function grabMode(grabOp) { return GRAB_TYPES.UNKNOWN; } +export function decomposeGrabOp(grabOp) { + grabOp &= ~1024; // ignore META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED + switch (grabOp) { + case Meta.GrabOp.RESIZING_NE: + return [Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_E]; + case Meta.GrabOp.RESIZING_NW: + return [Meta.GrabOp.RESIZING_N, Meta.GrabOp.RESIZING_W]; + case Meta.GrabOp.RESIZING_SE: + return [Meta.GrabOp.RESIZING_S, Meta.GrabOp.RESIZING_E]; + case Meta.GrabOp.RESIZING_SW: + return [Meta.GrabOp.RESIZING_S, Meta.GrabOp.RESIZING_W]; + default: + return [grabOp]; + } +} + export function directionFromGrab(grabOp) { if (grabOp === Meta.GrabOp.RESIZING_E || grabOp === Meta.GrabOp.KEYBOARD_RESIZING_E) { return Meta.MotionDirection.RIGHT; diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js index b5d3ceb..b5e60d5 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js @@ -2348,143 +2348,145 @@ export class WindowManager extends GObject.Object { _handleResizing(focusNodeWindow) { if (!focusNodeWindow || focusNodeWindow.isFloat()) return; - let grabOp = this.grabOp; - let initGrabOp = focusNodeWindow.initGrabOp; - let direction = Utils.directionFromGrab(grabOp); - let orientation = Utils.orientationFromGrab(grabOp); - let parentNodeForFocus = focusNodeWindow.parentNode; - let position = Utils.positionFromGrabOp(grabOp); - // normalize the rect without gaps - let frameRect = this.focusMetaWindow.get_frame_rect(); - let gaps = this.calculateGaps(focusNodeWindow); - let currentRect = Utils.removeGapOnRect(frameRect, gaps); - let firstRect; - let secondRect; - let parentRect; - let resizePairForWindow; + let grabOps = Utils.decomposeGrabOp(this.grabOp); + for (let grabOp of grabOps) { + let initGrabOp = focusNodeWindow.initGrabOp; + let direction = Utils.directionFromGrab(grabOp); + let orientation = Utils.orientationFromGrab(grabOp); + let parentNodeForFocus = focusNodeWindow.parentNode; + let position = Utils.positionFromGrabOp(grabOp); + // normalize the rect without gaps + let frameRect = this.focusMetaWindow.get_frame_rect(); + let gaps = this.calculateGaps(focusNodeWindow); + let currentRect = Utils.removeGapOnRect(frameRect, gaps); + let firstRect; + let secondRect; + let parentRect; + let resizePairForWindow; - if (initGrabOp === Meta.GrabOp.RESIZING_UNKNOWN) { - // the direction is null so do not process yet below. - return; - } else { - resizePairForWindow = this.tree.nextVisible(focusNodeWindow, direction); - } - - let sameParent = resizePairForWindow - ? resizePairForWindow.parentNode === focusNodeWindow.parentNode - : false; - - if (orientation === ORIENTATION_TYPES.HORIZONTAL) { - if (sameParent) { - // use the window or con pairs - if (this.tree.getTiledChildren(parentNodeForFocus.childNodes).length <= 1) { - return; - } - - firstRect = focusNodeWindow.initRect; - if (resizePairForWindow) { - if ( - !this.floatingWindow(resizePairForWindow) && - !this.minimizedWindow(resizePairForWindow) - ) { - secondRect = resizePairForWindow.rect; - } else { - // TODO try to get the next resize pair? - } - } - - if (!firstRect || !secondRect) { - return; - } - - parentRect = parentNodeForFocus.rect; - let changePx = currentRect.width - firstRect.width; - let firstPercent = (firstRect.width + changePx) / parentRect.width; - let secondPercent = (secondRect.width - changePx) / parentRect.width; - focusNodeWindow.percent = firstPercent; - resizePairForWindow.percent = secondPercent; + if (initGrabOp === Meta.GrabOp.RESIZING_UNKNOWN) { + // the direction is null so do not process yet below. + return; } else { - // use the parent pairs (con to another con or window) - if (resizePairForWindow && resizePairForWindow.parentNode) { - if (this.tree.getTiledChildren(resizePairForWindow.parentNode.childNodes).length <= 1) { + resizePairForWindow = this.tree.nextVisible(focusNodeWindow, direction); + } + + let sameParent = resizePairForWindow + ? resizePairForWindow.parentNode === focusNodeWindow.parentNode + : false; + + if (orientation === ORIENTATION_TYPES.HORIZONTAL) { + if (sameParent) { + // use the window or con pairs + if (this.tree.getTiledChildren(parentNodeForFocus.childNodes).length <= 1) { return; } - let firstWindowRect = focusNodeWindow.initRect; - let index = resizePairForWindow.index; - if (position === POSITION.BEFORE) { - // Find the opposite node - index = index + 1; - } else { - index = index - 1; + + firstRect = focusNodeWindow.initRect; + if (resizePairForWindow) { + if ( + !this.floatingWindow(resizePairForWindow) && + !this.minimizedWindow(resizePairForWindow) + ) { + secondRect = resizePairForWindow.rect; + } else { + // TODO try to get the next resize pair? + } } - parentNodeForFocus = resizePairForWindow.parentNode.childNodes[index]; - firstRect = parentNodeForFocus.rect; - secondRect = resizePairForWindow.rect; + if (!firstRect || !secondRect) { return; } - parentRect = parentNodeForFocus.parentNode.rect; - let changePx = currentRect.width - firstWindowRect.width; + parentRect = parentNodeForFocus.rect; + let changePx = currentRect.width - firstRect.width; let firstPercent = (firstRect.width + changePx) / parentRect.width; let secondPercent = (secondRect.width - changePx) / parentRect.width; - parentNodeForFocus.percent = firstPercent; + focusNodeWindow.percent = firstPercent; resizePairForWindow.percent = secondPercent; - } - } - } else if (orientation === ORIENTATION_TYPES.VERTICAL) { - if (sameParent) { - // use the window or con pairs - if (this.tree.getTiledChildren(parentNodeForFocus.childNodes).length <= 1) { - return; - } - firstRect = focusNodeWindow.initRect; - if (resizePairForWindow) { - if ( - !this.floatingWindow(resizePairForWindow) && - !this.minimizedWindow(resizePairForWindow) - ) { + } else { + // use the parent pairs (con to another con or window) + if (resizePairForWindow && resizePairForWindow.parentNode) { + if (this.tree.getTiledChildren(resizePairForWindow.parentNode.childNodes).length <= 1) { + return; + } + let firstWindowRect = focusNodeWindow.initRect; + let index = resizePairForWindow.index; + if (position === POSITION.BEFORE) { + // Find the opposite node + index = index + 1; + } else { + index = index - 1; + } + parentNodeForFocus = resizePairForWindow.parentNode.childNodes[index]; + firstRect = parentNodeForFocus.rect; secondRect = resizePairForWindow.rect; - } else { - // TODO try to get the next resize pair? + if (!firstRect || !secondRect) { + return; + } + + parentRect = parentNodeForFocus.parentNode.rect; + let changePx = currentRect.width - firstWindowRect.width; + let firstPercent = (firstRect.width + changePx) / parentRect.width; + let secondPercent = (secondRect.width - changePx) / parentRect.width; + parentNodeForFocus.percent = firstPercent; + resizePairForWindow.percent = secondPercent; } } - if (!firstRect || !secondRect) { - return; - } - parentRect = parentNodeForFocus.rect; - let changePx = currentRect.height - firstRect.height; - let firstPercent = (firstRect.height + changePx) / parentRect.height; - let secondPercent = (secondRect.height - changePx) / parentRect.height; - focusNodeWindow.percent = firstPercent; - resizePairForWindow.percent = secondPercent; - } else { - // use the parent pairs (con to another con or window) - if (resizePairForWindow && resizePairForWindow.parentNode) { - if (this.tree.getTiledChildren(resizePairForWindow.parentNode.childNodes).length <= 1) { + } else if (orientation === ORIENTATION_TYPES.VERTICAL) { + if (sameParent) { + // use the window or con pairs + if (this.tree.getTiledChildren(parentNodeForFocus.childNodes).length <= 1) { return; } - let firstWindowRect = focusNodeWindow.initRect; - let index = resizePairForWindow.index; - if (position === POSITION.BEFORE) { - // Find the opposite node - index = index + 1; - } else { - index = index - 1; + firstRect = focusNodeWindow.initRect; + if (resizePairForWindow) { + if ( + !this.floatingWindow(resizePairForWindow) && + !this.minimizedWindow(resizePairForWindow) + ) { + secondRect = resizePairForWindow.rect; + } else { + // TODO try to get the next resize pair? + } } - parentNodeForFocus = resizePairForWindow.parentNode.childNodes[index]; - firstRect = parentNodeForFocus.rect; - secondRect = resizePairForWindow.rect; if (!firstRect || !secondRect) { return; } - - parentRect = parentNodeForFocus.parentNode.rect; - let changePx = currentRect.height - firstWindowRect.height; + parentRect = parentNodeForFocus.rect; + let changePx = currentRect.height - firstRect.height; let firstPercent = (firstRect.height + changePx) / parentRect.height; let secondPercent = (secondRect.height - changePx) / parentRect.height; - parentNodeForFocus.percent = firstPercent; + focusNodeWindow.percent = firstPercent; resizePairForWindow.percent = secondPercent; + } else { + // use the parent pairs (con to another con or window) + if (resizePairForWindow && resizePairForWindow.parentNode) { + if (this.tree.getTiledChildren(resizePairForWindow.parentNode.childNodes).length <= 1) { + return; + } + let firstWindowRect = focusNodeWindow.initRect; + let index = resizePairForWindow.index; + if (position === POSITION.BEFORE) { + // Find the opposite node + index = index + 1; + } else { + index = index - 1; + } + parentNodeForFocus = resizePairForWindow.parentNode.childNodes[index]; + firstRect = parentNodeForFocus.rect; + secondRect = resizePairForWindow.rect; + if (!firstRect || !secondRect) { + return; + } + + parentRect = parentNodeForFocus.parentNode.rect; + let changePx = currentRect.height - firstWindowRect.height; + let firstPercent = (firstRect.height + changePx) / parentRect.height; + let secondPercent = (secondRect.height - changePx) / parentRect.height; + parentNodeForFocus.percent = firstPercent; + resizePairForWindow.percent = secondPercent; + } } } } diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js index 9333fe2..04d688f 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js @@ -74,6 +74,19 @@ export class SettingsPage extends PreferencesPage { ], }); + this.add_group({ + title: _("Behavior"), + children: [ + new SwitchRow({ + title: _("Move Pointer with the Focus"), + subtitle: _("Move the pointer when focusing or swapping via keyboard"), + experimental: true, + settings, + bind: "move-pointer-focus-enabled", + }), + ], + }); + this.add_group({ title: _("Tiling"), children: [ @@ -106,6 +119,12 @@ export class SettingsPage extends PreferencesPage { { id: "stacked", name: _("Stacked") }, ], }), + new SwitchRow({ + title: _("Auto Exit Tabbed Tiling Mode"), + subtitle: _("Exit tabbed tiling mode when only a single tab remains"), + settings, + bind: "auto-exit-tabbed", + }), new SwitchRow({ title: _("Auto Split"), subtitle: _("Quarter Tiling"), @@ -130,19 +149,6 @@ export class SettingsPage extends PreferencesPage { ], }); - this.add_group({ - title: _("Behavior"), - children: [ - new SwitchRow({ - title: _("Move Pointer with the Focus"), - subtitle: _("Move the pointer when focusing or swapping via keyboard"), - experimental: true, - settings, - bind: "move-pointer-focus-enabled", - }), - ], - }); - if (!production) { this.add_group({ title: _("Logger"), diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo index b3234e1956980c81f3a251f0d2f8c3a6f8e278db..0c3fba120ef6c986049c68eca6c864394e3a3637 100644 GIT binary patch literal 4783 zcmaKuOKcri8GsL=rPP$Rq);B=ai9;kknyW8<2a^%rV(-D+Acw=5FF2(d+#K3=S=2d z#{r430kL4g0)z?@AR&Qylub8Cl+6_zREZ5jAXN<#3&aMo1Vkmi|D1cTubYIC$KTvJ zkN%0I3@-KNy-@Xt_QU58`vuYLXlzMbFyhIheZ zOnwKv2QI=BP}YC0|2~FHRSrG?Yq$o#183lM_z*n)Hl^MNXW?=99Aro(P}X0B?}ZND z3BLwKk8eW$)QkKReSQc}z?a}t@OMzwAG<@T``{gL3!Z?ozk^Is4g3`R5|n*^4L<;X z3nTa!_#SvSgYSk9LSCs)!VkkmDEof_%Dy!exmTg=|K&cv3O~f}Z$Pp0XYifyH&Ej7 zDwO$uhvJWa!jHi_G5TS6622d9LGeSEe#%H0} zvkJwY7hnzxD0W?k_rkwHvEyIxarg$z;0&8A!0*Eq_&O9l9>5sUdkKmkUVvhcfzz-9 z-vwWUBIoB26V=O5*1ZBHPyPru;eVj4U%xxpzYV{_?=M3B)EoSh@w@K9_wYW5imHaQ z@ETl#zk;Igf8hi?g>fSHBAkL16!|}bqW3FM#(Ploe6`O%z{mLg8kBh5i!l$u2%dpk zQ0)6I|2_(T0jJ>aq2!|k{RuD&WnKfIpOWixNsh}UzLWfv>q&0$wd6DIQsdl` zN+#D!pmz zrp#qO88UHf3&z%5+*F#i@-l7buCx}#WAvCk%YCzxwW*W`&et|bc@36?0Y zmDgz7TdCIv#(x@t=ZiXZd8O7eXKER;dNJEG`;|VQ>uqfI1MC*mc_z(kwdTsURcB05 z`G5MEG)Zi(_d5LB!jD-Prr5XV%1c#Y zVyg*t8rw=7TwO|w3B5Yep3qY#r+MlYHR0%oD@iM}lUZJSO@~oZo0d3+|CQPz#&NCZ z(*@CCellHaXlbYzpOYmYJ+^T^+GIPK8Lc3FPR~ruJQhvOL^HE``l-3;C!?t+rl!WunW~PqDTY;MYFEzb z3pOG5^!%QuYqioiwb|2@k<7VE6RmQAHF>+iP0_YBUGykz9(Q!4mvLTVSX#RMr;F0n zE}!Vy!})W%RepYXacuqU`s$$>(-Tu;QW5caw7p-TsT`U~s#Kbv(s9R>IP&!K+iTJ6 z;XF~eWy@$ak10lZdrr^pr1jWF)|4iT2t>D<(|O^4R;Oo9>F{{^kz6n6=|{&t8=bMa zErZEt>Y@Gm@fp-ny=z3n6|UlF4O)f~Gs)H7K|%BI$Hve-x;$QPXb!F`fe5*??3&Cr zC98F2{OKZJ$mTR7J&(Q|7E>nHu8FBvObGoY4q^(&RvBfcW%J%oYcfxh8g!kmt4!~g zNcW9LiWr+z%uc25vqZPEw5sq^g4T`))byH>x?WT)t*G}h#Vs@7|iuOOC~R8 z;?Aqu`>H9cuvchb<%C+4gzQl48@?uRI{w?N+TCyR5>!y{sIINch3$Ll&-KGwy>T{5Q^c7odVhmAB zrivvMbT%G3rmQT8J_V{dR8k!0V=uWLCW>f0>$|O2gOuDQHFWO>{ZATFX7$Qk=(*>N zWcyXxx$N&Vp?6Rjdfe`t^YBRa`5Ma%wb?sJbJAaQ!mpcFOqL@reVJ04vpL<_o8{ZH z7ea$3nL-knL4J;AjP&f@fp6NstuQ>DYew|H&E;ai!_`a@b!nsG>KiA@c3tFU}(c;f9Gp=%VUH7)DVAQQ_NET107>$Hvj+t delta 1017 zcmXxjJ!q3b9LMoXOwznON!qkk6QefTm{Mu0)FLiQB&k!D1RRQku>`E9O{`6&2nH9y zQI0NB5OHzRAxn#cgKieF2%<~XLAn;CqA23`7t`bU-{*NQ&vP&TyF5?7OEfoQo@GNB zB9g=cC(Vn05? zKE^j|+;q|K77yVEfm=rHxCDS4qzBFsEkcu9E+$4S5f^e;#IP_jGFLY24V3g z#4Pk)6#E(9#JTCiF`UC3YCRCj#Eem+v$V$td(k=4;2lXA#|{`HOiKXI^QkI z+!2Cgm_Z^%Xi?h2koI4PM@5Hlwy`3+d2YI5UEa^O*Eei0`Xct4FK69duWi&{^fc;~ zd3(n{YG3+?Z7J|9I8&|8lxGKuwI!PkChYOxPAeapa@kEMZ_kJ0wj6G>3XyS_{S$ra SEww*?)19{?JvDnKw)hWTLTIf3 diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json index dda6394..aef9827 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json @@ -10,9 +10,10 @@ "settings-schema": "org.gnome.shell.extensions.forge", "shell-version": [ "45", - "46" + "46", + "47" ], "url": "https://github.com/forge-ext/forge", "uuid": "forge@jmmaranan.com", - "version": 78 + "version": 84 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled index 3884f40cac5027fd11673f539b32b86104fd3b47..b7ad5be7f8b4cd1be30a08fe55fb9e96f3e10fd5 100644 GIT binary patch delta 2303 zcmZ9Ne@v8h9LK-J9h?FJ0`l|nO2~)BGoWBF14e(aZeU@}?Len-+&$8br@MH)6qhF`_9ul?h`^(#|lv(>_UY~@j{r>gt&*FBNdHey=Z_ogyO*S zh&~Jb`%Ib;{kYiks#{?LeH6d_*r88?Goc%~%;~ukO;80Kzxda2=Jd=% z&@edYf53P$dgIBU{XkD{RoS1O3mt`ygN>7=tC?%O;EE#9>)=#o(JeO6^9CM*IB;_F zZ+|eS&qgjmWzgX}#J6F1_OC`(12(^Vwv0JF`!_)q@KIxx(Vrf*IKc^^b~fC>oStXS z29;t9u?1WIY-NMA*ia5-`KZ2@7LT_@R=mz;RdJ&Se)_SPN6Z1g>Iv#IF=_f1Q}%Ol zh*=Fh*_acrk!OVmQi$b%)w2rl$11_lMs=`?aGs6Ih=Q{ERsw81c7CC1vY_c85$HuR zd3u^DNjJyZQnvYA?E$&j*XCB*0d>c>fz`ty)W99?g|7jRUjz0``yl0wT9<-xVXYyk)EeDVw%=reFbh#6S=2+{K+)B`QS0hqX5e1-k#)6ste)D5QJyvs9b zcrG-A>~)~reft~c^juIcbYulSTvb}-RW^(u;1frncfiE8u}7KHvm`AzJ?Wsxb&u!T z@GN-=StVGiBzjho9l9M<)O>!5{pndT-OwZS^9j3SF~4!a3HlHY0VT1vg*VXi)m(;t z4<=t*Tg#lD-vX9M3i$XTtHPXq1#$^m3ARR!{lc7{{TraIK=;MJ%$#214P7vY!9LHN zv32y^x?box@L9$EM!C`R)l5NWz^)&^W0f186C~l^ssQM>EFUtbXMa1?3BIVCsAo>k zSJ0J=KQ0{?`=8o#gbnoE(q8C!(EYe-yfb?4&=mA%Fg9D8$^P`*Ar^cJI2mv?F{d|P z4YUlrSFy>Mn4Yh=0qO-q2eluJQ_TxLaToM3_@MB%Q3dpTvO(xLD19;8IKA}zBfAFu z9lY{uVHGE)$Eg+>`0|th{=qS)=L6WG4sf%)c|CK7h6`>*2zmfqU$fW226}#`d!gsS zNO{U7=Jd;vk3z44x}yF7b9#<52aUsLvtiyp%$%OpAwkPPedV*p4$*Um%yt;Z*@XDV GEPn&T0j3%N literal 5192 zcmai1e~c9686K*%C?bcTf*jr{oGg{OT@>oooadQ_h(MGIDoARXo&9ci*x8xs%@fe3}f<@hH)Ox?X&QsvDz4hTmkrDxxeiBHPIhcgzNT;(O7tq<9kv6 z2!0b7oSVy6)WdyT3}9M`OCX6$0W2di9Wsk9{67P@0+?&_^35Jeo&#>&(7m1Gsm}!8g^gbc zJo>$oAWwZN_+H39;N@dK`;a{KOTZT(2Y{!7>mDReo%>l2`88nn({H{_p87QK0puv~ z;>LgfhdlMU;CDgp=5Md|l*v=S3jBV^*MZ00I5~wpb)M@e$^F{0A42r#=V#KFIyRD;tL7 zeyDT*$01Ju8(;e6EgVms{29n|K*N7pj;Ai|{CU_G*!IxbD#ugjxpI&Npl@QTv?q1i za}DHuz;l22?{gea{R;3E$Zr9AM?Y9Vo;vwmkh_6{Z@s>PJazK>AP)n3<`h06Po4WY z3Hd&-&3(8;o;rC3@MPdOhxe``Pkk2nUP$IoRPmd!RWwV&_CqU1QkcTCimoVOFrG<9 zuDGb_cqPASmaV{yoGpU9bXTsvs6Vjc3jWU{k@7Oh@-oTt?Ig>~B+Fy1C~%$FEc#(d zgl6oQ%dU{~+fiiJgOU|<)m*g5^~b;N@nc1j#oBoeo1H($bEdH?$}i`5^;<%`U3KI?5oVTH4DK$Sb}-Z zyr*4QBUlTV|I>gu0K!Jr54c6U-xZbB600cdrhej_Jb%*wC5=<8gYFqHZ8YljYa%D_Jh<`(taI`-}1j}MX?G3Zkgxiy2<%I z)on?9YA3gS*AI=bT(ojG-TbA+y4>!i_h#l%a$$fy=f^X zTT&RnpJb*WbZS;OW+uLnAq9WP_>wDWyGo*6!fh9jD01>u|;i08#4_wiW`tG_D7 zif{;{Gul*GCg1-*9 zUZD^228D%?FrV@4-r*W!pM9HkEeClE(6u!8IC<*b;MYUOz{rLZx00vc1%5l^4}sk~ zuHQkP`U3C=A>Rdd-uc>M^3+*>&p=K?GEUsOe4IS>dEg6>%YpCz>(}>^r#>6}CddYm z_9yD>Pot3CNX8={FL|5esb7up1CXnM6F>TdrB&+O=O%DX(D> zLec629-4IM@8qd-{4nHNV5fiCcgR!c_zL7!;Bn`Sv>SEWZ5;9?;J1U<${I*7y4|(dee+BZJz>{}B`UCRRY0q)U zJ;3%mTl&uA~;T?jk&8E#^IhJz@cX)G-zU-M|+C)^$EeX<6^t1Ngnw3$X69 zH_Qikr(thkt!KYxKjAkL`^`Kc2f)RMkK{hXI}-0V>_aT42oZz50j1gK0aPqRP24l( zb-=P?r=k3txb$8T*Fz7LBV)c~ycm&@quHy{(a!WtD|XWH*=VTiaiaxY>eBQ*=@(yL zCvk=;Z$l~+Z9R_VmSq%c^SElB^imC*eD=LMa~H_tj;$qBJy7dc)%v*inl&q`;6>xI2}@=+f7|&H>-iziUJvA~ z7sPi}w`0WFv9Ijx%3jR7vOcd&@AkY}C8(-A$VOOF2{ij}*4IzJcd{v|jSt*3prvlqC0MgsM-)=c?%AvR+CPTHkltK$1G$&WVa2I$L}%R$0-?i!JH?lg}izfU4-7{F$vc zj*5d$9}LPqqx$@+!l*ATS!mMzYxc3#x#a=W7qH$jbUQ_w|NTICYW+1Lbo|lb%7 diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml index 40cf788..ee42081 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml @@ -120,13 +120,17 @@ - true + false Move the pointer when focusing or swapping via kbd true Floating windows toggle always-on-top + + true + Exit tabbed tiling mode when only a single tab remains + true Enable auto split or quarter-tiling based based on smaller side diff --git a/gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/keycodes.tar.xz b/gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/keycodes.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..a57820aef1bd65379fe084f033e51c48ba889916 GIT binary patch literal 281908 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�_;O4mOEbR;e6h`kV6BE$0YUsjF`HY7cpCgkh)69ICc≥$AJF z$fYXoCE&TK2n?|*&*tr>zc?KZyfv@@`;AK7J~`>gi^g1)#F!)EFx2}X9+ zbhe%V{sqCg*`zNu<<0YsCa#I2d&f|^t(e3qLI*N)(z%9#$GmR{eBB>(t@3}e!T
W96Kw(DNGb4mTQnD{U4AGG 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

KqRo#fyO!biKDY!hd$6B>1oDe7Udndne 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 + diff --git a/gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/ui/icons/hicolor/scalable/actions/settings.svg b/gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/ui/icons/hicolor/scalable/actions/settings.svg new file mode 100644 index 0000000..18735f5 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gjsosk@vishram1123.com/ui/icons/hicolor/scalable/actions/settings.svg @@ -0,0 +1,37 @@ + + diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js new file mode 100644 index 0000000..038f60e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect +// +// SPDX-License-Identifier: GPL-2.0-or-later + +import GLib from 'gi://GLib'; + +import setup, {setupGettext} from '../utils/setup.js'; + + +// Bootstrap +setup(GLib.path_get_dirname(GLib.path_get_dirname(GLib.filename_from_uri(import.meta.url)[0]))); +setupGettext(); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js new file mode 100644 index 0000000..249c7ee --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect +// +// SPDX-License-Identifier: GPL-2.0-or-later + +import * as atspi from './atspi.js'; +import * as clipboard from './clipboard.js'; +import * as contacts from './contacts.js'; +import * as input from './input.js'; +import * as mpris from './mpris.js'; +import * as notification from './notification.js'; +import * as pulseaudio from './pulseaudio.js'; +import * as session from './session.js'; +import * as sound from './sound.js'; +import * as upower from './upower.js'; +import * as ydotool from './ydotool.js'; + +export const functionOverrides = {}; + +const components = { + atspi, + clipboard, + contacts, + input, + mpris, + notification, + pulseaudio, + session, + sound, + upower, + ydotool, +}; + +/* + * Singleton Tracker + */ +const Default = new Map(); + + +/** + * Acquire a reference to a component. Calls to this function should always be + * followed by a call to `release()`. + * + * @param {string} name - The module name + * @return {*} The default instance of a component + */ +export function acquire(name) { + if (functionOverrides.acquire) + return functionOverrides.acquire(name); + + let component; + + try { + let info = Default.get(name); + + if (info === undefined) { + const module = components[name]; + + info = { + instance: new module.default(), + refcount: 0, + }; + + Default.set(name, info); + } + + info.refcount++; + component = info.instance; + } catch (e) { + debug(e, name); + } + + return component; +} + + +/** + * Release a reference on a component. If the caller was the last reference + * holder, the component will be freed. + * + * @param {string} name - The module name + * @return {null} A %null value, useful for overriding a traced variable + */ +export function release(name) { + if (functionOverrides.release) + return functionOverrides.release(name); + + try { + const info = Default.get(name); + + if (info.refcount === 1) { + info.instance.destroy(); + Default.delete(name); + } + + info.refcount--; + } catch (e) { + debug(e, name); + } + + return null; +} + diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js new file mode 100644 index 0000000..313c70b --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js @@ -0,0 +1,428 @@ +// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect +// +// SPDX-License-Identifier: GPL-2.0-or-later + +import {watchService} from '../wl_clipboard.js'; + +import Gio from 'gi://Gio'; +import GIRepository from 'gi://GIRepository'; +import GLib from 'gi://GLib'; + +import Config from '../config.js'; +import setup, {setupGettext} from '../utils/setup.js'; + + +// Promise Wrappers +// We don't use top-level await since it returns control flow to importing module, causing bugs +import('gi://EBook').then(({default: EBook}) => { + Gio._promisify(EBook.BookClient, 'connect'); + Gio._promisify(EBook.BookClient.prototype, 'get_view'); + Gio._promisify(EBook.BookClient.prototype, 'get_contacts'); +}).catch(console.debug); +import('gi://EDataServer').then(({default: EDataServer}) => { + Gio._promisify(EDataServer.SourceRegistry, 'new'); +}).catch(console.debug); + +Gio._promisify(Gio.AsyncInitable.prototype, 'init_async'); +Gio._promisify(Gio.DBusConnection.prototype, 'call'); +Gio._promisify(Gio.DBusProxy.prototype, 'call'); +Gio._promisify(Gio.DataInputStream.prototype, 'read_line_async', + 'read_line_finish_utf8'); +Gio._promisify(Gio.File.prototype, 'delete_async'); +Gio._promisify(Gio.File.prototype, 'enumerate_children_async'); +Gio._promisify(Gio.File.prototype, 'load_contents_async'); +Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume'); +Gio._promisify(Gio.File.prototype, 'query_info_async'); +Gio._promisify(Gio.File.prototype, 'read_async'); +Gio._promisify(Gio.File.prototype, 'replace_async'); +Gio._promisify(Gio.File.prototype, 'replace_contents_bytes_async', + 'replace_contents_finish'); +Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async'); +Gio._promisify(Gio.Mount.prototype, 'unmount_with_operation'); +Gio._promisify(Gio.InputStream.prototype, 'close_async'); +Gio._promisify(Gio.OutputStream.prototype, 'close_async'); +Gio._promisify(Gio.OutputStream.prototype, 'splice_async'); +Gio._promisify(Gio.OutputStream.prototype, 'write_all_async'); +Gio._promisify(Gio.SocketClient.prototype, 'connect_async'); +Gio._promisify(Gio.SocketListener.prototype, 'accept_async'); +Gio._promisify(Gio.Subprocess.prototype, 'communicate_utf8_async'); +Gio._promisify(Gio.Subprocess.prototype, 'wait_check_async'); +Gio._promisify(Gio.TlsConnection.prototype, 'handshake_async'); +Gio._promisify(Gio.DtlsConnection.prototype, 'handshake_async'); + + +// User Directories +Config.CACHEDIR = GLib.build_filenamev([GLib.get_user_cache_dir(), 'gsconnect']); +Config.CONFIGDIR = GLib.build_filenamev([GLib.get_user_config_dir(), 'gsconnect']); +Config.RUNTIMEDIR = GLib.build_filenamev([GLib.get_user_runtime_dir(), 'gsconnect']); + +// Bootstrap +const serviceFolder = GLib.path_get_dirname(GLib.filename_from_uri(import.meta.url)[0]); +const extensionFolder = GLib.path_get_dirname(serviceFolder); +setup(extensionFolder); +setupGettext(); + +if (Config.IS_USER) { + // Infer libdir by assuming gnome-shell shares a common prefix with gjs; + // assume the parent directory if it's not there + let libdir = GIRepository.Repository.get_search_path().find(path => { + return path.endsWith('/gjs/girepository-1.0'); + }).replace('/gjs/girepository-1.0', ''); + + const gsdir = GLib.build_filenamev([libdir, 'gnome-shell']); + + if (!GLib.file_test(gsdir, GLib.FileTest.IS_DIR)) { + const currentDir = `/${GLib.path_get_basename(libdir)}`; + libdir = libdir.replace(currentDir, ''); + } + + Config.GNOME_SHELL_LIBDIR = libdir; +} + + +// Load DBus interfaces +Config.DBUS = (() => { + const bytes = Gio.resources_lookup_data( + GLib.build_filenamev([Config.APP_PATH, `${Config.APP_ID}.xml`]), + Gio.ResourceLookupFlags.NONE + ); + + const xml = new TextDecoder().decode(bytes.toArray()); + const dbus = Gio.DBusNodeInfo.new_for_xml(xml); + dbus.nodes.forEach(info => info.cache_build()); + + return dbus; +})(); + + +// Init User Directories +for (const path of [Config.CACHEDIR, Config.CONFIGDIR, Config.RUNTIMEDIR]) + GLib.mkdir_with_parents(path, 0o755); + + +globalThis.HAVE_GNOME = GLib.getenv('GSCONNECT_MODE')?.toLowerCase() !== 'cli' && (GLib.getenv('GNOME_SETUP_DISPLAY') !== null || GLib.getenv('XDG_CURRENT_DESKTOP')?.toUpperCase()?.includes('GNOME') || GLib.getenv('XDG_SESSION_DESKTOP')?.toLowerCase() === 'gnome'); + + +/** + * A custom debug function that logs at LEVEL_MESSAGE to avoid the need for env + * variables to be set. + * + * @param {Error|string} message - A string or Error to log + * @param {string} [prefix] - An optional prefix for the warning + */ +const _debugCallerMatch = new RegExp(/([^@]*)@([^:]*):([^:]*)/); +// eslint-disable-next-line func-style +const _debugFunc = function (error, prefix = null) { + let caller, message; + + if (error.stack) { + caller = error.stack.split('\n')[0]; + message = `${error.message}\n${error.stack}`; + } else { + caller = (new Error()).stack.split('\n')[1]; + message = JSON.stringify(error, null, 2); + } + + if (prefix) + message = `${prefix}: ${message}`; + + const [, func, file, line] = _debugCallerMatch.exec(caller); + const script = file.replace(Config.PACKAGE_DATADIR, ''); + + GLib.log_structured('GSConnect', GLib.LogLevelFlags.LEVEL_MESSAGE, { + 'MESSAGE': `[${script}:${func}:${line}]: ${message}`, + 'SYSLOG_IDENTIFIER': 'org.gnome.Shell.Extensions.GSConnect', + 'CODE_FILE': file, + 'CODE_FUNC': func, + 'CODE_LINE': line, + }); +}; + +// Swap the function out for a no-op anonymous function for speed +const settings = new Gio.Settings({ + settings_schema: Config.GSCHEMA.lookup(Config.APP_ID, true), +}); + +settings.connect('changed::debug', (settings, key) => { + globalThis.debug = settings.get_boolean(key) ? _debugFunc : () => {}; +}); + +if (settings.get_boolean('debug')) + globalThis.debug = _debugFunc; +else + globalThis.debug = () => {}; + + +/** + * Start wl_clipboard if not under Gnome + */ +if (!globalThis.HAVE_GNOME) { + debug('Not running as a Gnome extension'); + watchService(); +} + + +/** + * A simple (for now) pre-comparison sanitizer for phone numbers + * See: https://github.com/KDE/kdeconnect-kde/blob/master/smsapp/conversationlistmodel.cpp#L200-L210 + * + * @return {string} Return the string stripped of leading 0, and ' ()-+' + */ +String.prototype.toPhoneNumber = function () { + const strippedNumber = this.replace(/^0*|[ ()+-]/g, ''); + + if (strippedNumber.length) + return strippedNumber; + + return this; +}; + + +/** + * A simple equality check for phone numbers based on `toPhoneNumber()` + * + * @param {string} number - A phone number string to compare + * @return {boolean} If `this` and @number are equivalent phone numbers + */ +String.prototype.equalsPhoneNumber = function (number) { + const a = this.toPhoneNumber(); + const b = number.toPhoneNumber(); + + return (a.length && b.length && (a.endsWith(b) || b.endsWith(a))); +}; + + +/** + * An implementation of `rm -rf` in Gio + * + * @param {Gio.File|string} file - a GFile or filepath + */ +Gio.File.rm_rf = function (file) { + try { + if (typeof file === 'string') + file = Gio.File.new_for_path(file); + + try { + const iter = file.enumerate_children( + 'standard::name', + Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, + null + ); + + let info; + + while ((info = iter.next_file(null))) + Gio.File.rm_rf(iter.get_child(info)); + + iter.close(null); + } catch (e) { + // Silence errors + } + + file.delete(null); + } catch (e) { + // Silence errors + } +}; + + +/** + * Extend GLib.Variant with a static method to recursively pack a variant + * + * @param {*} [obj] - May be a GLib.Variant, Array, standard Object or literal. + * @return {GLib.Variant} The resulting GVariant + */ +function _full_pack(obj) { + let packed; + const type = typeof obj; + + switch (true) { + case (obj instanceof GLib.Variant): + return obj; + + case (type === 'string'): + return GLib.Variant.new('s', obj); + + case (type === 'number'): + return GLib.Variant.new('d', obj); + + case (type === 'boolean'): + return GLib.Variant.new('b', obj); + + case (obj instanceof Uint8Array): + return GLib.Variant.new('ay', obj); + + case (obj === null): + return GLib.Variant.new('mv', null); + + case (typeof obj.map === 'function'): + return GLib.Variant.new( + 'av', + obj.filter(e => e !== undefined).map(e => _full_pack(e)) + ); + + case (obj instanceof Gio.Icon): + return obj.serialize(); + + case (type === 'object'): + packed = {}; + + for (const [key, val] of Object.entries(obj)) { + if (val !== undefined) + packed[key] = _full_pack(val); + } + + return GLib.Variant.new('a{sv}', packed); + + default: + throw Error(`Unsupported type '${type}': ${obj}`); + } +} + +GLib.Variant.full_pack = _full_pack; + + +/** + * Extend GLib.Variant with a method to recursively deepUnpack() a variant + * + * @param {*} [obj] - May be a GLib.Variant, Array, standard Object or literal. + * @return {*} The resulting object + */ +function _full_unpack(obj) { + obj = (obj === undefined) ? this : obj; + const unpacked = {}; + + switch (true) { + case (obj === null): + return obj; + + case (obj instanceof GLib.Variant): + return _full_unpack(obj.deepUnpack()); + + case (obj instanceof Uint8Array): + return obj; + + case (typeof obj.map === 'function'): + return obj.map(e => _full_unpack(e)); + + case (typeof obj === 'object'): + for (const [key, value] of Object.entries(obj)) { + // Try to detect and deserialize GIcons + try { + if (key === 'icon' && value.get_type_string() === '(sv)') + unpacked[key] = Gio.Icon.deserialize(value); + else + unpacked[key] = _full_unpack(value); + } catch (e) { + unpacked[key] = _full_unpack(value); + } + } + + return unpacked; + + default: + return obj; + } +} + +GLib.Variant.prototype.full_unpack = _full_unpack; + + +/** + * Creates a GTlsCertificate from the PEM-encoded data in @cert_path and + * @key_path. If either are missing a new pair will be generated. + * + * Additionally, the private key will be added using ssh-add to allow sftp + * connections using Gio. + * + * See: https://github.com/KDE/kdeconnect-kde/blob/master/core/kdeconnectconfig.cpp#L119 + * + * @param {string} certPath - Absolute path to a x509 certificate in PEM format + * @param {string} keyPath - Absolute path to a private key in PEM format + * @param {string} commonName - A unique common name for the certificate + * @return {Gio.TlsCertificate} A TLS certificate + */ +Gio.TlsCertificate.new_for_paths = function (certPath, keyPath, commonName = null) { + // Check if the certificate/key pair already exists + const certExists = GLib.file_test(certPath, GLib.FileTest.EXISTS); + const keyExists = GLib.file_test(keyPath, GLib.FileTest.EXISTS); + + // Create a new certificate and private key if necessary + if (!certExists || !keyExists) { + // If we weren't passed a common name, generate a random one + if (!commonName) + commonName = GLib.uuid_string_random(); + + const proc = new Gio.Subprocess({ + argv: [ + Config.OPENSSL_PATH, 'req', + '-new', '-x509', '-sha256', + '-out', certPath, + '-newkey', 'rsa:4096', '-nodes', + '-keyout', keyPath, + '-days', '3650', + '-subj', `/O=andyholmes.github.io/OU=GSConnect/CN=${commonName}`, + ], + flags: (Gio.SubprocessFlags.STDOUT_SILENCE | + Gio.SubprocessFlags.STDERR_SILENCE), + }); + proc.init(null); + proc.wait_check(null); + } + + return Gio.TlsCertificate.new_from_files(certPath, keyPath); +}; + +Object.defineProperties(Gio.TlsCertificate.prototype, { + /** + * The common name of the certificate. + */ + 'common_name': { + get: function () { + if (!this.__common_name) { + const proc = new Gio.Subprocess({ + argv: [Config.OPENSSL_PATH, 'x509', '-noout', '-subject', '-inform', 'pem'], + flags: Gio.SubprocessFlags.STDIN_PIPE | Gio.SubprocessFlags.STDOUT_PIPE, + }); + proc.init(null); + + const stdout = proc.communicate_utf8(this.certificate_pem, null)[1]; + this.__common_name = /(?:cn|CN) ?= ?([^,\n]*)/.exec(stdout)[1]; + } + + return this.__common_name; + }, + configurable: true, + enumerable: true, + }, + + /** + * Get just the pubkey as a DER ByteArray of a certificate. + * + * @return {GLib.Bytes} The pubkey as DER of the certificate. + */ + 'pubkey_der': { + value: function () { + if (!this.__pubkey_der) { + let proc = new Gio.Subprocess({ + argv: [Config.OPENSSL_PATH, 'x509', '-noout', '-pubkey', '-inform', 'pem'], + flags: Gio.SubprocessFlags.STDIN_PIPE | Gio.SubprocessFlags.STDOUT_PIPE, + }); + proc.init(null); + + const pubkey = proc.communicate_utf8(this.certificate_pem, null)[1]; + proc = new Gio.Subprocess({ + argv: [Config.OPENSSL_PATH, 'pkey', '-pubin', '-inform', 'pem', '-outform', 'der'], + flags: Gio.SubprocessFlags.STDIN_PIPE | Gio.SubprocessFlags.STDOUT_PIPE, + }); + proc.init(null); + this.__pubkey_der = proc.communicate(new TextEncoder().encode(pubkey), null)[1]; + } + + return this.__pubkey_der; + }, + configurable: true, + enumerable: false, + }, + +}); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js new file mode 100644 index 0000000..3d304a0 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect +// +// SPDX-License-Identifier: GPL-2.0-or-later + +import * as battery from './battery.js'; +import * as clipboard from './clipboard.js'; +import * as connectivity_report from './connectivity_report.js'; +import * as contacts from './contacts.js'; +import * as findmyphone from './findmyphone.js'; +import * as mousepad from './mousepad.js'; +import * as mpris from './mpris.js'; +import * as notification from './notification.js'; +import * as ping from './ping.js'; +import * as presenter from './presenter.js'; +import * as runcommand from './runcommand.js'; +import * as sftp from './sftp.js'; +import * as share from './share.js'; +import * as sms from './sms.js'; +import * as systemvolume from './systemvolume.js'; +import * as telephony from './telephony.js'; + +export default { + battery, + clipboard, + connectivity_report, + contacts, + findmyphone, + mousepad, + mpris, + notification, + ping, + presenter, + runcommand, + sftp, + share, + sms, + systemvolume, + telephony, +}; diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/busUtils.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/displayConfigState.js similarity index 53% rename from gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/busUtils.js rename to gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/displayConfigState.js index 6839c8c..97a7af8 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/busUtils.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/displayConfigState.js @@ -1,6 +1,6 @@ -/* busUtils.js +/* displayConfigState.js * -* Copyright (C) 2022 kosmospredanie, efosmark +* Copyright (C) 2024 kosmospredanie, shyzus * * 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 @@ -17,65 +17,11 @@ */ import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -export const Methods = Object.freeze({ - 'verify': 0, - 'temporary': 1, - 'persistent': 2 -}); +import { Monitor } from './monitor.js' +import { LogicalMonitor } from './logicalMonitor.js' -export const Monitor = class Monitor { - constructor(variant) { - let unpacked = variant.unpack(); - this.connector = unpacked[0].unpack()[0].unpack(); - - let modes = unpacked[1].unpack(); - for (let i = 0; i < modes.length; i++) { - let mode = modes[i].unpack(); - let id = mode[0].unpack(); - let mode_props = mode[6].unpack(); - if ('is-current' in mode_props) { - let is_current = mode_props['is-current'].unpack().get_boolean(); - if (is_current) { - this.current_mode_id = id; - break; - } - } - } - - let props = unpacked[2].unpack(); - if ('is-underscanning' in props) { - this.is_underscanning = props['is-underscanning'].unpack().get_boolean(); - } else { - this.is_underscanning = false; - } - if ('is-builtin' in props) { - this.is_builtin = props['is-builtin'].unpack().get_boolean(); - } else { - this.is_builtin = false; - } - } -} - -export const LogicalMonitor = class LogicalMonitor { - constructor(variant) { - let unpacked = variant.unpack(); - this.x = unpacked[0].unpack(); - this.y = unpacked[1].unpack(); - this.scale = unpacked[2].unpack(); - this.transform = unpacked[3].unpack(); - this.primary = unpacked[4].unpack(); - // [ [connector, vendor, product, serial]* ] - this.monitors = unpacked[5].deep_unpack(); - this.properties = unpacked[6].unpack(); - for (let key in this.properties) { - this.properties[key] = this.properties[key].unpack().unpack(); - } - } -} - -export const DisplayConfigState = class DisplayConfigState { +export class DisplayConfigState { constructor(result) { let unpacked = result.unpack(); @@ -102,8 +48,7 @@ export const DisplayConfigState = class DisplayConfigState { } get builtin_monitor() { - for (let i = 0; i < this.monitors.length; i++) { - let monitor = this.monitors[i]; + for (let monitor of this.monitors) { if (monitor.is_builtin) { return monitor; } @@ -112,8 +57,7 @@ export const DisplayConfigState = class DisplayConfigState { } get_monitor(connector) { - for (let i = 0; i < this.monitors.length; i++) { - let monitor = this.monitors[i]; + for (let monitor of this.monitors) { if (monitor.connector === connector) { return monitor; } @@ -122,12 +66,10 @@ export const DisplayConfigState = class DisplayConfigState { } get_logical_monitor_for(connector) { - for (let i = 0; i < this.logical_monitors.length; i++) { - let lmonitor = this.logical_monitors[i]; - for (let j = 0; j < lmonitor.monitors.length; j++) { - let lm_connector = lmonitor.monitors[j][0]; - if (connector === lm_connector) { - return lmonitor; + for (let log_monitor of this.logical_monitors) { + for (let lm_monitor of log_monitor.monitors) { + if (connector === lm_monitor[0]) { + return log_monitor; } } } @@ -149,8 +91,8 @@ export const DisplayConfigState = class DisplayConfigState { [] ]; let monitors = lmonitor_pack[5]; - for (let i = 0; i < lmonitor.monitors.length; i++) { - let connector = lmonitor.monitors[i][0]; + for (let log_monitor of lmonitor.monitors) { + let connector = log_monitor[0]; let monitor = this.get_monitor(connector); monitors.push([ connector, diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js index 9b5b509..edf89a0 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js @@ -15,197 +15,109 @@ * along with this program. If not, see . */ -import { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; - import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import GLib from 'gi://GLib'; -import * as SystemActions from 'resource:///org/gnome/shell/misc/systemActions.js'; +import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as SystemActions from 'resource:///org/gnome/shell/misc/systemActions.js'; + import * as Rotator from './rotator.js' -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; +import { Orientation } from './orientation.js'; +import { ManualOrientationIndicator } from './manualOrientationIndicator.js'; +import { SensorProxy } from './sensorProxy.js'; const ORIENTATION_LOCK_SCHEMA = 'org.gnome.settings-daemon.peripherals.touchscreen'; const ORIENTATION_LOCK_KEY = 'orientation-lock'; +const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; +const SHOW_KEYBOARD = 'screen-keyboard-enabled'; +const PERIPHERAL_TOUCHPAD_SCHEMA = 'org.gnome.desktop.peripherals.touchpad'; +const TOUCHPAD_EVENTS = 'send-events'; -import { QuickMenuToggle, QuickSettingsMenu, SystemIndicator } from 'resource:///org/gnome/shell/ui/quickSettings.js'; - -// Orientation names must match those provided by net.hadess.SensorProxy -const Orientation = Object.freeze({ - 'normal': 0, - 'left-up': 1, - 'bottom-up': 2, - 'right-up': 3 -}); - -const ManualOrientationIndicator = GObject.registerClass( -class ManualOrientationIndicator extends SystemIndicator { - _init(ext_ref) { - super._init(); - this.toggle = new ManualOrientationMenuToggle(ext_ref); - this.quickSettingsItems.push(this.toggle); - } - - destroy() { - this.quickSettingsItems.pop(this.toggle); - this.toggle.destroy(); - } -}); - -const ManualOrientationMenuToggle = GObject.registerClass( -class ManualOrientationMenuToggle extends QuickMenuToggle { - _init(ext) { - super._init({ - title: _('Rotate'), - iconName: 'object-rotate-left-symbolic', - menuEnabled: true, - toggleMode: true, - }); - - this.menu.setHeader('object-rotate-left-symbolic', _('Screen Rotate')); - - this._section = new PopupMenu.PopupMenuSection(); - this.menu.addMenuItem(this._section); - - this.landscapeItem = new PopupMenu.PopupMenuItem('Landscape', { - reactive: true, - can_focus: true, - }); - - this.portraitLeftItem = new PopupMenu.PopupMenuItem('Portrait Left', { - reactive: true, - can_focus: true, - }); - - this.landscapeFlipItem = new PopupMenu.PopupMenuItem('Landscape Flipped', { - reactive: true, - can_focus: true, - }); - - this.portraitRightItem = new PopupMenu.PopupMenuItem('Portrait Right', { - reactive: true, - can_focus: true, - }); - - this.landscapeItem.connect('activate', () => { - this._onItemActivate(this.landscapeItem); - ext.rotate_to('normal'); - }); - this.portraitLeftItem.connect('activate', () => { - this._onItemActivate(this.portraitLeftItem); - ext.rotate_to('left-up'); - }); - this.landscapeFlipItem.connect('activate', () => { - this._onItemActivate(this.landscapeFlipItem); - ext.rotate_to('bottom-up'); - }); - this.portraitRightItem.connect('activate', () => { - this._onItemActivate(this.portraitRightItem); - ext.rotate_to('right-up'); - }); - - this._section.addMenuItem(this.landscapeItem); - this._section.addMenuItem(this.portraitLeftItem); - this._section.addMenuItem(this.landscapeFlipItem); - this._section.addMenuItem(this.portraitRightItem); - - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addSettingsAction(_('Extension Settings'), - 'com.mattjakeman.ExtensionManager.desktop'); - - this.connect('clicked', () => { - if (this.checked == true) { - ext.rotate_to('right-up'); - } else { - ext.rotate_to('normal'); - } - }); - } - - _onItemActivate(item) { - this.landscapeItem.setOrnament(PopupMenu.Ornament.HIDDEN); - this.portraitLeftItem.setOrnament(PopupMenu.Ornament.HIDDEN); - this.landscapeFlipItem.setOrnament(PopupMenu.Ornament.HIDDEN); - this.portraitRightItem.setOrnament(PopupMenu.Ornament.HIDDEN); - - item.setOrnament(PopupMenu.Ornament.CHECK); - } -}); - -class SensorProxy { - constructor(rotate_cb) { - this._rotate_cb = rotate_cb; - this._proxy = null; - this._enabled = false; - this._watcher_id = Gio.bus_watch_name( - Gio.BusType.SYSTEM, - 'net.hadess.SensorProxy', - Gio.BusNameWatcherFlags.NONE, - this.appeared.bind(this), - this.vanished.bind(this) - ); - } - - destroy() { - Gio.bus_unwatch_name(this._watcher_id); - if (this._enabled) this.disable(); - this._proxy = null; - } - +export default class ScreenAutoRotateExtension extends Extension { enable() { - this._enabled = true; - if (this._proxy === null) return; - this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); - } - - disable() { - this._enabled = false; - if (this._proxy === null) return; - this._proxy.call_sync('ReleaseAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); - } - - appeared(connection, name, name_owner) { - this._proxy = Gio.DBusProxy.new_for_bus_sync( - Gio.BusType.SYSTEM, Gio.DBusProxyFlags.NONE, null, - 'net.hadess.SensorProxy', '/net/hadess/SensorProxy', 'net.hadess.SensorProxy', - null); - this._proxy.connect('g-properties-changed', this.properties_changed.bind(this)); - if (this._enabled) { - this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); - } - } - - vanished(connection, name) { - this._proxy = null; - } - - properties_changed(proxy, changed, invalidated) { - if (!this._enabled) return; - let properties = changed.deep_unpack(); - for (let [name, value] of Object.entries(properties)) { - if (name != 'AccelerometerOrientation') continue; - let target = value.unpack(); - this._rotate_cb(target); - } - } -} - -class ScreenAutorotate { - constructor(settings) { + this._settings = this.getSettings(); this._system_actions = SystemActions.getDefault(); - this._settings = settings; this._system_actions_backup = null; this._override_system_actions(); + + this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA }); + this._peripheralTouchpadSettings = new Gio.Settings({ schema_id: PERIPHERAL_TOUCHPAD_SCHEMA }); this._orientation_settings = new Gio.Settings({ schema_id: ORIENTATION_LOCK_SCHEMA }); - this._orientation_settings.connect('changed::' + ORIENTATION_LOCK_KEY, this._orientation_lock_changed.bind(this)); + this._orientation_settings_handler = this._orientation_settings.connect('changed::' + ORIENTATION_LOCK_KEY, this._orientation_lock_changed.bind(this)); this._sensor_proxy = new SensorProxy(this.rotate_to.bind(this)); - this._state = false; // enabled or not + this._state = false; let locked = this._orientation_settings.get_boolean(ORIENTATION_LOCK_KEY); - if (!locked) this.enable(); + if (!locked) { + this.toggle_rotation_lock() + } + + this._manual_flip_settings_handler = this._settings.connect('changed::manual-flip', (settings, key) => { + if (settings.get_boolean(key)) { + this._add_manual_flip(); + } else { + this._remove_manual_flip(); + } + }); + + this._hide_lock_rotate_settings_handler = this._settings.connect('changed::hide-lock-rotate', (settings, key) => { + this._set_hide_lock_rotate(settings.get_boolean(key)); + }); + + if (this._settings.get_boolean('manual-flip')) { + this._add_manual_flip(); + } else { + this._remove_manual_flip(); + } + + /* Timeout needed due to unknown race condition causing 'Auto Rotate' + * Quick Toggle to be undefined for a brief moment. + */ + this._timeoutId = setTimeout(() => { + this._set_hide_lock_rotate(this._settings.get_boolean('hide-lock-rotate')); + }, 1000); + } + + toggle_rotation_lock() { + if (this._state) { + this._a11yApplicationsSettings.set_boolean(SHOW_KEYBOARD, this._originala11yKeyboardSetting); + this._originala11yKeyboardSetting = null; + this._sensor_proxy.disable(); + this._state = false; + } else { + this._originala11yKeyboardSetting = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD); + this._sensor_proxy.enable(); + this._state = true; + } + } + + _set_hide_lock_rotate(state) { + const autoRotateIndicator = Main.panel.statusArea.quickSettings._autoRotate; + + if (state) { + Main.panel.statusArea.quickSettings._indicators.remove_child(autoRotateIndicator); + Main.panel.statusArea.quickSettings.menu._grid.remove_child(autoRotateIndicator.quickSettingsItems[0]); + } else { + Main.panel.statusArea.quickSettings._indicators.add_child(autoRotateIndicator); + Main.panel.statusArea.quickSettings._addItemsBefore( + autoRotateIndicator.quickSettingsItems, + Main.panel.statusArea.quickSettings._rfkill.quickSettingsItems[0] + ); + } + } + + _add_manual_flip() { + this.flipIndicator = new ManualOrientationIndicator(this); + Main.panel.statusArea.quickSettings.addExternalIndicator(this.flipIndicator); + } + + _remove_manual_flip() { + if (this.flipIndicator !== null && this.flipIndicator !== undefined) { + this.flipIndicator.destroy(); + this.flipIndicator = null; + } } _override_system_actions() { @@ -230,34 +142,76 @@ class ScreenAutorotate { _orientation_lock_changed() { let locked = this._orientation_settings.get_boolean(ORIENTATION_LOCK_KEY); - if (this._state == locked) { - this.toggle(); + if (this._state === locked) { + this.toggle_rotation_lock(); } } - destroy() { - this._sensor_proxy.destroy(); - this._orientation_settings = null; - this._restore_system_actions(); - } - - toggle() { - if (this._state) { - this.disable(); - } else { - this.enable(); + _handle_osk(target) { + const landscapeOsk = this._settings.get_boolean('landscape-osk'); + const portraitRightOsk = this._settings.get_boolean('portrait-right-osk'); + const portraitLeftOsk = this._settings.get_boolean('portrait-left-osk'); + const landscapeFlippedOsk = this._settings.get_boolean('landscape-flipped-osk'); + switch (target) { + case 0: + this._a11yApplicationsSettings.set_boolean(SHOW_KEYBOARD, landscapeOsk); + break; + case 1: + this._a11yApplicationsSettings.set_boolean(SHOW_KEYBOARD, portraitLeftOsk); + break; + case 2: + this._a11yApplicationsSettings.set_boolean(SHOW_KEYBOARD, landscapeFlippedOsk); + break; + case 3: + this._a11yApplicationsSettings.set_boolean(SHOW_KEYBOARD, portraitRightOsk); + break; } } - enable() { - this._sensor_proxy.enable(); - this._state = true; - } - disable() { - this._sensor_proxy.disable(); - this._state = false; - } + _handle_dor_touchpad(target) { + const dorLandscape = this._settings.get_boolean('dor-touchpad-landscape'); + const dorPortraitRight = this._settings.get_boolean('dor-touchpad-portrait-right'); + const dorPortraitLeft = this._settings.get_boolean('dor-touchpad-portrait-left'); + const dorLandscapeFlipped = this._settings.get_boolean('dor-touchpad-landscape-flipped'); + let setting_value = undefined; + + switch (target) { + case 0: + if (dorLandscape) { + setting_value = "disabled"; + } else { + setting_value = "enabled"; + } + this._peripheralTouchpadSettings.set_string(TOUCHPAD_EVENTS, setting_value); + break; + case 1: + if (dorPortraitLeft) { + setting_value = "disabled"; + } else { + setting_value = "enabled"; + } + this._peripheralTouchpadSettings.set_string(TOUCHPAD_EVENTS, setting_value); + break; + case 2: + if (dorLandscapeFlipped) { + setting_value = "disabled"; + } else { + setting_value = "enabled"; + } + this._peripheralTouchpadSettings.set_string(TOUCHPAD_EVENTS, setting_value); + break; + case 3: + if (dorPortraitRight) { + setting_value = "disabled"; + } else { + setting_value = "enabled"; + } + this._peripheralTouchpadSettings.set_string(TOUCHPAD_EVENTS, setting_value); + break; + } + } + rotate_to(orientation) { const sensor = Orientation[orientation]; const invert_horizontal_direction = this._settings.get_boolean('invert-horizontal-rotation-direction'); @@ -294,70 +248,13 @@ class ScreenAutorotate { target = (target + offset) % 4; if (this._settings.get_boolean('debug-logging')) { - console.debug(`sensor=${Orientation[orientation]}`); - console.debug(`offset=${offset}`); - console.debug(`target=${target}`); + console.log(`sensor=${Orientation[orientation]}`); + console.log(`offset=${offset}`); + console.log(`target=${target}`); } Rotator.rotate_to(target); - } -} - -export default class ScreenAutoRotateExtension extends Extension { - enable() { - this._settings = this.getSettings(); - this._ext = new ScreenAutorotate(this._settings); - - this._settings.connect('changed::manual-flip', (settings, key) => { - if (settings.get_boolean(key)) { - this._add_manual_flip(); - } else { - this._remove_manual_flip(); - } - }); - - this._settings.connect('changed::hide-lock-rotate', (settings, key) => { - this._set_hide_lock_rotate(settings.get_boolean(key)); - }); - - if (this._settings.get_boolean('manual-flip')) { - this._add_manual_flip(); - } else { - this._remove_manual_flip(); - } - - /* Timeout needed due to unknown race condition causing 'Auto Rotate' - * Quick Toggle to be undefined for a brief moment. - */ - this._timeoutId = setTimeout(() => { - this._set_hide_lock_rotate(this._settings.get_boolean('hide-lock-rotate')); - }, 1000); - } - - _set_hide_lock_rotate(state) { - const autoRotateIndicator = Main.panel.statusArea.quickSettings._autoRotate; - - if (state) { - Main.panel.statusArea.quickSettings._indicators.remove_child(autoRotateIndicator); - Main.panel.statusArea.quickSettings.menu._grid.remove_child(autoRotateIndicator.quickSettingsItems[0]); - } else { - Main.panel.statusArea.quickSettings._indicators.add_child(autoRotateIndicator); - Main.panel.statusArea.quickSettings._addItemsBefore( - autoRotateIndicator.quickSettingsItems, - Main.panel.statusArea.quickSettings._rfkill.quickSettingsItems[0] - ); - } - } - - _add_manual_flip() { - this.flipIndicator = new ManualOrientationIndicator(this._ext); - Main.panel.statusArea.quickSettings.addExternalIndicator(this.flipIndicator); - } - - _remove_manual_flip() { - if (this.flipIndicator != null) { - this.flipIndicator.destroy(); - this.flipIndicator = null; - } + this._handle_osk(target); + this._handle_dor_touchpad(target); } disable() { @@ -368,12 +265,17 @@ export default class ScreenAutoRotateExtension extends Extension { have auto-locked. This provides the ability to log back in regardless of the orientation of the device in tablet mode. */ + this._settings.disconnect(this._manual_flip_settings_handler); + this._settings.disconnect(this._hide_lock_rotate_settings_handler); this._settings = null; clearTimeout(this._timeoutId); this._timeoutId = null; this._remove_manual_flip(); - this._ext.destroy(); - this._ext = null; + this._sensor_proxy.destroy(); + this._orientation_settings.disconnect(this._orientation_settings_handler); + this._orientation_settings = null; + this._a11yApplicationsSettings = null; + this._restore_system_actions(); } } diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/logicalMonitor.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/logicalMonitor.js new file mode 100644 index 0000000..5862e49 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/logicalMonitor.js @@ -0,0 +1,34 @@ +/* logicalMonitor.js +* +* Copyright (C) 2024 kosmospredanie, shyzus +* +* 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 . +*/ + +export class LogicalMonitor { + constructor(variant) { + let unpacked = variant.unpack(); + this.x = unpacked[0].unpack(); + this.y = unpacked[1].unpack(); + this.scale = unpacked[2].unpack(); + this.transform = unpacked[3].unpack(); + this.primary = unpacked[4].unpack(); + // [ [connector, vendor, product, serial]* ] + this.monitors = unpacked[5].deep_unpack(); + this.properties = unpacked[6].unpack(); + for (let key in this.properties) { + this.properties[key] = this.properties[key].unpack().unpack(); + } + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationIndicator.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationIndicator.js new file mode 100644 index 0000000..2e2c20e --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationIndicator.js @@ -0,0 +1,36 @@ +/* manualOrientationIndicator.js +* Copyright (C) 2024 shyzus +* +* 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 . +*/ + +import GObject from 'gi://GObject'; + +import { SystemIndicator } from 'resource:///org/gnome/shell/ui/quickSettings.js'; + +import { ManualOrientationMenuToggle } from './manualOrientationMenuToggle.js'; + +export const ManualOrientationIndicator = GObject.registerClass( +class ManualOrientationIndicator extends SystemIndicator { + constructor(ext) { + super(); + this.toggle = new ManualOrientationMenuToggle(ext); + this.quickSettingsItems.push(this.toggle); + } + + destroy() { + this.quickSettingsItems.pop(this.toggle); + this.toggle.destroy(); + } +}); diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationMenuToggle.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationMenuToggle.js new file mode 100644 index 0000000..d7f6a14 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/manualOrientationMenuToggle.js @@ -0,0 +1,102 @@ +/* manualOrientationMenuToggle.js +* Copyright (C) 2024 shyzus +* +* 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 . +*/ + +import GObject from 'gi://GObject'; + +import { QuickMenuToggle } from 'resource:///org/gnome/shell/ui/quickSettings.js'; +import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; + +export const ManualOrientationMenuToggle = GObject.registerClass( +class ManualOrientationMenuToggle extends QuickMenuToggle { + constructor(ext) { + super({ + title: 'Rotate', + iconName: 'object-rotate-left-symbolic', + menuEnabled: true, + toggleMode: true, + }); + + this.menu.setHeader('object-rotate-left-symbolic', 'Screen Rotate'); + + this._section = new PopupMenu.PopupMenuSection(); + this.menu.addMenuItem(this._section); + + this.landscapeItem = new PopupMenu.PopupMenuItem('Landscape', { + reactive: true, + can_focus: true, + }); + + this.portraitLeftItem = new PopupMenu.PopupMenuItem('Portrait Left', { + reactive: true, + can_focus: true, + }); + + this.landscapeFlipItem = new PopupMenu.PopupMenuItem('Landscape Flipped', { + reactive: true, + can_focus: true, + }); + + this.portraitRightItem = new PopupMenu.PopupMenuItem('Portrait Right', { + reactive: true, + can_focus: true, + }); + + this.landscapeItem.connect('activate', () => { + this._onItemActivate(this.landscapeItem); + ext.rotate_to('normal'); + }); + this.portraitLeftItem.connect('activate', () => { + this._onItemActivate(this.portraitLeftItem); + ext.rotate_to('left-up'); + }); + this.landscapeFlipItem.connect('activate', () => { + this._onItemActivate(this.landscapeFlipItem); + ext.rotate_to('bottom-up'); + }); + this.portraitRightItem.connect('activate', () => { + this._onItemActivate(this.portraitRightItem); + ext.rotate_to('right-up'); + }); + + this._section.addMenuItem(this.landscapeItem); + this._section.addMenuItem(this.portraitLeftItem); + this._section.addMenuItem(this.landscapeFlipItem); + this._section.addMenuItem(this.portraitRightItem); + + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this.menu.addSettingsAction('Extension Settings', + 'com.mattjakeman.ExtensionManager.desktop'); + + this.connect('clicked', () => { + if (this.checked === true) { + ext.rotate_to('right-up'); + } else { + ext.rotate_to('normal'); + } + }); + } + + _onItemActivate(item) { + this.landscapeItem.setOrnament(PopupMenu.Ornament.HIDDEN); + this.portraitLeftItem.setOrnament(PopupMenu.Ornament.HIDDEN); + this.landscapeFlipItem.setOrnament(PopupMenu.Ornament.HIDDEN); + this.portraitRightItem.setOrnament(PopupMenu.Ornament.HIDDEN); + + item.setOrnament(PopupMenu.Ornament.CHECK); + } +}); + diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json index 69547d5..aa7faf1 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json @@ -10,9 +10,10 @@ "settings-schema": "org.gnome.shell.extensions.screen-rotate", "shell-version": [ "45", - "46" + "46", + "47" ], "url": "https://github.com/shyzus/gnome-shell-extension-screen-autorotate", "uuid": "screen-rotate@shyzus.github.io", - "version": 19 + "version": 24 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/monitor.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/monitor.js new file mode 100644 index 0000000..369217f --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/monitor.js @@ -0,0 +1,50 @@ +/* monitor.js +* +* Copyright (C) 2024 kosmospredanie, efosmark, shyzus +* +* 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 . +*/ + +export class Monitor { + constructor(variant) { + let unpacked = variant.unpack(); + this.connector = unpacked[0].unpack()[0].unpack(); + + let modes = unpacked[1].unpack(); + for (let mode_idx in modes) { + let mode = modes[mode_idx].unpack(); + let id = mode[0].unpack(); + let mode_props = mode[6].unpack(); + if ('is-current' in mode_props) { + let is_current = mode_props['is-current'].unpack().get_boolean(); + if (is_current) { + this.current_mode_id = id; + break; + } + } + } + + let props = unpacked[2].unpack(); + if ('is-underscanning' in props) { + this.is_underscanning = props['is-underscanning'].unpack().get_boolean(); + } else { + this.is_underscanning = false; + } + if ('is-builtin' in props) { + this.is_builtin = props['is-builtin'].unpack().get_boolean(); + } else { + this.is_builtin = false; + } + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/orientation.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/orientation.js new file mode 100644 index 0000000..bbd47f4 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/orientation.js @@ -0,0 +1,24 @@ +/* orientation.js +* Copyright (C) 2024 shyzus +* +* 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 . +*/ + +// Orientation names must match those provided by net.hadess.SensorProxy +export const Orientation = Object.freeze({ + 'normal': 0, + 'left-up': 1, + 'bottom-up': 2, + 'right-up': 3 +}); diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js index 85c2e6c..d28b383 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js @@ -21,6 +21,8 @@ import Adw from 'gi://Adw'; import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; +import { Orientation } from './orientation.js'; + export default class MyExtensionPreferences extends ExtensionPreferences { fillPreferencesWindow(window) { @@ -37,6 +39,14 @@ export default class MyExtensionPreferences extends ExtensionPreferences { shellMenuGroup.set_title('GNOME Shell Menu Settings'); page.add(shellMenuGroup); + const oskSettingsGroup = new Adw.PreferencesGroup(); + oskSettingsGroup.set_title('On-Screen-Keyboard Settings'); + page.add(oskSettingsGroup); + + const disableOnRotateGroup = new Adw.PreferencesGroup(); + disableOnRotateGroup.set_title('Disable-On-Rotation Settings'); + page.add(disableOnRotateGroup); + const debugGroup = new Adw.PreferencesGroup(); debugGroup.set_title('Debug Settings'); page.add(debugGroup); @@ -59,9 +69,10 @@ export default class MyExtensionPreferences extends ExtensionPreferences { const setOffsetRow = new Adw.ActionRow({ title: 'Set orientation offset', - subtitle: 'Valid offset range: 0 to 3. Default is 0\nExperiment with this in case\ - orientation is incorrect due to the display being mounted in a non-landscape orientation\ - e.g PineTab2 or GPD Pocket 3' + subtitle: 'Valid offset range: 0 to 3. Default is 0\nExperiment with' + + ' this in case orientation is incorrect due to the display' + + ' being mounted in a non-landscape orientation' + + ' e.g PineTab2 or GPD Pocket 3' }); orientationGroup.add(setOffsetRow); @@ -77,6 +88,26 @@ export default class MyExtensionPreferences extends ExtensionPreferences { }); shellMenuGroup.add(hideLockRotateRow); + const landscapeOskRow = new Adw.ActionRow({ + title: 'Show OSK in landscape orientation' + }); + oskSettingsGroup.add(landscapeOskRow); + + const portraitRightOskRow = new Adw.ActionRow({ + title: 'Show OSK in portrait (right) orientation' + }); + oskSettingsGroup.add(portraitRightOskRow); + + const landscapeFlippedOskRow = new Adw.ActionRow({ + title: 'Show OSK in landscape (flipped) orientation' + }); + oskSettingsGroup.add(landscapeFlippedOskRow); + + const portraitLeftOskRow = new Adw.ActionRow({ + title: 'Show OSK in portrait (left) orientation' + }); + oskSettingsGroup.add(portraitLeftOskRow); + const toggleLoggingRow = new Adw.ActionRow({ title: 'Enable debug logging', subtitle: 'Use "journalctl /usr/bin/gnome-shell -f" to see log output.' @@ -111,6 +142,125 @@ export default class MyExtensionPreferences extends ExtensionPreferences { valign: Gtk.Align.CENTER, }); + const landscapeOskCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean('landscape-osk'), + valign: Gtk.Align.CENTER + }); + + const portraitRightOskCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean('portrait-right-osk'), + valign: Gtk.Align.CENTER + }); + + const portraitLeftOskCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean('portrait-left-osk'), + valign: Gtk.Align.CENTER + }); + + const landscapeFlippedOskCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean('landscape-flipped-osk'), + valign: Gtk.Align.CENTER + }); + + const dorNotebook = new Gtk.Notebook(); + + const dorKeyboardPage = new Gtk.ListBox(); + dorKeyboardPage.set_visible(false); // Keep hidden until feature can be implemented. + dorKeyboardPage.set_selection_mode(Gtk.SelectionMode.NONE); + + for (let orientation in Orientation) { + let actionRowTitle = undefined; + let checkButtonBoolId = undefined; + + switch (orientation) { + case 'normal': + actionRowTitle = "Landscape"; + checkButtonBoolId = "dor-keyboard-landscape"; + break; + case 'left-up': + actionRowTitle = "Portrait (Left)"; + checkButtonBoolId = "dor-keyboard-portrait-left"; + break; + case 'bottom-up': + actionRowTitle = "Landscape Flipped"; + checkButtonBoolId = "dor-keyboard-landscape-flipped"; + break; + case 'right-up': + actionRowTitle = "Portrait (Right)"; + checkButtonBoolId = "dor-keyboard-portrait-right"; + break; + } + + const dorActionRow = new Adw.ActionRow({ + title: actionRowTitle + }); + + const dorCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean(checkButtonBoolId), + valign: Gtk.Align.CENTER + }); + + window._settings.bind(checkButtonBoolId, + dorCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + + dorActionRow.add_suffix(dorCheckButton); + dorActionRow.activatable_widget = dorCheckButton; + + dorKeyboardPage.append(dorActionRow); + } + + const dorTouchpadPage = new Gtk.ListBox(); + dorTouchpadPage.set_selection_mode(Gtk.SelectionMode.NONE); + + for (let orientation in Orientation) { + let actionRowTitle = undefined; + let checkButtonBoolId = undefined; + + switch (orientation) { + case 'normal': + actionRowTitle = "Landscape"; + checkButtonBoolId = "dor-touchpad-landscape"; + break; + case 'left-up': + actionRowTitle = "Portrait (Left)"; + checkButtonBoolId = "dor-touchpad-portrait-left"; + break; + case 'bottom-up': + actionRowTitle = "Landscape Flipped"; + checkButtonBoolId = "dor-touchpad-landscape-flipped"; + break; + case 'right-up': + actionRowTitle = "Portrait (Right)"; + checkButtonBoolId = "dor-touchpad-portrait-right"; + break; + } + + const dorActionRow = new Adw.ActionRow({ + title: actionRowTitle + }); + + const dorCheckButton = new Gtk.CheckButton({ + active: window._settings.get_boolean(checkButtonBoolId), + valign: Gtk.Align.CENTER + }); + + window._settings.bind(checkButtonBoolId, + dorCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + + dorActionRow.add_suffix(dorCheckButton); + dorActionRow.activatable_widget = dorCheckButton; + + dorTouchpadPage.append(dorActionRow); + } + + const dorKeyboardLabel = Gtk.Label.new('Keyboard'); + dorNotebook.append_page(dorKeyboardPage, dorKeyboardLabel); + + const dorTouchpadLabel = Gtk.Label.new('Touchpad'); + dorNotebook.append_page(dorTouchpadPage, dorTouchpadLabel) + + disableOnRotateGroup.add(dorNotebook); + const toggleLoggingSwitch = new Gtk.Switch({ active: window._settings.get_boolean('debug-logging'), valign: Gtk.Align.CENTER @@ -134,6 +284,18 @@ export default class MyExtensionPreferences extends ExtensionPreferences { window._settings.bind('hide-lock-rotate', hideLockRotateSwitch, 'active', Gio.SettingsBindFlags.DEFAULT); + window._settings.bind('landscape-osk', + landscapeOskCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + + window._settings.bind('portrait-right-osk', + portraitRightOskCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + + window._settings.bind('portrait-left-osk', + portraitLeftOskCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + + window._settings.bind('landscape-flipped-osk', + landscapeFlippedOskCheckButton, 'active', Gio.SettingsBindFlags.DEFAULT); + window._settings.bind('debug-logging', toggleLoggingSwitch, 'active', Gio.SettingsBindFlags.DEFAULT); @@ -155,6 +317,18 @@ export default class MyExtensionPreferences extends ExtensionPreferences { hideLockRotateRow.add_suffix(hideLockRotateSwitch); hideLockRotateRow.activatable_widget = hideLockRotateSwitch; + landscapeOskRow.add_suffix(landscapeOskCheckButton); + landscapeOskRow.activatable_widget = landscapeOskCheckButton; + + portraitRightOskRow.add_suffix(portraitRightOskCheckButton); + portraitRightOskRow.activatable_widget = portraitRightOskCheckButton; + + portraitLeftOskRow.add_suffix(portraitLeftOskCheckButton); + portraitLeftOskRow.activatable_widget = portraitLeftOskCheckButton; + + landscapeFlippedOskRow.add_suffix(landscapeFlippedOskCheckButton); + landscapeFlippedOskRow.activatable_widget = landscapeFlippedOskCheckButton; + toggleLoggingRow.add_suffix(toggleLoggingSwitch); toggleLoggingRow.activatable_widget = toggleLoggingSwitch; } diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/rotator.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/rotator.js index 6a104ee..c2e3c57 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/rotator.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/rotator.js @@ -17,11 +17,18 @@ */ import Gio from 'gi://Gio'; -import * as BusUtils from './busUtils.js'; +import { DisplayConfigState } from './displayConfigState.js' + const connection = Gio.DBus.session; -export function call_dbus_method(method, params = null, handler) { - if (handler != undefined || handler != null) { +export const Methods = Object.freeze({ + 'verify': 0, + 'temporary': 1, + 'persistent': 2 +}); + +export function call_dbus_method(method, handler, params = null) { + if (handler !== undefined || handler !== null) { connection.call( 'org.gnome.Mutter.DisplayConfig', '/org/gnome/Mutter/DisplayConfig', @@ -49,10 +56,10 @@ export function call_dbus_method(method, params = null, handler) { export function get_state() { return new Promise((resolve, reject) => { - call_dbus_method('GetCurrentState', null, (connection, res) => { + call_dbus_method('GetCurrentState', (conn, res) => { try { - let reply = connection.call_finish(res); - let configState = new BusUtils.DisplayConfigState(reply) + let reply = conn.call_finish(res); + let configState = new DisplayConfigState(reply) resolve(configState); } catch (err) { reject(err); @@ -65,13 +72,13 @@ export function get_state() { export function rotate_to(transform) { this.get_state().then(state => { let target_monitor = state.builtin_monitor; - if (target_monitor == undefined) { + if (target_monitor === undefined) { target_monitor = state.monitors[0] } let logical_monitor = state.get_logical_monitor_for(target_monitor.connector); logical_monitor.transform = transform; - let variant = state.pack_to_apply(BusUtils.Methods['temporary']); - call_dbus_method('ApplyMonitorsConfig', variant); + let variant = state.pack_to_apply(this.Methods['temporary']); + call_dbus_method('ApplyMonitorsConfig', null, variant); }).catch(err => { console.error(err); }) diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled index 4e7e3665a5c81ed86f10aa0ec18a54be6d4a921b..5404d4b91d2f2b0ec9ac78314d8e38dbb5e7f92e 100644 GIT binary patch literal 1445 zcmZ`(J!lj`7#)qL(MvQJ6A1=Qhz8DL?*s|hXe1C~kwWl?5DdE6o!eWox3lc-MI)HX zN-$!lh!BgQg#;`F3x!l-3N5rrBUq$RBw`9H3w>{H_mU%V;N5%o=G*!CX1*D@Vur5i z$0BK6;IW#{?@Uc_rc;Q&Xtlmk9di}_wTVAZ8AhEK=fxfH3O?KcR-sdHd{vQ!s4P9N zAaBOfk6h(Pg~$q}^o>x(W-R$BhOalyOY8!gfxQX#fwKu(z$x}aA4t#!KA4~b+#ARY z$KaX{iD~f*{2N$#5PYOheH4CIlMqLM?(Cxqed;XyJlFu1zpSs)r*4CP4m=FJSe?E> zpE?JB3_Jn!e(ji}Pu&VX09S#RuZBL+r{=s5!B2pJv*W|`sk`C72EPT;yi*G?Dwe=4 zNX-4ugFhKh-G}&--~r%q)3YD+sXO6c0AB`{ZqH_Ue$*NG*TMGyd91C2@zm|`=fTf` z?{fKiO2wNPQ6>CPtASxg8PBoMXR4a zHS>8Id{g7WX)f3se|~ zrW+fcEX9V3rjqY%IazfKPdSe3J36>F?)Hn@I)6i4eUi|1%BWYY52InLy6wg<>tGMi z4zT`O0oDVrP7Yu_u$EXytPxy&T|+oBT|cfrEyLL0k85Gyx;n8yZ%u54D;*h5!Hn delta 342 zcmZ3=y@qu{2vY~+#4w|JP6h~I1X9dU%mSp@fS4T#OLNc6A66B zptg?tKM;V}tU&P8{W_g}Vu2T~7WD*?rS0O`L#eDdzcCm?YUTY#agoO913DHF!(S`0Mcuico`US6Z1+Fb9B>kG7Bbqvp7xWVNso| q#VkEJmRVwQFN^f#QdX_WO03fIKwY4K0R<8$U_b!`HVR0y0x. -- ---> false Enable a toggle in the GNOME Shell System Menu to manually flip between landscape and portrait. - + + false Hide the 'Auto Rotate' quick toggle. + + false + Enable the use of the On-Screen-Keyboard for the landscape orientation. + + + false + Enable the use of the On-Screen-Keyboard for the portrait (right) orientation. + + + false + Enable the use of the On-Screen-Keyboard for the portrait (left) orientation. + + + false + Enable the use of the On-Screen-Keyboard for the landscape (flipped) orientation. + + + false + Toggle disabling the keyboard when the orientation is landscape. + + + false + Toggle disabling the keyboard when the orientation is portrait left. + + + false + Toggle disabling the keyboard when the orientation is landscape-flipped. + + + false + Toggle disabling the keyboard when the orientation is portrait right. + + + false + Toggle disabling the touchpad when the orientation is landscape. + + + false + Toggle disabling the touchpad when the orientation is portrait left. + + + false + Toggle disabling the touchpad when the orientation is landscape-flipped. + + + false + Toggle disabling the touchpad when the orientation is portrait right. + false Toggle debug logging. diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js new file mode 100644 index 0000000..93c5505 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js @@ -0,0 +1,76 @@ +/* sensorProxy.js +* Copyright (C) 2024 kosmospredanie, shyzus +* +* 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 . +*/ + +import Gio from 'gi://Gio'; + +export class SensorProxy { + constructor(rotate_cb) { + this._rotate_cb = rotate_cb; + this._proxy = null; + this._enabled = false; + this._watcher_id = Gio.bus_watch_name( + Gio.BusType.SYSTEM, + 'net.hadess.SensorProxy', + Gio.BusNameWatcherFlags.NONE, + this.appeared.bind(this), + this.vanished.bind(this) + ); + } + + destroy() { + Gio.bus_unwatch_name(this._watcher_id); + if (this._enabled) this.disable(); + this._proxy = null; + } + + enable() { + this._enabled = true; + if (this._proxy === null) return; + this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + } + + disable() { + this._enabled = false; + if (this._proxy === null) return; + this._proxy.call_sync('ReleaseAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + } + + appeared(_connection, _name, _name_owner) { + this._proxy = Gio.DBusProxy.new_for_bus_sync( + Gio.BusType.SYSTEM, Gio.DBusProxyFlags.NONE, null, + 'net.hadess.SensorProxy', '/net/hadess/SensorProxy', 'net.hadess.SensorProxy', + null); + this._proxy.connect('g-properties-changed', this.properties_changed.bind(this)); + if (this._enabled) { + this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + } + } + + vanished(_connection, _name) { + this._proxy = null; + } + + properties_changed(proxy, changed, _invalidated) { + if (!this._enabled) return; + let properties = changed.deep_unpack(); + for (let [name, value] of Object.entries(properties)) { + if (name !== 'AccelerometerOrientation') continue; + let target = value.unpack(); + this._rotate_cb(target); + } + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md index 7a7be63..6289aff 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md @@ -29,7 +29,7 @@ other: Other ## [v3] - 2022-02-05 ### Added -- Add alernatives thresholds paths. +- Add alternatives thresholds paths. - Add available flag and the _init code is restructured according to this addition... Now the submenu is shown even if the thresholds are not available. ### Fixed - Fix _available function. The test whether the files exist points to the start file twice! @@ -240,7 +240,7 @@ other: Other ## [v36] - 2023-10-10 ### Fixed - Remove "this" in prefs.js (Thanks Just Perfection) -- Remove "run_dispose()" in driver.js and inicator.js (Thanks Just Perfection) +- Remove "run_dispose()" in driver.js and indicator.js (Thanks Just Perfection) ## [v37] - 2023-10-13 ### Performance @@ -275,4 +275,28 @@ other: Other ## [v44] - 2024-03-20 ### Added -- Gnome 46 support \ No newline at end of file +- Gnome 46 support + +## [v45] - 2024-05-18 +### Fixed +- Issue [#20](https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/20): On some models the start threshold 0 is not allowed, instead 95 is used (Ex: P14s Gen 2a) + +## [v46] - 2024-08-02 +### Added +- Automatic detection of start threshold value disabled +- Show a notification and different indicator if the current thresholds are not set (suggestion #21) +- Gnome 47 support + +## [v47] - 2024-08-03 +### Fixed +- Issue [#23](https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/23): Indicator mode NEVER does not work + +## [v48] - 2024-08-07 +### Other +- Update translations + +## [v49] - 2024-08-08 +### Fixed +- Issue [#24](https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/24): The "NEVER" indicator mode does not work properly +### Changed +- "Automatic threshold detection disabled" is not convenient (no way to know the status before it is disabled for the first time), we returns to "model detection mode" and keeps "manual mode" (user settings) \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning-symbolic.svg new file mode 100644 index 0000000..e308010 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning-symbolic.svg @@ -0,0 +1,53 @@ + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning.svg b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning.svg new file mode 100644 index 0000000..fd33df2 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/icons/threshold-active-warning.svg @@ -0,0 +1,52 @@ + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/driver.js b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/driver.js index f19e4e0..a1dd52c 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/driver.js +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/driver.js @@ -11,6 +11,14 @@ import GLib from 'gi://GLib'; import GObject from 'gi://GObject'; import Gio from 'gi://Gio'; +/* + * On some models the start threshold 0 is not allowed, instead 95 is used (Ex: E14 Gen 3) + * See issues: + * #8: https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/8 + * #20: https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/20 + */ +const ALTERNATIVE_DISABLED_START = /(Think[pP]ad) (E14 Gen 3|P14s Gen 2a)/; + // Driver constants const BASE_PATH = '/sys/class/power_supply'; const START_FILE_OLD = 'charge_start_threshold'; // kernel 4.17 and newer @@ -24,7 +32,7 @@ const END_FILE_NEW = 'charge_control_end_threshold'; // kernel 5.9 and newer * @param {string} path Path of file * @returns {string} File contents */ -const readFile = function(path) { +const readFile = function (path) { try { const f = Gio.File.new_for_path(path); const [, contents,] = f.load_contents(null); @@ -41,7 +49,7 @@ const readFile = function(path) { * @param {string} path Path of file * @returns {number|null} Return a integer or null */ -const readFileInt = function(path) { +const readFileInt = function (path) { try { const v = readFile(path); if (v) { @@ -52,15 +60,15 @@ const readFileInt = function(path) { } catch (e) { return null; } -} +} /** - * Test file/direcory exists + * Test file/directory exists * * @param {string} path File/directory path * @returns {boolean} */ -const fileExists = function(path) { +const fileExists = function (path) { try { const f = Gio.File.new_for_path(path); return f.query_exists(null); @@ -79,7 +87,7 @@ const Environment = GObject.registerClass({ get productVersion() { if (this._productVersion === undefined) { const tmp = readFile('/sys/class/dmi/id/product_version'); - if (tmp) { + if (tmp) { // Remove non-alphanumeric characters const sanitize = /([^ A-Za-z0-9])+/g; this._productVersion = tmp.replace(sanitize, ''); @@ -109,23 +117,23 @@ const Environment = GObject.registerClass({ get kernelMajorVersion() { if (this._kernelMajorVersion === undefined) { - [this._kernelMajorVersion , this._kernelMinorVersion] = this.kernelRelease.split('.', 2); + [this._kernelMajorVersion, this._kernelMinorVersion] = this.kernelRelease.split('.', 2); } return this._kernelMajorVersion; } get kernelMinorVersion() { if (this._kernelMinorVersion === undefined) { - [this._kernelMajorVersion , this._kernelMinorVersion] = this.kernelRelease.split('.', 2); + [this._kernelMajorVersion, this._kernelMinorVersion] = this.kernelRelease.split('.', 2); } return this._kernelMinorVersion; } checkMinKernelVersion(major, minor) { return ( - this.kernelMajorVersion > major || - (this,this.kernelMajorVersion === major && this.kernelMinorVersion >= minor) - ); + this.kernelMajorVersion > major || + (this.kernelMajorVersion === major && this.kernelMinorVersion >= minor) + ); } }); @@ -140,7 +148,7 @@ const Runnable = GObject.registerClass({ GTypeName: 'Runnable', Signals: { 'command-completed': { - param_types: [GObject.TYPE_JSOBJECT /* erro */] + param_types: [GObject.TYPE_JSOBJECT /* error */] } } }, class Runnable extends GObject.Object { @@ -167,8 +175,8 @@ const Runnable = GObject.registerClass({ try { GLib.spawn_check_exit_status(status); this.emit('command-completed', null); - } catch(e) { - if (e.code == 126) { + } catch (e) { + if (e.code == 126) { // Cancelled } else { logError(e); @@ -272,13 +280,6 @@ export const ThinkPadBattery = GObject.registerClass({ throw Error('Battery name not defined'); } - // Signals handlers IDs - this._monitorId = null; - this._settingStartId = null; - this._settingEndId = null; - this._startId = null; - this._endId = null; - // Battery directory this._baseDirectoryPath = `${BASE_PATH}/${this.name}`; this._baseDirectory = Gio.File.new_for_path(this._baseDirectoryPath); @@ -334,28 +335,29 @@ export const ThinkPadBattery = GObject.registerClass({ // Update flags on changes in threshold values this._startId = this.connect( 'notify::start-value', () => { - this.isActive = this._checkActive(); - this.isAvailable = this.startValue !== null || this.endValue !== null; - this.pendingChanges = this._checkPendingChanges(); + this._updateStatuses(); } ); this._endId = this.connect( 'notify::end-value', () => { - this.isActive = this._checkActive(); - this.isAvailable = this.startValue !== null || this.endValue !== null; - this.pendingChanges = this._checkPendingChanges(); + this._updateStatuses(); } ); - // Update pending changes flag on changes to setting values this._settingStartId = this.settings.connect( `changed::start-${this.name.toLowerCase()}`, () => { - this.pendingChanges = this._checkPendingChanges(); + this._updateStatuses(); } ); this._settingEndId = this.settings.connect( `changed::end-${this.name.toLowerCase()}`, () => { - this.pendingChanges = this._checkPendingChanges(); + this._updateStatuses(); + } + ); + + this._settingDisabledValueId = this.settings.connect( + `changed::disabled-start-${this.name.toLowerCase()}-value`, () => { + this._updateStatuses(); } ); @@ -366,33 +368,34 @@ export const ThinkPadBattery = GObject.registerClass({ } /** - * Check if thresholds is active - * - * @returns {boolean} Returns true if the battery has active thresholds + * Update the statuses */ - _checkActive() { - // RegExs - /* On some models the start threshold 0 is not allowed, instead 95 is used (Ex: E14 Gen 3) - * See issue #8: https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/8 - */ - const disableStart95 = /(Think[pP]ad) (E14 Gen 3)/; + _updateStatuses() { + // Check if is available + this.isAvailable = this.startValue !== null || this.endValue !== null; - if (this.environment.productVersion.search(disableStart95) >= 0) { - return (this.startValue !== 95 && this.startValue !== null) || (this.endValue !== 100 && this.endValue !== null); + // Check if thresholds is active + const disabledStartValue = this.settings.get_int(`disabled-start-${this.name.toLowerCase()}-value`); + if (disabledStartValue === -1) { + // Use model detection + if (this.environment.productVersion.search(ALTERNATIVE_DISABLED_START) >= 0) { + this.isActive = (this.startValue !== null && this.startValue !== 95) || (this.endValue !== null && this.endValue !== 100); + } else { + this.isActive = (this.startValue !== null && this.startValue !== 0) || (this.endValue !== null && this.endValue !== 100); + } } else { - return (this.startValue !== 0 && this.startValue !== null) || (this.endValue !== 100 && this.endValue !== null); + // Use user settings + this.isActive = (this.startValue !== null && this.startValue !== disabledStartValue) || (this.endValue !== null && this.endValue !== 100); } - } - /** - * Check if there are changes to the settings that need to be applied - * - * @returns {boolean} Returns true if there are changes to the settings that need to be applied - */ - _checkPendingChanges() { const startSetting = this.settings.get_int(`start-${this.name.toLowerCase()}`); const endSetting = this.settings.get_int(`end-${this.name.toLowerCase()}`); - return ((this.startValue != null && this.startValue !== startSetting) || (this.endValue != null && this.endValue !== endSetting)); + if (this.isActive) { + this.pendingChanges = (this.startValue !== null && this.startValue !== startSetting) || (this.endValue !== null && this.endValue !== endSetting); + } else { + this.pendingChanges = false; + } + } /** @@ -419,7 +422,7 @@ export const ThinkPadBattery = GObject.registerClass({ } } catch (e) { // Ignored - } + } return false; } @@ -446,12 +449,12 @@ export const ThinkPadBattery = GObject.registerClass({ } get isAvailable() { - return this._isAvaialble; + return this._isAvailable; } set isAvailable(value) { if (this.isAvailable !== value) { - this._isAvaialble = value; + this._isAvailable = value; this.notify('is-available'); } } @@ -627,6 +630,9 @@ export const ThinkPadBattery = GObject.registerClass({ if (this._settingEndId) { this.settings.disconnect(this._settingEndId); } + if (this._settingDisabledValueId) { + this.settings.disconnect(this._settingDisabledValueId); + } if (this._monitorId) { this._baseMonitor.disconnect(this._monitorId); } @@ -660,6 +666,13 @@ export const ThinkPad = GObject.registerClass({ GObject.ParamFlags.READABLE, false ), + 'pending-changes': GObject.ParamSpec.boolean( + 'pending-changes', + 'Pending changes', + 'Indicates if the current values do not match the configured values', + GObject.ParamFlags.READABLE, + false + ), 'batteries': GObject.ParamSpec.jsobject( 'batteries', 'Batteries', @@ -706,12 +719,12 @@ export const ThinkPad = GObject.registerClass({ this.batteries = [ new ThinkPadBattery({ 'environment': this.environment, - 'name': 'BAT0', + 'name': 'BAT0', 'settings': this.settings }), new ThinkPadBattery({ 'environment': this.environment, - 'name': 'BAT1', + 'name': 'BAT1', 'settings': this.settings }), ]; @@ -728,6 +741,11 @@ export const ThinkPad = GObject.registerClass({ this.isActive = this._checkActive(); } ); + const pendingChangesId = battery.connect( + 'notify::pending-changes', (bat) => { + this.pendingChanges = this._checkPendingChanges(); + } + ); const enableCompletedId = battery.connect( 'enable-completed', (bat, error) => { this.emit('enable-battery-completed', bat, error); @@ -744,6 +762,7 @@ export const ThinkPad = GObject.registerClass({ // Load initial values this.isAvailable = this._checkAvailable(); this.isActive = this._checkActive(); + this.pendingChanges = this._checkPendingChanges(); } get environment() { @@ -754,12 +773,12 @@ export const ThinkPad = GObject.registerClass({ } get isAvailable() { - return this._isAvaialble; + return this._isAvailable; } set isAvailable(value) { if (this.isAvailable !== value) { - this._isAvaialble = value; + this._isAvailable = value; this.notify('is-available'); } } @@ -775,6 +794,28 @@ export const ThinkPad = GObject.registerClass({ } } + get pendingChanges() { + return this._pendingChanges; + } + + set pendingChanges(value) { + if (this.pendingChanges !== value) { + this._pendingChanges = value; + this.notify('pending-changes'); + } + } + + /** + * Check if there are changes to the settings that need to be applied + * + * @returns {boolean} Returns true if there are changes to the settings that need to be applied + */ + _checkPendingChanges() { + return this.batteries.some(bat => { + return bat.pendingChanges; + }); + } + /** * Check if at least one battery has the thresholds active * @@ -817,7 +858,7 @@ export const ThinkPad = GObject.registerClass({ runnable.connect('command-completed', (obj, error) => { this.emit('enable-all-completed', error); }) - runnable.run(); + runnable.run(); } /** @@ -840,7 +881,7 @@ export const ThinkPad = GObject.registerClass({ runnable.connect('command-completed', (obj, error) => { this.emit('disable-all-completed', error); }) - runnable.run(); + runnable.run(); } destroy() { diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js index 4e27e13..742e14d 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js @@ -37,9 +37,6 @@ const BatteryItem = GObject.registerClass({ this._settings = settings; this._battery = battery; - - // Flag to prevent the PopupImageMenuItem from being activated when the reload icon is clicked - this._reloading = false; const box = new St.BoxLayout({ 'opacity': 128, @@ -58,9 +55,8 @@ const BatteryItem = GObject.registerClass({ }); this._reload.connectObject( 'button-press-event', () => { - this._reloading = true; this._battery.enable(); - return true; // Does not prevent event propagation??? + return true; }, this ); @@ -91,10 +87,7 @@ const BatteryItem = GObject.registerClass({ // Menu item action this.connectObject( 'activate', () => { - if (!this._reloading) { - this._battery.toggle(); - } - this._reloading = false; + this._battery.toggle(); }, 'destroy', () => { this._settings.disconnectObject(this); @@ -123,7 +116,11 @@ const BatteryItem = GObject.registerClass({ if (this._battery.isActive) { // TRANSLATORS: %s is the name of the battery. this.label.text = _('Disable thresholds (%s)').format(this._battery.name); - this.setIcon(getIcon('threshold-active', colorMode)); + if (this._battery.pendingChanges) { + this.setIcon(getIcon('threshold-active-warning', colorMode)); + } else { + this.setIcon(getIcon('threshold-active', colorMode)); + } // Status text const showCurrentValues = this._settings.get_boolean('show-current-values'); if (showCurrentValues) { @@ -249,6 +246,9 @@ export const ThresholdIndicator = GObject.registerClass({ 'notify::is-active', () => { this._updateIndicator(); }, + 'notify::pending-changes', () => { + this._updateIndicator(); + }, 'enable-battery-completed', (driver, battery, error) => { if (!error) { this._notifyEnabled( @@ -330,6 +330,15 @@ export const ThresholdIndicator = GObject.registerClass({ this._driver = null; this._extension = null; }); + + // Pending changes alert + this._driver.batteries.every(battery => { + if (battery.pendingChanges && battery.isActive) { + this._notify(_('Battery Threshold'), _('The currently set thresholds do not match the configured ones'), 'threshold-active-warning', false); + return false; + } + return true; + }); } /** @@ -339,7 +348,11 @@ export const ThresholdIndicator = GObject.registerClass({ const colorMode = this._settings.get_boolean('color-mode'); if (this._driver.isAvailable) { if (this._driver.isActive) { - this._indicator.gicon = getIcon('threshold-active', colorMode); + if (this._driver.pendingChanges) { + this._indicator.gicon = getIcon('threshold-active-warning', colorMode); + } else { + this._indicator.gicon = getIcon('threshold-active', colorMode); + } } else { this._indicator.gicon = getIcon('threshold-inactive', colorMode); } @@ -352,14 +365,14 @@ export const ThresholdIndicator = GObject.registerClass({ case 0: // Active this._indicator.visible = this._driver.isActive; break; - case 1: // Inactive - this._indicator.visible = !this._driver.isActive; + case 1: // Inactive (or pending changes) + this._indicator.visible = !this._driver.isActive || this._driver.pendingChanges; break; case 2: // Always this._indicator.visible = true; break; - case 3: // Never - this._indicator.visible = false; + case 3: // Never (or pending changes) + this._indicator.visible = this._driver.pendingChanges; break; default: this._indicator.visible = true; @@ -368,15 +381,15 @@ export const ThresholdIndicator = GObject.registerClass({ } /** - * Show notificaion. + * Show notification. * * @param {string} msg Title * @param {string} details Message * @param {string} iconName Icon name + * @param {boolean} [transient=true] Transient notification */ - _notify(msg, details, iconName) { + _notify(msg, details, iconName, transient=true) { if (!this._settings.get_boolean('show-notifications')) return; - const colorMode = this._settings.get_boolean('color-mode'); if (SHELL_VERSION === 45) { const source = new MessageTray.Source(this._name); Main.messageTray.add(source); @@ -384,9 +397,9 @@ export const ThresholdIndicator = GObject.registerClass({ source, msg, details, - {gicon: getIcon(iconName, colorMode)} + {gicon: getIcon(iconName, true)} ); - notification.setTransient(true); + notification.setTransient(transient); source.showNotification(notification); } else { const source = new MessageTray.Source({'title': this._name}); @@ -395,8 +408,8 @@ export const ThresholdIndicator = GObject.registerClass({ source: source, title: msg, body: details, - isTransient: true, - gicon: getIcon(iconName, colorMode) + isTransient: transient, + gicon: getIcon(iconName, true) }); source.addNotification(notification); } @@ -408,7 +421,7 @@ export const ThresholdIndicator = GObject.registerClass({ * @param {string} message Message */ _notifyError(message) { - this._notify(_('Battery Threshold'), message, 'threshold-error'); + this._notify(_('Battery Threshold'), message, 'threshold-error', false); } /** diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index 8a8c6634ac16cdec7699ac9dbe19e451dddb803b..7aae3ff12319415ba4519fc704b315a53343175b 100644 GIT binary patch delta 2433 zcmZvcU5Hdw9Kg@Go35+2t{-hy=5aH3w|3Uqb#>iUYd1ApGQ*G5D3G&v&g@>ebMJUR zHtfL(3o3{pCy8DHBMgb68i*nSsfX~XhYE_I2a#Sfh@c=O>-WERW?Q4f{O|9abIX-%Oa)tsnG@} zAUf3~6n&32)(%|E+J#GC1ed~U`X2i)FV*CUw}8mx8Vx-5fsCh;2``KioHd6RlvULVe&9M1|NZMK`F;?@H#Azzgf5m zEyv+`C@Eb?71)QfN#tU+@7>TqF>oG=16QCZzS>y-4#mO0pwzw#FK7?77RtE|P)d-8Qi5?PCEW)lb3rHh z7Z1;}u^GMxWqldm4zEG+xC<>4a0rTm81}-~Ai=APPk;u36P2?%Tv+y+Q4@gT94x?2fc^wwun=lW*h8pJhWW>R4DCc%UY^nz# zs@3C-{W6pc%tFkhK}zPU(irQJendQ%Z&PZ27a|HJy<|5X(%pT?y@;fHJ0j_pfj??( zI?Ei|%3Lxyh%7+F_(r5T#5q1=>Hn;@o8h)}l|3X{>1r8LEBSM34(W+?jm1512$3?# z*o0`L6_FwT88SwYF+|ECL&~^9-Jf-?Y)D$kPWtB{YpL&mOc*7|=IhU@RP ze$%qngt4AAUShQq_>o(*p)Km78<{E37Hg;4o~fp9O73(bZ{nHIMl*p|%q~URgjU-V ziScwC@YXi>=V|M1s_RyVIp8E=X#LnbsUsWzt1!~VK>IwDFfBax=V(mu%7ldq!UU4omWvc^U8_(08sl-7g(!EK9`?yokL8wQ!^bP2vRzKx( zBo0sNDsh=44sgqL(sM-{TSxSvI89x@o=UJ@(kFvNJI3$fWfJ;2D3wyHbIwNnsY++Y z_|vXGtzC)M&#dEy)%ih5;|=DP=!QKv?yFyGdm^{^aA^F6bfHk>bP%NI85p~11jXziEwt_{<8Y^MW1m^CQgQQ~UeF<}^t&jfMVxZZ$`>Vr$# zbGecFj-{(xa<+b;<3g_Ii1A2<>${FiX`96~l&DDk&6Ml8F{|32%b%<63(`CUbOvvA zQl1L4J89E!D$)@-r-O{g5u?3%7v`ysbT`V46T7o=sauKSOdHoMg{LPSSM+fRWo6pP z>Z%{$pzHI-`r>M;KkXe_M>MHDo)n6Jiq>oTho@6UymjYmSipP(3-K%Z z@t5qF5kEJ;2uHVI7%paoe^f~Uv&$thju41Ugatxpjj$#N0 zFo-txbG}(*Fo}O~2vdZslzqT@T*rgxWl;w=q3*C3i|`Waz!4+{lfpNYaT?ju^m4n( zKtERFMbvc(v^BWJ;0W4y3}2u!@B?)RUQW?QRj2?g*DlnZpL6GNtYm%%Pvax(!AGEoMVe-D21iiQDbP_2 z;yAYAW3=!cDu8dupDC~@q-t5ihkh7DO6N4CNX>buazp1wx)aWK4p0^pur^i6^w#Q` zQTFsos~l>Fb2!0RjFna0xZS{qn(D6%sPWvGHfNOkXaWVP)ruTn8o&Pr-Cg84aL8W>xo#)PZ$5nz3I?vDl*376n)1JSYmu@PU z$%G0od(vrteR|nHIv8mU1^KhW!R~OVB}ns~jin}9FC=5*sj=8ZBH3-#4aAbeiImkB zu%cs=vE=COI_qfMSsRJv7J9D5W7o$5!-;q%UgYz5LYb-J%Dl|IvIS3isA4X&R5|ZS IpQ;M}1;BiRhX4Qo diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index fc4192c97bf329aeaae159bcc32e5bb0ba437b87..91b30591b8a42a9f9a768d3d9abac577bebb70a9 100644 GIT binary patch delta 2439 zcmaKsUu+ab9LMLRKq-Gp3yR7ghgxW>J!mQaiinhG6j2&&1rv;9xSPAK?CsW_T?{00 zK4RhnauSSB5RC>C|HO+%6GKR9)V>j;iN@%Qh8K-SgYm&g{QUOz0EuyObDx>nnctu9 z{C1~SUCLL#?`%1#Xm`_>(OYg%Y7G87gFo8lnM$?7VaQMI;O{2*0GtK)XX_={!`z4K z;7hOreg@m%H&FKf2p7Yj;3B1}=_&)Yn5Ro%FBAvc;TE_TZiFY`Fr0=P;EdTy@l(SY zM<6!UPAK+9vv~o|VeY}X(7}1Inm)(>3k+^!;RF=N??H)t8g{{N;X-&hTW?2>o0+eK zlIa$BE3Cj3@EBYG-+-O)11OHC;UN49ioe-JHGqHB!(bPD96k(RgK{0e!^?00{SLvk zSlJI>ha%}L(pUvMU^mW&=eHI)7ktBC;@(*&3}XBp#Fr!q*{mylWGwZC2og#n1?Ij zz7F)4qI;HwUU(AnQ|I`TySo78ZhwIH!OKt%-pfN_35ug*P!c%>#o^mf5;_OvYW{|j zP#5i;d{260LX%g!Q{B_JZ&{GSkXn!ek|y=ACLJlY6=omA^wrCj z)%yBdEnm)9ZlYKpGJaxpAq<>Xw2>|9qUX#3-xg~}Tc4|@PfA`nktgv)WZgvQ7aND1 zHj&l#>BRUt4tZ*u>(^N8YMSd(<7_A-QDlSIKdhaNuNri^80sL5b;ZPmiPRJ}N?x_$ zI1H>ykGohxzAg^tCf1(&uOwty>`HLXRICmIZG2z*W-<;Zo$gH>;SK`e zYxOf8TjJ=ju9BBY;*hYsLb|VLV_Oh=7*3_@*9Q{3m-OK<(FGIq@Gyx29hOR|*DJxg z{?ue)!USb6C~Hr$4I17F!|ME?$oMaJb9Ls=i~H(-weHK!8IMfhd=uN+V{NNv?;Uw` z_s-q-*N(JJ%wL}$*qk32((8t{3~sFb+P0*7%!_tKe(3bpI6LKW&D-5UpE>_nZstQ?aM0C`FVOmt#01Yz5Hm6m_4yWDJtD&am z3>q8e=$!7o#-h_*V)KCKd$FA9QrK+R;!KRH70S%wxI{c+G!UbOkn(fY$uKC|N^1LB z$7;0UN{TUy>;IE!7@az+LtU}15^9Xbp?KqWrNqiMYKB9VC3?6jWj0QHygwCoHtrbZ zuikwldg~~QH2Z#P1!0(lg{e22$pp@p6E6~ZeXooGahnP%#g+XybuskSdpe%VwNiG)(%T%Wcf7sbo=&wBQmgrUVHw=pf@ZFk=#k4na_mK{5pO z)=LCNpbbSEVfYaAQjj1N2txVNQxx&hx70VX5d-W^Zi(e16W{8 z#9WD2%q*7h#eLKS&#?_ZU<+pO_5t)_Gfv@VTuk@^dDOf`1~%^!?Jt;4dmS_JJ7(c; z=lh5;$&6A?M+R!*8q~_YSb;s5i<61|>$rvXJ=9L0;8y&GJ5cG$fpW~pdep>TwDA-+ zU#6Nfm!z@=R`-GLahPyGDPEA~m+F?6pV;^e5L1YakjPE(dDP%}#D%JC-46LJe@DnvqDzjPWMrEu4OYsaUbHfR*;$hl%QTJ*U z52Bk@Dq~%!19o20-j*r~rUoZZkLl$t*jAfcpJ35AZWiFz2G=kd6JbG~hXRwM{`tTuY zp?|RkQ<+uTs7&>v7BGoA!np{QA}SA1FTO$-D%4gumnvR$c2P#1d7Vq7i=_o?Q0-J% z)SXd!m3ob>sEgxd%c8FH*X54v;X|>XqLeAPH)fwxi+@yuR;#F`=x3@6sn|u)5h`>i zY>JLX$Jj_|qVSjC{5OCT`u!{0{NJ>g`got&gi7^x3ir+Vjq3&qUnp0Mi zqSfisF+1~uD;mwJj4ovjwKsX}Mo)un*{yAMYi$FO(d`RQc+Q7>#yAMPC;;{sSSRkbD3D diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json index 3f2d6bf..e8ff14c 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json @@ -6,9 +6,10 @@ "settings-schema": "org.gnome.shell.extensions.thinkpad-battery-threshold", "shell-version": [ "45", - "46" + "46", + "47" ], "url": "https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension", "uuid": "thinkpad-battery-threshold@marcosdalvarez.org", - "version": 44 + "version": 49 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/about.js b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/about.js index d547b1a..db06944 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/about.js +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/about.js @@ -7,6 +7,14 @@ import Gio from 'gi://Gio'; import Gtk from 'gi://Gtk'; import Gdk from 'gi://Gdk'; +// Links +const URLS = { + readme: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/', + bug_report: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues', + license: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/blob/main/LICENSE', + translate: 'https://hosted.weblate.org/engage/thinkpad-battery-threshold/', +}; + export const About = GObject.registerClass({ GTypeName: 'AboutPrefs', Template: GLib.Uri.resolve_relative(import.meta.url, '../ui/about.ui',GLib.UriFlags.NONE), @@ -14,6 +22,10 @@ export const About = GObject.registerClass({ 'app_icon_image', 'app_name_label', 'version_label', + 'open_readme', + 'open_bug_report', + 'open_license', + 'open_translate', ] }, class About extends Adw.PreferencesPage { constructor(window) { @@ -21,25 +33,29 @@ export const About = GObject.registerClass({ this._app_icon_image.gicon = Gio.icon_new_for_string(`${GLib.Uri.resolve_relative(import.meta.url, '../icons/threshold-active.svg',GLib.UriFlags.NONE)}`); this._app_name_label.label = window._metadata.name; - this._version_label.label = window._metadata.version.toString(); + this._version_label.label = window._metadata.version ? window._metadata.version.toString() : "0"; - // setup menu actions + // Setup actions const actionGroup = new Gio.SimpleActionGroup(); window.insert_action_group('prefs', actionGroup); - // a list of actions with their associated link + // A list of actions with their associated link const actions = [ { name: 'open-bug-report', - link: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues' + link: URLS.bug_report }, { name: 'open-readme', - link: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/' + link: URLS.readme }, { name: 'open-license', - link: 'https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/blob/main/LICENSE' + link: URLS.license + }, + { + name: 'open-translate', + link: URLS.translate }, ]; @@ -51,5 +67,11 @@ export const About = GObject.registerClass({ ); actionGroup.add_action(act); }); + + // Set tooltips + this._open_readme.tooltip_text = URLS.readme; + this._open_license.tooltip_text = URLS.license; + this._open_bug_report.tooltip_text = URLS.bug_report; + this._open_translate.tooltip_text = URLS.translate; } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/thinkpad.js b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/thinkpad.js index 133ad85..30517b4 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/thinkpad.js +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/preferences/thinkpad.js @@ -16,7 +16,11 @@ export const Thinkpad = GObject.registerClass({ 'reset', 'apply_bat0', 'apply_bat1', - 'reset_thresholds_dialog' + 'reset_thresholds_dialog', + 'disabled_start_bat0', + 'disabled_start_bat1', + 'warn_bat0', + 'warn_bat1' ], }, class Thinkpad extends Adw.PreferencesPage { constructor(window) { @@ -46,26 +50,48 @@ export const Thinkpad = GObject.registerClass({ 'value', Gio.SettingsBindFlags.DEFAULT ); + window._settings.bind( + 'disabled-start-bat0-value', + this._disabled_start_bat0, + 'value', + Gio.SettingsBindFlags.DEFAULT + ); + window._settings.bind( + 'disabled-start-bat1-value', + this._disabled_start_bat1, + 'value', + Gio.SettingsBindFlags.DEFAULT + ); window._settings.connect('changed::start-bat0', () => { if (this._start_bat0.value >= this._end_bat0.value) { this._end_bat0.value = this._start_bat0.value + 1; } + this._updateWarnings(); }); window._settings.connect('changed::end-bat0', () => { if (this._start_bat0.value >= this._end_bat0.value) { this._start_bat0.value = this._end_bat0.value - 1; } + this._updateWarnings(); }); window._settings.connect('changed::start-bat1', () => { if (this._start_bat1.value >= this._end_bat1.value) { this._end_bat1.value = this._start_bat1.value + 1; } + this._updateWarnings(); }); window._settings.connect('changed::end-bat1', () => { if (this._start_bat1.value >= this._end_bat1.value) { this._start_bat1.value = this._end_bat1.value - 1; } + this._updateWarnings(); + }); + window._settings.connect('changed::disabled-start-bat0-value', () => { + this._updateWarnings(); + }); + window._settings.connect('changed::disabled-start-bat1-value', () => { + this._updateWarnings(); }); const bat0 = window._driver.batteries.find(battery => battery.name === 'BAT0'); @@ -96,13 +122,17 @@ export const Thinkpad = GObject.registerClass({ this._apply_bat1.sensitive = bat1.pendingChanges; }); + this._updateWarnings(); + this._reset_thresholds_dialog.connect('response', (obj, response, data) => { if (response === 'reset') { const keys = [ 'start-bat0', 'end-bat0', 'start-bat1', - 'end-bat1' + 'end-bat1', + 'disabled-start-bat0-value', + 'disabled-start-bat1-value', ]; keys.forEach(key => { window._settings.reset(key); @@ -116,4 +146,9 @@ export const Thinkpad = GObject.registerClass({ this._reset_thresholds_dialog.present(); }); } + + _updateWarnings() { + this._warn_bat0.reveal_child = this._start_bat0.value === this._disabled_start_bat0.value && this._end_bat0.value === 100; + this._warn_bat1.reveal_child = this._start_bat1.value === this._disabled_start_bat1.value && this._end_bat1.value === 100; + } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/gschemas.compiled index bb8abf8276eedccc0d9cc0974c705190a88e4583..8f06c78801c52d4ed240f251c1105c1b55674e98 100644 GIT binary patch literal 1076 zcmaJ=L2DC182zHg##DJE`_y5kU{) zp$8AW_zOf(P&^5_h=O-7BK`ueQbbta+iX%n+l9C9&D(Fk`R1FM#kPt(6==zx68Pp& z8;3G4N3ZyOHf89G(v)rR90KywA_<=A5e6>{`2r9|Yn8PiTz4w5>-c`fxu=~V_QD{p zXx9tw^ptIOl-5qPX=*oeVmI_{rVufvhAf-=8IFP{G8Di?-~_;bh@VfMZZVd% zoskW>3~mDNK0f|TpPIf4?g0x6tBO8#5&i@4BjCsMT8=*TDfm0!=fL~3=jZ8D&%z&o zKLDdXP_qx8z`MZjZo|^F`EM^9H(|XpYPdx>{3VsMI&X_OhQ?s6J@D9*=F@KIe z^=bI8z;A)U{jEv%pE?hJ0R9Cuvpm$yQ^1~_1gg7VUo#JN0e%TQ2h=j3n!W+%UfN!) zI=*9@u~w1hmQ~FS<@X)r;KRAa@XG(j)&3jT4gD}O*F!r?kQ1X*#^&EOgHU_7y{^(c zB-nfSs;@)y;LK?p>fpIRxstXY%(HVG;Mw4LIR>B=SewWsuutmo;?lfcV6&jV3$8D( z)^D{$#_O+Nxv|u4AfqIlGg(?0ISFe?Mn6Du{$!=mZd{jSLX6nhRQ+;!ud(St9Xx-WoHF=5>PfURJNs ML><|R>(%FbTe7ZOk7l48YHMxL>h_h@|xUchK_f_%#DAb&)`De zp-_Yt`T#ycmxV6c7ZBVC-A&KAnb2%{;mkR6=FI*1zPsL4S*(nea@4`^#@c&WdJpK; zel0kLek~hv0saD`GAB}C%sygxOJ0EMK$;DLfk_W^kViU60)1??$>Y@IfsJDGaj5$K zzOq(lC%%m`okwZX=M*AdZOrb;H92(!n3=*8XyzvCb1z(<{2gfi`T3O&byW`K2lzLz zyu7FAQ`g|%f$xE(GEdFC;P6#oecr!jo|^eO_$9DW`qcEB;1%HJ?EER~L0y5r3O)ro zpIj`b}3Pw=jRZ=K5#ed=fMZ@{cENcaP5!Wyt9Rp2qe8foL| z+T4K_FK+bGB+dMTw6AIKUvIxrhL-T|YK~lPRc6_dri;lN(zMU;WWW!G%0_q((df`M zI&_T=|1~=Nf1^W@934OMd!sDV#`=dU8R;DJx&66MCbjX0xTh>H&Df7kpT_ioT5G$T z-8Rl$?yZ;@xR$I_vAI2Q3f8V@ZSA$*cbG0%!(zMLZNHUbM!eiRQKLqKpG5uwb^xS% diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/org.gnome.shell.extensions.battery-threshold.gschema.xml b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/org.gnome.shell.extensions.battery-threshold.gschema.xml index e9c4b22..d806fa8 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/org.gnome.shell.extensions.battery-threshold.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/schemas/org.gnome.shell.extensions.battery-threshold.gschema.xml @@ -13,7 +13,7 @@ - "ACTIVE" + "ALWAYS"

Set when the Icon tray should appear in Gnome tray @@ -39,12 +39,28 @@ Stop charging when the level is above this value - 0 + 75 Start charging when the level is below this value - 100 + 80 Stop charging when the level is above this value + + true + Use autodetected disabled start value + + + -1 + Disabled start value instead of default value + + + true + Use autodetected disabled start value + + + -1 + Disabled start value instead of default value + diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/about.ui b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/about.ui index b0c116e..c529db3 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/about.ui +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/about.ui @@ -53,8 +53,6 @@ Project site - - https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/ prefs.open-readme true @@ -68,8 +66,6 @@ Bug report - - https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues prefs.open-bug-report true @@ -83,8 +79,6 @@ License - - https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/blob/main/LICENSE prefs.open-license true @@ -95,6 +89,19 @@ + + + Translate + prefs.open-translate + true + + + center + adw-external-link-symbolic + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/thinkpad.ui b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/thinkpad.ui index 1f1a30a..eeef868 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/thinkpad.ui +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/ui/thinkpad.ui @@ -29,16 +29,100 @@ Charging start value Start charging when the level is below this value - bat0_start_adjustment + true + if-valid + + + 5.0 + 1.0 + 99.0 + 0.0 + 75.0 + + Charging stop value Stop charging when the level is above this value - bat0_end_adjustment + true + if-valid + + + 5.0 + 1.0 + 100.0 + 1.0 + 80.0 + + + + + Start value considered disabled + The start threshold value that is considered disabled is not the same on all laptops (usually 0 or 95). We will try to automatically detect this value, but if you can't turn off the thresholds, try changing it manually (use -1 to automatically detect it) + true + if-valid + + + 5.0 + 1.0 + 99.0 + -1.0 + -1.0 + + + + + + + true + + + GTK_ORIENTATION_HORIZONTAL + 12 + 6 + 6 + 6 + 6 + + + dialog-warning + warning + GTK_ICON_SIZE_LARGE + + + + + GTK_ORIENTATION_VERTICAL + + + WARNING + warning + true + true + GTK_JUSTIFY_CENTER + + + + + + + + true + true + GTK_JUSTIFY_CENTER + The configured threshold values are equal to the values considered "disabled" + + + + + + + + @@ -66,16 +150,100 @@ Charging start value Start charging when the level is below this value - bat1_start_adjustment + true + if-valid + + + 5.0 + 1.0 + 99.0 + 0.0 + 75.0 + + Charging stop value Stop charging when the level is above this value - bat1_end_adjustment + true + if-valid + + + 5.0 + 1.0 + 100.0 + 1.0 + 80.0 + + + + + Start value considered disabled + The start threshold value that is considered disabled is not the same on all laptops (usually 0 or 95). We will try to automatically detect this value, but if you can't turn off the thresholds, try changing it manually (use -1 to automatically detect it) + true + if-valid + + + 5.0 + 1.0 + 99.0 + -1.0 + -1.0 + + + + + + + true + + + GTK_ORIENTATION_HORIZONTAL + 12 + 6 + 6 + 6 + 6 + + + dialog-warning + warning + GTK_ICON_SIZE_LARGE + + + + + GTK_ORIENTATION_VERTICAL + + + WARNING + warning + true + true + GTK_JUSTIFY_CENTER + + + + + + + + true + true + GTK_JUSTIFY_CENTER + The configured threshold values are equal to the values considered "disabled" + + + + + + + +

)*5SAy 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

@@ -116,33 +284,4 @@ Reset
- - - 5.0 - 1.0 - 99.0 - 0.0 - 75.0 - - - 5.0 - 1.0 - 100.0 - 1.0 - 80.0 - - - 5.0 - 1.0 - 99.0 - 0.0 - 75.0 - - - 5.0 - 1.0 - 100.0 - 1.0 - 80.0 - \ No newline at end of file