From c6cc94df4b7222193743a39f11e930c25fd690fa Mon Sep 17 00:00:00 2001 From: Tyrone Meijn Date: Thu, 31 Oct 2024 14:07:46 +0000 Subject: [PATCH] refactor: manage extensions with CLI Closes #8 --- chezmoi/.chezmoiignore | 1 + ..._once_after_50_load-dconf-settings.sh.tmpl | 4 +- ...nchange_30_install_extensions_list.sh.tmpl | 12 + chezmoi/dconf.ini | 50 +- chezmoi/dot_config/mise/config.toml | 7 + chezmoi/installed-extensions.txt | 15 + .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 664 ---- .../gnome-shell-extension-apps-menu.mo | Bin 428 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 525 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 509 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 577 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 480 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 620 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 462 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 537 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 462 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 498 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 463 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 536 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 522 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 516 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 543 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 538 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 536 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 547 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 483 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 527 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 572 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 582 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 543 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 468 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 590 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 653 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 532 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 571 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 566 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 539 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 532 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 537 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 481 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 505 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 472 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 471 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 551 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 502 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 497 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 480 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 474 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 560 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 537 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 401 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 630 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 482 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 477 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 492 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 546 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 556 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 499 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 471 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 511 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 545 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 650 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 570 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 595 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 606 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 500 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 631 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 620 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 583 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 478 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 499 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 478 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 453 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 512 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 509 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 631 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 496 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 510 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 466 -> 0 bytes .../gnome-shell-extension-apps-menu.mo | Bin 485 -> 0 bytes .../private_metadata.json | 18 - .../schemas/gschemas.compiled | Bin 318 -> 0 bytes ...ome.shell.extensions.apps-menu.gschema.xml | 18 - .../stylesheet.css | 15 - .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 140 - ...gnome-shell-extension-auto-move-windows.mo | Bin 521 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 526 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 515 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 577 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 493 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 684 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 571 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 647 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 466 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 533 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 466 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 570 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 550 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 544 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 628 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 557 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 588 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 580 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 485 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 549 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 597 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 612 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 582 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 497 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 597 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 682 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 538 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 600 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 617 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 599 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 565 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 563 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 537 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 546 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 540 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 544 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 581 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 527 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 432 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 498 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 502 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 592 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 569 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 401 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 648 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 513 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 483 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 514 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 640 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 573 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 539 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 489 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 581 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 580 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 683 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 605 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 664 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 658 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 454 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 659 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 707 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 587 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 509 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 508 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 508 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 466 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 595 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 537 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 684 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 565 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 535 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 471 -> 0 bytes ...gnome-shell-extension-auto-move-windows.mo | Bin 538 -> 0 bytes .../prefs.js | 353 -- .../private_metadata.json | 18 - .../schemas/gschemas.compiled | Bin 316 -> 0 bytes ...l.extensions.auto-move-windows.gschema.xml | 16 - .../components/appfolders.js | 265 -- .../components/applications.js | 451 --- .../components/coverflow_alt_tab.js | 91 - .../components/dash_to_dock.js | 421 --- .../components/lockscreen.js | 89 - .../components/overview.js | 213 -- .../blur-my-shell@aunetx/components/panel.js | 542 --- .../components/screenshot.js | 110 - .../components/window_list.js | 148 - .../conveniences/connections.js | 106 - .../conveniences/dummy_pipeline.js | 112 - .../conveniences/effects_manager.js | 90 - .../blur-my-shell@aunetx/conveniences/keys.js | 188 - .../conveniences/paint_signals.js | 91 - .../conveniences/pipeline.js | 223 -- .../conveniences/pipelines_manager.js | 168 - .../conveniences/settings.js | 363 -- .../conveniences/settings_updater.js | 40 - .../conveniences/utils.js | 38 - .../blur-my-shell@aunetx/dbus/client.js | 58 - .../blur-my-shell@aunetx/dbus/iface.xml | 12 - .../blur-my-shell@aunetx/dbus/services.js | 93 - .../blur-my-shell@aunetx/effects/color.glsl | 13 - .../blur-my-shell@aunetx/effects/color.js | 140 - .../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 - .../blur-my-shell@aunetx/effects/noise.glsl | 20 - .../blur-my-shell@aunetx/effects/noise.js | 76 - .../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 | 589 --- .../scalable/actions/add-row-symbolic.svg | 4 - .../actions/applications-symbolic.svg | 56 - .../actions/bottom-panel-symbolic.svg | 44 - .../scalable/actions/dash-symbolic.svg | 44 - .../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/heart-symbolic.svg | 2 - .../scalable/actions/other-symbolic.svg | 1 - .../scalable/actions/overview-symbolic.svg | 56 - .../scalable/actions/pipelines-symbolic.svg | 64 - .../scalable/actions/remove-row-symbolic.svg | 3 - .../scalable/actions/reset-symbolic.svg | 7 - .../scalable/actions/select-row-symbolic.svg | 2 - .../actions/select-window-symbolic.svg | 2 - .../scalable/actions/static-mode-symbolic.svg | 71 - .../af/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 7995 -> 0 bytes .../ar/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 9194 -> 0 bytes .../az/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1254 -> 0 bytes .../be/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 3494 -> 0 bytes .../bg/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1748 -> 0 bytes .../ca/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1229 -> 0 bytes .../cs/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 16628 -> 0 bytes .../da/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 916 -> 0 bytes .../de/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 15289 -> 0 bytes .../el/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 10265 -> 0 bytes .../es/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 17156 -> 0 bytes .../et/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 2830 -> 0 bytes .../fi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 7609 -> 0 bytes .../fr/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 17284 -> 0 bytes .../he/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 587 -> 0 bytes .../hi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 25807 -> 0 bytes .../hu/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 8562 -> 0 bytes .../id/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 8938 -> 0 bytes .../it/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 15008 -> 0 bytes .../ja/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 17069 -> 0 bytes .../ka/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 2635 -> 0 bytes .../ko/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 14981 -> 0 bytes .../nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 7968 -> 0 bytes .../nl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 17057 -> 0 bytes .../nn/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 1184 -> 0 bytes .../pl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 14189 -> 0 bytes .../pt/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 10348 -> 0 bytes .../pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 14652 -> 0 bytes .../ro/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 3643 -> 0 bytes .../ru/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 19098 -> 0 bytes .../sl/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 11683 -> 0 bytes .../sv/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 14526 -> 0 bytes .../ta/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 24834 -> 0 bytes .../tr/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 16836 -> 0 bytes .../uk/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 21285 -> 0 bytes .../vi/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 7239 -> 0 bytes .../LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 13533 -> 0 bytes .../zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo | Bin 8190 -> 0 bytes .../preferences/applications.js | 186 - .../application_row.js | 112 - .../blur-my-shell@aunetx/preferences/dash.js | 81 - .../blur-my-shell@aunetx/preferences/menu.js | 68 - .../blur-my-shell@aunetx/preferences/other.js | 86 - .../preferences/overview.js | 59 - .../blur-my-shell@aunetx/preferences/panel.js | 102 - .../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 | 51 - .../private_metadata.json | 25 - .../schemas/gschemas.compiled | Bin 9848 -> 0 bytes ...shell.extensions.blur-my-shell.gschema.xml | 585 --- .../blur-my-shell@aunetx/stylesheet.css | 573 --- .../ui/application-row.ui | 47 - .../blur-my-shell@aunetx/ui/applications.ui | 223 -- .../blur-my-shell@aunetx/ui/dash.ui | 172 - .../blur-my-shell@aunetx/ui/effects-dialog.ui | 77 - .../blur-my-shell@aunetx/ui/menu.ui | 37 - .../blur-my-shell@aunetx/ui/other.ui | 208 -- .../blur-my-shell@aunetx/ui/overview.ui | 143 - .../blur-my-shell@aunetx/ui/panel.ui | 240 -- .../ui/pipeline-choose-row.ui | 39 - .../blur-my-shell@aunetx/ui/pipeline-group.ui | 29 - .../blur-my-shell@aunetx/ui/pipelines.ui | 44 - .../LICENSE.rst | 24 - .../README.rst | 88 - .../confirmDialog.js | 72 - .../constants.js | 24 - .../extension.js | 1172 ------ .../keyboard.js | 41 - .../ar/LC_MESSAGES/clipboard-indicator.mo | Bin 2308 -> 0 bytes .../ca/LC_MESSAGES/clipboard-indicator.mo | Bin 1584 -> 0 bytes .../cs/LC_MESSAGES/clipboard-indicator.mo | Bin 2125 -> 0 bytes .../de/LC_MESSAGES/clipboard-indicator.mo | Bin 3639 -> 0 bytes .../el/LC_MESSAGES/clipboard-indicator.mo | Bin 1266 -> 0 bytes .../es/LC_MESSAGES/clipboard-indicator.mo | Bin 3488 -> 0 bytes .../eu/LC_MESSAGES/clipboard-indicator.mo | Bin 2031 -> 0 bytes .../fa/LC_MESSAGES/clipboard-indicator.mo | Bin 3966 -> 0 bytes .../fi/LC_MESSAGES/clipboard-indicator.mo | Bin 1092 -> 0 bytes .../fr_FR/LC_MESSAGES/clipboard-indicator.mo | Bin 1971 -> 0 bytes .../hu/LC_MESSAGES/clipboard-indicator.mo | Bin 2127 -> 0 bytes .../it/LC_MESSAGES/clipboard-indicator.mo | Bin 2846 -> 0 bytes .../locale/ja/LC_MESSAGES/ja.mo | Bin 2191 -> 0 bytes .../nl/LC_MESSAGES/clipboard-indicator.mo | Bin 2061 -> 0 bytes .../oc/LC_MESSAGES/clipboard-indicator.mo | Bin 2102 -> 0 bytes .../pl/LC_MESSAGES/clipboard-indicator.mo | Bin 3694 -> 0 bytes .../pt_BR/LC_MESSAGES/clipboard-indicator.mo | Bin 2201 -> 0 bytes .../ru/LC_MESSAGES/clipboard-indicator.mo | Bin 3679 -> 0 bytes .../sk/LC_MESSAGES/clipboard-indicator.mo | Bin 3495 -> 0 bytes .../tr/LC_MESSAGES/clipboard-indicator.mo | Bin 2050 -> 0 bytes .../uk/LC_MESSAGES/clipboard-indicator.mo | Bin 4593 -> 0 bytes .../zh_CN/LC_MESSAGES/clipboard-indicator.mo | Bin 3298 -> 0 bytes .../clipboard-indicator@tudmotu.com/prefs.js | 283 -- .../private_metadata.json | 14 - .../registry.js | 319 -- .../schemas/gschemas.compiled | Bin 1661 -> 0 bytes ...extensions.clipboard-indicator.gschema.xml | 170 - .../stylesheet.css | 75 - .../dash-to-panel@jderose9.github.com/COPYING | 341 -- .../README.md | 194 - .../appIcons.js | 1904 ---------- .../desktopIconsIntegration.js | 165 - .../executable_panelManager.js | 773 ---- .../extension.js | 144 - .../img/highlight_stacked_bg.svg | 7 - .../img/highlight_stacked_bg_2.svg | 7 - .../img/highlight_stacked_bg_3.svg | 7 - .../intellihide.js | 427 --- .../locale/cs/LC_MESSAGES/dash-to-panel.mo | Bin 24663 -> 0 bytes .../locale/de/LC_MESSAGES/dash-to-panel.mo | Bin 24232 -> 0 bytes .../locale/es/LC_MESSAGES/dash-to-panel.mo | Bin 21553 -> 0 bytes .../locale/fa/LC_MESSAGES/dash-to-panel.mo | Bin 19898 -> 0 bytes .../locale/fr/LC_MESSAGES/dash-to-panel.mo | Bin 26064 -> 0 bytes .../locale/gl/LC_MESSAGES/dash-to-panel.mo | Bin 18062 -> 0 bytes .../locale/hu/LC_MESSAGES/dash-to-panel.mo | Bin 22960 -> 0 bytes .../locale/it/LC_MESSAGES/dash-to-panel.mo | Bin 25062 -> 0 bytes .../locale/ja/LC_MESSAGES/dash-to-panel.mo | Bin 23380 -> 0 bytes .../locale/kk/LC_MESSAGES/dash-to-panel.mo | Bin 10823 -> 0 bytes .../locale/ko/LC_MESSAGES/dash-to-panel.mo | Bin 21724 -> 0 bytes .../locale/nl/LC_MESSAGES/dash-to-panel.mo | Bin 17138 -> 0 bytes .../locale/pl/LC_MESSAGES/dash-to-panel.mo | Bin 20282 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/dash-to-panel.mo | Bin 16496 -> 0 bytes .../locale/ru/LC_MESSAGES/dash-to-panel.mo | Bin 31991 -> 0 bytes .../locale/sk/LC_MESSAGES/dash-to-panel.mo | Bin 21075 -> 0 bytes .../locale/sv/LC_MESSAGES/dash-to-panel.mo | Bin 17499 -> 0 bytes .../locale/tr/LC_MESSAGES/dash-to-panel.mo | Bin 27713 -> 0 bytes .../locale/uk/LC_MESSAGES/dash-to-panel.mo | Bin 32668 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/dash-to-panel.mo | Bin 19556 -> 0 bytes .../locale/zh_TW/LC_MESSAGES/dash-to-panel.mo | Bin 14647 -> 0 bytes .../overview.js | 518 --- .../panel.js | 1263 ------- .../panelPositions.js | 61 - .../panelSettings.js | 111 - .../panelStyle.js | 314 -- .../prefs.js | 2343 ------------ .../private_metadata.json | 17 - .../progress.js | 597 --- .../proximity.js | 256 -- .../schemas/gschemas.compiled | Bin 17292 -> 0 bytes ...shell.extensions.dash-to-panel.gschema.xml | 1282 ------- .../stylesheet.css | 155 - .../taskbar.js | 1556 -------- .../transparency.js | 252 -- .../ui/BoxAdvancedOptions.ui | 28 - .../ui/BoxAnimateAppIconHoverOptions.ui | 189 - .../ui/BoxDotOptions.ui | 271 -- .../ui/BoxDynamicOpacityOptions.ui | 100 - .../ui/BoxGroupAppsOptions.ui | 153 - .../ui/BoxIntellihideOptions.ui | 226 -- .../ui/BoxMiddleClickOptions.ui | 100 - .../ui/BoxOverlayShortcut.ui | 115 - .../ui/BoxScrollIconOptions.ui | 44 - .../ui/BoxScrollPanelOptions.ui | 56 - .../ui/BoxSecondaryMenuOptions.ui | 43 - .../ui/BoxShowApplicationsOptions.ui | 86 - .../ui/BoxShowDesktopOptions.ui | 125 - .../ui/BoxWindowPreviewOptions.ui | 484 --- .../ui/SettingsAbout.ui | 99 - .../ui/SettingsAction.ui | 165 - .../ui/SettingsBehavior.ui | 192 - .../ui/SettingsFineTune.ui | 279 -- .../ui/SettingsPosition.ui | 243 -- .../ui/SettingsStyle.ui | 359 -- .../utils.js | 889 ----- .../windowPreview.js | 1152 ------ .../day-progress@arcaege.github.io/LICENSE | 674 ---- .../extension.js | 483 --- .../day-progress@arcaege.github.io/prefs.js | 166 - .../private_metadata.json | 13 - .../schemas/gschemas.compiled | Bin 1011 -> 0 bytes ....shell.extensions.day-progress.gschema.xml | 49 - .../stylesheet.css | 42 - .../aticonfigUtil.js | 38 - .../batteryUtil.js | 110 - .../bumblebeeNvidiaUtil.js | 101 - .../commandLineUtil.js | 52 - .../extension.js | 1053 ------ .../freeipmiUtil.js | 100 - .../freonItem.js | 53 - .../hddtempUtil.js | 81 - .../icons/freon-battery-symbolic.svg | 55 - .../icons/freon-fan-symbolic.svg | 133 - .../icons/freon-gpu-temperature-symbolic.svg | 146 - .../icons/freon-temperature-symbolic.svg | 127 - .../icons/freon-voltage-symbolic.svg | 125 - .../icons/material-icons/LICENSE | 94 - .../material-gpu-temperature-symbolic.svg | 58 - .../material-temperature-symbolic.svg | 58 - .../liquidctlUtil.js | 89 - .../locale/de/LC_MESSAGES/freon.mo | Bin 2322 -> 0 bytes .../locale/es_AR/LC_MESSAGES/freon.mo | Bin 2402 -> 0 bytes .../locale/es_ES/LC_MESSAGES/freon.mo | Bin 2362 -> 0 bytes .../locale/fr/LC_MESSAGES/freon.mo | Bin 2365 -> 0 bytes .../locale/hu/LC_MESSAGES/freon.mo | Bin 2603 -> 0 bytes .../locale/it/LC_MESSAGES/freon.mo | Bin 2639 -> 0 bytes .../locale/nl/LC_MESSAGES/freon.mo | Bin 2489 -> 0 bytes .../locale/pl/LC_MESSAGES/freon.mo | Bin 2500 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/freon.mo | Bin 2383 -> 0 bytes .../locale/ru/LC_MESSAGES/freon.mo | Bin 3233 -> 0 bytes .../locale/tr/LC_MESSAGES/freon.mo | Bin 8408 -> 0 bytes .../locale/uk_UA/LC_MESSAGES/freon.mo | Bin 3250 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/freon.mo | Bin 2178 -> 0 bytes .../locale/zh_TW/LC_MESSAGES/freon.mo | Bin 4735 -> 0 bytes .../nvidiaUtil.js | 191 - .../nvmecliUtil.js | 58 - .../pkexecUtil.js | 73 - .../po/.keep | 0 ...b.UshakovVasilii.freon.ipmi-sensors.policy | 18 - .../prefs.js | 188 - .../private_metadata.json | 15 - .../schemas/gschemas.compiled | Bin 2037 -> 0 bytes ...gnome.shell.extensions.sensors.gschema.xml | 193 - .../sensorsUtil.js | 104 - .../smartctlUtil.js | 61 - .../stylesheet.css | 7 - .../udisks2.js | 117 - .../gsconnect@andyholmes.github.io/config.js | 24 - .../executable_gsconnect-preferences | 104 - .../extension.js | 407 --- .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 20859 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 21187 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 14247 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18638 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 12438 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18366 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 23676 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18586 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 15903 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 21364 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 17281 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18747 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 13943 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 14325 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 19433 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18934 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 11530 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 17949 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 16896 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18231 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 16332 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 7731 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 19299 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 18505 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 16871 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 22736 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 17143 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 8802 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 10784 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 16752 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 15574 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 23303 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 14997 -> 0 bytes .../org.gnome.Shell.Extensions.GSConnect.mo | Bin 10769 -> 0 bytes .../nautilus-gsconnect.py | 212 -- ...gnome.Shell.Extensions.GSConnect.gresource | Bin 60052 -> 0 bytes .../preferences/device.js | 1111 ------ .../preferences/init.js | 12 - .../preferences/keybindings.js | 314 -- .../preferences/service.js | 648 ---- .../gsconnect@andyholmes.github.io/prefs.js | 32 - .../private_metadata.json | 11 - .../schemas/gschemas.compiled | Bin 5316 -> 0 bytes ...ome.Shell.Extensions.GSConnect.gschema.xml | 192 - .../service/backends/lan.js | 889 ----- .../service/components/atspi.js | 312 -- .../service/components/clipboard.js | 225 -- .../service/components/contacts.js | 613 ---- .../service/components/index.js | 102 - .../service/components/input.js | 514 --- .../service/components/mpris.js | 1003 ----- .../service/components/notification.js | 409 --- .../service/components/pulseaudio.js | 271 -- .../service/components/session.js | 84 - .../service/components/sound.js | 172 - .../service/components/upower.js | 215 -- .../service/components/ydotool.js | 160 - .../service/core.js | 694 ---- .../service/device.js | 1105 ------ .../service/executable_daemon.js | 702 ---- .../service/executable_nativeMessagingHost.js | 225 -- .../service/init.js | 428 --- .../service/manager.js | 515 --- .../service/plugin.js | 251 -- .../service/plugins/battery.js | 433 --- .../service/plugins/clipboard.js | 182 - .../service/plugins/connectivity_report.js | 163 - .../service/plugins/contacts.js | 463 --- .../service/plugins/findmyphone.js | 249 -- .../service/plugins/index.js | 39 - .../service/plugins/mousepad.js | 381 -- .../service/plugins/mpris.js | 917 ----- .../service/plugins/notification.js | 694 ---- .../service/plugins/ping.js | 73 - .../service/plugins/presenter.js | 63 - .../service/plugins/runcommand.js | 254 -- .../service/plugins/sftp.js | 487 --- .../service/plugins/share.js | 492 --- .../service/plugins/sms.js | 536 --- .../service/plugins/systemvolume.js | 204 -- .../service/plugins/telephony.js | 245 -- .../service/ui/contacts.js | 642 ---- .../service/ui/legacyMessaging.js | 227 -- .../service/ui/messaging.js | 1320 ------- .../service/ui/mousepad.js | 460 --- .../service/ui/notification.js | 178 - .../service/ui/service.js | 252 -- .../service/utils/dbus.js | 255 -- .../service/utils/ui.js | 51 - .../service/utils/uri.js | 169 - .../shell/clipboard.js | 380 -- .../shell/device.js | 380 -- .../shell/gmenu.js | 647 ---- .../shell/input.js | 38 - .../shell/keybindings.js | 103 - .../shell/notification.js | 453 --- .../shell/tooltip.js | 309 -- .../shell/utils.js | 283 -- .../stylesheet.css | 127 - .../utils/remote.js | 516 --- .../utils/setup.js | 51 - .../wl_clipboard.js | 296 -- .../impatience@gfxmonk.net/extension.js | 52 - .../impatience@gfxmonk.net/prefs.js | 61 - .../private_metadata.json | 14 - .../schemas/gschemas.compiled | Bin 332 -> 0 bytes ...ensions.net.gfxmonk.impatience.gschema.xml | 10 - .../impatience@gfxmonk.net/settings.js | 10 - .../executable_CHANGELOG.md | 555 --- .../executable_LICENSE | 675 ---- .../executable_extension.js | 134 - .../executable_prefs.js | 51 - .../executable_stylesheet.css | 714 ---- .../lib/Prefs/executable_Prefs.js | 410 --- .../lib/Prefs/executable_PrefsKeys.js | 880 ----- .../lib/executable_API.js | 3226 ----------------- .../lib/executable_Manager.js | 1481 -------- .../locale/af/LC_MESSAGES/just-perfection.mo | Bin 11200 -> 0 bytes .../locale/ar/LC_MESSAGES/just-perfection.mo | Bin 13597 -> 0 bytes .../locale/be/LC_MESSAGES/just-perfection.mo | Bin 15311 -> 0 bytes .../locale/bg/LC_MESSAGES/just-perfection.mo | Bin 16160 -> 0 bytes .../locale/ca/LC_MESSAGES/just-perfection.mo | Bin 12285 -> 0 bytes .../locale/de/LC_MESSAGES/just-perfection.mo | Bin 11762 -> 0 bytes .../locale/es/LC_MESSAGES/just-perfection.mo | Bin 12591 -> 0 bytes .../locale/fr/LC_MESSAGES/just-perfection.mo | Bin 12653 -> 0 bytes .../locale/gl/LC_MESSAGES/just-perfection.mo | Bin 12451 -> 0 bytes .../locale/it/LC_MESSAGES/just-perfection.mo | Bin 12210 -> 0 bytes .../locale/ja/LC_MESSAGES/just-perfection.mo | Bin 13452 -> 0 bytes .../locale/ne/LC_MESSAGES/just-perfection.mo | Bin 17171 -> 0 bytes .../locale/nl/LC_MESSAGES/just-perfection.mo | Bin 11281 -> 0 bytes .../pt_BR/LC_MESSAGES/just-perfection.mo | Bin 12168 -> 0 bytes .../locale/ru/LC_MESSAGES/just-perfection.mo | Bin 15024 -> 0 bytes .../locale/sv/LC_MESSAGES/just-perfection.mo | Bin 11188 -> 0 bytes .../zh_CN/LC_MESSAGES/just-perfection.mo | Bin 10764 -> 0 bytes .../zh_TW/LC_MESSAGES/just-perfection.mo | Bin 10740 -> 0 bytes .../private_metadata.json | 19 - .../resources.gresource | Bin 96880 -> 0 bytes ...ell.extensions.just-perfection.gschema.xml | 409 --- .../schemas/gschemas.compiled | Bin 4405 -> 0 bytes .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 27 - .../private_metadata.json | 14 - .../dbus/mprisNode.xml | 74 - .../dbus/watchNode.xml | 20 - .../extension.js | 496 --- .../helpers/prefs/AppChooser.js | 46 - .../helpers/prefs/BlacklistedPlayers.js | 77 - .../helpers/prefs/ElementList.js | 117 - .../helpers/prefs/LabelList.js | 170 - .../helpers/shell/MenuSlider.js | 161 - .../helpers/shell/PanelButton.js | 953 ----- .../helpers/shell/PlayerProxy.js | 292 -- .../helpers/shell/ScrollingLabel.js | 134 - .../mediacontrols@cliffniff.github.com.mo | Bin 6398 -> 0 bytes .../mediacontrols@cliffniff.github.com.mo | Bin 1793 -> 0 bytes .../mediacontrols@cliffniff.github.com.mo | Bin 6429 -> 0 bytes .../mediacontrols@cliffniff.github.com.mo | Bin 6539 -> 0 bytes .../mediacontrols@cliffniff.github.com.mo | Bin 6476 -> 0 bytes ...e.shell.extensions.mediacontrols.gresource | Bin 24412 -> 0 bytes .../prefs.js | 326 -- .../private_metadata.json | 16 - .../schemas/gschemas.compiled | Bin 3645 -> 0 bytes ...shell.extensions.mediacontrols.gschema.xml | 104 - .../stylesheet.css | 100 - .../types/enums/common.js | 73 - .../types/enums/shell_only.js | 131 - .../utils/common.js | 40 - .../utils/prefs_only.js | 64 - .../utils/shell_only.js | 130 - .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 306 -- .../private_metadata.json | 17 - .../schemas/gschemas.compiled | Bin 389 -> 0 bytes ...nsions.native-window-placement.gschema.xml | 22 - .../LICENSE | 674 ---- .../extension.js | 417 --- .../prefs.js | 382 -- .../private_metadata.json | 13 - .../schemas/gschemas.compiled | Bin 1715 -> 0 bytes ....extensions.netspeedsimplified.gschema.xml | 82 - .../stylesheet.css | 27 - .../AUTHORS | 25 - .../COPYING | 674 ---- .../constants.js | 69 - .../extension.js | 2000 ---------- .../getweather.js | 861 ----- ...nome-shell-extension-openweatherrefined.mo | Bin 3773 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 5584 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4317 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2502 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 19078 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 1190 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 11413 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2894 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 585 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 14091 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 3677 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4521 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 20239 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2619 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 11619 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2848 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 11401 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 7939 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2392 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 958 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 19445 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 11647 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4641 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 21262 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 2314 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 25049 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 11531 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 5241 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4517 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4411 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 15648 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 5254 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 1690 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 10576 -> 0 bytes ...nome-shell-extension-openweatherrefined.mo | Bin 4382 -> 0 bytes .../locs.js | 383 -- .../media/openweather-icon.svg | 1 - .../media/status/daytime-sunrise-symbolic.svg | 7 - .../media/status/daytime-sunset-symbolic.svg | 7 - .../status/internet-web-browser-symbolic.svg | 4 - .../status/weather-clear-night-symbolic.svg | 4 - .../media/status/weather-clear-symbolic.svg | 4 - .../weather-few-clouds-night-symbolic.svg | 4 - .../status/weather-few-clouds-symbolic.svg | 4 - .../media/status/weather-fog-symbolic.svg | 4 - .../status/weather-freezing-rain-symbolic.svg | 2 - .../status/weather-overcast-symbolic.svg | 4 - .../status/weather-severe-alert-symbolic.svg | 5 - .../weather-showers-scattered-symbolic.svg | 4 - .../media/status/weather-showers-symbolic.svg | 4 - .../media/status/weather-snow-symbolic.svg | 4 - .../media/status/weather-storm-symbolic.svg | 4 - .../media/status/weather-tornado-symbolic.svg | 4 - .../media/status/weather-windy-symbolic.svg | 4 - .../migration.js | 153 - .../myloc.js | 339 -- .../openweathermap.js | 321 -- .../preferences/aboutPage.js | 346 -- .../preferences/generalPage.js | 542 --- .../preferences/layoutPage.js | 443 --- .../preferences/locationsPage.js | 659 ---- .../preferences/searchResultsWindow.js | 307 -- .../prefs.js | 77 - .../private_metadata.json | 17 - .../schemas/gschemas.compiled | Bin 3836 -> 0 bytes ....extensions.openweatherrefined.gschema.xml | 267 -- .../stylesheet.css | 180 - .../weathericons.js | 387 -- .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 152 - .../gnome-shell-extension-places-menu.mo | Bin 896 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 882 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 628 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 954 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 651 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1043 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 943 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1107 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 577 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 845 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 843 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 879 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 869 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 902 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1048 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 871 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 907 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 899 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 767 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 893 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 964 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 947 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 927 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 834 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1040 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1025 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 697 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 917 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1104 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 932 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 922 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 871 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 849 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 865 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 905 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1005 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 912 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 929 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 645 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 638 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 864 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 909 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 878 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 678 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1292 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 628 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 835 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 865 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1094 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 918 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 874 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 673 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1033 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 940 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 986 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 914 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 985 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1027 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 454 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 997 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1106 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 974 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 846 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 654 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 672 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 929 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1086 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 840 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 1054 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 915 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 839 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 578 -> 0 bytes .../gnome-shell-extension-places-menu.mo | Bin 836 -> 0 bytes .../placeDisplay.js | 542 --- .../private_metadata.json | 14 - .../stylesheet.css | 14 - .../pop-shell@system76.com/arena.js | 40 - .../pop-shell@system76.com/auto_tiler.js | 606 ---- .../color_dialog/main.js | 65 - .../pop-shell@system76.com/config.js | 239 -- .../pop-shell@system76.com/context.js | 24 - .../pop-shell@system76.com/dark.css | 57 - .../pop-shell@system76.com/dbus_service.js | 44 - .../dialog_add_exception.js | 59 - .../extensions/pop-shell@system76.com/ecs.js | 174 - .../pop-shell@system76.com/error.js | 26 - .../pop-shell@system76.com/events.js | 26 - .../pop-shell@system76.com/executor.js | 90 - .../pop-shell@system76.com/extension.js | 2314 ------------ .../floating_exceptions/config.js | 239 -- .../floating_exceptions/empty_utils.js | 0 .../floating_exceptions/main.js | 222 -- .../pop-shell@system76.com/focus.js | 55 - .../pop-shell@system76.com/forest.js | 700 ---- .../extensions/pop-shell@system76.com/fork.js | 286 -- .../extensions/pop-shell@system76.com/geom.js | 74 - .../pop-shell@system76.com/grab_op.js | 10 - .../pop-shell@system76.com/highcontrast.css | 61 - .../icons/pop-shell-auto-off-symbolic.svg | 163 - .../icons/pop-shell-auto-on-symbolic.svg | 161 - .../pop-shell@system76.com/keybindings.js | 50 - .../pop-shell@system76.com/launcher.js | 289 -- .../launcher_service.js | 76 - .../extensions/pop-shell@system76.com/lib.js | 91 - .../pop-shell@system76.com/light.css | 57 - .../literal_once_cell.js | 9 - .../extensions/pop-shell@system76.com/log.js | 32 - .../pop-shell@system76.com/metadata.json | 11 - .../pop-shell@system76.com/movement.js | 53 - .../extensions/pop-shell@system76.com/node.js | 165 - .../pop-shell@system76.com/panel_settings.js | 258 -- .../pop-shell@system76.com/paths.js | 3 - .../pop-shell@system76.com/prefs.js | 197 - .../pop-shell@system76.com/rectangle.js | 81 - .../pop-shell@system76.com/result.js | 8 - .../pop-shell@system76.com/scheduler.js | 36 - .../schemas/gschemas.compiled | Bin 4332 -> 0 bytes ...ome.shell.extensions.pop-shell.gschema.xml | 288 -- .../pop-shell@system76.com/search.js | 400 -- .../pop-shell@system76.com/settings.js | 185 - .../pop-shell@system76.com/shell.js | 4 - .../shortcut_overlay.js | 93 - .../pop-shell@system76.com/stack.js | 549 --- .../extensions/pop-shell@system76.com/tags.js | 4 - .../pop-shell@system76.com/tiling.js | 710 ---- .../pop-shell@system76.com/utils.js | 144 - .../pop-shell@system76.com/window.js | 583 --- .../pop-shell@system76.com/xprop.js | 95 - .../effect/clip_shadow_effect.js | 17 - .../effect/linear_filter_effect.js | 12 - .../effect/rounded_corners_effect.js | 118 - .../effect/shader/clip_shadow.frag | 6 - .../effect/shader/rounded_corners.frag | 103 - .../rounded-window-corners@fxgn/extension.js | 289 -- .../rounded-window-corners@fxgn.mo | Bin 2273 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2308 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2285 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 1049 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2312 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 166 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2256 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2337 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 950 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2171 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2300 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 1716 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 684 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2208 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2155 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2304 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 1915 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2798 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2281 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2841 -> 0 bytes .../rounded-window-corners@fxgn.mo | Bin 2131 -> 0 bytes .../manager/README.md | 20 - .../manager/event_handlers.js | 241 -- .../manager/event_manager.js | 139 - .../manager/utils.js | 233 -- .../preferences/index.js | 8 - .../preferences/pages/blacklist.js | 51 - .../preferences/pages/blacklist.ui | 29 - .../preferences/pages/custom.js | 114 - .../preferences/pages/custom.ui | 29 - .../preferences/pages/general.js | 103 - .../preferences/pages/general.ui | 196 - .../preferences/widgets/app_row.js | 75 - .../preferences/widgets/blacklist_row.js | 7 - .../preferences/widgets/customeffect_row.js | 89 - .../preferences/widgets/edit-shadow-page.ui | 351 -- .../preferences/widgets/edit_shadow_page.js | 118 - .../preferences/widgets/paddings-row.ui | 91 - .../preferences/widgets/paddings_row.js | 15 - .../preferences/widgets/reset-page.ui | 64 - .../preferences/widgets/reset_page.js | 108 - .../rounded-window-corners@fxgn/prefs.js | 33 - .../private_metadata.json | 14 - .../schemas/gschemas.compiled | Bin 1597 -> 0 bytes ....rounded-window-corners-reborn.gschema.xml | 114 - .../stylesheet-prefs.css | 35 - .../stylesheet.css | 6 - .../utils/README.md | 35 - .../utils/background_menu.js | 55 - .../utils/box_shadow.js | 19 - .../utils/constants.js | 16 - .../rounded-window-corners@fxgn/utils/file.js | 48 - .../rounded-window-corners@fxgn/utils/log.js | 17 - .../utils/settings.js | 140 - .../utils/types.js | 2 - .../window_picker/README.md | 21 - .../window_picker/client.js | 26 - .../window_picker/iface.xml | 8 - .../window_picker/service.js | 70 - .../extensions/space-bar@luchrioh/README.md | 79 - .../space-bar@luchrioh/extension.js | 39 - .../preferences/AppearancePage.js | 342 -- .../preferences/BehaviorPage.js | 248 -- .../preferences/DropDownChoice.js | 12 - .../preferences/ShortcutsPage.js | 70 - .../space-bar@luchrioh/preferences/common.js | 405 --- .../preferences/custom-styles.js | 211 -- .../extensions/space-bar@luchrioh/prefs.js | 13 - .../space-bar@luchrioh/private_metadata.json | 13 - .../schemas/gschemas.compiled | Bin 7694 -> 0 bytes ...ome.shell.extensions.space-bar.gschema.xml | 359 -- .../services/KeyBindings.js | 84 - .../services/ScrollHandler.js | 102 - .../space-bar@luchrioh/services/Settings.js | 199 - .../space-bar@luchrioh/services/Styles.js | 227 -- .../services/TopBarAdjustments.js | 43 - .../services/WorkspaceNames.js | 135 - .../space-bar@luchrioh/services/Workspaces.js | 470 --- .../space-bar@luchrioh/stylesheet.css | 20 - .../space-bar@luchrioh/types/dummy/gi/Gdk.js | 1 - .../types/dummy/gi/Shell.js | 1 - .../space-bar@luchrioh/ui/WorkspacesBar.js | 433 --- .../ui/WorkspacesBarMenu.js | 162 - .../utils/DebouncingNotifier.js | 37 - .../space-bar@luchrioh/utils/Subject.js | 25 - .../space-bar@luchrioh/utils/Timeout.js | 35 - .../space-bar@luchrioh/utils/Widget.js | 9 - .../space-bar@luchrioh/utils/hook.js | 28 - .../COPYING | 339 -- .../NEWS | 1462 -------- .../extension.js | 61 - .../prefs.js | 138 - .../private_metadata.json | 17 - .../schemas/gschemas.compiled | Bin 296 -> 0 bytes ...me.shell.extensions.user-theme.gschema.xml | 15 - .../util.js | 26 - update_extensions.sh | 18 +- 941 files changed, 81 insertions(+), 114025 deletions(-) create mode 100644 chezmoi/.chezmoiscripts/run_onchange_30_install_extensions_list.sh.tmpl create mode 100644 chezmoi/installed-extensions.txt delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/de/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/es/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/et/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/hi/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/hr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ja/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/mr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sv/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/vi/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-apps-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.apps-menu.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/de/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/es/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/et/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/hi/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/hr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ja/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/mr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sv/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/vi/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.auto-move-windows.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/client.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/iface.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/services.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/applications-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/bottom-panel-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dash-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/other-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/overview-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/reset-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-window-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/cs/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ka/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ro/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ru/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/sl/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_Hans/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/applications.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/dash.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/LICENSE.rst delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/README.rst delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/confirmDialog.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/constants.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/keyboard.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ar/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ca/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/cs/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/de/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/el/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/es/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/eu/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fa/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fi/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fr_FR/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/hu/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/it/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ja/LC_MESSAGES/ja.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/nl/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/oc/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pl/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pt_BR/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ru/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/sk/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/tr/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/uk/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/zh_CN/LC_MESSAGES/clipboard-indicator.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/registry.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/org.gnome.shell.extensions.clipboard-indicator.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/README.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/appIcons.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/desktopIconsIntegration.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/executable_panelManager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/intellihide.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/de/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fa/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/gl/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/hu/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ja/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ko/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/nl/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/pl/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/pt_BR/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/sk/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/sv/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/tr/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/overview.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panel.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelPositions.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelSettings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelStyle.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/progress.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/proximity.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/taskbar.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/transparency.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAdvancedOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAnimateAppIconHoverOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDotOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDynamicOpacityOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxGroupAppsOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxIntellihideOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxMiddleClickOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxOverlayShortcut.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollIconOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollPanelOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxSecondaryMenuOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowApplicationsOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowDesktopOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxWindowPreviewOptions.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAbout.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAction.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsBehavior.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsFineTune.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsPosition.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsStyle.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/windowPreview.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/LICENSE delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/schemas/org.gnome.shell.extensions.day-progress.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freonItem.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/pkexecUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/po/.keep delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/policies/com.github.UshakovVasilii.freon.ipmi-sensors.policy delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/udisks2.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/executable_gsconnect-preferences delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/be/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ca/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/cs/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/de/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/el/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/et/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fi/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fy/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/gl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/he/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/nl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/nl_BE/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ru/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/tr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/uk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_TW/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/nautilus-gsconnect.py delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/device.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/keybindings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/atspi.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/clipboard.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/input.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/mpris.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/notification.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/session.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/sound.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/upower.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/ydotool.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/core.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_daemon.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_nativeMessagingHost.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugin.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/battery.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/clipboard.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/connectivity_report.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/contacts.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/findmyphone.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mousepad.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/notification.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/ping.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/presenter.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/runcommand.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sftp.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sms.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/telephony.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/contacts.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/legacyMessaging.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/messaging.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/mousepad.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/notification.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/service.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/dbus.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/ui.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/uri.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/clipboard.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/device.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/gmenu.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/input.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/keybindings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/notification.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/tooltip.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/remote.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/setup.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/org.gnome.shell.extensions.net.gfxmonk.impatience.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_CHANGELOG.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_LICENSE delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_Prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_PrefsKeys.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_API.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_Manager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/executable_org.gnome.shell.extensions.just-perfection.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/mprisNode.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/watchNode.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/AppChooser.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/BlacklistedPlayers.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/ElementList.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/LabelList.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/MenuSlider.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PanelButton.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PlayerProxy.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/ScrollingLabel.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/ca/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/cs/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/de/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/es/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/pt_BR/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/org.gnome.shell.extensions.mediacontrols.gresource delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/org.gnome.shell.extensions.mediacontrols.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/common.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/shell_only.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/common.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/prefs_only.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/shell_only.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.native-window-placement.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/LICENSE delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/org.gnome.shell.extensions.netspeedsimplified.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/AUTHORS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/constants.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/getweather.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ar/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/be/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/bg/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ca/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/cs/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/da/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/de/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/el/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/en/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/es/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/eu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/he/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/hu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/id/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/it/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ja/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/lt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nb/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ro/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ru/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sv/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/tr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/uk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/vi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/openweather-icon.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunrise-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunset-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/internet-web-browser-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-night-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-night-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-fog-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-freezing-rain-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-overcast-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-severe-alert-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-scattered-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-snow-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-storm-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-tornado-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-windy-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/migration.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/myloc.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/openweathermap.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/aboutPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/generalPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/layoutPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/locationsPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/searchResultsWindow.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/org.gnome.shell.extensions.openweatherrefined.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/weathericons.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/de/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/es/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/et/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hi/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hr/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ja/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mr/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sv/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/vi/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-places-menu.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/placeDisplay.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/arena.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/auto_tiler.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/color_dialog/main.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/config.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/context.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dark.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dbus_service.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dialog_add_exception.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/ecs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/error.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/events.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/executor.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/config.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/empty_utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/main.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/focus.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/forest.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/fork.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/geom.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/grab_op.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/highcontrast.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-off-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-on-symbolic.svg delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/keybindings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher_service.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/lib.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/light.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/literal_once_cell.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/log.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/movement.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/node.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/panel_settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/paths.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/rectangle.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/result.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/scheduler.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/org.gnome.shell.extensions.pop-shell.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/search.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shell.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shortcut_overlay.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/stack.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tags.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tiling.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/window.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/xprop.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/clip_shadow_effect.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/linear_filter_effect.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/rounded_corners_effect.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/clip_shadow.frag delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/rounded_corners.frag delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ar/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/cs/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/de/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/eo/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/es/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/et/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fi/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fr/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/hu/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/id/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/it/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ja/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/nb_NO/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/nl/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/pl/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/pt/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/pt_BR/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ru/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/tr/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/uk/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/zh_CN/LC_MESSAGES/rounded-window-corners@fxgn.mo delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/README.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_handlers.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_manager.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/utils.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/index.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/app_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/blacklist_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/customeffect_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit-shadow-page.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit_shadow_page.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings-row.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings_row.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset-page.ui delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset_page.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/org.gnome.shell.extensions.rounded-window-corners-reborn.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet-prefs.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/README.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/background_menu.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/box_shadow.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/constants.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/file.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/log.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/types.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/README.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/client.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/iface.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/service.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/README.md delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/AppearancePage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/BehaviorPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/DropDownChoice.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/ShortcutsPage.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/common.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/custom-styles.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/org.gnome.shell.extensions.space-bar.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/KeyBindings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/ScrollHandler.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Settings.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Styles.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/TopBarAdjustments.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/WorkspaceNames.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Workspaces.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/stylesheet.css delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Gdk.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Shell.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBar.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBarMenu.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/DebouncingNotifier.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Subject.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Timeout.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Widget.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/hook.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/COPYING delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/NEWS delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/extension.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/prefs.js delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/private_metadata.json delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.user-theme.gschema.xml delete mode 100644 chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/util.js diff --git a/chezmoi/.chezmoiignore b/chezmoi/.chezmoiignore index 555511d9..9e4be7e1 100644 --- a/chezmoi/.chezmoiignore +++ b/chezmoi/.chezmoiignore @@ -10,3 +10,4 @@ bootstrap.sh ansible dconf.ini +installed-extensions.txt diff --git a/chezmoi/.chezmoiscripts/run_once_after_50_load-dconf-settings.sh.tmpl b/chezmoi/.chezmoiscripts/run_once_after_50_load-dconf-settings.sh.tmpl index e73ebbc9..23fc1f2c 100644 --- a/chezmoi/.chezmoiscripts/run_once_after_50_load-dconf-settings.sh.tmpl +++ b/chezmoi/.chezmoiscripts/run_once_after_50_load-dconf-settings.sh.tmpl @@ -6,9 +6,11 @@ echo "" echo "===============================================================" echo "" -echo "Loading dconf settings" +echo "Installing extensions and loading dconf settings" echo "" echo "===============================================================" echo "" +cat {{ joinPath .chezmoi.sourceDir "installed-extensions.txt" | quote }} | xargs -I {} gext install {} + dconf load / < {{ joinPath .chezmoi.sourceDir "dconf.ini" | quote }} diff --git a/chezmoi/.chezmoiscripts/run_onchange_30_install_extensions_list.sh.tmpl b/chezmoi/.chezmoiscripts/run_onchange_30_install_extensions_list.sh.tmpl new file mode 100644 index 00000000..5665e5fc --- /dev/null +++ b/chezmoi/.chezmoiscripts/run_onchange_30_install_extensions_list.sh.tmpl @@ -0,0 +1,12 @@ +#!/bin/bash + +echo "" +echo "===============================================================" +echo "" +echo "Reconfiguring Gnome Extensions due to change detected" +echo "" +echo "===============================================================" +echo "" + +# dconf.ini hash: {{ include "installed-extensions.txt" | sha256sum }} +cat {{ joinPath .chezmoi.sourceDir "installed-extensions.txt" | quote }} | xargs -I {} gext install {} diff --git a/chezmoi/dconf.ini b/chezmoi/dconf.ini index 921f26c5..5b8b0852 100644 --- a/chezmoi/dconf.ini +++ b/chezmoi/dconf.ini @@ -9,8 +9,8 @@ width=1254 [apps/update-manager] first-run=false -launch-count=250 -launch-time=int64 1728482895 +launch-count=252 +launch-time=int64 1729751055 show-details=true window-height=574 window-width=534 @@ -26,7 +26,7 @@ window-width=1254 show-percentage=true [com/ubuntu/update-notifier] -release-check-time=uint32 1728288080 +release-check-time=uint32 1729503240 [desktop/ibus/general] preload-engines=['xkb:us::eng'] @@ -36,12 +36,12 @@ version='1.5.22' favorites=['🎤', '🛡', '🔓', '🏗', '⚒️', '🕵️', '🗃️', '👥', '📊', '🔑', '🏡', '🧡', '⛔', '⚠️'] [org/gnome/Characters] -recent-characters=['🤮', '🏎️', '🚩', '👴🏻', '🐸', '✌', '✍🏾', '🗝️', '🔑', '🗃️', '🔓', '💡', '🔒'] +recent-characters=['👋🏾', '🤮', '🏎️', '🚩', '👴🏻', '🐸', '✌', '✍🏾', '🗝️', '🔑', '🗃️', '🔓', '💡', '🔒'] [org/gnome/Extensions] -window-height=1346 -window-maximized=false -window-width=1254 +window-height=331 +window-maximized=true +window-width=304 [org/gnome/TextEditor] highlight-current-line=true @@ -79,7 +79,7 @@ target-currency='DZD' target-units='radian' window-maximized=false window-position=(3526, 189) -window-size=(2560, 1376) +window-size=(1254, 1360) word-size=64 [org/gnome/calendar] @@ -96,8 +96,8 @@ panel-id='world' size=(870, 690) [org/gnome/control-center] -last-panel='network' -window-state=(1254, 1346, false) +last-panel='background' +window-state=(1254, 1360, false) [org/gnome/deja-dup] backend='local' @@ -146,8 +146,8 @@ translate=true [org/gnome/desktop/background] color-shading-type='solid' picture-options='zoom' -picture-uri='file:///home/tmeijn/.local/share/backgrounds/2024-10-08-17-25-05-darkskin-headphone-ai.jpg' -picture-uri-dark='file:///home/tmeijn/.local/share/backgrounds/2024-10-08-17-25-05-darkskin-headphone-ai.jpg' +picture-uri='file:///home/tmeijn/.local/share/backgrounds/2024-10-31-12-23-14-purple-aesthetic-5120x2880-18775.jpg' +picture-uri-dark='file:///home/tmeijn/.local/share/backgrounds/2024-10-31-12-23-14-purple-aesthetic-5120x2880-18775.jpg' primary-color='#000000000000' secondary-color='#000000000000' @@ -179,7 +179,7 @@ show-battery-percentage=true text-scaling-factor=0.89999999999999991 [org/gnome/desktop/notifications] -application-children=['update-manager', 'org-gnome-software', 'google-chrome', 'gnome-shell-extension-prefs', 'slack-slack', 'org-gnome-gedit', 'gnome-power-panel', 'gnome-network-panel', 'apport-gtk', 'redis-desktop-manager-rdm', 'chrome-jjphmlaoffndcnecccgemfdaaoighkel-default', 'org-gnome-nautilus', 'chrome-macmgoeeggnlnmpiojbcniblabkdjphe-default', 'phpstorm-phpstorm', 'code-code', 'gnome-control-center', 'skype-skypeforlinux', 'org-gnome-chromegnomeshell', 'kazam', 'org-gnome-terminal', 'gitkraken-gitkraken', 'org-gnome-eog', 'gnome-printers-panel', 'org-gnome-extensions-desktop', 'nm-connection-editor', 'org-gnome-shell-extensions', 'org-gnome-screenshot', 'flameshot', 'org-gnome-dejadup', 'teams', 'snap-store-ubuntu-software', 'vlc', 'gnome-datetime-panel', 'chrome-fbddfdjileihpefdciilbgplolpcpmgd-default', 'org-gnome-fileroller', 'keybase', 'org-flameshot-flameshot', 'io-snapcraft-sessionagent', 'firefox-firefox', 'teams-for-linux-teams-for-linux', 'nomachine-status', 'terminator', 'slack', 'veracrypt', 'firefox', 'gnome-system-monitor', 'gitdock', 'ca-desrt-dconf-editor', 'org-gnome-baobab', 'io-podman-desktop-podmandesktop', 'xdg-desktop-portal-gnome', 'teams-for-linux', 'org-gnome-texteditor', 'org-wezfurlong-wezterm', 'org-gnome-settings', 'io-github-seadve-kooha', 'org-gnome-calendar', 'org-gnome-shell-portalhelper', 'com-visualstudio-code', 'yelp', 'org-gnome-extensions', 'org-gnome-totem', 'org-gnome-meld', 'app-getclipboard-clipboard', 'kitty', 'code', 'org-gnome-characters', 'snapd-desktop-integration-snapd-desktop-integration'] +application-children=['update-manager', 'org-gnome-software', 'google-chrome', 'gnome-shell-extension-prefs', 'slack-slack', 'org-gnome-gedit', 'gnome-power-panel', 'gnome-network-panel', 'apport-gtk', 'redis-desktop-manager-rdm', 'chrome-jjphmlaoffndcnecccgemfdaaoighkel-default', 'org-gnome-nautilus', 'chrome-macmgoeeggnlnmpiojbcniblabkdjphe-default', 'phpstorm-phpstorm', 'code-code', 'gnome-control-center', 'skype-skypeforlinux', 'org-gnome-chromegnomeshell', 'kazam', 'org-gnome-terminal', 'gitkraken-gitkraken', 'org-gnome-eog', 'gnome-printers-panel', 'org-gnome-extensions-desktop', 'nm-connection-editor', 'org-gnome-shell-extensions', 'org-gnome-screenshot', 'flameshot', 'org-gnome-dejadup', 'teams', 'snap-store-ubuntu-software', 'vlc', 'gnome-datetime-panel', 'chrome-fbddfdjileihpefdciilbgplolpcpmgd-default', 'org-gnome-fileroller', 'keybase', 'org-flameshot-flameshot', 'io-snapcraft-sessionagent', 'firefox-firefox', 'teams-for-linux-teams-for-linux', 'nomachine-status', 'terminator', 'slack', 'veracrypt', 'firefox', 'gnome-system-monitor', 'gitdock', 'ca-desrt-dconf-editor', 'org-gnome-baobab', 'io-podman-desktop-podmandesktop', 'xdg-desktop-portal-gnome', 'teams-for-linux', 'org-gnome-texteditor', 'org-wezfurlong-wezterm', 'org-gnome-settings', 'io-github-seadve-kooha', 'org-gnome-calendar', 'org-gnome-shell-portalhelper', 'com-visualstudio-code', 'yelp', 'org-gnome-extensions', 'org-gnome-totem', 'org-gnome-meld', 'app-getclipboard-clipboard', 'kitty', 'code', 'org-gnome-characters', 'snapd-desktop-integration-snapd-desktop-integration', 'org-gnome-shell-extensions-gsconnect', 'thunderbird-thunderbird'] show-banners=true show-in-lock-screen=false @@ -381,6 +381,9 @@ application-id='teams.desktop' [org/gnome/desktop/notifications/application/terminator] application-id='terminator.desktop' +[org/gnome/desktop/notifications/application/thunderbird-thunderbird] +application-id='thunderbird_thunderbird.desktop' + [org/gnome/desktop/notifications/application/update-manager] application-id='update-manager.desktop' @@ -403,6 +406,8 @@ numlock-state=false speed=0.34558823529411775 [org/gnome/desktop/peripherals/touchpad] +disable-while-typing=true +tap-to-click=false two-finger-scrolling-enabled=true [org/gnome/desktop/privacy] @@ -414,7 +419,7 @@ report-technical-problems=true [org/gnome/desktop/screensaver] color-shading-type='solid' picture-options='zoom' -picture-uri='file:///home/tmeijn/.local/share/backgrounds/2024-10-08-17-25-05-darkskin-headphone-ai.jpg' +picture-uri='file:///home/tmeijn/.local/share/backgrounds/2024-10-31-12-23-14-purple-aesthetic-5120x2880-18775.jpg' primary-color='#000000000000' secondary-color='#000000000000' @@ -603,7 +608,7 @@ search-view='list-view' show-image-thumbnails='always' [org/gnome/nautilus/window-state] -initial-size=(1254, 674) +initial-size=(2560, 1400) maximized=false sidebar-width=210 @@ -676,6 +681,9 @@ last-folder-path='/home/tmeijn/workspace/el-capitano/tutorials-and-courses/go-le [org/gnome/portal/filechooser/gnome-background-panel] last-folder-path='/home/tmeijn/Pictures/Wallpapers' +[org/gnome/portal/filechooser/gnome-control-center] +last-folder-path='/home/tmeijn/Pictures/Wallpapers' + [org/gnome/portal/filechooser/gnome-display-panel] last-folder-path='/home/tmeijn/Pictures/Wallpapers' @@ -686,7 +694,7 @@ last-folder-path='/home/tmeijn/Downloads' last-folder-path='/home/tmeijn/OneDrive/personal' [org/gnome/portal/filechooser/snap.firefox] -last-folder-path='/home/tmeijn/Videos/Screencasts' +last-folder-path='/home/tmeijn/Pictures/Wallpapers' [org/gnome/portal/filechooser/teams-for-linux] last-folder-path='/home/tmeijn/Videos/Kooha' @@ -719,8 +727,8 @@ app-picker-layout=[{'org.gnome.Calculator.desktop': <{'position': <0>}>, 'simple command-history=['r'] disable-extension-version-validation=false disable-user-extensions=false -disabled-extensions=['places-menu@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'tiling-assistant@ubuntu.com', 'ding@rastersoft.com', 'CoverflowAltTab@palatis.blogspot.com', 'netspeedsimplified@prateekmedia.extension', 'apps-menu@gnome-shell-extensions.gcampax.github.com', 'freon@UshakovVasilii_Github.yahoo.com', 'rounded-window-corners@fxgn', 'gsconnect@andyholmes.github.io'] -enabled-extensions=['ubuntu-appindicators@ubuntu.com', 'openweather-extension@jenslody.de', 'update-extensions@franglais125.gmail.com', 'clipboard-indicator@tudmotu.com', 'launch-new-instance@gnome-shell-extensions.gcampax.github.com', 'batterypercentageandtime@copong.gmail.com', 'ShellTile@emasab.it', 'putWindow@clemens.lab21.org', 'impatience@gfxmonk.net', 'space-bar@luchrioh', 'auto-move-windows@gnome-shell-extensions.gcampax.github.com', 'user-theme@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'just-perfection-desktop@just-perfection', 'gtktitlebar@velitasali.github.io', 'mediacontrols@cliffniff.github.com', 'ubuntu-dock@ubuntu.com', 'openweather-extension@penguin-teal.github.io', 'native-window-placement@gnome-shell-extensions.gcampax.github.com', 'blur-my-shell@aunetx', 'pop-shell@system76.com', 'openbar@neuromorph', 'day-progress@arcaege.github.io', 'dash-to-panel@jderose9.github.com'] +disabled-extensions=['places-menu@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'tiling-assistant@ubuntu.com', 'ding@rastersoft.com', 'CoverflowAltTab@palatis.blogspot.com', 'netspeedsimplified@prateekmedia.extension', 'apps-menu@gnome-shell-extensions.gcampax.github.com', 'freon@UshakovVasilii_Github.yahoo.com', 'rounded-window-corners@fxgn', 'gsconnect@andyholmes.github.io', 'ubuntu-dock@ubuntu.com'] +enabled-extensions=['ubuntu-appindicators@ubuntu.com', 'openweather-extension@jenslody.de', 'update-extensions@franglais125.gmail.com', 'clipboard-indicator@tudmotu.com', 'launch-new-instance@gnome-shell-extensions.gcampax.github.com', 'batterypercentageandtime@copong.gmail.com', 'ShellTile@emasab.it', 'putWindow@clemens.lab21.org', 'impatience@gfxmonk.net', 'auto-move-windows@gnome-shell-extensions.gcampax.github.com', 'user-theme@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'just-perfection-desktop@just-perfection', 'gtktitlebar@velitasali.github.io', 'mediacontrols@cliffniff.github.com', 'openweather-extension@penguin-teal.github.io', 'native-window-placement@gnome-shell-extensions.gcampax.github.com', 'blur-my-shell@aunetx', 'pop-shell@system76.com', 'openbar@neuromorph', 'day-progress@arcaege.github.io', 'dash-to-panel@jderose9.github.com', 'space-bar@luchrioh'] favorite-apps=['firefox_firefox.desktop'] had-bluetooth-devices-setup=true last-selected-power-profile='power-saver' @@ -1114,8 +1122,8 @@ save-format='application/pdf' selected-device='escl:http://192.168.178.19:8080' [org/gnome/software] -check-timestamp=int64 1728976393 -flatpak-purge-timestamp=int64 1728986764 +check-timestamp=int64 1730361294 +flatpak-purge-timestamp=int64 1730368106 install-timestamp=int64 1680257960 packagekit-historical-updates-timestamp=uint64 1680257960 update-notification-timestamp=int64 1705750277 @@ -1176,5 +1184,5 @@ sort-column='name' sort-directories-first=true sort-order='ascending' type-format='category' -window-position=(26, 23) +window-position=(193, 337) window-size=(908, 680) diff --git a/chezmoi/dot_config/mise/config.toml b/chezmoi/dot_config/mise/config.toml index 11efb51c..ee31ebe2 100644 --- a/chezmoi/dot_config/mise/config.toml +++ b/chezmoi/dot_config/mise/config.toml @@ -19,6 +19,7 @@ pipx = "latest" "pipx:ansible" = "latest" "pipx:ansible-lint" = "latest" "pipx:aws-gate" = "latest" +"pipx:gnome-extensions-cli" = "0.10.3" "pipx:harlequin" = { version = "latest", extras = "postgres" } "pipx:pgcli" = "latest" "pipx:readmeai" = "latest" @@ -29,6 +30,7 @@ pipx = "latest" ################## # Cargo Packages # ################## +"cargo:ag" = "latest" "cargo:bandwhich" = "latest" "cargo:crates-tui" = "latest" "cargo:gitnr" = "latest" @@ -57,5 +59,10 @@ pipx = "latest" ################ "npm:gitlab-ci-local" = "latest" +################ +# UBI Packages # +################ +"ubi:darkhz/bluetuith" = "latest" + [settings] pipx_uvx = true diff --git a/chezmoi/installed-extensions.txt b/chezmoi/installed-extensions.txt new file mode 100644 index 00000000..d599a338 --- /dev/null +++ b/chezmoi/installed-extensions.txt @@ -0,0 +1,15 @@ +auto-move-windows@gnome-shell-extensions.gcampax.github.com +blur-my-shell@aunetx +clipboard-indicator@tudmotu.com +dash-to-panel@jderose9.github.com +day-progress@arcaege.github.io +impatience@gfxmonk.net +just-perfection-desktop@just-perfection +launch-new-instance@gnome-shell-extensions.gcampax.github.com +mediacontrols@cliffniff.github.com +native-window-placement@gnome-shell-extensions.gcampax.github.com +openweather-extension@penguin-teal.github.io +space-bar@luchrioh +ubuntu-appindicators@ubuntu.com +user-theme@gnome-shell-extensions.gcampax.github.com +workspace-indicator@gnome-shell-extensions.gcampax.github.com diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index 17bcf3b5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,664 +0,0 @@ -// SPDX-FileCopyrightText: 2011 Vamsi Krishna Brahmajosyula -// SPDX-FileCopyrightText: 2011 Giovanni Campagna -// SPDX-FileCopyrightText: 2013 Debarshi Ray -// SPDX-FileCopyrightText: 2013 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ -import Atk from 'gi://Atk'; -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GMenu from 'gi://GMenu'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; - -import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -const appSys = Shell.AppSystem.get_default(); - -const APPLICATION_ICON_SIZE = 32; -const HORIZ_FACTOR = 5; -const MENU_HEIGHT_OFFSET = 132; -const NAVIGATION_REGION_OVERSHOOT = 50; - -Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); -Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); - -class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { - static { - GObject.registerClass(this); - } - - constructor(button, app) { - super(); - this._app = app; - this._button = button; - - this._iconBin = new St.Bin(); - this.add_child(this._iconBin); - - let appLabel = new St.Label({ - text: app.get_name(), - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - this.add_child(appLabel); - this.label_actor = appLabel; - - let textureCache = St.TextureCache.get_default(); - textureCache.connectObject('icon-theme-changed', - () => this._updateIcon(), this); - this._updateIcon(); - - this._delegate = this; - let draggable = DND.makeDraggable(this); - - let maybeStartDrag = draggable._maybeStartDrag; - draggable._maybeStartDrag = event => { - if (this._dragEnabled) - return maybeStartDrag.call(draggable, event); - return false; - }; - } - - activate(event) { - this._app.open_new_window(-1); - this._button.selectCategory(null); - this._button.menu.toggle(); - super.activate(event); - - Main.overview.hide(); - } - - setActive(active, params) { - if (active) - this._button.scrollToButton(this); - super.setActive(active, params); - } - - setDragEnabled(enabled) { - this._dragEnabled = enabled; - } - - getDragActor() { - return this._app.create_icon_texture(APPLICATION_ICON_SIZE); - } - - getDragActorSource() { - return this._iconBin; - } - - _updateIcon() { - let icon = this.getDragActor(); - icon.style_class = 'icon-dropshadow'; - this._iconBin.set_child(icon); - } -} - -class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { - static { - GObject.registerClass(this); - } - - constructor(button, category) { - super(); - this._category = category; - this._button = button; - - this._oldX = -1; - this._oldY = -1; - - let name; - if (this._category) - name = this._category.get_name(); - else - name = _('Favorites'); - - const label = new St.Label({text: name}); - this.add_child(label); - this.actor.label_actor = label; - - this.connect('motion-event', this._onMotionEvent.bind(this)); - this.connect('notify::active', this._onActiveChanged.bind(this)); - } - - activate(event) { - this._button.selectCategory(this._category); - this._button.scrollToCatButton(this); - super.activate(event); - } - - _isNavigatingSubmenu([x, y]) { - let [posX, posY] = this.get_transformed_position(); - - if (this._oldX === -1) { - this._oldX = x; - this._oldY = y; - return true; - } - - let deltaX = Math.abs(x - this._oldX); - let deltaY = Math.abs(y - this._oldY); - - this._oldX = x; - this._oldY = y; - - // If it lies outside the x-coordinates then it is definitely outside. - if (posX > x || posX + this.width < x) - return false; - - // If it lies inside the menu item then it is definitely inside. - if (posY <= y && posY + this.height >= y) - return true; - - // We want the keep-up triangle only if the movement is more - // horizontal than vertical. - if (deltaX * HORIZ_FACTOR < deltaY) - return false; - - // Check whether the point lies inside triangle ABC, and a similar - // triangle on the other side of the menu item. - // - // +---------------------+ - // | menu item | - // A +---------------------+ C - // P | - // B - - // Ensure that the point P always lies below line AC so that we can - // only check for triangle ABC. - if (posY > y) { - let offset = posY - y; - y = posY + this.height + offset; - } - - // Ensure that A is (0, 0). - x -= posX; - y -= posY + this.height; - - // Check which side of line AB the point P lies on by taking the - // cross-product of AB and AP. See: - // http://stackoverflow.com/questions/3461453/determine-which-side-of-a-line-a-point-lies - if (this.width * y - NAVIGATION_REGION_OVERSHOOT * x <= 0) - return true; - - return false; - } - - _onMotionEvent(actor, event) { - if (!this._grab) { - this._oldX = -1; - this._oldY = -1; - const grab = global.stage.grab(this); - if (grab.get_seat_state() !== Clutter.GrabState.NONE) - this._grab = grab; - else - grab.dismiss(); - } - this.hover = true; - - if (this._isNavigatingSubmenu(event.get_coords())) - return true; - - this._oldX = -1; - this._oldY = -1; - this.hover = false; - this._grab?.dismiss(); - delete this._grab; - - const targetActor = global.stage.get_event_actor(event); - if (targetActor instanceof St.Widget) - targetActor.sync_hover(); - - return false; - } - - _onActiveChanged() { - if (!this.active) - return; - - this._button.selectCategory(this._category); - this._button.scrollToCatButton(this); - } -} - -class ApplicationsMenu extends PopupMenu.PopupMenu { - constructor(sourceActor, arrowAlignment, arrowSide, button) { - super(sourceActor, arrowAlignment, arrowSide); - this._button = button; - } - - isEmpty() { - return false; - } - - toggle() { - if (this.isOpen) - this._button.selectCategory(null); - super.toggle(); - } -} - -class DesktopTarget extends EventEmitter { - constructor() { - super(); - - this._desktop = null; - this._desktopDestroyedId = 0; - - this._windowAddedId = - global.window_group.connect('child-added', - this._onWindowAdded.bind(this)); - - global.get_window_actors().forEach(a => { - this._onWindowAdded(a.get_parent(), a); - }); - } - - get hasDesktop() { - return this._desktop !== null; - } - - _onWindowAdded(group, actor) { - if (!(actor instanceof Meta.WindowActor)) - return; - - if (actor.meta_window.get_window_type() === Meta.WindowType.DESKTOP) - this._setDesktop(actor); - } - - _setDesktop(desktop) { - if (this._desktop) { - this._desktop.disconnectObject(this); - delete this._desktop._delegate; - } - - this._desktop = desktop; - this.emit('desktop-changed'); - - if (this._desktop) { - this._desktop.connectObject('destroy', () => { - this._setDesktop(null); - }, this); - this._desktop._delegate = this; - } - } - - _getSourceAppInfo(source) { - if (!(source instanceof ApplicationMenuItem)) - return null; - return source._app.app_info; - } - - async _markTrusted(file) { - let modeAttr = Gio.FILE_ATTRIBUTE_UNIX_MODE; - let trustedAttr = 'metadata::trusted'; - let queryFlags = Gio.FileQueryInfoFlags.NONE; - let ioPriority = GLib.PRIORITY_DEFAULT; - - try { - let info = await file.query_info_async(modeAttr, queryFlags, ioPriority, null); - - let mode = info.get_attribute_uint32(modeAttr) | 0o100; - info.set_attribute_uint32(modeAttr, mode); - info.set_attribute_string(trustedAttr, 'yes'); - await file.set_attributes_async(info, queryFlags, ioPriority, null); - - // Hack: force nautilus to reload file info - info = new Gio.FileInfo(); - info.set_attribute_uint64( - Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time()); - try { - await file.set_attributes_async(info, queryFlags, ioPriority, null); - } catch (e) { - log(`Failed to update access time: ${e.message}`); - } - } catch (e) { - log(`Failed to mark file as trusted: ${e.message}`); - } - } - - destroy() { - global.window_group.disconnectObject(this); - this._setDesktop(null); - } - - handleDragOver(source, _actor, _x, _y, _time) { - let appInfo = this._getSourceAppInfo(source); - if (!appInfo) - return DND.DragMotionResult.CONTINUE; - - return DND.DragMotionResult.COPY_DROP; - } - - acceptDrop(source, _actor, _x, _y, _time) { - let appInfo = this._getSourceAppInfo(source); - if (!appInfo) - return false; - - this.emit('app-dropped'); - - let desktop = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP); - - let src = Gio.File.new_for_path(appInfo.get_filename()); - let dst = Gio.File.new_for_path(GLib.build_filenamev([desktop, src.get_basename()])); - - try { - // copy_async() isn't introspectable :-( - src.copy(dst, Gio.FileCopyFlags.OVERWRITE, null, null); - this._markTrusted(dst); - } catch (e) { - log(`Failed to copy to desktop: ${e.message}`); - } - - return true; - } -} - -class MainLayout extends Clutter.BoxLayout { - static { - GObject.registerClass(this); - } - - vfunc_get_preferred_height(container, forWidth) { - const [mainChild] = container; - const [minHeight, natHeight] = - mainChild.get_preferred_height(forWidth); - - return [minHeight, natHeight + MENU_HEIGHT_OFFSET]; - } -} - -class ApplicationsButton extends PanelMenu.Button { - static { - GObject.registerClass(this); - } - - constructor() { - super(1.0, null, false); - - this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this)); - Main.panel.menuManager.addMenu(this.menu); - - // At this moment applications menu is not keyboard navigable at - // all (so not accessible), so it doesn't make sense to set as - // role ATK_ROLE_MENU like other elements of the panel. - this.accessible_role = Atk.Role.LABEL; - - this._label = new St.Label({ - text: _('Apps'), - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - - this.add_child(this._label); - this.name = 'panelApplications'; - this.label_actor = this._label; - - Main.overview.connectObject( - 'showing', () => this.add_accessible_state(Atk.StateType.CHECKED), - 'hiding', () => this.remove_accessible_state(Atk.StateType.CHECKED), - this); - - Main.wm.addKeybinding( - 'apps-menu-toggle-menu', - Extension.lookupByURL(import.meta.url).getSettings(), - Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, - () => this.menu.toggle()); - - this._desktopTarget = new DesktopTarget(); - this._desktopTarget.connect('app-dropped', () => { - this.menu.close(); - }); - this._desktopTarget.connect('desktop-changed', () => { - this._applicationsButtons.forEach(item => { - item.setDragEnabled(this._desktopTarget.hasDesktop); - }); - }); - - this._tree = new GMenu.Tree({menu_basename: 'applications.menu'}); - this._tree.connectObject('changed', - () => this._onTreeChanged(), this); - - this._applicationsButtons = new Map(); - this.reloadFlag = false; - this._createLayout(); - this._display(); - appSys.connectObject('installed-changed', - () => this._onTreeChanged(), this); - } - - _onTreeChanged() { - if (this.menu.isOpen) { - this._redisplay(); - this.mainBox.show(); - } else { - this.reloadFlag = true; - } - } - - _onDestroy() { - super._onDestroy(); - - delete this._tree; - - Main.wm.removeKeybinding('apps-menu-toggle-menu'); - - this._desktopTarget.destroy(); - } - - _onMenuKeyPress(actor, event) { - let symbol = event.get_key_symbol(); - if (symbol === Clutter.KEY_Left || symbol === Clutter.KEY_Right) { - let direction = symbol === Clutter.KEY_Left - ? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT; - if (this.menu.actor.navigate_focus(global.stage.key_focus, direction, false)) - return true; - } - return super._onMenuKeyPress(actor, event); - } - - _onOpenStateChanged(menu, open) { - if (open) { - if (this.reloadFlag) { - this._redisplay(); - this.reloadFlag = false; - } - this.mainBox.show(); - } - super._onOpenStateChanged(menu, open); - } - - _redisplay() { - this.applicationsBox.destroy_all_children(); - this.categoriesBox.destroy_all_children(); - this._display(); - } - - _loadCategory(categoryId, dir) { - let iter = dir.iter(); - let nextType; - while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) { - if (nextType === GMenu.TreeItemType.ENTRY) { - let entry = iter.get_entry(); - let id; - try { - id = entry.get_desktop_file_id(); // catch non-UTF8 filenames - } catch (e) { - continue; - } - let app = appSys.lookup_app(id); - if (!app) - app = new Shell.App({app_info: entry.get_app_info()}); - if (app.get_app_info().should_show()) - this.applicationsByCategory[categoryId].push(app); - } else if (nextType === GMenu.TreeItemType.SEPARATOR) { - this.applicationsByCategory[categoryId].push('separator'); - } else if (nextType === GMenu.TreeItemType.DIRECTORY) { - let subdir = iter.get_directory(); - if (!subdir.get_is_nodisplay()) - this._loadCategory(categoryId, subdir); - } - } - } - - scrollToButton(button) { - let appsScrollBoxAdj = this.applicationsScrollBox.get_vadjustment(); - let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box(); - let currentScrollValue = appsScrollBoxAdj.get_value(); - let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1; - let buttonAlloc = button.get_allocation_box(); - let newScrollValue = currentScrollValue; - if (currentScrollValue > buttonAlloc.y1 - 10) - newScrollValue = buttonAlloc.y1 - 10; - if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10) - newScrollValue = buttonAlloc.y2 - boxHeight + 10; - if (newScrollValue !== currentScrollValue) - appsScrollBoxAdj.set_value(newScrollValue); - } - - scrollToCatButton(button) { - let catsScrollBoxAdj = this.categoriesScrollBox.get_vadjustment(); - let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box(); - let currentScrollValue = catsScrollBoxAdj.get_value(); - let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1; - let buttonAlloc = button.get_allocation_box(); - let newScrollValue = currentScrollValue; - if (currentScrollValue > buttonAlloc.y1 - 10) - newScrollValue = buttonAlloc.y1 - 10; - if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10) - newScrollValue = buttonAlloc.y2 - boxHeight + 10; - if (newScrollValue !== currentScrollValue) - catsScrollBoxAdj.set_value(newScrollValue); - } - - _createLayout() { - let section = new PopupMenu.PopupMenuSection(); - this.menu.addMenuItem(section); - this.mainBox = new St.BoxLayout({layoutManager: new MainLayout()}); - this.leftBox = new St.BoxLayout({vertical: true}); - this.applicationsScrollBox = new St.ScrollView({ - style_class: 'apps-menu vfade', - x_expand: true, - }); - this.categoriesScrollBox = new St.ScrollView({ - style_class: 'vfade', - }); - this.leftBox.add_child(this.categoriesScrollBox); - - this.applicationsBox = new St.BoxLayout({vertical: true}); - this.applicationsScrollBox.set_child(this.applicationsBox); - this.categoriesBox = new St.BoxLayout({vertical: true}); - this.categoriesScrollBox.set_child(this.categoriesBox); - - this.mainBox.add_child(this.leftBox); - this.mainBox.add_child(this.applicationsScrollBox); - section.actor.add_child(this.mainBox); - } - - _display() { - this._applicationsButtons.clear(); - this.mainBox.hide(); - - // Load categories - this.applicationsByCategory = {}; - this._tree.load_sync(); - let root = this._tree.get_root_directory(); - let categoryMenuItem = new CategoryMenuItem(this, null); - this.categoriesBox.add_child(categoryMenuItem); - let iter = root.iter(); - let nextType; - while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) { - if (nextType !== GMenu.TreeItemType.DIRECTORY) - continue; - - let dir = iter.get_directory(); - if (dir.get_is_nodisplay()) - continue; - - let categoryId = dir.get_menu_id(); - this.applicationsByCategory[categoryId] = []; - this._loadCategory(categoryId, dir); - if (this.applicationsByCategory[categoryId].length > 0) { - categoryMenuItem = new CategoryMenuItem(this, dir); - this.categoriesBox.add_child(categoryMenuItem); - } - } - - // Load applications - this._displayButtons(this._listApplications(null)); - } - - selectCategory(dir) { - this.applicationsBox.get_children().forEach(c => { - if (c._delegate instanceof PopupMenu.PopupSeparatorMenuItem) - c._delegate.destroy(); - else - this.applicationsBox.remove_child(c); - }); - - if (dir) - this._displayButtons(this._listApplications(dir.get_menu_id())); - else - this._displayButtons(this._listApplications(null)); - } - - _displayButtons(apps) { - for (let i = 0; i < apps.length; i++) { - let app = apps[i]; - let item; - if (app instanceof Shell.App) - item = this._applicationsButtons.get(app); - else - item = new PopupMenu.PopupSeparatorMenuItem(); - if (!item) { - item = new ApplicationMenuItem(this, app); - item.setDragEnabled(this._desktopTarget.hasDesktop); - this._applicationsButtons.set(app, item); - } - if (!item.get_parent()) - this.applicationsBox.add_child(item); - } - } - - _listApplications(categoryMenuId) { - let applist; - - if (categoryMenuId) { - applist = this.applicationsByCategory[categoryMenuId]; - } else { - applist = global.settings.get_strv('favorite-apps') - .map(id => appSys.lookup_app(id)) - .filter(app => app); - } - - return applist; - } -} - -export default class AppsMenuExtension extends Extension { - enable() { - this._appsMenuButton = new ApplicationsButton(); - const index = Main.sessionMode.panel.left.indexOf('activities') + 1; - Main.panel.addToStatusArea( - 'apps-menu', this._appsMenuButton, index, 'left'); - } - - disable() { - Main.panel.menuManager.removeMenu(this._appsMenuButton.menu); - this._appsMenuButton.destroy(); - delete this._appsMenuButton; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index ae0330e2328d98d81e84eb64e7c9491145d7029a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmYL^!A=4(5QbNy2lwE?vxnYgaM=^7NI->zL?V*ai>FzrOLb{UTZnq~8BDzJ4(nCo zJJc8OS)9d0{`Biin!l6ze-3uu0@5~dNK}YjqCu1z5PQTm(cTJzJF5G{l6pGpe^fT= z;zAqggbfBpKZuco-WYC$u~I9}GNq>i>_p@_h$kmh`E1z~r3!~)rj3KX&Ey!)=9z^= za~2M+U?>){G{OZs!C4%|F+?%cViv_bsvkw9@Dij&dH)a!Po@MiVqvxYL`Y3-yh!T>4%Z=%|q%OO3{*&(F`!)CltGa}t diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index f49084b7443028ce6467a1a5dbeadb6e8dd564de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmaix%}&EG495$C1Lek){z+5q(Gg0)wevz5s1l~^a*iEe?U#wGs ze3U!;O#Oi81H2>Wl{EqiV@pE+L|P-g1~PTnLn(bA7hh9lUBIp{)Bumhg~y&15a*Y8 zO)sjxiYGFVfGlk^G0iaDfyS=b-d#_#G>tE~3ig~dUdv#efLsxmg`579)T7#2Dy4zF zY7#&2);y9|l=N-#F84X#6k}Ns_DGfj4u?*SBv<=4L4X{_-Sh70w9!VA#>duhhb-x> zV$Fg3-K?}!rUfj>c?#{@UI&}gd$sf-IXpFeJ5Z(&(0o)O&h^+yjUDSsFThljt#4;7 z_*u4B4Xm`GvDS+3@r(?)-}WsHRDdi=lPx~^o5xLf)2wGQia0tO8~%IEuTk_3k2#t> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index f7c2a1c1091477e98986b0fd087626eb949f2e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmY+B!EO^l42HLe9@ryi4(<&E4!bK++DU?1Xj4@pYN*l*iPMm{(?PTLYGzUa?}2y* zo}=&4m*53(lByBbe6l_IJ@T))d;0iSq47w0ro2+Nm4UL1iSk7Gr2O70iZA#5U#<15 z<}__$WN#$;OsSYe`9`yhr*pidn7pt7$I=p}YYGABdnR69CunWT6w7n!BxW2Z=jZr- z;Sx^8Ksh#joQ?Oa0fg{VF0*r0U zp6MqHh_ek@Y_v}Jz_r$g-b~teI?8Tg9pRL0Yv6Dtxc!r0kmM?_^^^{rhzsPREV}gn zpaIL}_;h@{@mlw)@`JFN)UAGWx^`B}ue)G9_hEKzW1>8~n2vC7qg!r&MG=pACUeiu zz}{D%%g=a1OmS`NBtLkBrng`BcFRdvL>q7&k#W%AEa#d0>NrP0;z$8Ub1N^t^l4gGq06Ikt)5nxDdZ{$BF{-(Mu2a)8hfZPh6Ga+V=>KmNpjw$STiuaKlQ`JDB~9!J z`KRspJv&2#Zu`k5r3*?`KpV9u5QPnb;<}`!7&@*l6Knz^auO7N5`;t`pn#C57JII` zQ+33hHqw#xdPZMU?C>DLb23(H6@hCLt!2EjZiidPMZjhWG3?DapWZIYkMzp2@RD_T+2{05UvvI ze2bGR9f_2%Pa=ZgEr5CY{D25Z3P=blcNg!b;%p zYUN1rN{>U{+0lbr9cDtRI>ZBEEV<@czk{{u+<5i>WU#Gbok*2NP`i@O?`0z+GVExR z+X&R~x3$f+I!tVHS;0~h!oPL@0{2OgnVf&9Z$u`a2*S#S@0GHPpal#j;% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 42078553536eeef29da417be3c78344fa63a0776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmY+A&ubGw6vs!c2lpW2*~9Z-vB<>PO~kOt)>>_(kYK1$^dLCdyl$rK&MY&t!9ow- zd(ew#{{_XX{tuh8;NRlg4W;r-8kHD(T9%HD_|c2y}f4EYRY z5yL*_(pFAM4MP?7HJ@Y7+rjrTW3n7GYpT-yuZ>}j!Q^mqaJg&P5y3N~X-S&uw4|{; zt^BaerP2dPm(n`)$?MsO_b>aJ>5tL!1D%?M(pe1sx$?m@r&V%3GPZCr=(0^+(jCAi zOz!J@p-7Stwzr`P#oZ(f;Ry(!cFK2?=;CUa^qR0$h+!z;>}(^U9_xfjh{#u{2`b+(zO@6P>*Pq!xz^JzD diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index da84c33defa2196f8e252e468db8203d178b824b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmY+9v2GJV5QYyF3Qkni6hjAs33mrYw6>9Bh$Tz0Fu~AJjeXN5)K;E)_D^-Bs1@R@G|10#Bc0_aaMu0u4W8tt}5hRWZOLls3}DD=><2=N1O(2 zN*rx;z`0Y9&OYG$Y1u-q`kSjYH!Wk2e*t~2i7WsB diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 3b93b6c19655a285f2edd90e89a9d7fb22d6adf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmYL_!EVz)5QYtc1HM%1nZs~v1?xJoK#|*^653Re8VDsIBo1g|56)71*4kYc`UHIf zULjoI3P;`q`B4}rh>Y}UcV_n2{xg4e?|cm;ZVUH?N5Wm*UzR7_W@go?I}q<`ZRJO>*^?tkZ^5Xqd609O_Lkyr9}xucofhxf(TvQ*)C- zID4rs=t_4Qb%LH!=*Rt7#RJt#pckic@-Tj!#NjzQujUrnmFSI4;n^ixw?u}KcAwF~ z5&kPgi*@06X?%scj51R_6*(6T7Nq8cRSF~G0!s~h6V5g6ig zBF$TA3Jd-)c@a)0)6?yky(kW!8}`Iv@46QMp1$~lxtKaSFXZ!7@UHuCF0`h002LJ#7 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 07f6c095a945b6d094b7a8092aa2344897670abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmYk1(N4lJ6o#kKM0e@67rocwHbKZlV^A<85GH~#@v7VEI0&ap+aW%IPv9HrYxpdl zp~*bym(#TWY5)KGVCTc3+9nQ(V`7(R6J#z6U+N4e~{XM!jQ$vAP6iFR&*q-7HAg2(w#e&xzd&oO$I6N6q(@@6*4y(@v&S% zInHl{l_3i}zrnpz?gh+mgmwSO^F7ZU2xIx=?>(hMb}yEo*%)H@d}r+`zMy)=OVVLh zh)nW{6w8oxehsm9Y_1kiQ#z|8WY@UE{;*s5_iLVet0K&XSoZ zLtRWKJ>IHxrKxABc^4Cv0%jp=#bDh>J`e>avs|RSyWWKVA28s4lX+)hKmn;pek)OG YVasrlk||i`*P6Au>x`DLm`eob2Qo>4)c^nh diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 269106442bbfb78f8c51296d2fdcfc8d08fdf96c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmZ{h%}&EG41mkufpX)_!JJV>TR?(rMf`07w2287&Y0HgGIdFnWC(ZYx-e5l24q1P*=GEq5 z)yi_SpVqYt2KZ#G^5lZCH8aY+xGKawS*MJaP--(L;ignof}TC;=Guj~R2%EX$d#%P zXN%H_%t#2wH{zC_RO2Hq(36BDO7=x`Ad)?Z_hfRk6U9*!4$*m$S=6pVZ>)rCV+#c% zbfDmptp0e{1-(LVHb-~j%*5yDvBHkA^*Gx5Rrx15To_wWp%$r&A*okwgf`8x#(2HWG5lyc7@b)53;+Q;w4=i_JyoO*Mr*F_Gx@^FCI@zNhs8&y91xgPJTixM^ zkvour`YF*-Grk19#|*)2~G=O4QOEs1!T2c&HMF|K}=@W;9ltG zt46~Cx4fz~C^M$T7EOqdzT^uw>ib&X8{yd86t+}Gayt4@fn<8;K(mE)mFLvd-P5PT VG5wdRq30=0#sm*7a9)*o^FJA?hF1Up diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 9ac0a33672ad87d1120b7b1844827c157fb376dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmYL`&u$Yj5XKDz30C65nZul_R>+HY8${$}OQCI0rACdSfH>kflZ~m@UfE9h^BRbU z=%G*1_uyHWO%569r_cU0w!X3dz3lyER8NRkM4xy{ToGM;BYK1)o)atL&m+cK(q}~P zF=H9&3sSPT_mFIhEXF>xZDeD0>w`%c*);g?s1v_j@-G;o@lHbRe1kl$(OQl_6S~fh z*$i7B5}(A{EcwSx9r@f#$fnnPhPS5c;pZx$gi@4!E=n%mLGf0K!D~?nkzJ{n_&g{V ztx7&fI9JY~h1n+J4U8IP?5T>{m>=G*a_yTFI^yb$s*%r8H4@H#qh7;k7f(lSO-!fT zUG77@Z_;kck)3%*vrvX#Erm=p*_+lX*3Ax%$*yhL4uUh!(AVoz z^bWI&P)7b{#@2W|?h)eawdH!3C2jW|QFVX_oM+!W#gE=HUMr$O0RtK@=& z)3|`kdrmorkqVJ49I3ddJNHC4%GAA?YmWJ%)k~!br=%JQXUdv5hog!!ElxU(IxM{> z+p89@SNlfZxP&E!+Xrct`yKNkleRy*RTNb_ypxEwM>h6kv&f#ccGnaRJVsxy zkI)C`iLsH$$luOCqgi`?`R}KLKM}`1^O@;0ADL^WjeF*RQOqH;VO~B&QO)^?`Nz8L z|L4q4_a07N?6v2lu6;CDkJg!hK3Y2afO&wc0)Cl>*IXv+R*yA*uS{}V{oq@q8>JCes46L@*aV+%dAeJ)z;P!M>-26` ziUQ-s)nc~u)l1U&!V(+e9iD4mGO)eVx@2QRk#Cjr7)C!=a~SOA+Fdv3U`Dwu3~4C_ zYZKyS**I0g+`7t3L3LO9Q8pBBa&$uCcqDpXhVdO-BB6WpyR=xCAigF2B#Wa7{YEMp K(n#o)U>2e@3$@v@GdytGaQ@=@XJcNzukm-vO8SJnuqjGYqt32BY=Gmu$qdzeZe$i=5L zvo7GkSE|Gh^UCAU3W$qiJf%yuXvI%5kbo@7a!i_-q>$y}FnyimNfLkNTX5*4@mdD! z1a!wf$S_gXL*IHeR;BXLCazcc`=y+Qb=5l_Hq~5KghP^30Y{GL#{mp%NzTAtdiXZS zeQ2-rlSZw4cy3$(>3Gl|bl0BKMiPIthRw3Ns~O7=Z2iqlOJ!Oxnn>p}rYeu$IrV`M+P$4e#+)0f+>!x0SnJr7-$y%^VJ9`FpJCN?T;;(o_hTQ5U3QMI5 nkT>#1#wSl-a~7^N>sh*rqxyG!Q(xczs{hxw_22rgzK$LN8(F2S diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index f2ffce157ef979ae4330de6f4fd10073c8be1a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmYL`&u-H|5XKFZ1AD2&nZs}cp>Y#8NYSQ2{XJn7`N8i(>WT0|7zs~>YoV)e!hv9fXTqKE=TT9#qMffE3!;aj zV)yS6=}WAlIBVNf%*}m>E>kL&G5nx)#;Y1XQ%o+f2Fsx#OdIkZ=~pK1?4)j}4Kd>) zSy$uv)+Ss94QlxjZ|L52J^0>a(ohYm5e_P>j$t^|Z^v&2QtH~IjH_rkd6PrbaK^QR zi;dyhQ-l*ycWT2=@7R{>(7clqY`4Y|uE;bRW^BDn8$h^a$zH<;>8wKoC&XVb&riK8 zL$v#28hT$Xt`@WXaKmz-E&|I`lIEe6xLIaAYQ1qhf%V43M0t9^xJ4W&O>aH25$S?G_5AEyPUpacsYgP>xue;m&6ozlP?3+F2iv-Dl2*N Ue+QrPgO@!0?^pXpZFigc2P4gw(EtDd diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 214054fdf934dfa5c23844c98b154165f0f0d2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmYL`!A=`75QeuEJ=9V!J@+uZQI$!TEfQc7gbE2nZPYDnDEG@J=VeHf01PuyuV=tH*nhZ z@wSSQy7Iv!idh-_oa%(*DgL4mjdv2X^9^B~k+n$IiQMu!LZf1$AWo_EA>kxyGsQ0p z9kKEfMEM<0>B=li@kk|-P~^pD%y+TahN6&L+aL2H&&4;Mf>ls1T9tf|@HLp2=E}j@ z;mKrtR6+mp`KA}^S!1T@Kzpw(HOkmt?VEj`;q*dj!irQQVHjKDfyqPvNjiD7JoKQ; zdOqk?iv;pwGM)@qb~k&uIP{Kvvap+$l_z%nskO?uJ*a0YL`s97)d+W1bxQ+(DB#f5 zerlYSu=Cp_QQAdN7DqlbQG#o`G!BYAcsdT&9lRgF<_B?($K+Uc_Xfx5|AW9*!FtZ| Y-^ZM#8_SY9D-_*O^F3@~LS!ndm1UOe9X`!9P+N@p6f`6xevDpmM$@w3ex!(yrw79hT?^eq@c))0pCq`>H zj=EpwL$ys*K>U4tlg=(@V-=Z(q z1JA-ZIYb@prdyc3=Yb7729cp+Q~cTb||hvetNgVgf&dySQACSc_h z#N{P!XlKSz{Gyo@WJx;37t5oybdtoMofS_a z;%_f1SscFaTW#zNwl~@b;{02+!n5PtDE1e5T-vRxjcpX1{WKhx?cjBbE9bkQ!1nt# o(FJv#`7_kfe=@_28vp`3Yc(#HHOF#J^$8qfB*NcsxM(vUEQW+|bl@q16ugZo($}{Cc`SHM*R{eA3x9X?r zpFA{1<+_f#wQ0zhy|xuIp{tl&W-+rAzwsjD@e)6C5*LGoI>d%iF4=qJ>&&4K3p6B| zQ*p{|Oc|$AyCv>-wctEjC}tn=l&@T$iXSMmg{rKESXMZA4`peG)!VWv%i=_<;5<_S0lKS$vL0ADs1=GXMYp diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index f5d109f076ae60de620f2d85819f0e5d17dbb228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmYL^&u-H|5XKiM2Yji7R8AcB#HAY7adL<@4Wj>2RZ4`_riddOd*UpzcdgxZRXB0$ zrB@!IDx9kFG;WbN@Fa{Aq>S{_?0mEKe&3&$8{Zk#GvYPTBc2muqODKF1|f+T#GJT! z!dOLplX&%%u`TLvsFS?>54B~H#MoX{IX03P#ww4FCDwe#)Wb;zAJ95wwBWfmC4yUE zQ2<_g)UE9P%Uy_qQ>={jFmbucV86~COpV|{@*Ym{LbbQyP~ijTQV*Y9$N4kBhG|Q+zk0Ih@g?-qo{O`#MZb`If%Zc`b84Z^mU^JzmH@{S5%2TGDs*p+#c)F0*p&y=4N6=s2YrW0U z!jVo*rgScNf2Mqp6t$HFjEpUv;JR9lZrB;{)o~aNf{zrv)R>JGIyg&B`(h=nr+~CO zMvZnAIx(0j&%0qSjA^qP;mp)F#ebra{czRXvgSu~|9IE@ K`hDHpt<`_k46$VZ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index c48d63065e62436a6c3dfd9343bf5dfb0284f269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmYL`-)_?|6vhn<3Bn!MT$nr1bb^z1Fu4ScKPxI)wWOHAu}ULBvvb}IHDybn*p zvv86z^+-Q`&dG7~oiBf%9{pxi4~S>Pn0QEB5Pkh1jtE6OCbq<%dyKWDPl)0^V~{a9<`-q+vA|p2~IZd?QtJW#&CwzUSLe#1HT2JBhFxMO2>Hz0{jT`HY zcn}VK zxjqY%U8)`F)7azjc>eL@+k?MK?1k`NmkJ zJMj|U))BWg2`P2n_dzZ6y=N0Cs1^HPR7Je1@jG!a-j&cg-w}olS&Q^Lk{iPTIvpZ$ za!bAEh|AEL8ZU-6;M$jvtZwj@?#-BrUv#7rimaGmR$wuKA}{l!Pg$O2$+c9$HES2F zj-E@n9E`Pk=m;)|o#q-&bO^pOI*!ktwNK}Gw>wW8K9w@A9dt{$Cf!MquQ$s%ESOxi zfiVOpTNMqTMb`CDrJmdUtr8kemRHO9UUZ&j$!G6Gt+e;2m;R$@KkThGZVJ^#bD%i; zwqD@zK5vxK5aZlczBaBc;rPzPWMv1|78jnoP=f2X+b}Dpuv^YPI5>s;<23n!m*j|d alURAGO@yO#k`~GMQPxzuA^iWap#A~R*_;Ug diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 590bec246243c7f5ee4e1f040d2dd2581664ad5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 468 zcmYL_%}&EG495$M1L4M*L+;3>D;1i`hsMW-CT(Jx3gSrCdRb7LR7pAk@4;*E2AnwY z5Nf0nC7eggW>_2R zVdA7J;JT3xGLv#Py@wgDR4avB;W6cL6ekcR&^_gGH;v+>D2^gFrYewGpmUtlWrFPEj@) zO$M8Zx?#j_jHXfO@3)$o^EB9TT?(boc)k?Yp}%;@hS1yS+8!5ZVW4wUC@oXon=8+r j;0`s~|K_I#3+4Gqn1nH--BRP?z1VoGK7(u+3lO#HA%|qDqYjZK#kq4fe!dw4SwgHx-ro8r*q? zzCz!lS6+j0qLPt5&CWO9?9R;IJ$>{$5_>3kCU_-yEEo%VTL_*Az6kz4h@$V}W5GlU zB;3@A+u0N^tVlltmUF1twxoPR#whv~hIehnkR|C*C7H_JLz?C9vX@DkB=M=-qLvQX8w}RvFkADa zF=R^^ue9|CE9`N8bYph8v3ELc|w>KgJMws3H+3NmFr2i_OpUjVU z1Eqr`o>-Pi&~F&5tI!&Poem_oT}kY*SEMLr;fR_mF7B!;SU|+g;_f^ zYHD5UbKq_h`r_>fw#VW*7exx!*U#a(LgfzFi0hJBpagYRFhZdrR@jm&;^Y~a`!)a9(^b diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index a84cfd1ff7c81c87fc88ff4c07254e7956967b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmZWn&2AGh5MH1?u;Rp-gSml_7iXJ8jy!Z`5+-8TurB z1m1&ZVRn}^2S)ldKl|DGz8(L0d2pXmJR`g!3<-yX8KI4Dgad*iJSVIOhflN2Q+`3% zQr*sfQGPV>VS=3?@O$76E@imH1W7zd(ovon+eK26$Y9wH$5}xON=b zM#TgnzXp#X@p;sy=I4!$e2J3fi%iAo?@Das)iB`=Sd5K;`^iGdLLjBeq} zpj@;nVUTP}HJcdF4g6#$E9#26?@l`*1qS_rjyc^Z4SWe|BiW_0rZRN!#0R`319+N( ziVh2{?4C_tY(Br5U+m2d3Xy+AN3KZ5ohO}%Jihl<88>3pT7?K{{CPR$$9rBYcLjl8 zxC(3Iv}DKMP0AOx3Ci**hE0^r`L2!Qa>V*_{Km1@V>Wm@%D?hUa1eUS3xwJvc2o?D zlD_PAaFgyV>FHe4cryEEmOOOb9P8$h@ZWxV&N)e~){>TGTtAs$TTAA#?{8AKo!tt^ UO-_%3ey6I;?+5qzI51{^0Uk=g&;S4c diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index c7d7b8dc1aabd27f9309e5cf07735b1dd46fc02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmYL_&2H2%5P$#=+b`Fd>N$4cT2(es-%$U6GarA#rk(!8J|n$o5unL%aho z&`KPPxFCTzl{cyUBvmKd!;buUX6%`XC zeVe!-o7O6i)LLfzSR3ikMwQW@uy(N1z&kWnYE`m$AA4;a%&m|OyjThg3r)w>YuLwQ zIRwEg?yzKenmvJZ6S9oud6_q_5B_iPXTkp_{}-v1 za~ghrWn(IO$lC*gD_K0<5*?RqQtR#+6;oo#1;PS(SF-0F8d-D2rb@Jw#l}Ysg3Jm9 zjjp%INwg8`w33NsJl~m5*X?CV8o$)ap`u@Y>8TBepWUOr6opSyCjMNft-J`{4ft|1J0*G_7IxXVE2=oULL2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 4bebfb0f7d8abe27c6bf347d3fa92758c5be290e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmZvY&u-K(5XJ+P137Tu4ALAyFu_SzqVjgjpVEa&U9oBxRBm{)vx%$3j%;sXrM?B) z0|z)DE=asjZafQ<&7l{@`suSjjXg8|dv9kGaol3=GXv%}bHa4-iP>QkbB9?ne{Muk z!+Mu_aI@DZtZZ-JVc7;-QS`EDd^A><*6Bb#nmT(ydBEcZejw+yH4+MAYeHXARUv%| zWIEf&r_@*%aN-NSz*nonxknaBnxGEAR=5Hd|4i%f|4MEQU- zr;M*uuuj59<*b3TQk724mC>;8%Vgb|FN#{}D#>kqz}HN%QU&3RR4w5x%^iJ){k8S9 zv~K>tR0$=;ljF(J^+;(V;zMhA7Vcr)aFc;2d)ib=n<3<-a-PEI{cMbT*Lhv9OLBN* za=Xx`kgzw`A)Zz%rz#v9DUZp)Y@qZ^)4A|EN!d-DHrYanyd}^}F4)KUlvHx9!MR5>I|maVc~R7$(0Qdg|Xf;i$$X0xswJF=brxuM>X zxbOlf<KlP-s&kcS}@? zC zGZbYCZ>7#9Y}2ZwuFv_h>vxoN-i6N8Hp7Ln1%?{^`fdtK8B7i*`|IFw7zJ;Pro{Bb zi;6OM%KyAlLh2!8OJN=Q(TCZXZ>`UDQ5IT>4*bhT>T zs5gY0?dYk7CnJcT4TDeo05#g1?>O-P{sxklVH~iw`PMeq?bX+|`9;k&N!whu&CmAg JOSd+^*(+oFw7XTn?b!Tr&v zwlmHTrm;I=aj;8cQB2Tu6`WBt*_iFLm*a~~BWfVavlzGozVczg zZ_3=yr-e5z3}HGqlrT3xCL?jY(e+RJjU+C@G|pVG6&&BXT(*8m#*0y;E>#c~t1>l* zLs+NH`>>~E(Ahd!0NjZ*L#B(R+8lScpFs+*%eT{&c}Bs@N@Ev%6T>{0B|2gCB0 Z_=*8({ZVbinaiLDhh=fqIe&-26)!fulX3t6 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 76a6d5be552533a208478cca3d9cb63817da5f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmZ{fv2GJV5QY~B1t-y@PBC;Kv}S#FVXb4N1Y(G=g%vr7lF8lpym)W-w7X}4UxAv2 zF3;lk;7KT$bBa_M>D!qd&5Zv4@A1)Z!SRGSVTR08X2x{!jX7eFdB&`mUyp=nI6r6p zaozQ^$3k#sYvp&lwT-Bzgnq6E>b2@CmCg8y zTn2Q}V)8-5Iokd0F2ep#fYUbgZqOosF~KUXp!5mW?OR@RRf`qLC1I`MW9upm1|6LG zh6NV z!WF(WuF^2NF)8~hKaitvXJ+O%Xw8lwAN16yH_R5c4QS=mhdOF-&EXp-`55lX$x8<> bCeVL1&cvDJLTs%-p=;M$ygIhSRxp8)!B}~CGP#{%w<;ibRbc|RsL@vcPzm{Itx<~tT2rbP J(y8B7u^)}hnScNQ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index a80625e75341e2c0edaaa93d03ffcc39332f9c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmYL_%}ygR49ABR9GK&tIhZqKm>CYhv_)u_7FD96KtV{H!qgqihNOz!3V4rwg}v=l z@D3b#7FF1I= sWedLCj)%<-6s`2eoS?_}^#`Znk9G8dP#k1MneC=YcOn$s>p!971JI_6>i_@% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index d72c0965f81a4624c247a51fdca9eebdd5e61787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmYL`%}&EG49CmYfgU+?FgFl#Y0E$;V~Ee8NlZ*=AdZC9l%O=Jk_-Xw!Rzq?9C!ts z?Jz69*!e5A?Br)-^*do(VK$i#v&P&o(Vm!9Ml$Qn3-h&TH_`_jJ88U@!8!p$r7c`YFKZSn zg5!pT)3{|uHgv)nrk={0a7?lhFbGmBX)GMi8&mHK`*9zS7WZPeFXZsbOl+l0E#T;xE06TlNsWE$ x8ZW@Kv!m~oU6_ZxZ3A09D0aH(BVLmsH=lT9sZs&q4Ol0Q<|NT31?mQ%6om&5deL?y70!bVJCGUcY1<{TM^8qH zqp{&6j4o*h#&R)A&x8j~N~~0(?2r~qq*&pM?Xe1D;RSA?u@%}W;f>|Q$?mBdBu9EIRSO>m-9XDw?pIbQWgQX4KH9e^lPRe)Ehmjgtp=i_C)N!J- e<=54VRkAAUtQrRM>FoRcWj=lTdU~Bd&VnC$kdL(h diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 99f2d0ab7edcde4a72f90dc5f8ea86dc50616a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmYL^&q@O^5XM)n2lpa)^57wN$-28OShiOD*Gi$qrBv}~>`vF%nuH`RdfpdMP!JCy zc=F;S_$b1@iL+azLw@<@OD4(Wccb#+V5}fpNDWy9rQ^1)lF7OJPCaD-R0WuyAj8)P!-- zAj2D`4cO-SpiS$Gx}uvAXxb7(nQ)Otq<+n<8&9U1O=w%{I};J1N^6=ygUr*W-*7MK sDG1Q>uf!4(Zb{XvdZFv&*<+r)=h<_fJ>}Ue`j0&OD*b1ky)8EW0JH3k0ssI2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index c8774aa4b23dae878b5c5699e3bb43a67e04d4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmYL_%}yIJ5XapDD(ta`o>1j`HDR-fTI4iHg%A{xs1Z%89_wT$8@Ib-%l0C85FUZo z>a%oq7s^OK&8NqI&EL2C4}xuvIcA2;0W)VB`^D@tnmJ;&%;PH|9Q!xSyVpV-vVYH> z%k3U^t#L_+FU|!q)wkB0h(Rp9{f(OlvmAb)55|&`HIc3`m#*t2H|VU7un2|8;k+&a ztgMpB@+;int!duCL`PIIOS2)Q1IPw4{iOOIKcxLMP3Ag8Sb0sM)X{n+gXS6)wJs1= zs4FF}_4>X<`T6XBL&-mSoh)XH%NJe!UYcB3ib%Zg-tmVK@8XFowV{#R?6eOU$KO{| zIDMIG{@tR7OWN4nP@&}M+Qej8)?Sw|wY~~Ul55j2&PK8e$8^>oB|qT`34JGfX)!lZ z4tm30#+}LhNqi%;O&2z=OIB5otq{Tv%Mw^1Qgfov&78BI%}&XRHFuSXZDJ*z?ecH2 Wz2)=4SaKp}fpkC;GpfDWa_|p1T$;@Q diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 5b1ccb2cbe29ade8d02376975aeadafd54c3690e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmYL^J5R$f5XZx7AR_}}VDOF{OehG2hoHQKprS$rF=EHa?xqjw(02r`XSkTK){DdP+oML05!w2|W>&nvJ_A|H64 z!upLBPk#=Uehim+qbQ8G!@Eig3&yK!bpcIF_geG>v=K^1B$g@%Y7)pY3YQjSDI1b= zV?p~zP$+F_&BUTbtDV@;hKh(^Kcq*{6=f^k;uazjvamu~NW%rfSj55^w#b-&fKzBg zb7?Yem5xZ2cl33_C8>4VmZynm38}hdh}EiSvDW$no?<)huH8+RBrW;?dQ=cR3F~8c z@hN-&Vc*2rigcJS^OKom=4XE9%_Es67KmkHmZ%Yhw23+5lo(BU-Zj}p;+uTZaUYq9 zH04N}$f5PxM&Du2!C@aR(AY>T!2+cd1RG);1KvASMcT4NT8GB(V5*ISmJOml>WF2)C#~1w$DibWtXP9fb)RR-5Dn8zg?~u(dZ?pj_g9Lo1q`zIsS$7Ds!m zq_K=tmGwetEV}x6w+WR=T`|%v8rV}k-H%itSmh>iemfo-8ADT>#0sX;acJx1D*JQm zyy{=UJ}NYS`&??%r|JM1FI8BlQKswv9g11u=)m{#>@oj%%CqM@`^vNTBFsMX>?Qwr HrPKQbXziJ} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index b4b475b11fbb41d6bae32006a74fc7a9b18ad492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmYL^zityj5XKJ#MXpQ>#n2^!F?TUZoQsX}*C-+uN4OxQRFk{OdE@i0wY#v7;pRp7z2beI`wryuZ)XQ~;( zBl4WUMijrnXb0nMh_{k<`(?D*j>1!N9y3eYRpgCL;M0)wh%BU*92L-YGZyU`_A{_t z49UZh@sOMGTUplSluE{oX`H}&(wYi_?xvW|W4JnLg;IoFuJVvEN*H-*w=0-a0c!!P)bHQR@4 zPR)oa^^GBJZH8$zwNzo>*s)7MPwu7bZS2BB*;~^udhvP~)bn5U;Mpi|x(g0mk4WMny=B5D7VrrOPocr^n7^cMs$(Yn|R~8nHv{6B|T}$m5P!CnT{++!MDeo|ls5JKt1q zk^Yd1+d zjpJ>r;yypil;t4`=69}m7e;YD!_TDy!Ae1Cp9f`L3|Ofs$_Kl_VG#H&X&n!Z)Hab0 zjbQbG)M|{#x|56@MPoC`PWsS`r7oaR$F!hTCKd1yvAn5R2>d!~I)+S4QgZ3&w7oQuv97XcAdLlAyAGSYvYgA!-h<%{ z9brG#O0Y^Vc77+xj7)eF&Cm*_)5X`;idFVs)`F_<&0pTV`RnuS<840unte{aKM#P5 Apa1{> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 25e2b2e9f40816734b6f2c27a1f58e59bd0b3cfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmYL`&59H;5XYmg2OCe`1P>+R;v#9&nK=wS)9bFfBMUP)ETed|?8(MxI%$&hps9N$E^=0smNBre^zzk=NtY`g=oAh!KUm&wLT=ijM{AY zi%v(r_9bMiH~d0vO)ulGFsTxxkYg?+FD4*mIhs5bQiyDUG4XXk7cC|qN;vI;X)wa| zcNLuJBFvB~u^yl3293>Y-yGAF(;aHX*9w~w7DlCRYySL(nRdQW+@=$2Vv0F_vAIqA zfnnw4`SNUkhawl*OYf3$w8*!XHcjelde&MrZVL4$3{j=(?Rw59dtJZqr3(Da)qZ1~ zE@AS~q-pw~dYz~?SW3Y>c{R3BA BnKl3b diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 712d001b48f3556d839321d2e778221082aeb1d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmY+B&u$Yj5XKEHsO+(44$}iwE9AxA1}SX1ZTZunNE;DF0dd466Jzk&E881E-lO6n zcn)5JXJN8Msu<}ff8S_kG$a2x+`nNId&Fa6Ks+F7Vi%u?eL@kBh&A!^9%Jo4e{i3% zholebrF1`so<1nW*vqz!Y^*jun1qqdg8z!k#3w8M0Yfz2m5|M`^&#q%-?j1oo)YXP zn@*^0(+P+@4hXZ_1i2LUERhVJ@?o?Sis=>_ZbvaBXj6bvA-qS)I5iQdE_M<73!K iaa2hOmmq-3;iw{U36e~4I?7mWF!|)@hbCLABC@|WyOSIM diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 48ef5c316ad941379ce9907c6c2a2da29bad4361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 401 zcmZvX%T5C^3`L7zHA~hkykG|&(pDAIP!IwNDo{~X!(*Gym^5W3sgjh(hwyuR3m$>! zhASOeN^D=>ukEeR7HfmqVRo5KW}j)4F^~M&=i2oAY2w|2iio2UAIJyetORXcO&I1> zRY>oVZ1WtTRw0s4rnGcE;y7qi;@L_E%$MC(Y~k#wu9d0M!qq1{VD(CA!kkns;YRtHfx$~t z()hcFP5&E_P%qw+@n}3;hij)IId_&*@fjaWzB6*hgJq?RJ%VDce4u!IpI>6O?rUtG h$>Y!#t~6Fl$Yv%cPk2R^{7()|rHRl@J6YOJTHhN+c8vf4 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index f6b3a48465ecec3f043c81176085898c6a876a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmYLGF>ezw6h2THxUp*)%m$)9?ydsDB|%k7gDMemlzlq#F&Ap zO9zAyMc{)D2>uE3FF`!Jit^;oezxCx-}C3c%S*Ee>>}U_U=?r)&;xiY0ha-f0sk&U z(MwoY052c`wjmFeg$>AoRLoEvl}hf@%HZuWenypMQWU5bvY}Y-QO+@aW2o@Q8Z|^4 zs^T3wk;>qquGtuGOlyrtvOsb92=CAX=0ov)VrYT#G`oY-4$g0*>~4|gH_}^cY5WkX z;E^Iib7G__kh7ni{q5{GXMZ^R!L{$5ow@cGT%0-k2laLdCz^=YL{;l#YM3^xVu@7s zJt!vXDXA$QQPTKQXCb|H_Qctb!9NM}S7*NjiqpXL-Pt3Ep7~SH_bJS$u03-0IQYjv zJ@3Z%gnB$n#ky`P&zvx^ATLnEYx0UJyd^3*W}+@oXP23{VDou=WhR+Kv(-HyWWkT w;|Ekwb*^hE>6jUmCuy<oM z2Ij&O@EklqnX-n5E|u=WER)ue@Bf?*u)WqbOWu;jQ#~_@(y4&3n zUs##rz}UhG(B$joJ~9th&rQ5e+Kb6vgE)xWx` I>ZiZK8*iP#BFUtFV36D zAt}6j;#tJ&IsRfFjI$al>l((e;JQYBjcixn0U8RCeR{{O^AYn8;Ayb(`)yM2BsLwjfj?_S@^qWk<(vuA}Mdvlpv|G9sPB#9mYRJ^RnQKm^ z)K(o;j3rZ}p`g$`lZBG~6F0Pw@ap?*K8BoXS_VV^8#FW_&9C$ER#U&H(hFxrjBH=F za$Xc^pW2#?9l~ruK5!iUEGIbF)~&95WRGJzb8}-W4TGtPX;F8cYMeOV1P!)br(u*0 lVH1ul9FCwrOz-iEE&Gkm!tvZh$a<>xB~5O)5)HB-`3HaYiIo5V diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index c26d442a04c5532f3ce66dc4bdfe879ee9b5dd37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmYL_&rZTX5XP(G!5%$(*t?lpN@K91!9QR~KnbbFqgy&Gi)FXjT@W9{NAO8}3=Tx9>orEK*Yo@(I={SB5DLD_J|2F+w#1Ua#i<9YoGErWqQ{C zp|pU~j`*6Z@6HqxQ>hDOhD?4Xy!0~#x}N|;c3j$o%)6o4y-syeo;5k$wq${%5= zje~&|GKb5Bu#oD6`NKOH;ZjzmaLpYiEDEC-!U&?6)#Idbav0Xb(C>5WAT?asf;(*z zc4@dk)?J9gqMNc-R_!N$+xA*Zpp7`EP9+xf4N~OugxzZMf)|(1c z)-I%VXo6BI5iFz*l-_hFOlAI{H|T8q)`QT$(u$0dve%NNJF7s-+GwJ+CxIu;H*V<5HE*%Xn4kEvrJevQ}lRobUT4Ia9 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 58e923e32de78b86c4b837956862e7d4bb254a12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmaKo&2G~`5XTKF2P{rVy>S?BpfbTRjg)Sh3K1GqiGV2qA#oaY3FnIKl}Uk&W}j!x^PE$AlwiRh0ZeJrtnI*x)w$6<=ho+ z$$*6GIXSjAr8DbvU>{}9e&Rgf$pYW9^V%8(g|QW*UvgO@e+_K9^d<|Bdj0+Qlxyn( z&U~R4_@pU3&aHwtdx@ufrn_!@N`V!mNt$AEfXNV&R1FUHlEMBUeoj8%+>!Am1?v=K z^o0yemO424Ob!n7B{hMZeq2^os>yoq?fe3M)!}!g7ioq{kDhxpnyF6YTc bfr5>Ms9jyQtDo)aSG&4uFU~vv;(PQ5meQw7 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index b4b79d1333c520f09e297f9c2665a760467f53dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmYL`%WhLK5QYu33oKTMB@0*GP@y?DA~kXdqPJ9)k~AuZs>_;Wa$@9TTeefR55g1l zy?7QTClE&ZH1^oz`G5KM+r3|m;uZ0p=n?zGnApTUu}3K4HL)a~Uohq=zaieeWQg#Y z-=KFP!6Y_%0jKLGLhYpBvun7)2feup=PIETRZ;bzsG#hN@>rI~AB(am_?TXSIw%{B zN-jt-RcWQH7&&8TlK5-$Rt-Xps+Hn$dOf*-=~%2%@=@k_t5VR9 zS#tSderS!{weC8lu!c{rsBLGn%nE+yEcqirPo5Mfa+`ajv>k}~N`;7N_`M!M|Np&> z@FfPguyeQ2wvnR$Lnl5n>!1vbTxcVW^4&HLtAW@qhaaps7>e>}!0+G^ErzZ6nZt!n i;#1bkDmwZ18{g8CAw8W9&T5BV#Yof8{{1>6)$9*ck)J&P diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 0af5897e07d5baccd8530b11c275d347953a8c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmYL`%}&EG495!$3CfK#2OmMmqwRK>G7X834NYRAKtUV{ohd^ID?4D^clG$V)nQA2nYW7>qoYx!dzuEIx z)M2-<)n-1bYZr{hF4S@ z>v7@=HO1pu;V?4-!t?^K=tVWDcq%;!NTQ^RQ3vA$;z-2teiTPhc+OQYvr@ZKdSeA# z&PaQuAw4?#dcWqlE@rYI%t%%OGUH*W;p-#+iwH1zI2lid|BB;w6rLE(Qn~h9&6j%? zeo&WE=|1F7(mL{kn{0%=|GY-SBUv2k+)R}&1oR%157TmHWr-tWD(_ZeON9B yyBZE5-s^{Vct)D+@)@b2sq)ZiciRa^e*1du-%6IVXlcmJFI6t{rk%fk;DR3^_l-gT diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 925ae9bd519d75e8af8f6869dded008c51434e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmY+9!A{#i5Qbeu5BOM#TMxqx1RLy>pvWXBf+h%+h%`zO5~n2@mIZs)nq5at-+?2q zfDm$f?v)ooew0qgA?mOBH2thakA(zRtX| z=X&4cwp33}EoqM~7?8cgu@|Qkae?HtH3@`6%q@A*cS=vhQK6g|S^gfJiy=<+d`Nti z9uufX@t%m9qP`DtJ&7CJQR7P#o=NA$h@^3;^p+CnOJncgTaihE6HOXgnc~(VoZL!Z z8{6!Vmy9Z;LNP*_C2&r9CZWYCXHsb2QP!#y71<(p|1Tt9DeRy2yUPROS`;2zzWrm=6V2t^Jns#X=$f&eXrmHnUTYs-iW4+Qi$l)ry-f8l zgt*oS2Wdev6+KItOTgssPuH#=z{0jS4Q#X_-U@@N{8N?BRryktf9K}+LsdQn{{TsA Bj!^&r diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index aee5c05d8e9ed0424e19dd5e5c880d7e1aabea42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmYL^!EO^V5Qeu14(t($TMxsXS+<*21Sdglp+S`zv26oF;^ZcS>)^Flwzq0I@d6xq z1(b5)$caZmd+l3vwyBhnKhN*cjA!QmlZQVOwg=26^PG9a44KYK<}q{3{Mbm6&+MNv zH>~;G)v;UKSY9}5^YobCVs diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 6638c6c01fbb470e398c4222cfe7f203446ca0da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmYL`y-ve05Xa4z1X+-n7#O^OsE~_OI-s*0V82tVnA9CSUohu+$Y;|bIbYSqiJ!S613fo| z)FQ*@PckGERXL`}(74iPSljyO^Ro_oHfHi;o#!dO#1upNFr^oH3m+ZTVK;Bb@Hon} in^OGoQR}gWHlQbko>rri#Oo1`l}j{J)f4<-j{X3m0+qJ_ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 6f14d323283d2553747c33807c9b3b84b5db054a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmYLH!EV$r5Dldqh&XZPU~a9D6K4rhm1PmM+l5NIB5D`J5tF!y!SPu3WJPcM1mD0H z@CE%3zJ_guGJClAR zO$+RGOW}`Q^tJ`;q&7(f-5a`Tn_f1Gua)cyRuYT8=~Ynds6}+4NK=yun=}?Wm4I(j zq{5IoOpos_7tCS2x>%jxtI84)pMgbXiP()J=BR#R>WtKO%BoiSpm6qSz2GPJb%TIw z<@vd-pw_l2*vU7IacO!l4PSuoLcy%thG90Dvhg@Ovh4YcWyjO_3xBVy@?#T9P_;&C zaGp%)&%XIrcw>mqRuQG=%bj-8u#Hww_jd(6w8|Jx+?5^15XPEQqFS}PM|dvA>>Q}E hG*Sm+e1+SY?FU1OV%i9!D|!3p_Al+jZZjZ6{{cx%z1#o* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 9079ad2140db0ebc96e6f6edf4efd523d01c2d4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmYL`!EO^l42Bmd2bLRW4nA;z!)!KbDwRo7l|WNfYD5$Q;s%qAyBV0wj6B|m^ga3{ zybsTUvnj;VCwn{|%m4V#i=+EY?1}JF=nGGU8)0YPg(JZT&xBjy_oFO};-3qz9`Ey| zcuBW?#I+`=EPEGY%Eo3B$TFsEO5q1qtge^p3sSPdYp8u#qe?4uPT?;`ze^`ro5V=@ z3}YZxlT_QK8Z~uN^PnN0epEBu*j=gmU>G&@%3fcU$Ex=h%C7F7NL-frjdW3SGCn!O zfiz4Eudqol4en9$eEXOZ5C&R9QyYGo)P z4?oYx>hw^zQ*n!=E`1f2*4G+N7nbv>Ysfe?4zx}hd~A73TiN1TO5 z*Z8Ju0xq0{w0e(oy4JlEPgEocxyTC?uP{G^tdK7cpNT?<^c~-V3$JW2DmpJ=YMdt< zwN)_de*IJtCKr2ZS-bcZ+Ac7^&GQi~6?09iwE4%aTzkYf+on?u;eu2v;jDK7bJr@X zm4)4t{6FXg|K$?AOK0b^(|rT7p-7LNW#|0Wn>Blh+=mxyqqH5v>QebYvHY}{;%Kky zEnSeuQ@e7twvB|*HyzW;bY2;pI^PBfcD*S>S&U(umQQV2X7CyWNa%9`x3`=;$%KF- zW)BWvTTHm4g8?fuR_258IQ@cWWXW&)SUIY7gko3>bKcnv_G7#;Y+y6fG}#S4`3pKb BtWf{} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 9a59edc87135dae644936242c290dc2c0f68ace7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmYL_!EO^V5QYtu1ADAEau^O&RLG0H2`JiROA9opq7hLEh$AL(w?-R#WqT_s^+3e~ za6;k+j{t{40hJqf?+frO%x;7-(x(~E%x}%i-_?~51nm-X4e276kzJ&*m&ghtkSoYO z^5+5}CHkw#-HU{*qJNAY)9pX#TEi3}TV?6UP#hYoymVx2&1*UJbZ17NOY4-;DdgJB zC3Od~D5!knrEbzL+LNWRo{n6uX7qlQJ328bMB^uPPadkKhdvZurjW3tOIboW2i{8) zev5S&i*|+cbYg{eh499vuw{K^;i-XvXd-1?!q}b7xll!Hs|^(Byb`&j6Dj5?gwOT6 z`lLPyKf_u00fWVq(<8gtMzOK^Qj>zMqS4N1d$|>lS@ghYTnEQEDsfJa%iS&up>!Xn z2f{k(vuBeb?JfJ7ardRA+j?qdO6Mu`UMU}qi^__E4vn3=6m;1>UDoNtBFt{;8=Pes zhqX0mLUujFYup0{*pBawEcss=WZfog6>Pv693L+v*u&OQ!%>s0_oEl|k<`*IjyE=P rraW}wZk$9Ue5&8#Repuv;afNj=i#h=Pr}FWJ$%K&7fhUE>6H8fmhrgW diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 22ac3959eb5a50bd32aafa77974b172bae33c5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmYL_&u$Yj5XKh-2bLS>9_CaP(OK+G5s{N^tI`IwBI-6x5fUdS8MbbA?Un6B4 z5WE5hF70!0<}sKghm8Ew{LweoXa9Zm>}SI9l-XhSndeNOSw+dbV6K=SPm<&-=al(sFw*eX*BKdSgt@9Cwp)xZ(SyTbX zPC;5;;)s@JwS}iTl7d|12Pod5%s~hxyKh7;MEZ$u!Lipi)H*t^;KBuhk-62-zvEKA zm-4u3w5hYHYYtg&tA(xz$D|tt*R@;fIrKNa!W?T8;_o17XNy9FIqdF&?H32DVa`L*OTXYpvg9`(Q97EL2%W5x S$uzl~JpOt3Jt6z>EBOza_Ko`h diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 2f129a46480be03af882412a288b033217615693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmYL`!EVz)5QYsD2`o;WIm`tKgx1)OC5lr+p(ItLnnq2EdV`HK*{-$TwRYDLNPUGK zd80lD&%h%vj;S)zr`ehLcRaKH^Zej!i^+2yGfzL#+_$N z%e7P78=FH(;uud3Os(O`qwGovotX43V+o16|aj;{w?dd6UCJnJsF`HJpAu zFDG!{lD-eU0*?OAFOP*WLZPsxYh6^CX5T9Zr@k*{VL2-&`^A$e4o{4xjcL+fEv@2d z|F^B;Qjej!=GLJvE|*hwxYzX?ZP2obuFP6$k;CCi`f#o~%N3g%+qfKby9-^BjbS(z zuk=fLmZC`DBP2kQAxtSu_u&X`ZthDNl}1#GUys8pHaEDIo-IsgD?Axy%c1id8t#gn fqDDKs^B{y#ltpRS|8QY>Bk3Sj-K|uO+64aqXnwU$ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 529c4ed924e5142d75d91cd1941dc289496cadfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmY*W&1w`u5Z;I$oP!6?9?FA3(H?td1BTh1BqU}f;NqC9B8Z31Y}siu(>-+e1_L>$ z@8H27dcU1= zXjchuYzEZ9dE zNMs`vbp{7$50%i+KOf$1Nn>P%(wa%*Vq@h}l7X|)aBsM~w4B5|+A*5E(r~8@P4CJ1 z{iYI1_nYXRx zjd%_YJPEUDs*LoL=j(6H*nc0~`JJ)dW*#!nnY&EI^fqViGas3Mx3cUTpZAyv3pm{B z_}JT2Zz$M=F`Eavz$S^4rTBs&TJj|rPc4dgj?M}Enb7y?2(69@Lw<%Gg(POt*rj;0 zHc>37gnWJ~&TwP(2TG}KP`4sX`lpje=8ONgP1D+|?b?r>y?j6)M>-NgX~ zvsd)Z`RrtNyx&$0Wd4>sugP;=c073ErC)STTR(>8T!)CM{=Arq(Y~*r{|5$f>>FBI zZ%P<_w<({ybsDYUT!-)+NK565ur*1oRQA-n`GK30+gI5^n4@=>i69D>}HCUtRB vs_J3yKIs**QWCDNt|i+GU>5;dDgVKof>fg}g9m6|f?jE%&FPWVM}%i3hL zXvTb@JvqBgGNyE%fC&nT>SmE^?m`H@Q1np diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 2cd5ab3d993ec5c4863f5fbaa7c79cdcdfdbfc06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmYL^zityj5XLWv6kJIQ#ZbeTI};hP&Zz@!hVqyN>wt0yLD= zG^r>qRq8wjU38Da*eN{P-_FeHo7H?b_wW9WB<=_gg(t$UFc#J^7w!q~gdaOm^ilEy z;h)rUHgl4;F{N|sbYLINo&Cajz@q}+v-8>-1*NeKqp!HGk-r8u>t_!Q`M@qd;iYu} zXTH=09;`}_nN<+a-{J|M>$MbLQ(y)CB;CX01*QW?`>H>9oIHP)#K-arW{!-nDOjiA zv?3EKg2k#K2V-AtihajLMWL75=B3P-az!O$#?&atsL?fy7X_nEhXxCq?@QCOuH0%B z1d3-zv%{^gw3o!MtPw-9!MCNX7{uPwWlh?QAg{=I4wJKNio>mLz3FFmcxZB4Xj3W} ze$pZSfN$8ayR~p^7gX!-3~6r=&+C<=8mHDZUV&L|T0iNJ;I^C?cr<}@6h~eAw`;Gv U_Rr?N=q`VC?M2sKb(cS*|2#&UY5)KL diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index b03c2b1736da4dee4511f9fd28f47966c535a707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmYL^zfQw25XJ+7fs9CO3}yp?OHwE*DMb~~B19_+3J8hGO^(#mwIkc9fQ^ZXk(pNr zENsj?1&3AseXoa5YKT|s`a$DG_@ znMI3@l;#$U)79z$B1_L=dIQ>UB?IDKL8`Q+9h2~w9%YH4p~7|df?mOhk45x^SqMnk z^LMGYk4gN!pj_GXDm$LrX2#M`Gid~~N(bazbJLfs$9fs|%Jx~xgy7_0Fqlpa4RN2@ zQly55crKHSB|t-9!+?Y!vLr)o43zs-Nn;f?a40FA%)|k);C9YB&Dk4%$#ajDv>?&V zQ;K#iJlgG4FfMB(>N9P?)~~}Bt>}$(9a&U}Y#>)icg1mTv2P)7_{X=L z!&X#_Wl9SR#tF3=L2PMzKzpE#P%6m7XyR0V(^X8uj<7e?UsLpyKcN72kI+a0`tzlO|zS>45Y^jGeUm znsJe;jMTHG;)#Ey!BZv@FIMR>j!Qma9B2eA4M@aB;-1tkZzRG~niqzESnhV(oo11% zE diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index d5fe99505a0004e00aceea0d0ecb69b4bc5aaaa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmYL^!H(2042BDW13hv^D0gt_41-uQGiU|upcRZLtAda?g^o$Xq)C;y%kB{*-T+SA z*f-!*UIvvn!P7mA<^X*EKyytwI`NuW; zxW{R4D|PCFA&f~8{3omkjyLcYLp0t=p`C9KVvW`Uo)NlTJBmg{!jPU|>jS|$YO{eS zosLj?DbnHr;Wh^d+KVOIb=h*+A{09puqD}w+ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 66101213dba4827335dbc41f9e4d07eaa196da51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmYL^&u$Yj5XKi;4lFm$9DGN!Y_>s)oCcLYO;xE8QQ0DnOtMqQt=C?Sy%FU-xbYmk zK;MHa55Nm_Ha%qIpT{1LN8k7N<>9YP;y`#MjD=^yg)qc-;ZQ)~xo|CPpJZ7l`GxRL z&O`mbWLdj8l6LWQ*xz?u%;vZaY!k(7$>E093C72XaE3ISdC@tdNVH=1|gRSy;AcrB+l+i{OT7-P9ztBipGc+5=C( zjWY*c0EAXTTHqPHFTjZhVUlW9OTWyA|1+A2|K8g99N@Wz+(u&LIx;}&^9I>LIC2A- zBmb@hL5cPzGP%03bF`Rl`k-kJrh?#cS=yk_SK3G?Y%ntVotQduJR>iKu~Mr9GNqS- z*o7zxBHlZp>a>L=w@#SwM3mY%GPIeTktbDV$yg^4j-Hbfv68ivJmpR#5YZ?mG$O1G z>|qkO@6(9VaDZLN*l=YF?zBnZb!8+RF0@fvuDF8Ux-wG?531a>lyLi4qOyu-f{X=U zCNRkjmrB;sd?tuw9Yw1A0R5IW*;bxFm50OQ;n8+8)}rB|R=5(*ur6^(hYLO^3vAeh z>4F<8Tsj%|NoT98XPpZ}j?`4oq{1(sJ38=COZQAa_#!c_3yNsqO zgWX-IU3w>F3?2amlw-V~MweH;G_KvIg7z4N)6-1}YUm!;FszC8y5TGGOekSCe{P_2 zUdRsuqIQeMErz$3&-ucw3*4@G$uRI=E`lj_{0p(9Q}_)|G@|OvWJHM6$E%0HxG6J*A2B5eGr( z5&oE}fVmTp4u9e)ReCmvdoq%MM%HLx*21g_^_FP0H?!|qmLACvG5692Bct;Ia{u}I zWZ_tSzTFpaGJSuv(5>vXHltG79mS8DTH(rVUbSi}6=6=Y6mX^~T3J#c=q?0T8jTKd zXWrGESIZp%l}-nTgZ-t+dM!(Lon?0{=yt-2BYXWeG3>Gf#aQ}4vG*(QV|zI_6MjV= z_if=u+A0C25GwHMoqAPtW|6T~a< z1Qa|B-2o-twKp4dLX7G?rJPfR0asL+_;H9ow;in8JSi+MA@B|Xh>Z^jUF7qbm@gDsG z11F8oWUx-Ktjx7h=degu--B8x5 z43)EG;lI8VY@8l<_T%1eZ~HS~y~g8?HI$4-xh`ndKskRDnbfAmhN*NOL;G;hh302p zHS!rc*fv8uqKO4-p6U?yv(m{7y4K}hFjGvAzFlvz58LLg_&4mJLHCijZ*impTd6f_ UNgVxon!HXPqL<0z+x>0y4|rLXa{vGU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 4e1b326ab8929cbb2482c4d84adda81ac28a8cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmYL^&q~8U5XPgZV2++W>`~E)N&Q2ORYYyAXt7EZ!9!WwG1-#tl-*5jeGff(^)Y+` z-@%*j;Y5WF``a0Y?}PcimgZhOu32W8S!d>%8dFxAS!Avln(@4Q?hDK(&-{LU+@{r# zBQnaN_1cE|*mZE$gIhFKk&Z>GX@Foe%yYo8LtU=z|9TTb{~Cv69JFkzdT>;v77~hu z-@b%v9H~+bC(>aoDq*w*VHKiX9^*=7Ev$y2e<7`d#7J#(>Bz+5IFkfTs|uZp3nfX^ z`kkzkD_I;)WJVNpX%M)l19s}PkSRifa!~q|MvG#lN$fo5Z&lP-J1Derlfzu;Vw}l5 z56Glbb1a^-PV?Mvowe%I&`}Wj$D}ze-!>WY@s6`^40EaUp6F)MSakb0Ndu}=U76t# p4b*j)dP=9Us6Hs?-@z$rG=JgRggxa%6zl}szW4q5_Wl0h{Q$u~hqC|x diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-apps-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-apps-menu.mo deleted file mode 100644 index 846eae9b8ff0b5e9cd0d86bbea14a47b06251803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmYL^O-lnY5QbM#!99BRkh{*Btte&Nidd}(7FSt6z=Ong%to@wlB9ke#lN5z{cYa# zcQ~s;hdj(=cn9A1b7}51qM9X^iB)2r=n_rk#3FG_JkLbYCG`d3lV*Cqchsge5O>z8 zfIiBdy~R<0gE5?;^U9ixNnz8OG^h+gJ;b~;u+TYuh zZ?^fitc23Z$W~i)XXHdkgaSp?Tq%PdS@)>~opQ6Sm6<#w*2yH?Pt_TFDzA$3cz7_} zn`TTC9`~)GaAf7NCa-~_uGLy7(_y1hIFF%sS`45))isuH(7~P=*|9P*W9@4d;#^Oh u&@iyB@)yc1u*J{oj?d2@?n71(;hlQfRL-afux-lHGwuZ)cV diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index b6c70f95..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Add a category-based menu for apps.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.", - "extension-id": "apps-menu", - "gettext-domain": "gnome-shell-extension-apps-menu", - "name": "Apps Menu", - "original-authors": [ - "e2002@bk.ru", - "debarshir@gnome.org" - ], - "settings-schema": "org.gnome.shell.extensions.apps-menu", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "apps-menu@gnome-shell-extensions.gcampax.github.com", - "version": 59 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled deleted file mode 100644 index 2a1bd6e9a86e3921c2e4b617889a86733ad87407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZ<{ODxJv%qwAl0tp};0by$}!32Rct0)7*e;|O!`GD2L0L6DMQ#}Pz24br)crY{o z={rEo2*mkC>3ZpT`MIfj#TltNIeMuTC8>GEnfZCedWi)E#k#qvd8I&Q8q7cf20;1_ z)Yfr>>;jp?%23Ae0!Rx2C17pJ5Oj9T4jkB$i}= zlmdZ1&@uX8$LNC{qmOWmKHM?-3=G9UwIF}P#dJ&Z)6;WOVUD$N%qg*RGi2ak&`2!S F1OT>sN3Z|@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.apps-menu.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.apps-menu.gschema.xml deleted file mode 100644 index 6930ecc0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.apps-menu.gschema.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - ["<Alt>F1"] - Keybinding to open the applications menu - - Keybinding to open the applications menu. - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css deleted file mode 100644 index 16eed17b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/apps-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2013 Florian Müllner - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -.apps-menu {width: 26em;} - -.apps-menu:ltr { - padding-right: 3px; -} - -.apps-menu:rtl { - padding-left: 3px; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index 4f972cd7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-FileCopyrightText: 2011 Giovanni Campagna -// SPDX-FileCopyrightText: 2011 Alessandro Crismani -// SPDX-FileCopyrightText: 2014 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -// Start apps on custom workspaces - -import Shell from 'gi://Shell'; - -import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -class WindowMover { - constructor(settings) { - this._settings = settings; - this._appSystem = Shell.AppSystem.get_default(); - this._appConfigs = new Map(); - this._appData = new Map(); - - this._appSystem.connectObject('installed-changed', - () => this._updateAppData(), this); - - this._settings.connectObject('changed', - this._updateAppConfigs.bind(this), this); - this._updateAppConfigs(); - } - - _updateAppConfigs() { - this._appConfigs.clear(); - - this._settings.get_strv('application-list').forEach(v => { - let [appId, num] = v.split(':'); - this._appConfigs.set(appId, parseInt(num) - 1); - }); - - this._updateAppData(); - } - - _updateAppData() { - let ids = [...this._appConfigs.keys()]; - let removedApps = [...this._appData.keys()] - .filter(a => !ids.includes(a.id)); - removedApps.forEach(app => { - app.disconnectObject(this); - this._appData.delete(app); - }); - - let addedApps = ids - .map(id => this._appSystem.lookup_app(id)) - .filter(app => app && !this._appData.has(app)); - addedApps.forEach(app => { - app.connectObject('windows-changed', - this._appWindowsChanged.bind(this), this); - this._appData.set(app, {windows: app.get_windows()}); - }); - } - - destroy() { - this._appSystem.disconnectObject(this); - this._settings.disconnectObject(this); - this._settings = null; - - this._appConfigs.clear(); - this._updateAppData(); - } - - _moveWindow(window, workspaceNum) { - if (window.skip_taskbar || window.is_on_all_workspaces()) - return; - - // ensure we have the required number of workspaces - let workspaceManager = global.workspace_manager; - for (let i = workspaceManager.n_workspaces; i <= workspaceNum; i++) { - window.change_workspace_by_index(i - 1, false); - workspaceManager.append_new_workspace(false, 0); - } - - window.change_workspace_by_index(workspaceNum, false); - } - - _appWindowsChanged(app) { - let data = this._appData.get(app); - let windows = app.get_windows(); - - // If get_compositor_private() returns non-NULL on a removed windows, - // the window still exists and is just moved to a different workspace - // or something; assume it'll be added back immediately, so keep it - // to avoid moving it again - windows.push(...data.windows.filter(w => { - return !windows.includes(w) && w.get_compositor_private() !== null; - })); - - let workspaceNum = this._appConfigs.get(app.id); - windows.filter(w => !data.windows.includes(w)).forEach(window => { - this._moveWindow(window, workspaceNum); - }); - data.windows = windows; - } -} - -export default class AutoMoveExtension extends Extension { - enable() { - this._prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces; - Main.wm._workspaceTracker._checkWorkspaces = - this._getCheckWorkspaceOverride(this._prevCheckWorkspaces); - this._windowMover = new WindowMover(this.getSettings()); - } - - disable() { - Main.wm._workspaceTracker._checkWorkspaces = this._prevCheckWorkspaces; - this._windowMover.destroy(); - delete this._windowMover; - } - - _getCheckWorkspaceOverride(originalMethod) { - /* eslint-disable no-invalid-this */ - return function () { - const keepAliveWorkspaces = []; - let foundNonEmpty = false; - for (let i = this._workspaces.length - 1; i >= 0; i--) { - if (!foundNonEmpty) { - foundNonEmpty = this._workspaces[i].list_windows().some( - w => !w.is_on_all_workspaces()); - } else if (!this._workspaces[i]._keepAliveId) { - keepAliveWorkspaces.push(this._workspaces[i]); - } - } - - // make sure the original method only removes empty workspaces at the end - keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1)); - originalMethod.call(this); - keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId); - - return false; - }; - /* eslint-enable no-invalid-this */ - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 2fe2c7567f2a71de3f6ed9503dea23965a536d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 zcmYL^J4?hs5Xa*SB#mGvSZuF*#$a*82cCL@;GrC+woWcg$y98h}AYShyXH#>>{Ne$2r0{ zg1lhvWBkB~pVNz2*?nD=qKH)6DRZ`j+*2*6vu>%Jbt!gPUDK6_ZZfG7!2=R=(PUIL zSejCHpc%Kn6=_1k-70GdscA*UNkkXgv7$8*5O;lzR@r`H2k8=M77*X_ed_si(kGrD zc*QXf<*tI#v?hV86ts{5F}Ef&ujavI-)Ux^F`eN6DNqhPgn0?gFlDkJ+jHaHwYY`H zZHO7IF=z&)6z(K=f{^jt-%vmxbSo>B^1s2!g6A#@j?VCy!xmnv(dR@f zMTgU*-TpTIO{TB|HvDF-)}Un9KM3&Yj8fW9uQy&pVIb1$OeY d`~<;He)@JzY{xw17eAxF?`+w*dAl~5^9B7mwDkZ0 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 735af54a7c5f69b2f175754626f51950d6d5e681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmaix!EO^l42HLeN@%5CIQL*~An>wT5Q!!UBD850iKt5&BE)Tybv8q1XI3+ls_A?5 z5qjb=`W}6jdIL1aTKeR%$F_dU_b;E{L~PHPL*^Z`&-9qaa^?l|ow?nMqF?L}n5Kcl zZC?{U+Mp<4vep#k&i@pft83^efUD=_-(E(jF@51G#uYwRHi|}8QT!kK|f|BzE8~e@743)nbb33M|dY}3j<+U6XAvMMfkIoW!KVQ3J)^N zS^1=GYE;)S?Hpy3;J?#6;bo0qDMag8fnnbe#sxWtbeD*i&k-6O6NP+Atq%#u(byV4 zb|&J?E669GaY{ezQi`WKk%Foy_pvCks-Qen)rYr5Srqvv`2}Y|b96fSpx{)qB?n_2 zl4be@1LCAz@;Yea`Pekty58J3M`C5uX+t<8-6$BX1owX<45GhHYdytd|G*yxtq-%`Lcp8MLe zQE+f$Q~nJvh$*aNU8JXsQ1uSW-urywx}Y7N`_M!M+^(*1SoL8&4qr3u4xxP0&$Cgz Nus1e9#}G*3WRKs(n7;r3 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index f4c46ebd2c5cc1e44b32a4a6bb799e47fe7bf8a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmY+B!EVz)5QYsZ67rE=In0G#VAEX}O6A0*p-oFvLQNVX#BE~_j>~2@+Fe)85uShx zPrw0j;)cX)aB?m@3*$s6Vzi(3|F!c=Gxnc*TVDdI+r)k15pjp;5KX1TUE($I`&JOV zqkEfR6d=3G(Y2{=p2M(G7^K!*VdhysXJfRkG&+W~dwkwK>%q7;yzF1R3Wqp1*0X^t z%A7r~3dcq!hA_QgL%c4V3_Fn?V~DtT$~c_}_O2>NaFkX&w6H&FGXJZ2Fo(-=k$coteDUMGOa%(ub+4 ztW@mO*qMt#&sWwZ`)yduL?;P{XTX78lSGgdYZ;M@8u>tQewggR&dyqQ644~~HgBSd zJtqI89lm8}sL`%J*|@Y`N(Ho0i?a!ODX8J!&%5*sMavc1%rFe_L_uwxQ{iO*2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 3f954b9088089d74a7ef403f580b8676bada6a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmYL^&raJw5XRlAm5`5|IZSULI>9DIL{3r#Xh2AWrcsJeZ(Hx+Y_WI4?z;SW1kgXQ=!rOvoXh_P6uRXhxd(zxwJSV7+A4n77Ppro+rNWLB6@%+-q^_`(sG zf9&}^&v964Pf8e-IR!&&zESG&SmGI3r;JV@9MRNRj{}z}iTh>daBR3d{D>p^uI5en zL3m1FJBr_7)WWz4@ov)G-HdjcQFtPp$FUXK<-!}Az^TebA#Y2s;K;aZQ7Gu>Y~gyA zOF+1Aa6ITQ zZ;2aGcwn?A%`4qbd1p^IeruWwrQ48BgmvV*pT~#TTK3IXzaWc!of@fhmO$&P^5HNq zt;q4v*uo{Cr_ZVDZnt4!yXzX>bRphohv#@in(X5I6LTqYbw?04cEX^pe%00AdiJxf VenVaTsb}|f^@H6*J$vLocmnGOm&gDB diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 22b5c550f3be1eb9b4275ec53fadee22b11cedcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmY+AO>5Lp6o%s$NH&67T^tt{i`?-hGvb(;)LLz&(7|CGtM0r_j+xZt-f(YHtaMRb zbW_2Ny41fgh#M*DUr5%1zr~Y`!{C93^O5(xoRdEn&wjKh&JdT04snjyBI=2s5Q~HZV~fvb7>IY^*%6hY#5Z_u^X0?u#5f zaJk!I+-1&9;9bwXb)C04x3}mOHr7I#MC3|)@T}0nz@tf#s=YXvK;O*E{naQHancG@ zx~tmD!Gtx7uSQBm2}W8Knfc%A!4BGk&B6NOR;R`7 zdrH!gwAFq_Yv*+GjVuwd>_IRQ+FA72k2-4sakj^(($R|J3(8b=f$0-{Ej@Ftd<` zFO$b1kGtHnpRxxiQP2M6P+=J7&~9~Fu5Fbc%4zwnoK{EGJ1Bouhtz(pK9wis)GEI$ h+Ugicc2d3nC#sIhpVjB`2g$$BM{laPG(4=1t-nPd->(1w diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 0f3b3c21f3fa2427fc451cd2ca3592e670192e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmY+9&1w`u5Xak(fXqek?4bk?igcVABZS#(NMaHQWXZCwdbM|^(mP2{_t4!FVou@< zHrDfjlV!m-8tM4hWDpJa_y~{6R?0Vp#|+XqO?jO1 zLOUhAu^Fr@JQlh@3vZ{UHb<}`+;r_wR1=|vEybd-a+Suk zY=lHUMp0$3(J0wAHLMh6?$`F6;1l`3G=qtZ20MeT+sl&0IC^6=okTl)s%c422fnP8 zD0L6=sjv=x|J`_-FW>6gUH8%QEuEX9)G~wRN$I1ZYOGLv+t|uwpzAJm{j>*v!~Qc3 zPx_EN??o(}g;}@==i&SOH2e&gK+idZoB8Lq7OumOFk|7{KPh#uNYYg39N7-98z&Bk z6IyZPmLMb^;;qe_?HOgO=5SUYz{IDVwLZZ9Mcj~!Dj;U zhz$g$kV)1WVj^LS#8}QD+0CS}CIDQPI#4R=l*=iVP%fvv@&E3fq4$JK()d-|899gy#Dgt3+ZNvEE!-f0C6NGJc?RZX$+7 zb2Ru$d>V(=iQ%K(E Ie$rg;FEB>myZ`_I diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 861b39db10c6f1467bfb2e38476c376cca9211dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmYk1(MrQG6o#uPNWmMgy~w?$rgd{8PSLq3gAHr#M7&Fz*kyJ}Nz*x>z$fsH_8dNo zr&Fkhe4LQ{C;9*HgPku2Y8yBNj)7gE2h?fw5F~(M^Tjv zCp3C4Qj13%KM7Mxttd)#sU%aCl1n%e)-YA(%)*@;i9#ETCuJr%?pIlfV@;78-s4Ct zWj&4u%nFJE;f1=)0y(#^!Em3KKm%ZjTI|8xNJ4_BM;{{sft?;vtU0|*EO@;jk~ cVYUtzYQd#NzSr?ut~1b_%~4_4Qs&zE0aVn2tpET3 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 23b60a32f0420bd3743fcde5f947dfc401b482ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533 zcmZ{h&2AJi49CNlgyw?a43ascl-X&KO14{3N-K)GVzpY}iaYV9S+dC}&Y;rw;Lf}7 z9^7~au6Tw+PgwcIc49|=E59Dy{jS9B2#RS9m;kU$3 z#Qza5OWhU*8{Ql3$XZzTfz+pzzi@{wjVY@|P8({AKC}8GW%el=a4~I3^Cg9#>8em1 zj=5S=mvYf_cHZjOy<@#f2CBt-y`-;xsL^k*kb$Od_H_M1H@h&|HO{7aT9+0J2HZ*69ZGj}Jv!1W!mWYh@hZYW z$!JHt|Lri)Vl_XTpWF;M*{Q4J6lF3|^sN)gMdp0o1@v(W?ImWWGW)PP)%!PfgYq?H zeG=PbeRKx)FMO#Mq0bofY06tR5W6wuSu=%y;Vi<_8BC^?I$Dz>e+7L+$m9a5rR>CD RDKL=yiXUPqnJzE{^%t8)n_d6_ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index ef288ebbc3f0d9e326d27a8cdb61e5ced56ed383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmYL^!A`?442BB=3H88%GY4~qly)2#*@gyVlO{1Srh*VR(`H#vnoLPLjR)b0cn_Wh zw;X2qlYd*b^!xYZ;5(w&Cr*hA;*jVQP0WcS;+a_OMbSIeW8#N2WqU_u7k6a|i&~3l z?(C;10-KiXRXDG#;UJBz1oJDQH51z)Of&ZJLaeO|Z04mZ*?lcN%Pog^{=^nyqnaJ| zfI)ERq}eq~DZ7we@y^Y8nx$#{h(55~q464nbsXMsqhPv0=b^tPov20+Wra#7g{^Ms z#K;<@V7b7G!w3UvG|&$Y%hu%3+hr))ablg^U2rInZBPqSD2!***?9L}mZb5>8v2X; ze67iFpf4}i8kOlmu_6;93|{gH>+bd%-%H`x*c7%@MsnzWs1VO}?NGCcb(QB})@|zt aogVzlfq}CDWW6}LTPg{)L2yE9jQ#+{S%zZ( diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 7374af720024f59709c2eb475bee501f0556dd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmYL`+iuh_5Qfc3Lb)i2ON7K+RjrUik}hK9-IPKPs8Ux%tL1Qsai&?fjvd+F1^OC@ z3m$@}K)eRe!X$gKBYm2gUt{YZ``@FxKN-ax;t4S#?hzM6AD@Z)gd`piSHzE7jNMRv zNbKBZ>@nr1lu2fkhUo7b;&olad}WY*bpASYQsK}BR(W@YD)RH1e?T9!vjQ6HTI6Ag z#&G-=(e`pk=GZwO`7AWL=5JO_;0q@psowE9u5~}dPh>;^MOKV>R`Bd4cV9y?w1?=vE zotC3s%t|UZf*bkrg!L! HQ%m+AOJ<@j diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 6ceadbe42f3804afd925cb9b756f37e7de14365a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmYL^&u-K(5XKD!2}K|zZb%%48x``Bqy?31w`!p+RN57*Rrqtnjc2`196PcdM7i<| zJOb~)z3;)JASUTyKk4V0vBsZg{yw_%i;;GSC&WH+mzWcSz7qEcK|CaC;^!^Keo%Zs z{GkrGzDLH61CCUm00u?%eKU5!=b7m|NMAGEUtDC=6}VS~nS z{2tK`*8y4)BKl;7o%4||g3^+|=~dvRDadSQbR(fI;SLIdw>vfRL2_<$A;MQF^J9;;SpGpSsAL=Ua%g+gAUXbU(M zR)-B7N^)wB$CE4HcOBY^Y_{zMNRccq7H8Z2vPqh}b(R*RNv=8?HPV_dIwQ25LbVyb zjlum!;{-=~Tv4QY0zS0Uu-D zz{hYm@8NT}^i<8F4}6^egug21&)>)QuNl=n;wdpD9uODAP+y6Mgd+BcOXAlZ#;&M8 zBL0znLY?1bj3lEr*6_cv4z-3=?~r{C@muOtjpLZuGKNd6vpCn{6UJnNmtcHoQKSZ) z6Zj*eAC42W%6h)SF2pPr$yhCpdXvODNZ`v4Vuj!BU=+tHqlBugrlPDw`G%yNRxis* zS@H{&vRFsulT$fF31?~(Ejl=&GYxMIjm2ir2Zru*MIG9A^p!WgGAP!lS_#M4=TtZ3 z9v9VkFp45Xv-3*O$QS2}lU=S!QS$e}Qy|*mXGcqBiubB>6l?}{qhi85|F}LC`#ayT z>lULp@paJF8wvXxoB7i9Q8{rMVw)uRZXDCRn!&A{Klku#4wDx%{zaUj$9S7}8Bp5{ muZw9>akfH3*&FMx`t8jhgPtA64ceTx?&f#hAU!G>Jo^t$Pn}u- diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 49d0251d3dcd3e68ffd66f5a10eabca98dd55847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmZvZ&5Bbo6vyKi$lVC86^^?Z$JE>23gvb>IHR4RFvU{q$I{q)dYhRvDM>1hyBQZE zh&wl~d;+z|pa{h`$bAE!#nW4KHXiupb4SPb}jZahVXr z72<&SdXBMIl&=#T=NY?6xkH(j8Kp9o_m#1oWze4~WKWDebW<_JvUIFx%>fQQ?_~Tj zS|^Q8A=hSt+>KEwjxRmx<+6i`a2{>c$EmTNcU>+szB9`mAD9%P-UHsp7jk)&-xnTJ zsKvE}#|<7=p_Zie>PDQzakNjj@PQTDDdCMxp*?b5_^~t&I>yP7%%p=&qI9X40`QE?@m|6h9wsG@GC+dlJLt;Eqi zqsc6(JDQSwPu6cwm5{m#!?Caqee2O+mp9JNEnSSz^0pqDOzJ#^#&hYTo|;*q_^z=N zmx7*_rEAriu$s2kG~8%Gb-fuq<$I{nu3n;NFq0mVN>ZuO&fl+j=#LcXDP2V@d@7E^ zui|z15k7~X;XBYU4~ybmScEwXAO97n#R(K|iuc8F@ir_VoKoMnFsIHhG@h_O#o^FP diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 65ef68e370ca0db7336d47f2e4836afaefb8a1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmZ{hO>Yx15QevWNN6ueh$BeD4TNS%wn2)V2K6hgsx~4@Q`#Gt_29U8?Un6N%Kzx0 ze~#bM*^N+6ywanwUytn>`|pbrDBbn#SHFLj}Wq&xf{>w*e z|20RpGY*~F^E&M*1@o1q?9zvyv5^&Z)0oYIzoshTiNY@wqVZ0EcD^QzOR^T}cOuu? zF`rZ8L&9m)M&bTSM_hOT`Rp^!>6dA9@K7caQ1;3J_DU?bq2CuDhwpo={7lA#iy&RJ zGWj52&nW{3OX-xQ06QGbuJ$+9I9*h}{=_?+UP(>3AXy8TIBiW_0>Xtei4>f2rt&rH zko$VPziUn5gWhZt(E0iFWIEY2*Drecfp^>$S99BNxruxH&{%2Q2&$zFk<$2LafHK7 zUR(7K3OI3*4sVgEwR7zZ>OOcubDMy7QSQ bWfE)`gQDb>e}8bEZY|f-J%674_sbpt52T(w diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 41e4064de33349f863b92472691906c2060e7f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmYL`-EPz{5QWX3gmM8A+;TD8Q6VpBSgA|eMJ?^Ntk@N+ZGc|lCWF_h(Qs)BWAQG6kP6i+Ensgr-Ljghh+6puJOC+kIEAjF^4S8Ud!~2%=RG5^6}owG)vQD z!78%w$_1+;`5ZoY6Jo6#oFBhm&QA(BxVqhpLb+*76%RF$w%90RM_t&ye@>OXg`|4?GrgnPnRxFMVgy?qpJ3R<`=tc9Ofl=?1u zOSpSgsr#Z2MJ2672J7byc34%g=q#ysK78g@mo$W|=E1M2jCfk%TMBHvE1-71A>;>(dO4=13t~Q0qg)8P}%5mtD=c^aUjI*SMfBrZ2@K9jSmk%g31Im_LWnxX5;% zWTPxg&SVNMgLZ6n^r3(w?F?C%bsR;BVZRzOY4b00P&eAxwDipjX?Jy}Yr-YzrhxNS zYIz0Nd&a^3W_Mz=hU38yr9RZ##sY{xOwW_q>1?_^d6Z_!EAQl1S?*ga+ef+lX=`QZ z9+WE`nBwHk@)&owb^Q^aDB#qUzA~;ZVE4krWNy2lEgt*OZ~?9zLZ0M%uyH4k96Xr7 z=yCEMPsmZ&{KHB7|0yuuNuMR^@bb5=On^YO)oRhd3>85ym%jpSB5AwOYp?zSn~h9`6(^l%ADuTteR1t5nJH|+wEJ;@M;#>G|UVIj( z?V&j2$IOJ8;ro6!R=yLCWoDDvV^*0CGmVm2WA2!*r6hUcyw3b^&2P5HX%VMY1;fTr zQhN7B-tZM1d1-@@(Rl#_=_3qfQw6GP=or$jr^rU< zTF$EzUa+c>if}}7BA_3lvszl{%w|6DcyuA6GGq4gdfE diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index f960d1b2788aeee14308a8814ec20caef642a381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmY+A+e#ck5Qf{tKo|ruxy?o8E+TDahYd)tD{7)5xMW#Z&z|lXGMqy_G`@QDOVR{0GhDJb%yFY`k7zCfO2NO}5ksyVxFtWqsf3ZAxK}uiGkNMRH15D>%gPD-rA( zedFl?4ekGn{_j^nDI1-Rj$UN;w)5<(v#gI7x^H;n$Z9_~2DKf)Y>qxq99~S1<<3iA zyZBG?^2p9yscofT=SIhDY?4PKkDafB0^4+H7#0IqhQm)5J`SO`ImoW$-#~qG}kc!>rE(FCM_H%M0QzPh-Ybop2+|J diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index f0904523712196585c9147429d06e5ea4691fad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmYL^J&)5s5Qfc{gxny}&`?Z|);LazXmdeuU+APnSh?^~vau)59`>%ayGC#wR{+Je z`~(zHAt;deCpIVXTNv9&8R^l^J2SgG@87#Ozjzcki2KBdxJAr}HeM6A2|?T;&WNwq zJnx*&djwqX?~UoCvPVZ3?R#B3NmE!aH+ zwY#m+up^b|RH}@_cqN@5=amsTJJzPK98}p!I~`1*Pp9F;e?`^{h3QP9Wv7X5e=LP@ zWRQAKQK9Kg#~M@VU>J;oh&sJwr@Ar;9`tK*sN9@Qp}DBH^>0c) ZdCdjYIsr8BtKME+!k=$c`EhmW{R6GmzI*@x diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 6bba61a13a4f7e96e434f5454a98eeed584d84e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 zcmYL`&u-K(5XKD!3FT73ffEOF1631}>=r6-7Zqq1E!tIAOZaodB(teo$Bt|Vv3(ET zpwG}V(!K}J!X$0ApY-!*k0;U0_}`NUe;8?pct#9~hs2EN^n-XrNMe^bC;r}J?2`O3 zF}ly#Q}Q`Eg&A3|?ti`Bl_g)c8re7NE_@>k?2n!;oIS@Pz_f&~=)AH<@XFX4!Jnbl zfWHHpF6^TvHr550`%0DYzO6juR`6(X3QPQ@x*Rx`0R_*JYzWB!l8mQs#30>EvLuOS z(g(<$G+xVKo#3CAFj4%_2kB~Qj&40(skfACs#aDAIm%ja-`biowY`v9d8G?tHAIE18>%!=d#@TTl^OBkOgfKY{3V~j z!8Wfec!ds5Okqo9D!~tast_%7>!gN>b+s4VH2u+!vk|}9j$au5e9Y6Aqv$()M1$_8 z>4n8o1wM#}aYi?H~01 XykAY&T(f+=xeiLxyPDgmp#b|2F{8Fb diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index a3b0776240ee484fecf8ebd14dda45e94972cf41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmYL`&2AGh5Xa4zg!Y0|aYSftfRLBnZ4T9@soK({s?^XZ3Li(@-HGGiwO3+*KDp04SH+c@1RjdF#m z;U*t$=2Msvx@rS`3XTUCYdVdj>aI#X>HV$})|AYz=F`3DJk65#-mzQ0-uIU8AKCl6 z)+*!1P;C?ijFXS6nLOIp^)}W>a_TBy8>dS+x-~Ib*p8HyGfzz@!L`FQOo}n=hLhJ0 zP9T3XPQJ)XbV$3GSa_^Wgu`@{7Ku39`i|clI)^}ierx``fNWFGSHB={4eu?2z|OnqIU> z1PS&2YyJQg*VDk)8UL^)ctTp%lu*OXypt0dPH-r8d&6Jy0Z zC+inz>dLPOuw+{W`O>x2Y=5b-h30l_ErKzMA zIqZ$4kMG$fYPA2u4-Hn*!%osovN(DOEx@7(mmUQr9aLNbUHmPW5)_|(e%R<2#1f68 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 542f0c8d14a123c6ff70e5d79ca20651e9b03ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmYLG&2G~`5H<)TD$zy;#{C;>EdG(ofY(#W4oTAxqMsNHUSVhcwIIWv`MnN#ZlUMXVeeuQ6Dc!>lut zT9YkdyjIqKT3d&WL5ZrWwUPrv;gGA0>`;-miN zgHilV%*c@2?&wmvfT$rEd>EvhI_3>gb*9LRi_-Q3wdjIE&AEpky$IKu6PwSBqe-V6 NIEAuCr2|Jk`Uj;ItRDaX diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index d362336585c391df9fbcc10e22c65e0b4339a52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmZ`$&2AGh5MF*Np_LF4S2zqe5c1+|bEupKm6D{Yl!zz|KS$j4)N$+BE8C0Oo_GRo zJOIzad+;pG?o#E%NZ-zU z2CZdyozS)I2wNEwhJ1y!4~Z?JHi{iLIe*2zr0_w%rE5+%QX^ZV+zL36)>MWr z9@fEMlL3E}f{e}=TH4(-d9nH8bTQqT8x%Z$?;W`!88{4B<@lw87h@Q_8s%Tu2|5hD z<)ueu66_blqNJ0%9h{{bOL{uj)Sk@$nI#V$TX;n){NH~1nPZY#Z3HdLxV|&-Z7rbo qJwHp`cJ5X{Zt`sEv{WWQKpkYZYQGVbgx|jcN>B*&bI+xWamtdVVx+L)&T4Oz(IUzZH)Cory29K+!bPn(3 z5JaCa4<*Ud>^@C5X_k>ZFVlOs(>zV%edat}Sf-s~-q@0a{%7d_g#K6Pe~11D`ll!> z=UZ5QB4aFi$kYMCv@9NMiH1p))TVie#kA;{0J;Fylw`XBD{H37R11Y!Wc-c;m06)F zH}w`eiLqjxRua+0v%T4L-CmZY@nfSsX#C~J7TfUf!QX8alX^tzLuMWL$&1AfE!J^E zH*dhwsjdx|T9l+XkUp+dXPKfq#x|}bx?Q<$l8?y6c5+jb8xxY<8pW@0W{n2EFTv60 zwHY36ne~z>yxRp0_F`I<0WLksk|NnmvN#I;$!dCMq5qDfJ3Pidi2M~tQelpUVrHc3hBk?jD3`Vtkb z5TZf?u|SCT@s4NVX0qspD}6fl(XoB6|6aRz!l*6~*NFjfiP#~!dP7_$Byoi}ApV?V z>?7$_;^ukAZjjz5C7Y2ftGjPmkMbNQZH?@eHgD}*X1Ls1Ha7YIGsm}c{t}I?v=UG# z-5|Fm)-}fu4pnE{V1jdP93R=D%K78Auzaco1mov?g72y>!=Ffp0+J{h@F?N&J%}O^ z$9JM6ih>G;$_Y1#7kp7oGXAXk=A~nQqqUm?~OXAfKXa z1U$o;!S}GX&=&W#nf)&+pu}LbJ=#1QDGsAxLo1qvdRWYLEV}f? zbc?T^<+@(?(eO=`>AX^ffYn*$f^pp%S@SJz8Y@7}ms^{z45449DotZ}01*hdrPhfjN5Qf8-gmOXR48q)sDu-m*Wvgt1%12u&b;W8~K8|>kY1YNDBin((kqZaJ zu{SOtuhbK8o%c_K`MTAQusaTtW_! zFK2?_E#_;;)w4mcjyc1Oa)7Cec3&5Fi-JrW0l_n+Uz(cb(3K{bXmtp=rF#W^3fgcb zQ&LJ*0W}K{g2Isn*~*4g%vjLj6l$d{9h;ID^j=dMI#VeLCy(e9Uh%e-K42D7(u;e2 z8V_jFC&?h~$LsOnRvhl*7CO^R8o{j6DS4c0R?P(z!{Lx@zJ@vK5SjnfEyJr?fKVlu zQLd^xxI~r>D}l~{RVjJMWx>fNeg&7!5nZ(Pmf*&k$f!o=aG-Pvkp#P%P050XxZo`Ra zG!t}3>B^);)?I0`-iVwYvo%SsXC%2X3ZK(mkf2YWW7qzB8`8fWC1K#*iFd!f`{vzO q;@u~|{NUYZ?|%B_d+*-i{jqnyy!-B#AG@v}-C@~@CpfVh5B>rHH{5VBTu@OVFLt^YRd&-BdO(%BVzpWhm$=E`_15u3wzmS* z*Wgun9G-80Sd+fi@9{$eQ9xyMMG4qJIVtV_=JZ3cWlvy)>?q%68_D>jf zKg*u8KW5M6jNM@UdV{@d8dz)`W?v}W#7@^Zq%oTZT4SBWWg|Xgh?aZ_##4(TuFyGw zKN9-B9HG@QVaONQQAlDIjcvsHjfrAOCFJvuVu81|mx?o;u!KSuN+|vcP(@jc-$*58 ze#NVZWzar4oha~bWC*4y;59mLZ;BJsYU@TdwMQ)WW}^*?CF-_>(?B{|?P0nKC(e#2 zn4PACRmf+Tv-8~`Y9#Yh@;m`=`Lp9QC7$PP=d|?`s8>2fOx365g*e>l`lEfvAkKYF zjrFF4!)u%Jx!VNo#07;mmf*V~jn%;fwqfqPy{v`h@KA^|2y{I{1V-pmkgFHKTHA#;zJGM&CM4;W+~GMCJcTS7D( zA2auF3-N^G5l4O&91iN{9rP;CVNn|rpPk=^3Nt#SLCn3oq%6vdTz(=SN@q0`*6m1! z4H+ZpdnDUE2iReV5MVZUfx(IUVG$ix)azWq9u2jCkNE%X=4y77MHH3bu z2kM3DE0s)nid=fM!C-V=!zr3}-vnrXc{r|pZ-oXq#R%)LhTKKi)F<3#iy8}(OTwLo zceO3hmuTVGRlH!v=l@zX4@hPgv$GqA{hmr*JImI1m#d1GjcoK~Ww5kk$TsK$#mUFz zxg6cpbvv)g%QKs~ytIXe(W;Ee7x|Vf`D-&%w?$Jn1nHosM!jJ&H?>D2&z;`|4YoR@ zVUmvF`Z{@L;pqhW&&P@Q(BP`wn=9D3rfK(>xBGx%R@*KAr*D57iZcAGaa-{h(4wcQ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index c8db26963140dd4a76b8bb346df3e9a5af35b455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmY+B+iuh_5Qfc3LXi+sueq3eG)p!tqVjf854332u2^jY^pa^Z&3ZSnBilig_dvWI z&%z|Rs2J(f@3DS+X6(NQPk$?kC&DXXCOi|agg(9t&jk`*3OnJ?Bc*AB?jaD(f1?u;sc&{u$Z!+W{I1 zk$tk^*7=C5P?-`>yDDJrG$iZKxZxkBx8g^NtRYLY8KxO#nJjgdzE0n#X>ujEVD8C= znxgX>F1vlVh3k8|BZ_de@6#}5$3rI*=c^BL&Q={&j5$-IVQEWeIT*5VG`Nn<^qu|R zs=<`WYPmXp7;QR9lQU;!CTZfnl`f-9_@=GN*f|ti@`2;xOMZce55B(HJN9^P3s)Lj zX*j$!FF4>dJs!`W-R<9kwZ*(*-Z9UZ8Pn^WdBG^=C3DH#K4IAIFn`(K zW&8Z85bO#zgZg@dK9(gc8-wDz^H)@>0*8>q!n;c>f}ED}3_WRQbBLB$J0IknDqYIs zrXsm=oL+p9OKf$2NS>&GIb=ze$~2Sd9wY~O^8QW2ie`#}TzO^5sNj4KUt84HLU#`n zG)BWAwdv8CU9uQrO&|D*tr}IKT%o$oVOpS3w$ue2hW~Z?M+0w4O-DvkpqO0a3tT&2 zVa&^>NDi8!`E-7|`BEAu(I;mETJG$o=GFuL3U6zpv>ie5Q+dKL{eVg~!hJY^K~jJahV9x?y(zZ?&9`;Ud- zP_P?q*f-jl*0Aawi7z4kOr6@$m?p7|;g&WT=Ndm#Og4B4#)pxg_nG`qPQ{A4 z5Hl{4u^Qj^CgD0rD3;f_qB}eE;0KjSLQ^#ptQu?%p+1!Fsy9_#RmGJ`8P`$y?S1G zTrB2`i=C*ttcvsCSq)$DtK%~>YkS){W&IR3H!3E|vrp?wJlgdQ*Z!c07k(48^+v+c zciy~oeN+xFLu``--;HUSHB;DzvsWHo&Y*rhExzJM@)WmY5Qfh$kZS~Mi?x=Gn`ogMBYs6t42BT3b-f$Ui<{kJcOzXt6|!^PI6M zHqV&9g;QwL2xX;k+Hhjy;8>o?_z=i~`_Xa8QeQ8$l11!OQAb2Tn;_bpY>GrEu-Nmx z?cdH^DMaR9A15v0*EVX^{+-1F^H;UP1979X1Xp%=?sOtWtjZ)f62^k7>@?TuT)!^c z@DL2Gsz8Uaia41&h@D@T9U~-N*QRYbQAwWKO0i77!wM_=UfR1$dr#Tlz4~~0e!ILy X=^>N44{7%??cL<@V|sD_Tk3rQ_^hxq diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 1d85d199b512955b46e2490301b6bef3a2888118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmYL^OH0Hs5Xb8aq!+=nha3e-ZM%X?*A-u@2riaoeH@M3vDU3gNzz5V_6zs~K|H7z z4}JhYjgW8RwCiKYFEf+;XEOPk9)GaV#*i6g0hvH{kkXEjNrWL&$QjZcv8*ffv&bjL z%jgYyT-GR3TG_9%)hHsJJO%4O$iB*052{pIp%iD(({wwc`yf>!ctGq9WI}4%R&f&1 zwLDg|EATknr5zX~rHF1Y4FU08e}TF_^?c&hgWBSp>$$GI!<437$+$|H7BV2MKB{HH zfrKn$14fpz$~&+U>)eT98Ebf)vlwU>*g3xSn+K%N?DlrM^*^5Hxc0i>8aTdknc)~3 zF7$ksvV=EC@03Xey1Ccgr1gJYIn4=3+TuMCB|HvD{W#HfnC6nDbW_N46%d|PscL!+ zG7Ot;!#<>2z(Eeb5(L$G?@tBjKem6`lwyp^G2FQvro%!i8}AK&fA%i2x6kdLeow zDs3gwNB3SI?}`GpttIu%`ODB?PJJ2F#=8s3qh1#JEBR14HqbI-O$9W=EZI`yeAMeu zR)s!o%b<78K(hIyw{%r?ck}`y8OYLXs?&+iCXl`{&jVK{Rte)5BXT09S(h3j$y mjT`FEvESvtg^A@vZMg-sZAq+_BFMlH(b|@yWNnRy%Bnk%N~L4~ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 1c9860379d100eb46ef3ab34f323fd71e4504b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527 zcmYL^v2GMG5QYr_32hUJhK6D)8sv>x4iqf`C4mG*?UU_|;HpHF zsdEiaK@l1V&*04iQ1ckf28sLSPh*dMkLLe<_trThtq}K#0dbqyCwhG(?huk#C60)L z8;s4V-Xj9tA5i^6l@7Z}^y=qbYb(!T+}6n68(X=V%<%f@*vOhA%sk)A`8%{u8J$9* zO@rK(Sl1jsdDMN|K_i_<8;x;htmi{lsGM)Nh2s;GLNt2I$9SxID}NBi|c_}pv+o_jTsdA;wF>D-C-k75zMG@3He5}#+ZrKf~z zvsx9(>Q1{aEG(|Rg`eG7cM8-w>CVC>gp2>)AN{>su)h?ete*e? diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index cf5202e23767af882d93da417094369a2b7e9da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmYLEO;5ux3YWtgQ<$@w&+1dZ|66R&q9dfElieh6*<-pyX#FZh@fF<|2{jtz&T^ z1iPnKAa%<4QU&WIf3$Uuiqe92{kp!gHJZpe9WC-pS}=O4G(w81l6;(3=y-SAmwZvN z$!Idz8i*so`qq$g`s%ADErEQT)}<;;htG56Jciy=I)r4)Yb3p+gMpdbtT0;gU(jAZ_1wNuvfT6gKp#J#k!2x8o7uPKI_Lc{`1gih4CHR`2}to Be~$nF diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index b7ac105e9e834c3d3879f3742ef9e57607727de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmYL^K~ED=5XV=8iP@uP4&zOOQ+KIAU0Ndw7$S{JS&8vB?i;pCx9>IYy%ONYiIYda zgC{UcOuTvEdzk$wPRpT__j@z{$$yfWe@~Wv1QHL0W#NVJNazZ)NQKA3fiQd!1Yae$ zggdF_&F3U7VoNC)Oe+pjYfd=#xTo-ltt*XAARO?-SdV>IlnUQX3x}DJcKQhid|J*- zxJ{lDSdHRW7`?`L1LF0h-Cl{-+EKVq&SPdtyNbNA2^USH!I- zd~dX8Ez6uwWLwW?{^g{iQg1>&Bp4AG5_Bof}o^B7x4g(uZI018cVT z*X)}SRpkXk+*%9MYHF#%U1P^C0X>;Z*IV6$`?B{;KkdcO!=R~uHuc}8zG>>~rv5#X Xx8LXgB{cP)=Ju+of6X0IUk3jHLBgMU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index b6ee69c56ff45eef56dcf466d4b02d868b680887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmYL^L2FY%5XV<*K^_!AJbIYBZ2FRxQa6pH))tBl4I$bd-M%;7yyj)+vAfTjo;=tO zP*9{$`WXtM;^*)#cn$dwotGT)XMfDh?#%L^e@`EM6RaiXIkV0zGY3qi56ojmGf$W^ z=JRK${Zzh3=QFYj zjHMAuKfpYf_$i>Ru6@+Qf?SXtZ?aUrE{&IcQV?|yWe-1QRgZk511f05jddBX$$AWp zx?0p)Jy&OlppP6WMi30ujz8<*`APcm(5G zBm?a{hSt0Op4?pYRc24o$z7XJnpvY@^CSyVH!q#e09+C%+prfjKt*k f&GgSTOn-fy+!e%r3Ib?$lP>N?{k5W&OA`ojH!_W|ASv6f1oM zy_Dh`c<(E$ui>+JW)|54KhD?xgp=g&&g~zJ>=yBW7!r4gDbd+S;w~YHd&D{M>jq4EMd`VWbdt8`9>Dlr=HE7J;x&O(~`eK=an@X=nyTi zu`ckLuT;rjww32gn?W>x!xwm=IvGEb0W(NNI^-hd$q3Rk8;qWcRETIQec($cjn^_* zm%(A{R4qNMzo9d#^)QiC@x}0uR5YY5LUXgE4Hv{E2y-h&)eVcNe-)Jj{~>UVs3S zQ@)?4U8|RgNh09tYNMlu*dt*=!gOyOec-RrpxeCJ++wK$4B}y&M)XmtTwezTK`MW_ X((9k>NV+o%-l_HX?v?&Gu08t)I*F%t diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 1038b36a644b4d3cfe607ee1395cfced227345ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmY+A+iDa+5Qf_m$lM6=){DwTfTPfL!DwE^?l~fGjUYFQ18Ah-8XB@TEiJH3sVnSp5E3 zTYc$ahMVX-9Jn~>v>o(O)1uO8W!qOYYnq6S3gy)?`WhPKvq4P47@0VwMeB0MwekmP4 zHI=QEX$lx$sE~Z(Z>5p$=1Eh#LajCu^8Hkd(=3_m=uq=B>snuc=?3Y`{R!NZ! zhASOeN^D=>ukEeR7HfmqVRo5KW}j)4F^~M&=i2oAY2w|2iio2UAIJyetORXcO&I1> zRY>oVZ1WtTRw0s4rnGcE;y7qi;@L_E%$MC(Y~k#wu9d0M!qq1{VD(CA!kkns;YRtHfx$~t z()hcFP5&E_P%qw+@n}3;hij)IId_&*@fjaWzB6*hgJq?RJ%VDce4u!IpI>6O?rUtG h$>Y!#t~6Fl$Yv%cPk2R^{7()|rHRl@J6YOJTHhN+c8vf4 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 60625c2a13d2a03d2219ff3b87738ab0d035b50c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmYLGy>HYo6b}d_l#!XiY#?w*QUOQq4wa7cdw#ax=kNVFdukqmoCKT$Tn3y53;Cv@C*Xr8sgws%B{La;~A$>spK}T4Bn{m6RI?mqCkz1Eya3^a*pY1Lxq3Vs3qD^ z6_4puDuYM5VKu%zYc!t70>$M6Jf^Rhcg1&!p#{p*>^e?+IKPIn8%3U9O0TY@@qNgG zCyEHoiIJ*6&VF(Bm$ToT{o(8f*S&Xk?z*4wapdf8G}t7ZXd+$`RjrblVcM{YB~mpv zA(?1qq@j31N$XP`h49YVeP=%fdq3zyXTOFL2cgz?XLrGS?q7Yq&p{u!Zr9npVDCZc z<8FLUXuz{ntm?M%l@lhG#S7H(c(gHETQZm>X?#Ztpblo;nF1LGh`ci8go!??wusWy z3?EO{ac}A8Ie9@9UK5q9nP>{s+his#`AiXx*QIK8fy6Xi^)T@I477FFts?RG(kTi7u(p_ycqWGmnuIQGmX zNSuHRYESeTcmb40!LuCJ$|pOq9sB=#`^I_3cAdGy+-GhwBc``0bBj4<&aP$I8}=K_ zACCE~`q-^)uc~0S)Raw~eNT&khZVje=an@AYGYeM-;mZw9|D>F*+VORAeYamvo7Go z*Q&xN%i81I3dpA~a7JgUFU4mvkbupie2B#kmXDy=5k+~g*m_XpNBj%Uoitv{V4Z*y zX)2-)P8zCOc}g(yJh~5e9aW7CgN1D$bDyb~vL>99Yz0iDlc7;CYTd3@1MBK_iGbGS zlf%jWT2eVE@~76Y79Rew$-l)cjR#2ENrDrEnxet z3i(tooz!?>UF!vyZgutJ%^~~`#|G|>p&aI~@i`gdJ$so)_Ec*1iJ%;8 fM~dGe#Y=W6{!a1N>h&Uh{hZ<#PMoLslM~rLvMZ*G diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 53fadee03ab172720caaa27c8077cae456fd120c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmYL^+m6#P5QYN+3FQiL&BbsHQ`{gy);rb4(_94ZRPJG40t}KR)mr=g)VekTtt$7^=9m+<1lRlSCqEFF@e{|y>kD(lO7ebO|asq$^`B1V2c z46T@6Fy_#jStWdh86@Lm9QUXzwmOj>-9UOyWuWT;`?!gf_ z3HRWQ8*l(-15!r*Y5dt^dpmL*!NNq9JR^>iZj@$I(_~ocNe{+&Z{4M(yEsCa6)ok!in?$Noi@J za+mXmdjmVV*SBb^U86%JpEla6wAC)PZh5){TP4He;o;J6FU^tzXW1xscGGa{k!^1_ zMr!*FrZefev+utrN7!H1bq>zS15yg2 THsDE-5vOzia9fgc5Qfc{gnU8b%wf0{RT~_WNU1{*5L#5J0V{-$Ba1ya+uFOl|*B5n`^;tFv41!^OdOrVge zLS~j&mJB~wl&!p0;ZCnV24nQC-~)3t*H))oTqPP{ww?uU2Z!Ml}r-~8%ptFAtK h_sg%oc=wYODm?b?w|A%AGnKb$*FfS4wQlAFe*lZ`*@gfB diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 23c3eed9feb1933db15f068a0742b27541c0399b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmYL`+iDvz5Qfzgl)Y%7*P%?vO-q?Q#SkOcrKdOqY{ximlglXH$$As5v`BJD`W}6P zyjPy3v+LF!_|VKqBmF;meDnOb;CRODFg@l4GiKVjU|uqcdCgoi4^M>n^|yZeRESrc z$Gmb|@X|$lUl(7B0_JN?;>@}m->4;Zr57`2uW1?ZxWJ#}d}WP<(%72NuSjd8yFjLG zd#IHU)&-pSvMTWFy7aiP5~A4&&gr&lkK%U~NJ5_GJxp`V`j8#S?BGM1rD-(g zTX5l&@mdAzBurIUDFY*`HNONO&DAFR+{uWoD?jm&Dc7nbT#%|I98FIqhd3R>Dul+% zB&k(!)m3MG`S%;A;a;DF>)#2LApORWmm_PzK6buOh% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index ee8ed6012e1919acda96561bdeb55e6844778bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 539 zcmYL`&1&2*5XaRoD83YOE_9A9MO)k1L(sB?ZMq48EOj^T$FYh%^(vJ|Mv_aDC&)RF zcj$ZUd-R-l=%r(aCWC&=jAj`9CH>iXd@a}>G0&MP^MpBO2K&Z5Wi<1QIb+%fLR_%l zVQx5n!Tv9MUg9A$*f4LjMP0+XwolwpI` zO8ga(hV1~Y4iSB_#?JXDSD`VreAhQYmQF!Ze2{DWX@*w$UPn}rr}3vJs9Oc4i?AfvUR8G$1+Gd~N2}$% z;%t&8`;J&D&pz+?@W{g7bXFUhLAB97V4Qy{59Ho`-=N_;dby;^)rJ}cd#5HQh3&nz z^1%5vD4=dk!#tnCZ8(2P@D{RHv*fEhL_&XijlyAVBJ574lbkF6-}NM(Tb46EX(AS# hquL|%q`_~0H&%=F=mOMe1K{vAW=J4`;ot8TU34esbiQ{x2MCaTN#;|LzY%hXz)QA#M zrb&@vFUcE(CqaG`W}!GS@=xE`o=^Jbd2Z$*pqeJ;i6!C#(IM*U6SKr2fm146+G=)K#VbC}F0!NPRrR*4um0Beb4zSS1v7Qw&WnW5R*-+DS|9}nfO4dVc zi#tr98O19sYP04l#LXmbEk>>7DBS1Pv7zD0X549$K#wbZ0pH4;8`zabLMIm_8wS&J z?iwSVuailMk_%)*Nut+1b!hG%R?o7^U#ir1^{HrL>-?Jg+z*oF9082IY9um1b-Phb53U;XvtJ6}Ee S>cLn4>c8>5uYURQZSVs32AXRC diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index b9e15dfbc34ef7583531e0d47b4ecf37ec000b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmYL^&2AGh5Xa4zRP6GL_{Hc9C3GzyQ$Y++1{%31vns% zz3~7J2jGIljWMR+^Y7m6D}r$gd4TL9caSmC#Rp^y;mBQNfqcC| z$R+B1Wa}m&+o;>9SSBc|==!ZOp)h3?Aky4<5#G82ulo=%*sO8Tsoj?N8(WcrHE#Cg@Z=?m@!gFMU8|CDAq zWPSD+^CwxBjJfl4Zn<`fdt(`l;5CdCuVIgKlmo}TY8R=oav#lFwpC4>G+<&*dHrO?8zrx}|wuBuA`c`wa&(_S)F zt>uay8CyFBx>;@AFdx7=9cp+ugq=Y`VhAz(jp1huKOly0arq@KyA@A<$M7qLs~G;o O@I5X+V}h2ApZo{jS-gq> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index e5ba1cb3573a82805a2642f2ee38feeaf0914f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmYL^&2G~`5XTn^67r!)+z=e*LX`?_Sf@EuPFxD4l`1tNiUM5O*vn?q^^Uc>1`_pD zsgJ;c3opSVP+o&)VeCsr{%Jn{>zRK~9{gZrd&F~MNIWDiiPk<7j|fRTCf3BSdyH+# z?-Nh&Gxm&pk35wbxz5`6I(t)=FmJ44pU_{0S{ABH1DknVt0MA?l7Cb_7<3tEhn3=C zrL5)ZdsMD1hh(m5^pQ`4HYI=C=)f14K{9*K=jy9zXZS=$mBBy^hFl!cM`0$0FGVUu zaw$XP3ol);GNR95W-xk~_`6#T4S>- zhs8NR-p#cee^H*FxdKb$bOy&u6O);3ytMoreHAirb(e}^I;qI+Oim@0qH3ybx~o>6_lQySM(ED*BH&ot0c?g6?DdW zx^%Ls=y5L{T^ml~;sag5O%n>~TzKGQ!X`Ooukj;{@dDNH$v5hys431Z`j+~_*OJ3DNTEbH?{1A1iA*%a#COyz3jmO*{i+p98Xh~F`Yc0S$zf0>ic$IJ8O>Ak8fVeyI49yB&~+hOM(zWcOOqR~@Q*1|gQvybaD zdT?JC1bhQaPjzXkMoUf(E*l>gs<%SXGhg$pT=M4JJ4Xq zAruCx#^ZqVWP&H#;a~V$h5ZbQaC^SkXh#hLTbc^J+Z0e&gHjZG2OVs1W6d$PTGrc| zoQ=D4gM&p&J2UbNKX|q^1{KB8QPq_Aj diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index d2fc41b13a847557d0f087950917d0baf9b0fc3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmYL`Uv3jI5XKD!3GE9K&j`&UJb1H7Q>i#jL<4PAsS!~Kf8M~^9d_M%?bXAaa%j{5&UPCri!z0#N zmRxZaxhCy`)zOoJg^m@r0hZq0cye1fshgdAW15(5XvUXZ+3FJI8g;E;PWskZqa9zO z*p@8@gp(@9CaA$+Luv0I^;8Zb>7vcG-`7yk#IN&JvbbEF?L80EEP3l4o8|7d4YwcJ z`k=AexC!Kyrhsw!aeXe2_vbnn-;v~*%Y9*7so;2HVzRU?X)Dh?)j@%4`ZP>O6S$Yt zmkwqyd^JhF$P08x_k+0LUUyT0@lkrnfB(PEhq$%eQg15}r-jLR%$k6(BrR6mH$Z`a R{Iq|5`(AUkjkc8+{{TPDv-$u4 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index bda056cb39b3f2782559b15763861b59bba734da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmYLHOK#La5H&vud4pihqBcYsp&tB+#H1$<3Lz6k%7~E}K2n54V^^FG?QW~P9TCVb zXJCQ2P8K-@N8k*UZNilFR8`N<<$l%v{pjwGfZ`6}F=2ynk8nun;uGOMK@c7gP6>Z* z1;IDU4+--2@ZNXIL#7wMvL%X|!+z%ia#IT}g@&6?()pkh{FigECY&G4_f`vt$5FUzG&!fE zo;T#h(;l8RN=QA0;zU@7K6|^IvB^r;Svp3`_H-j~eZ;$A!UC zdPv9VIH4yu7yHJaD>BgEX&CI3qOGnj!GOi8Racim-esu}=&!i`B_*vMN(9vwwhjIQ D0h7WW diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 3bb78650ab860c75af1dbe3b915628c41cdd4b35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmYk2OKTKC5XajW$Xo=^g5|+rkRE$xS6F6u;zms*ki}(PAIG#a?PTI?_tM=XMshF_ z@gjK9vwnmmc!&npllPu4;AgRB7Fi2^)T8U)RMnr$=f4oNbI28>ja)!Bk=nM9iwH+9 zAv?(LGlaZBe--JUB_u$HDsvOjz}!sNa+)y zO|E1FnN$-&&9*2CDqdS5>$34iVyd*I1C!+`y<296j#UKS@F5+ES9#q-?{h062wB*s zETlmIK_?1>o2Mtn`j8`70G5`Z4%xLBuW<($U_0h3arp147q{!MQLtXXU~g|O!5+4ZngBK7a@TuC z9|$S*{CGnp(%eGJZ~LJ~+-Em)NAA!ayOZjm`Uvh<^>&`RQ#T{->woDXxbNa}H^G*|wH&c8f>y*&~3T-OF zO4bf4={(tJOtrBdN3Kv)yqFgbb0Z+i?r}^XsyT&M(vyIMB}d4Pkte{I;GKPzFc#f~ zTQIj$yHa{%1>71(Fjj98dhem+C!F_-N~$uRnCdL}bupI(VNS9V@KBl$IfLFZmz!a! zobNBX*w|v_7vN^m=w>uny@kgtx-{C84hg>M5Yf}8KdeisbQdOX(mL|#V?M;r%GV@) zC5r<+F;k@r0i74+qpX};S>n*x$_dc*qIGGz3(GRy)oIH2;2byz*wtrg0<9M4UV79F alQ3l6=ozm`lU;s9W@xHBwBvTnqqRQ{+k#R6 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 278a352fd4c6424cccd1ab3940fb56fa8cea5d63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmYL`U2fAr5Xa4zge)N>-jH~h7bH-%#&#l6oCaFjw2IWwC`qAju(hYort2MRcO6mG zEA){AaF=oo&cG2ECsY~fr}51EJ)Rl=dG_#U!1jQ7!E~8N%rVp2H|8-TnWxNx`Fk%2 zez1SST;30Y=j^Z8b2?zRvbNvK_KE@~jmF>$*-KZ;99N+W#+DYCdoe7;XS7a{$)Ge; zp>T85THtq&rcJwWf;Cw$My^za_}G+A%qW9!d?F^eRINrFNRJt$aoQDeDw21QBw74+ zD^B7#JeJOjnU%(A>B(j=V(|h_?YT6!H|q8VcB(eh>^hrAs~IA)<$He7l#MJ=%urSt zOf@ahC~4s6)5&N6cP;t*&?;c(|NLsVBq}wQmYUi{IaQlp894oQIt)j{(O|Q962;*@ z8Qz#Dy{dT?&-=frwN$1D`CM9uzJEG96x$nJyU_(&F)%q5%9I&wpDQ1Zbz`L#hh!_4 zfvH!a>vwywe(b+8FZnF}egYpL0hX-8l*4orcHsK@uGHmHhfDG6UU(+PgoW~AN{!8N ze?40UjlbaG&cqQKwCg*sh0uw*Q5psZRLBL?RxXt${{5|&P#|B`s5#WMw7-8T6Z`{x CVZa{% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 9b3abe568d669c8880463e6c565695843b4d897e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmYk3UuzRV5Wuhg0l62!H^GPT!J_D%dr81@$+flGN}<7!#y^j4@7C=#ce}^#Mq0^( z3Vs6>QNgbeqz^?geud2!@Uu8~X^8_rW@hIPGdq8;T=?jroJX!9E#xAygH-YYxr8v} zGID?{o%6icsIMYpwC|w)gn9`zs#>akwcJlr=#O&lJyUvUN|x~2HC|7v1D;s2osy?q zn@q_Fgj5A5W}oLd;fI#X>e)cSjOE(z^HOO`x<+Iv*%%2!1}Xx-_n7qgtE@^T51Hi= zG-#tiXp@8?(0frxZ_|)ce+Rpefo9U=%qks$`{pLIH}0pKq8Whu;-<5=vv=-f_7yq> z(?b;$!B82SCF`PKSso;+Sj9e4jF{kLz*!N&F4ub*lh8RGUat$KM9zg)qtXOQi$zHU zM*H3E?&f0UFrfYeC2?0A?x@7+EpC3d%vmPeknA&UxQ(9-w#dpNuUg_I*JM*BD$S&b zU}Z0}elH(smXj@|3lo7XYuCiBHq6af#&Ng?O~BxdkfH<2%e6_b$M{)mKu<%fapNr1 ziCdLi@v!M_h6}|M8yUX=b4r&>-|Z s_rXowG2Y-axIcJ^iTmMB+%Grv-1q<73DnN9`;C`*KTn+>YFY)ne_5jGRsaA1 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 403c6d1874f4d7047c5e93bc394d1bb5fab6f66a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmYL`&2H2%5XS>55{kryGl$_oMFn2$u!2=KX$!QKDs{`UEC_KkiE-U^Jdy3JsMLF( zfH&efIPfG)(yex+pFCfGYsUWjc;|OQcAt1cyd)kF1<~7_cu0IA{@qKG?{q#QN)k{w z=;+wmySj!&XH_!yc&Vz$PHXm6`C!oHpdB`fg$rdZQ@^5eeL6rRLsULps1|)>v!G4Q z-gi2%CFYRMKeB~do4%DD$*6M3xOmI>go!a^BG2Bu;2G!X8QsE`UbD-|1Q?5M(KpYCwFlUlK*l1&c5w_#%n z-Ia=R+`G?v1uq1L>+4$y_3%B?2-0NJ^c%bT%+K-4(jLQmq{$K1@)BAv*T!P5Jk;TLOlT?F=J43Lj8D%KLRBp3gIKY$usG~aWHnv<%G{Z*a2%` z1MGnzQ?@~M7$B~ER4%J@UH4;Q`dP51m?fsc%rH%+(tl=_QOq1OVE#=A@x*nWdFT5g z*H5l|#3WOx@*8WXD4;X6C@y`trBd~9+>&SqKfqp;$A!GWK*qZqwDWf;sgKr5e2D0( zXG%I)`VeJ{v?=87P?PNX9Fq2_?BK{$Gjd-=%%Psu8!}tv1GV*hZEZQLWm(cx6lFIk zM^;52a@cVN{|G1SP2Rz#8u#hoyWe&`(7=zBwdhj9EjDm^s5Hths=FM{?y)e`hs{_@ z8f{xc?3#|7U*kE@C}|zH4t@gG(k$8Yj+605k0q}hIp<1gm2rQd*H?is{ypy=%8j47 zYV#Wm^1$_cVVurk2 LRJg`Sk5P#)Hp`S0 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index aa4e19a331cdbf6973ce674d4f1f6514bba08b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmYL^zmC&D5XKDx3AwzQVkoF!a&{mnY!Y+_cZW{8h!6}ybc;RMOV+#5?)t=^2Y`n1 znyaZD8fxBx68TY>_==47x8KZaW;Nfxy&D%1$93j5bDz1%Oqp#gm|M(C=Iga6ddGT~ z`O7(<^W&Ybbdbc)tYJgE!RIxv7}(zaT1#ankXO=q3bWVQ366Jt+f6@^!()@%LYY#) z_`M48TYOH2+?9nhyOLUcAxH(h#f_V6=NL;(XH=>^WydHX?HJ5(z!}S znFdj&NEOa6KuX>s+DFNpU3fH~X8zGX(#*rlXV)IaQ)CNyhdf7ikUB=l3*<8*o_OAO ztWD%U_L!?ZESuQNGBPd&cq6TTLTc$zM!$kKT*;XDV=w?F0RYGWI50T*gPf)h%ztHn*rrfThdIWJrse``NkX*3;ytE*x$Sn z1)={*NedFMxhU{l3+Hyb5RA(XNvBL3u-z}ofVMZj`syE`X z4wRmon8;!!O}Eh@>$dw^l2=_4z3KSh=pjhZ>(5Wrj0t`TBnn!-=c-#*-Mi|qtL|L& cua?VS>mhN~A6MPD>bF~7)sE$&HZ2$4Bj(ek<^TWy diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 2368c84b38774ea7c32be2d95657097d3a3e96e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmYL^&q~BF5XP%0NROU9%)y(cwkwKTSMk3rxVSD=#9OuL0H6t zDEbW12k=>(DzZaloIbbjZk zjcPN?pwrLMYa4xusb$TKouDbDRxt>r3uNU5<~hS_i>i`KD0pen_#NzNV_B;dGGkkP zQL;qG;I|K12M4mUvK?+QhFTcaS-8l;Wr*tWQaBebg`s~yzp%t`Rp#7k6T^v2sYA1C zxR8Y&Kx6Q$1oB_m5CxZckm_Qc#+B%Efh<8@#E|eyc?AtCHgXwgBSwZ8tngdS*6t`* z6ome^RuqUfxarY~mf|h+axT>>q!-+jXxEODJ+?CPRhyopVY@2TnN%W%m9Dh@DceVd s<}X59Vb5Xa3+LTQkYprUY(9J0$Ij_fWv9(U-(tyrzXqr@bGlUv7*Z08QBpg=$a z6+%!TAv&md3GbId{wPdx#g6>*%=|Son)!G7_f~WjDElln#^Oh$TaO zbZ{vhT{)jzPLgOBr?AX$WhHmor1W;>T-B6X2|5F?{D3<;S-M`?1POV(T(&XKV^?0q zZY5eSfMvkzlx8Kb=)~dA+;VMM~}dGMcu{~cDZgZ~ozi{Rgp-n|X}TkyYv k{~r9;;C}@FsW1H-R&Rp;82pFe|MYDbVA-qSf1*zQ17yX_avIbEX;smPD435UlX!48S?^l2>x%LMJOMW( zo*~cB@EW`WcMgo*Lq_}4%XKiWT!@BfIz?g>wXq3}Ss6gvAXJQPrPBy5DMJ5lsa zd@THxxa<2TUQTpZ=&YO9+i6+CqBRtKbiDNquBgBIXwGg!tDr7Q^?}%HXLG2mt4aAa z8KdZHAlp5AsL==FctMThpk}_(rFz*`UKK8fc>Y!`=t_5`>NN(+AxpENN;5UcU@*#u z&!478X&PV36jd-l})f zx7x4aIN(;-C%xRnag_u<)aDR4o?XnQhrI?#8ozQ@77_*5jYtf#-m}J_wqsbWkv)aU z`{GQE4t1Tve{nbwfW4H|`={WwR&dCzrt~qy9 n>HtT{Fv;TRP1g<6t^CN%cQpIm?_V{-sX@EnL7z0p`(5-Omnffu diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index f6a8dd434f30c0afd873c44bee05f571be539cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmYjO&2G~`5H^1j@&$=29EJlG722?NatLl*3Z+Gr5)p-zpA#(c)^Y9ZM!V~ZlpYEa z;st;!uMjE@k&w(QtY3f=55m|{6-N3r^X-1$XlD1%^~+x!j7x}{h!)}sqKl~F4dN<- zA+8|~5q~c@&N1d2h}Rb#hhlz@8IK)IbyWT8co;=6$TRM|kSf(vHsUqaPG8AGJ~Cu4 zBG0+fi4+0ELQXi*W1eM%zcXA^#~LO~8?M{|pGsv&Psd3_9_6tnLm7bEe@X`YD5<36 zF*7^>pZYCAed0C2yC1Zgcd1XQ+r=(qsF=_hGg1ZcDpv_?kEIeaIbs4jvs{gkZsn+P&I^BUCMmI7D8 z8D>))(%^#krWrQefYF#K%}uyJ+$HUmuA23LE3zX-GD<`oK>KZC+1jS6om~02~C59C@F4_yv+VctY)()1d=Es3(INw#DKU;91%^uB(4#HxK5l9 zA1*QW?w{Ve%ox!6CUqJ!YHc<5wRJzwVOD8m&#imoOOatKJ)1gvf?42)IX_0{l{E=S zV+-Vdj#_g(3uv0Lhe9Y5&9JmC@QIfy=ew2kJhcf#(bX$;qCZt97jjO2c9}%ycWT_1X5RDd^7M^*2|9>Jgrt=4QwyWsnU5N%#Nf-btkjM zJvwS+B_#3`MUlXC&g6SCWhqX*VdIx=)# zlH)*G@06NSjv$*0=P`_*rTcui+1D6?(wmj&nuI`Bmu1!5VmnjLbnNM#boYqvB^M7O zUOfmNyoiqwP<$0nuJ{a|teGgm4}SDlMRoDj_p9gMG158W8ZjU)5W7UH$HXN<5m$%< z;^+)xOL{L8zsa}#i)R@l%joIU?(1|r&-uJD$R0WWEYvE)t_*DE-2rA1c5--#K4@np zFRZH&LW#xzzKCescHor?5q&bp+W836Q0N@)G(~`glRTN-hdDmi?I_$;5hYJWIslPE zDtLcQinZ%vC`7VLTVUap4Ms)hB{xl_ZLuu*`aidEc-YHab&FxQfi9< zIdo3(b=@CYSe6@wbA`deyQU8R|CD@L?oaL|)1B$&>4E*8NG8tGWfbLQO<5z|d80N; z+Y!%7 tZM5i5?wvWzb>ugDgI=1jpT}QUZ$AF|{A%_3JzE`r`tj|<>g|`m^&c=KqPGA5 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index 8a7aea4fe65ebbf3b2652f8c30ace67ce6d0f7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmYL^zfK!L5XLVkNYROknqo^Ln9JD^srjHOb zRP;3DVR#5SOL+|D0+L7j+Zm0%Pnz##@#90lHODM5tIRx8XUb|bpO{mIJ_Nxz_XXye zXMX>E+-9|trlM154BD0k*!OUl!Y{N=kx4{mXo%o))EaQ?(UfcVzFvbk?BIy3hnCA! z3cE$-pi7Ae+b7V$OI51jhxC|;YFt@|xCWJPJSNrZN?eQM@K`zzT`P^#(vwZZUM>lm zP8B8-$4Zi@4|;h|D_Lw$WKIladt^8*-!>WX@t(7P8EL7^chS$Kb?7&L zcK4w+)0G)6&_cuXDODy*MD4fo;TasDLHic2O_(Y#D$z#tH4LVAkJCR-|Nh=jZ*PKE Dk;ICY diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-auto-move-windows.mo deleted file mode 100644 index fb5ace8af7c7f0ab6ad7249d3b1a8280d840eff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmYL^&uSDw5XM`hAVWa#?4j>cW6wrqnaxUcO(c-TWf_e(ZD-1vjy>H&cTfK8NdyTI z#FIAM)J;7bVBYy$hikN&EtYU=xa>)KaFS|e@~_lWDn9?|PHaf6V=P2zy~ zaD}l2z3aq3@_j$L${1Nj&rN7LQu_9|l%i)dmEg`-nW8oD)5 z)VqzA%8YnkN#`+)pJzKTT+Q_-zeNYzCbxw$Wy*(dRETD}byCBQb+u2qX_loQCnJ7g w$6^${gr{iGUF4lvEL7kdv51q1b)UX>AJ6~(_|l!7vhL^kpI_g)&+jkm|Cgbm9smFU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/prefs.js deleted file mode 100644 index 10c14717..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/prefs.js +++ /dev/null @@ -1,353 +0,0 @@ -// SPDX-FileCopyrightText: 2012 Giovanni Campagna -// SPDX-FileCopyrightText: 2014 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -// Start apps on custom workspaces - -import Adw from 'gi://Adw'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - -const SETTINGS_KEY = 'application-list'; - -const WORKSPACE_MAX = 36; // compiled in limit of mutter - -class NewItem extends GObject.Object {} -GObject.registerClass(NewItem); - -class NewItemModel extends GObject.Object { - static [GObject.interfaces] = [Gio.ListModel]; - static { - GObject.registerClass(this); - } - - #item = new NewItem(); - - vfunc_get_item_type() { - return NewItem; - } - - vfunc_get_n_items() { - return 1; - } - - vfunc_get_item(_pos) { - return this.#item; - } -} - -class Rule extends GObject.Object { - static [GObject.properties] = { - 'app-info': GObject.ParamSpec.object( - 'app-info', 'app-info', 'app-info', - GObject.ParamFlags.READWRITE, - Gio.DesktopAppInfo), - 'workspace': GObject.ParamSpec.uint( - 'workspace', 'workspace', 'workspace', - GObject.ParamFlags.READWRITE, - 1, WORKSPACE_MAX, 1), - }; - - static { - GObject.registerClass(this); - } -} - -class RulesList extends GObject.Object { - static [GObject.interfaces] = [Gio.ListModel]; - static { - GObject.registerClass(this); - } - - #settings; - #rules = []; - #changedId; - - constructor(settings) { - super(); - - this.#settings = settings; - this.#changedId = - this.#settings.connect(`changed::${SETTINGS_KEY}`, - () => this.#sync()); - this.#sync(); - } - - append(appInfo) { - const pos = this.#rules.length; - - this.#rules.push(new Rule({appInfo})); - this.#saveRules(); - - this.items_changed(pos, 0, 1); - } - - remove(id) { - const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id); - if (pos < 0) - return; - - this.#rules.splice(pos, 1); - this.#saveRules(); - - this.items_changed(pos, 1, 0); - } - - changeWorkspace(id, workspace) { - const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id); - if (pos < 0) - return; - - this.#rules[pos].set({workspace}); - this.#saveRules(); - } - - #saveRules() { - this.#settings.block_signal_handler(this.#changedId); - this.#settings.set_strv(SETTINGS_KEY, - this.#rules.map(r => `${r.app_info.get_id()}:${r.workspace}`)); - this.#settings.unblock_signal_handler(this.#changedId); - } - - #sync() { - const removed = this.#rules.length; - - this.#rules = []; - for (const stringRule of this.#settings.get_strv(SETTINGS_KEY)) { - const [id, workspace] = stringRule.split(':'); - const appInfo = Gio.DesktopAppInfo.new(id); - if (appInfo) - this.#rules.push(new Rule({appInfo, workspace})); - else - log(`Invalid ID ${id}`); - } - this.items_changed(0, removed, this.#rules.length); - } - - vfunc_get_item_type() { - return Rule; - } - - vfunc_get_n_items() { - return this.#rules.length; - } - - vfunc_get_item(pos) { - return this.#rules[pos] ?? null; - } -} - -class AutoMoveSettingsWidget extends Adw.PreferencesGroup { - static { - GObject.registerClass(this); - - this.install_action('rules.add', null, self => self._addNewRule()); - this.install_action('rules.remove', 's', - (self, name, param) => self._rules.remove(param.unpack())); - this.install_action('rules.change-workspace', '(si)', - (self, name, param) => self._rules.changeWorkspace(...param.deepUnpack())); - } - - constructor(settings) { - super({ - title: _('Workspace Rules'), - }); - - this._settings = settings; - this._rules = new RulesList(this._settings); - - const store = new Gio.ListStore({item_type: Gio.ListModel}); - const listModel = new Gtk.FlattenListModel({model: store}); - store.append(this._rules); - store.append(new NewItemModel()); - - this._list = new Gtk.ListBox({ - selection_mode: Gtk.SelectionMode.NONE, - css_classes: ['boxed-list'], - }); - this.add(this._list); - - this._list.bind_model(listModel, item => { - return item instanceof NewItem - ? new NewRuleRow() - : new RuleRow(item); - }); - } - - _addNewRule() { - const dialog = new NewRuleDialog(this.get_root(), this._settings); - dialog.connect('response', (dlg, id) => { - const appInfo = id === Gtk.ResponseType.OK - ? dialog.get_widget().get_app_info() : null; - if (appInfo) - this._rules.append(appInfo); - dialog.destroy(); - }); - dialog.show(); - } -} - -class WorkspaceSelector extends Gtk.Widget { - static [GObject.properties] = { - 'number': GObject.ParamSpec.uint( - 'number', 'number', 'number', - GObject.ParamFlags.READWRITE, - 1, WORKSPACE_MAX, 1), - }; - - static { - GObject.registerClass(this); - - this.set_layout_manager_type(Gtk.BoxLayout); - } - - constructor() { - super(); - - this.layout_manager.spacing = 6; - - const label = new Gtk.Label({ - xalign: 1, - margin_end: 6, - }); - this.bind_property('number', - label, 'label', - GObject.BindingFlags.SYNC_CREATE); - label.set_parent(this); - - const buttonProps = { - css_classes: ['circular'], - valign: Gtk.Align.CENTER, - }; - - this._decButton = new Gtk.Button({ - icon_name: 'list-remove-symbolic', - ...buttonProps, - }); - this._decButton.set_parent(this); - this._decButton.connect('clicked', () => this.number--); - - this._incButton = new Gtk.Button({ - icon_name: 'list-add-symbolic', - ...buttonProps, - }); - this._incButton.set_parent(this); - this._incButton.connect('clicked', () => this.number++); - - this.connect('notify::number', () => this._syncButtons()); - this._syncButtons(); - } - - _syncButtons() { - this._decButton.sensitive = this.number > 1; - this._incButton.sensitive = this.number < WORKSPACE_MAX; - } -} - -class RuleRow extends Adw.ActionRow { - static { - GObject.registerClass(this); - } - - constructor(rule) { - const {appInfo} = rule; - const id = appInfo.get_id(); - - super({ - activatable: false, - title: rule.appInfo.get_display_name(), - }); - - const icon = new Gtk.Image({ - css_classes: ['icon-dropshadow'], - gicon: appInfo.get_icon(), - pixel_size: 32, - }); - this.add_prefix(icon); - - const wsButton = new WorkspaceSelector(); - rule.bind_property('workspace', - wsButton, 'number', - GObject.BindingFlags.SYNC_CREATE); - this.add_suffix(wsButton); - - wsButton.connect('notify::number', () => { - this.activate_action('rules.change-workspace', - new GLib.Variant('(si)', [id, wsButton.number])); - }); - - const button = new Gtk.Button({ - action_name: 'rules.remove', - action_target: new GLib.Variant('s', id), - icon_name: 'edit-delete-symbolic', - has_frame: false, - valign: Gtk.Align.CENTER, - }); - this.add_suffix(button); - } -} - -class NewRuleRow extends Gtk.ListBoxRow { - static { - GObject.registerClass(this); - } - - constructor() { - super({ - action_name: 'rules.add', - child: new Gtk.Image({ - icon_name: 'list-add-symbolic', - pixel_size: 16, - margin_top: 12, - margin_bottom: 12, - margin_start: 12, - margin_end: 12, - }), - }); - this.update_property( - [Gtk.AccessibleProperty.LABEL], [_('Add Rule')]); - } -} - -class NewRuleDialog extends Gtk.AppChooserDialog { - static { - GObject.registerClass(this); - } - - constructor(parent, settings) { - super({ - transient_for: parent, - modal: true, - }); - - this._settings = settings; - - this.get_widget().set({ - show_all: true, - show_other: true, // hide more button - }); - - this.get_widget().connect('application-selected', - this._updateSensitivity.bind(this)); - this._updateSensitivity(); - } - - _updateSensitivity() { - const rules = this._settings.get_strv(SETTINGS_KEY); - const appInfo = this.get_widget().get_app_info(); - this.set_response_sensitive(Gtk.ResponseType.OK, - appInfo && !rules.some(i => i.startsWith(appInfo.get_id()))); - } -} - -export default class AutoMovePrefs extends ExtensionPreferences { - getPreferencesWidget() { - return new AutoMoveSettingsWidget(this.getSettings()); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index aff34993..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Move applications to specific workspaces when they create windows.", - "extension-id": "auto-move-windows", - "gettext-domain": "gnome-shell-extension-auto-move-windows", - "name": "Auto Move Windows", - "original-authors": [ - "alessandro.crismani@gmail.com", - "thomas.bouffon@gmail.com" - ], - "settings-schema": "org.gnome.shell.extensions.auto-move-windows", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "auto-move-windows@gnome-shell-extensions.gcampax.github.com", - "version": 57 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/auto-move-windows@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled deleted file mode 100644 index 9ba7c0d8de30bfcf7e58aa608eacdb76e885b1df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmZWku?|5&5L`s1(MU)XqIweVPD2!W3bkl2T)5=9dvV9pQ28jOPf_Z90JA(%m}E1P z+1uT@@l0)vvVn5c!Sj!fin&(+UrMI|GxxeQp)>e~D%XgfK%bj5r6G8Pa@& - -SPDX-License-Identifier: GPL-2.0-or-later ---> - - - - - - [ ] - Application and workspace list - A list of strings, each containing an application id (desktop file name), followed by a colon and the workspace number - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js deleted file mode 100644 index 88247771..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/appfolders.js +++ /dev/null @@ -1,265 +0,0 @@ -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 '../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; - -// 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 = [ - "appfolder-dialogs-transparent", - "appfolder-dialogs-light", - "appfolder-dialogs-dark" -]; - -let original_zoomAndFadeIn = null; -let original_zoomAndFadeOut = null; -let sigma; -let brightness; - -let _zoomAndFadeIn = function () { - let [sourceX, sourceY] = - this._source.get_transformed_position(); - let [dialogX, dialogY] = - this.child.get_transformed_position(); - - this.child.set({ - translation_x: sourceX - dialogX, - translation_y: sourceY - dialogY, - scale_x: this._source.width / this.child.width, - scale_y: this._source.height / this.child.height, - opacity: 0, - }); - - this.set_background_color(transparent); - - let blur_effect = this.get_effect("appfolder-blur"); - - blur_effect.radius = 0; - blur_effect.brightness = 1.0; - Tweener.addTween(blur_effect, - { - radius: sigma * 2, - brightness: brightness, - time: adjustAnimationTime(FOLDER_DIALOG_ANIMATION_TIME / 1000), - transition: 'easeOutQuad' - } - ); - - this.child.ease({ - translation_x: 0, - translation_y: 0, - scale_x: 1, - scale_y: 1, - opacity: 255, - duration: FOLDER_DIALOG_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - - this._needsZoomAndFade = false; - - if (this._sourceMappedId === 0) { - this._sourceMappedId = this._source.connect( - 'notify::mapped', this._zoomAndFadeOut.bind(this)); - } -}; - -let _zoomAndFadeOut = function () { - if (!this._isOpen) - return; - - if (!this._source.mapped) { - this.hide(); - return; - } - - let [sourceX, sourceY] = - this._source.get_transformed_position(); - let [dialogX, dialogY] = - this.child.get_transformed_position(); - - this.set_background_color(transparent); - - let blur_effect = this.get_effect("appfolder-blur"); - Tweener.addTween(blur_effect, - { - radius: 0, - brightness: 1.0, - time: adjustAnimationTime(FOLDER_DIALOG_ANIMATION_TIME / 1000), - transition: 'easeInQuad' - } - ); - - this.child.ease({ - translation_x: sourceX - dialogX, - translation_y: sourceY - dialogY, - scale_x: this._source.width / this.child.width, - scale_y: this._source.height / this.child.height, - opacity: 0, - duration: FOLDER_DIALOG_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => { - this.child.set({ - translation_x: 0, - translation_y: 0, - scale_x: 1, - scale_y: 1, - opacity: 255, - }); - this.hide(); - - this._popdownCallbacks.forEach(func => func()); - this._popdownCallbacks = []; - }, - }); - - this._needsZoomAndFade = false; -}; - - -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); - this.settings = settings; - } - - enable() { - this._log("blurring appfolders"); - - brightness = this.settings.appfolder.BRIGHTNESS; - sigma = this.settings.appfolder.SIGMA; - - let appDisplay = Main.overview._overview.controls._appDisplay; - - if (appDisplay._folderIcons.length > 0) { - this.blur_appfolders(); - } - - this.connections.connect( - appDisplay, 'view-loaded', _ => this.blur_appfolders() - ); - } - - blur_appfolders() { - let appDisplay = Main.overview._overview.controls._appDisplay; - - if (this.settings.HACKS_LEVEL === 1) - this._log("appfolders hack level 1"); - - appDisplay._folderIcons.forEach(icon => { - icon._ensureFolderDialog(); - - if (original_zoomAndFadeIn == null) { - original_zoomAndFadeIn = icon._dialog._zoomAndFadeIn; - } - if (original_zoomAndFadeOut == null) { - original_zoomAndFadeOut = icon._dialog._zoomAndFadeOut; - } - - let blur_effect = new Shell.BlurEffect({ - name: "appfolder-blur", - radius: sigma * 2, - brightness: brightness, - mode: Shell.BlurMode.BACKGROUND - }); - - icon._dialog.remove_effect_by_name("appfolder-blur"); - icon._dialog.add_effect(blur_effect); - - DIALOGS_STYLES.forEach( - style => icon._dialog._viewBox.remove_style_class_name(style) - ); - - if (this.settings.appfolder.STYLE_DIALOGS > 0) - icon._dialog._viewBox.add_style_class_name( - DIALOGS_STYLES[this.settings.appfolder.STYLE_DIALOGS - 1] - ); - - // finally override the builtin functions - icon._dialog._zoomAndFadeIn = _zoomAndFadeIn; - icon._dialog._zoomAndFadeOut = _zoomAndFadeOut; - - - // 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 (this.settings.HACKS_LEVEL === 1) { - this.paint_signals.disconnect_all_for_actor(icon._dialog); - this.paint_signals.connect(icon._dialog, blur_effect); - } else { - this.paint_signals.disconnect_all(); - } - }); - }; - - set_sigma(s) { - sigma = s; - if (this.settings.appfolder.BLUR) - this.blur_appfolders(); - } - - set_brightness(b) { - brightness = b; - if (this.settings.appfolder.BLUR) - this.blur_appfolders(); - } - - disable() { - this._log("removing blur from appfolders"); - - let appDisplay = Main.overview._overview.controls._appDisplay; - - if (original_zoomAndFadeIn != null) { - appDisplay._folderIcons.forEach(icon => { - if (icon._dialog) - icon._dialog._zoomAndFadeIn = original_zoomAndFadeIn; - }); - } - - if (original_zoomAndFadeOut != null) { - appDisplay._folderIcons.forEach(icon => { - if (icon._dialog) - icon._dialog._zoomAndFadeOut = original_zoomAndFadeOut; - }); - } - - appDisplay._folderIcons.forEach(icon => { - if (icon._dialog) { - icon._dialog.remove_effect_by_name("appfolder-blur"); - DIALOGS_STYLES.forEach( - s => icon._dialog._viewBox.remove_style_class_name(s) - ); - } - }); - - this.connections.disconnect_all(); - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > appfolders] ${str}`); - } -}; \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js deleted file mode 100644 index e2a8bdf9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/applications.js +++ /dev/null @@ -1,451 +0,0 @@ -import Meta from 'gi://Meta'; -import Gio from 'gi://Gio'; -import * as Main from 'resource:///org/gnome/shell/ui/main.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, effects_manager) { - this.connections = connections; - this.settings = settings; - this.effects_manager = effects_manager; - this.paint_signals = new PaintSignals(connections); - - // stores every blurred meta window - this.meta_window_map = new Map(); - } - - enable() { - this._log("blurring applications..."); - - // export dbus service for preferences - 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(); - - // blur every new window - this.connections.connect( - global.display, - 'window-created', - (_meta_display, meta_window) => { - this._log("window created"); - - 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() { - this.connections.disconnect_all_for(Main.overview); - - if (this.settings.applications.BLUR_ON_OVERVIEW) { - // when the overview is opened, show every window actors (which - // allows the blur to be shown too) - this.connections.connect( - Main.overview, 'showing', - _ => this.meta_window_map.forEach((meta_window, _pid) => { - let window_actor = meta_window.get_compositor_private(); - window_actor?.show(); - }) - ); - - // when the overview is closed, hide every actor that is not on the - // current workspace (to mimic the original behaviour) - this.connections.connect( - Main.overview, 'hidden', - _ => { - this.meta_window_map.forEach((meta_window, _pid) => { - let window_actor = meta_window.get_compositor_private(); - - if ( - !meta_window.get_workspace().active - ) - window_actor.hide(); - }); - } - ); - } - } - - /// Iterate through all existing windows and add blur as needed. - update_all_windows() { - // remove all previously blurred windows, in the case where the - // whitelist was changed - this.meta_window_map.forEach(((_meta_window, pid) => { - this.remove_blur(pid); - })); - - for ( - let i = 0; - i < global.workspace_manager.get_n_workspaces(); - ++i - ) { - let workspace = global.workspace_manager.get_workspace_by_index(i); - let windows = workspace.list_windows(); - - windows.forEach(meta_window => this.track_new(meta_window)); - } - } - - /// Adds the needed signals to every new tracked window, and adds blur if - /// needed. - /// 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; - - this._log(`new window tracked, pid: ${pid}`); - - // register the blurred window - this.meta_window_map.set(pid, 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', - _ => 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; - } - } 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 - 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}`); - - - // 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)) - ) - && [ - Meta.FrameType.NORMAL, - Meta.FrameType.DIALOG, - Meta.FrameType.MODAL_DIALOG - ].includes(meta_window.get_frame_type()) - ) { - // only blur the window if it is not already done - if (!meta_window.blur_actor) - this.create_blur_effect(meta_window); - } - - // 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. - /// 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(); - - 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._log("hack level 1"); - - this.paint_signals.disconnect_all_for_actor(blur_actor); - this.paint_signals.connect(blur_actor, pipeline.effect); - } else { - this.paint_signals.disconnect_all_for_actor(blur_actor); - } - - // 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', - _ => { - if (this.focused_window_pid != pid) - this.set_window_opacity(window_actor, this.settings.applications.OPACITY); - } - ); - - // hide the blur if window becomes invisible - if (!window_actor.visible) - blur_actor.hide(); - - this.connections.connect( - window_actor, - 'notify::visible', - window_actor => { - 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 - /// improve performances without hiding the blur effect. - enforce_window_visibility_on_overview_for(window_actor) { - this.connections.connect(window_actor, 'notify::visible', - _ => { - if (this.settings.applications.BLUR_ON_OVERVIEW) { - if ( - !window_actor.visible - && Main.overview.visible - ) { - window_actor.show(); - window_actor.get_last_child().hide(); - } - else if ( - window_actor.visible - ) - window_actor.get_last_child().show(); - } - } - ); - } - - /// 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 => { - 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. - compute_allocation(meta_window) { - const scale_monitor_framebuffer = this.mutter_gsettings.get_strv('experimental-features') - .includes('scale-monitor-framebuffer'); - const is_wayland = Meta.is_wayland_compositor(); - const monitor_index = meta_window.get_monitor(); - // check if the window is using wayland, or xwayland/xorg for rendering - const scale = !scale_monitor_framebuffer && is_wayland && meta_window.get_client_type() == 0 - ? Main.layoutManager.monitors[monitor_index].geometry_scale - : 1; - - let frame = meta_window.get_frame_rect(); - let buffer = meta_window.get_buffer_rect(); - - return { - x: (frame.x - buffer.x) / scale, - y: (frame.y - buffer.y) / scale, - width: frame.width / scale, - height: frame.height / scale - }; - } - - /// 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.meta_window_map.get(pid); - if (meta_window) { - let window_actor = meta_window.get_compositor_private(); - let blur_actor = meta_window.blur_actor; - let bg_manager = meta_window.bg_manager; - - if (blur_actor && 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(); - - // 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 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.meta_window_map.forEach((_meta_window, pid) => { - this.untrack_meta_window(pid); - }); - - this.connections.disconnect_all(); - this.paint_signals.disconnect_all(); - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > applications] ${str}`); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js deleted file mode 100644 index e4b0f193..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/coverflow_alt_tab.js +++ /dev/null @@ -1,91 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js deleted file mode 100644 index 4ff212c6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/dash_to_dock.js +++ /dev/null @@ -1,421 +0,0 @@ -import Meta from 'gi://Meta'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Signals from 'resource:///org/gnome/shell/misc/signals.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", - "light-dash", - "dark-dash" -]; - - -/// 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_group, bg_manager - ) { - // the parent DashBlur object, to communicate - this.dash_blur = dash_blur; - this.dash = dash; - this.dash_container = dash_container; - this.dash_background = dash_background; - this.background = background; - this.background_group = background_group; - this.bg_manager = bg_manager; - this.settings = dash_blur.settings; - this.old_style = this.dash._background.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()) - ); - } - - // 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); - - // 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); - - // 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; - } - - override_style() { - this.remove_style(); - - this.dash.set_style_class_name( - DASH_STYLES[this.settings.dash_to_dock.STYLE_DASH_TO_DOCK] - ); - } - - remove_style() { - this.dash._background.style = this.old_style; - - DASH_STYLES.forEach( - style => this.dash.remove_style_class_name(style) - ); - } - - 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 = Main.layoutManager.findMonitorForActor(dash_container); - let dash_box = dash_container._slider.get_child(); - - if (dash_container.get_style_class_name().includes("top")) { - x = (monitor.width - dash_background.width) / 2; - y = dash_box.y; - } else if (dash_container.get_style_class_name().includes("bottom")) { - x = (monitor.width - dash_background.width) / 2; - y = monitor.height - dash_container.height; - } else if (dash_container.get_style_class_name().includes("left")) { - x = dash_box.x; - y = dash_container.y + (dash_container.height - dash_background.height) / 2 - dash_background.y; - } else if (dash_container.get_style_class_name().includes("right")) { - x = monitor.width - dash_container.width; - y = dash_container.y + (dash_container.height - dash_background.height) / 2 - dash_background.y; - } - - return [x, y]; - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > dash] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > dash] ${str}`); - } -} - -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.is_static = this.settings.dash_to_dock.STATIC_BLUR; - this.enabled = false; - } - - enable() { - this.connections.connect(Main.uiGroup, 'child-added', (_, actor) => { - if ( - (actor.get_name() === "dashtodockContainer") && - (actor.constructor.name === 'DashToDock') - ) - this.try_blur(actor); - }); - - this.blur_existing_dashes(); - this.connect_to_overview(); - - this.update_size(); - - this.enabled = true; - } - - // Finds all existing dashes on every monitor, and call `try_blur` on them - // We cannot only blur `Main.overview.dash`, as there could be several - blur_existing_dashes() { - this._log("searching for dash"); - - // blur every dash found, filtered by name - Main.uiGroup.get_children().filter((child) => { - return (child.get_name() === "dashtodockContainer") && - (child.constructor.name === 'DashToDock'); - }).forEach(dash_container => this.try_blur(dash_container)); - } - - // Tries to blur the dash contained in the given actor - try_blur(dash_container) { - let dash_box = dash_container._slider.get_child(); - - // verify that we did not already blur that dash - 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 - let dash = dash_box.get_children().find(child => { - return child.get_name() === 'dash'; - }); - - this.dashes.push(this.blur_dash_from(dash, dash_container)); - } - } - - // Blurs the dash and returns a `DashInfos` containing its information - blur_dash_from(dash, dash_container) { - let [background, background_group, bg_manager, paint_signals] = this.add_blur(dash); - - // 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', 'notify::height'], - _ => this.update_size() - ); - this.connections.connect( - dash_container, - ['notify::width', 'notify::height', 'notify::y', 'notify::x'], - _ => this.update_size() - ); - - const dash_background = dash.get_children().find(child => { - return child.get_style_class_name() === 'dash-background'; - }); - - // create infos - let infos = new DashInfos( - this, - dash, - dash_container, - dash_background, - background, - background_group, - bg_manager, - paint_signals - ); - - this.update_size(); - this.update_background(); - - // returns infos - return infos; - } - - add_blur(dash) { - const monitor = Main.layoutManager.findMonitorForActor(dash); - if (!monitor) - return; - - const background_group = new Meta.BackgroundGroup({ - name: 'bms-dash-backgroundgroup', width: 0, height: 0 - }); - - 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 - ); - 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 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("hack level 1"); - - paint_signals.disconnect_all(); - paint_signals.connect(background, pipeline.effect); - } else { - paint_signals.disconnect_all(); - } - } - - 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'); - - this.update_background(); - } - - /// Connect when overview if opened/closed to hide/show the blur accordingly - connect_to_overview() { - this.connections.disconnect_all_for(Main.overview); - - if (this.settings.dash_to_dock.UNBLUR_IN_OVERVIEW) { - this.connections.connect( - Main.overview, 'showing', _ => this.hide() - ); - this.connections.connect( - Main.overview, 'hidden', _ => this.show() - ); - } - }; - - /// 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-style'); - else - this.emit('remove-style'); - } - - update_pipeline() { - this.emit('update-pipeline'); - } - - update_size() { - this.emit('update-size'); - } - - show() { - this.emit('show'); - } - hide() { - this.emit('hide'); - } - - disable() { - this._log("removing blur from dashes"); - - this.emit('remove-dashes'); - - this.dashes = []; - this.connections.disconnect_all(); - - this.enabled = false; - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > dash manager] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > dash manager] ${str}`); - } -}; \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js deleted file mode 100644 index 7755ba9c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/lockscreen.js +++ /dev/null @@ -1,89 +0,0 @@ -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { UnlockDialog } from 'resource:///org/gnome/shell/ui/unlockDialog.js'; - -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 { - constructor(connections, settings, effects_manager) { - this.connections = connections; - this.settings = settings; - this.effects_manager = effects_manager; - this.enabled = false; - } - - enable() { - this._log("blurring lockscreen"); - - this.update_lockscreen(); - - this.enabled = true; - } - - update_lockscreen() { - UnlockDialog.prototype._createBackground = - this._createBackground; - UnlockDialog.prototype._updateBackgroundEffects = - this._updateBackgroundEffects; - UnlockDialog.prototype._updateBackgrounds = - this._updateBackgrounds; - } - - _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 - ); - - pipeline.create_background_with_effects( - monitor_index, - this._bgManagers, - this._backgroundGroup, - "screen-shield-background" - ); - } - - _updateBackgroundEffects() { - this._updateBackgrounds(); - } - - _updateBackgrounds() { - for (let i = 0; i < this._bgManagers.length; i++) { - this._bgManagers[i]._bms_pipeline.destroy(); - this._bgManagers[i].destroy(); - } - - this._bgManagers = []; - this._backgroundGroup.destroy_all_children(); - - for (let i = 0; i < Main.layoutManager.monitors.length; i++) - this._createBackground(i); - } - - disable() { - this._log("removing blur from lockscreen"); - - UnlockDialog.prototype._createBackground = - original_createBackground; - UnlockDialog.prototype._updateBackgroundEffects = - original_updateBackgroundEffects; - UnlockDialog.prototype._updateBackgrounds = - original_updateBackgrounds; - - this.connections.disconnect_all(); - - this.enabled = false; - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > lockscreen] ${str}`); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js deleted file mode 100644 index 13992343..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/overview.js +++ /dev/null @@ -1,213 +0,0 @@ -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", - "overview-components-transparent" -]; - - -export const OverviewBlur = class OverviewBlur { - constructor(connections, settings, effects_manager) { - this.connections = connections; - this.settings = settings; - this.effects_manager = effects_manager; - 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"); - - // add css class name for workspace-switch background - Main.uiGroup.add_style_class_name("blurred-overview"); - - // add css class name to make components semi-transparent if wanted - this.update_components_classname(); - - // 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 functions were patched prior, as - // the functions would call themselves and cause infinite recursion - if (!this.proto_patched) { - // store original workspace switching methods for restoring them on - // disable() - this._original_PrepareSwitch = wac_proto._prepareWorkspaceSwitch; - this._original_FinishSwitch = wac_proto._finishWorkspaceSwitch; - - const w_m = global.workspace_manager; - const outer_this = this; - - // create a blurred background actor for each monitor during a - // workspace switch - wac_proto._prepareWorkspaceSwitch = function (...params) { - outer_this._log("prepare workspace switch"); - outer_this._original_PrepareSwitch.apply(this, params); - - // this permits to show the blur behind windows that are on - // workspaces on the left and right - if ( - outer_this.settings.applications.BLUR - ) { - let ws_index = w_m.get_active_workspace_index(); - [ws_index - 1, ws_index + 1].forEach( - i => w_m.get_workspace_by_index(i)?.list_windows().forEach( - window => window.get_compositor_private().show() - ) - ); - } - - 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() && - bg_manager._monitorIndex !== Main.layoutManager.primaryMonitor.index - ) - bg_manager._bms_pipeline.actor.visible = false; - else - bg_manager._bms_pipeline.actor.visible = true; - }); - }; - - // remove the workspace-switch actors when the switch is done - wac_proto._finishWorkspaceSwitch = function (...params) { - outer_this._log("finish workspace switch"); - outer_this._original_FinishSwitch.apply(this, params); - - // this hides windows that are not on the current workspace - if ( - outer_this.settings.applications.BLUR - ) - for (let i = 0; i < w_m.get_n_workspaces(); i++) { - if (i != w_m.get_active_workspace_index()) - w_m.get_workspace_by_index(i)?.list_windows().forEach( - window => window.get_compositor_private().hide() - ); - } - - Main.uiGroup.remove_child(outer_this.animation_background_group); - }; - - this.proto_patched = true; - } - - this.enabled = true; - } - - update_backgrounds() { - // remove every old background - this.remove_background_actors(); - // 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' - ); - - 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' - ); - } - // 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 - /// backgrounds. - update_components_classname() { - OVERVIEW_COMPONENTS_STYLE.forEach( - style => Main.uiGroup.remove_style_class_name(style) - ); - - if (this.settings.overview.STYLE_COMPONENTS > 0) - Main.uiGroup.add_style_class_name( - OVERVIEW_COMPONENTS_STYLE[this.settings.overview.STYLE_COMPONENTS - 1] - ); - } - - remove_background_actors() { - 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.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) - ); - - 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.proto_patched = false; - } - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > overview] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > overview] ${str}`); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js deleted file mode 100644 index df1be7be..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js +++ /dev/null @@ -1,542 +0,0 @@ -import St from 'gi://St'; -import Meta from 'gi://Meta'; -import * as Main from 'resource:///org/gnome/shell/ui/main.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 = [ - "transparent-panel", - "light-panel", - "dark-panel", - "contrasted-panel" -]; - - -export const PanelBlur = class PanelBlur { - constructor(connections, settings, effects_manager) { - this.connections = connections; - this.window_signal_ids = new Map(); - this.settings = settings; - this.effects_manager = effects_manager; - this.actors_list = []; - this.enabled = false; - } - - enable() { - this._log("blurring top panel"); - - // check for panels when Dash to Panel is activated - this.connections.connect( - Main.extensionManager, - 'extension-state-changed', - (_, extension) => { - if (extension.uuid === DASH_TO_PANEL_UUID - && extension.state === 1 - ) { - this.connections.connect( - global.dashToPanel, - 'panels-created', - _ => this.blur_dtp_panels() - ); - - this.blur_existing_panels(); - } - } - ); - - this.blur_existing_panels(); - - // connect to overview being opened/closed, and dynamically show or not - // the blur when a window is near a panel - this.connect_to_windows_and_overview(); - - // update the classname if the panel to have or have not light text - this.update_light_text_classname(); - - // connect to workareas change - this.connections.connect(global.display, 'workareas-changed', - _ => this.reset() - ); - - this.enabled = true; - } - - reset() { - this._log("resetting..."); - - this.disable(); - setTimeout(_ => this.enable(), 1); - } - - /// Check for already existing panels and blur them if they are not already - blur_existing_panels() { - // check if dash-to-panel is present - if (global.dashToPanel) { - // blur already existing ones - if (global.dashToPanel.panels) - this.blur_dtp_panels(); - } else { - // if no dash-to-panel, blur the main and only panel - this.maybe_blur_panel(Main.panel); - } - } - - blur_dtp_panels() { - // FIXME when Dash to Panel changes its size, it seems it creates new - // panels; but I can't get to delete old widgets - - // blur every panel found - global.dashToPanel.panels.forEach(p => { - this.maybe_blur_panel(p.panel); - }); - - // if main panel is not included in the previous panels, blur it - if ( - !global.dashToPanel.panels - .map(p => p.panel) - .includes(Main.panel) - && - this.settings.dash_to_panel.BLUR_ORIGINAL_PANEL - ) - this.maybe_blur_panel(Main.panel); - }; - - /// Blur a panel only if it is not already blurred (contained in the list) - maybe_blur_panel(panel) { - // check if the panel is contained in the list - let actors = this.actors_list.find( - actors => actors.widgets.panel == panel - ); - - if (!actors) - // if the actors is not blurred, blur it - this.blur_panel(panel); - } - - /// Blur a panel - blur_panel(panel) { - let panel_box = panel.get_parent(); - let is_dtp_panel = false; - if (!panel_box.name) { - is_dtp_panel = true; - panel_box = panel_box.get_parent(); - } - - let monitor = Main.layoutManager.findMonitorForActor(panel); - if (!monitor) - return; - - let background_group = new Meta.BackgroundGroup( - { name: 'bms-panel-backgroundgroup', width: 0, height: 0 } - ); - - 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' - ); - - let 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 - // - // [1]: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2857 - - { - if (this.settings.HACKS_LEVEL === 1) { - this._log("panel hack level 1"); - - paint_signals.disconnect_all(); - paint_signals.connect(background, pipeline.effect); - } else { - paint_signals.disconnect_all(); - } - } - } - - // 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_group }, - static_blur, - monitor, - bg_manager, - is_dtp_panel - }; - this.actors_list.push(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 - this.connections.connect( - panel, - 'notify::position', - _ => this.update_size(actors) - ); - this.connections.connect( - panel_box, - ['notify::size', 'notify::position'], - _ => this.update_size(actors) - ); - this.connections.connect( - panel_box.get_parent(), - 'notify::position', - _ => this.update_size(actors) - ); - - // 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 [width, height] = panel_box.get_size(); - - // if static blur, need to clip the background - 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 + (width - panel.width) / 2; - let y = p_y + p_p_y - monitor.y + (height - panel.height) / 2; - - 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 = Main.layoutManager.findMonitorForActor(panel); - } - - /// Connect when overview if opened/closed to hide/show the blur accordingly - /// - /// If HIDETOPBAR is set, we need just to hide the blur when showing appgrid - /// (so no shadow is cropped) - connect_to_overview() { - // may be called when panel blur is disabled, if hidetopbar - // compatibility is toggled on/off - // if this is the case, do nothing as only the panel blur interfers with - // hidetopbar - if ( - this.settings.panel.BLUR && - this.settings.panel.UNBLUR_IN_OVERVIEW - ) { - if (!this.settings.hidetopbar.COMPATIBILITY) { - this.connections.connect( - Main.overview, 'showing', _ => this.hide() - ); - this.connections.connect( - Main.overview, 'hidden', _ => this.show() - ); - } else { - let appDisplay = Main.overview._overview._controls._appDisplay; - - this.connections.connect( - appDisplay, 'show', _ => this.hide() - ); - this.connections.connect( - appDisplay, 'hide', _ => this.show() - ); - this.connections.connect( - Main.overview, 'hidden', _ => this.show() - ); - } - - } - } - - /// Connect to windows disable transparency when a window is too close - connect_to_windows() { - if ( - this.settings.panel.OVERRIDE_BACKGROUND_DYNAMICALLY - ) { - // connect to overview opening/closing - this.connections.connect(Main.overview, ['showing', 'hiding'], - _ => this.update_visibility() - ); - - // connect to session mode update - this.connections.connect(Main.sessionMode, 'updated', - _ => this.update_visibility() - ); - - // manage already-existing windows - for (const meta_window_actor of global.get_window_actors()) { - this.on_window_actor_added( - meta_window_actor.get_parent(), meta_window_actor - ); - } - - // manage windows at their creation/removal - this.connections.connect(global.window_group, 'child-added', - this.on_window_actor_added.bind(this) - ); - this.connections.connect(global.window_group, 'child-removed', - this.on_window_actor_removed.bind(this) - ); - - // connect to a workspace change - this.connections.connect(global.window_manager, 'switch-workspace', - _ => this.update_visibility() - ); - - // perform early update - this.update_visibility(); - } else { - // reset transparency for every panels - this.actors_list.forEach( - actors => this.set_should_override_panel(actors, true) - ); - } - } - - /// An helper to connect to both the windows and overview signals. - /// This is the only function that should be directly called, to prevent - /// inconsistencies with signals not being disconnected. - connect_to_windows_and_overview() { - this.disconnect_from_windows_and_overview(); - this.connect_to_overview(); - this.connect_to_windows(); - } - - /// Disconnect all the connections created by connect_to_windows - disconnect_from_windows_and_overview() { - // disconnect the connections to actors - for (const actor of [ - Main.overview, Main.sessionMode, - global.window_group, global.window_manager, - Main.overview._overview._controls._appDisplay - ]) { - this.connections.disconnect_all_for(actor); - } - - // disconnect the connections from windows - for (const [actor, ids] of this.window_signal_ids) { - for (const id of ids) { - actor.disconnect(id); - } - } - this.window_signal_ids = new Map(); - } - - /// Update the css classname of the panel for light theme - update_light_text_classname(disable = false) { - if (this.settings.panel.FORCE_LIGHT_TEXT && !disable) - Main.panel.add_style_class_name("panel-light-text"); - else - Main.panel.remove_style_class_name("panel-light-text"); - } - - /// Callback when a new window is added - on_window_actor_added(container, meta_window_actor) { - this.window_signal_ids.set(meta_window_actor, [ - meta_window_actor.connect('notify::allocation', - _ => this.update_visibility() - ), - meta_window_actor.connect('notify::visible', - _ => this.update_visibility() - ) - ]); - this.update_visibility(); - } - - /// Callback when a window is removed - on_window_actor_removed(container, meta_window_actor) { - for (const signalId of this.window_signal_ids.get(meta_window_actor)) { - meta_window_actor.disconnect(signalId); - } - this.window_signal_ids.delete(meta_window_actor); - this.update_visibility(); - } - - /// Update the visibility of the blur effect - update_visibility() { - if ( - Main.panel.has_style_pseudo_class('overview') - || !Main.sessionMode.hasWindows - ) { - this.actors_list.forEach( - actors => this.set_should_override_panel(actors, true) - ); - return; - } - - if (!Main.layoutManager.primaryMonitor) - return; - - // get all the windows in the active workspace that are visible - const workspace = global.workspace_manager.get_active_workspace(); - const windows = workspace.list_windows().filter(meta_window => - meta_window.showing_on_its_workspace() - && !meta_window.is_hidden() - && meta_window.get_window_type() !== Meta.WindowType.DESKTOP - // exclude Desktop Icons NG - && meta_window.get_gtk_application_id() !== "com.rastersoft.ding" - && meta_window.get_gtk_application_id() !== "com.desktop.ding" - ); - - // check if at least one window is near enough to each panel and act - // accordingly - const scale = St.ThemeContext.get_for_stage(global.stage).scale_factor; - this.actors_list - // do not apply for dtp panels, as it would only cause bugs and it - // can be done from its preferences anyway - .filter(actors => !actors.is_dtp_panel) - .forEach(actors => { - let panel = actors.widgets.panel; - let panel_top = panel.get_transformed_position()[1]; - let panel_bottom = panel_top + panel.get_height(); - - // check if at least a window is near enough the panel - let window_overlap_panel = false; - windows.forEach(meta_window => { - let window_monitor_i = meta_window.get_monitor(); - let same_monitor = actors.monitor.index == window_monitor_i; - - let window_vertical_pos = meta_window.get_frame_rect().y; - - // if so, and if in the same monitor, then it overlaps - if (same_monitor - && - window_vertical_pos < panel_bottom + 5 * scale - ) - window_overlap_panel = true; - }); - - // if no window overlaps, then the panel is transparent - this.set_should_override_panel( - actors, !window_overlap_panel - ); - }); - } - - /// Choose wether or not the panel background should be overriden, in - /// respect to its argument and the `override-background` setting. - set_should_override_panel(actors, should_override) { - let panel = actors.widgets.panel; - - PANEL_STYLES.forEach(style => panel.remove_style_class_name(style)); - - if ( - this.settings.panel.OVERRIDE_BACKGROUND - && - should_override - ) - panel.add_style_class_name( - PANEL_STYLES[this.settings.panel.STYLE_PANEL] - ); - } - - 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.show(); - }); - } - - hide() { - this.actors_list.forEach(actors => { - actors.widgets.background.hide(); - }); - } - - // 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() { - this._log("removing blur from top panel"); - - this.disconnect_from_windows_and_overview(); - - this.update_light_text_classname(true); - - const immutable_actors_list = [...this.actors_list]; - immutable_actors_list.forEach(actors => this.destroy_blur(actors, false)); - this.actors_list = []; - - this.connections.disconnect_all(); - - this.enabled = false; - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > panel] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > panel] ${str}`); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js deleted file mode 100644 index dcf05eba..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/screenshot.js +++ /dev/null @@ -1,110 +0,0 @@ -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.settings = settings; - this.screenshot_background_managers = []; - this.effects_manager = effects_manager; - } - - enable() { - this._log("blurring screenshot's window selector"); - - // connect to monitors change - this.connections.connect(Main.layoutManager, 'monitors-changed', - _ => this.update_backgrounds() - ); - - // update backgrounds when the component is enabled - this.update_backgrounds(); - } - - update_backgrounds() { - // remove every old background - this.remove_background_actors(); - // create new backgrounds for the screenshot window selector - for (let i = 0; i < Main.screenshotUI._windowSelectors.length; 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 - ); - - // 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(); - - 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); - }); - } - } - - 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(); - }); - - 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); - }) - ); - - this.screenshot_background_managers = []; - } - - disable() { - this._log("removing blur from screenshot's window selector"); - - this.remove_background_actors(); - this.connections.disconnect_all(); - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > screenshot] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > screenshot] ${str}`); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js deleted file mode 100644 index 6ab0644f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/components/window_list.js +++ /dev/null @@ -1,148 +0,0 @@ -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -import { PaintSignals } from '../conveniences/paint_signals.js'; -import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; - - -export const WindowListBlur = class WindowListBlur { - constructor(connections, settings, effects_manager) { - this.connections = connections; - this.settings = settings; - this.paint_signals = new PaintSignals(connections); - this.effects_manager = effects_manager; - this.pipelines = []; - } - - enable() { - this._log("blurring window list"); - - // blur if window-list is found - Main.layoutManager.uiGroup.get_children().forEach( - child => this.try_blur(child) - ); - - // listen to new actors in `Main.layoutManager.uiGroup` and blur it if - // if is window-list - this.connections.connect( - Main.layoutManager.uiGroup, - 'child-added', - (_, child) => this.try_blur(child) - ); - - // connect to overview - this.connections.connect(Main.overview, 'showing', _ => { - this.hide(); - }); - this.connections.connect(Main.overview, 'hidden', _ => { - this.show(); - }); - } - - try_blur(actor) { - if ( - actor.constructor.name === "WindowList" && - actor.style !== "background:transparent;" - ) { - this._log("found window list to blur"); - - const pipeline = new DummyPipeline( - this.effects_manager, this.settings.window_list - ); - pipeline.attach_effect_to_actor(actor); - this.pipelines.push(pipeline); - - actor.set_style("background:transparent;"); - - actor._windowList.get_children().forEach( - window => this.style_window_button(window) - ); - - this.connections.connect( - actor._windowList, - 'child-added', - (_, window) => this.style_window_button(window) - ); - - this.connections.connect( - actor, - 'destroy', - _ => this.destroy_blur(pipeline, true) - ); - - - // 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 (this.settings.HACKS_LEVEL === 1) { - this._log("window list hack level 1"); - - this.paint_signals.disconnect_all_for_actor(actor); - this.paint_signals.connect(actor, pipeline.effect); - } else { - this.paint_signals.disconnect_all_for_actor(actor); - } - } - } - - 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;" - ); - } - - // 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); - } - - 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) - ); - } - } - - hide() { - this.pipelines.forEach(pipeline => pipeline.effect?.set_enabled(false)); - } - - show() { - this.pipelines.forEach(pipeline => pipeline.effect?.set_enabled(true)); - } - - disable() { - this._log("removing blur from window list"); - - const immutable_pipelines_list = [...this.pipelines]; - immutable_pipelines_list.forEach(pipeline => this.destroy_blur(pipeline)); - - this.pipelines = []; - this.connections.disconnect_all(); - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > window list] ${str}`); - } -}; \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js deleted file mode 100644 index 0583db33..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/connections.js +++ /dev/null @@ -1,106 +0,0 @@ -import GObject from 'gi://GObject'; - -/// An object to easily manage signals. -export const Connections = class Connections { - constructor() { - this.buffer = []; - } - - /// Adds a connection. - /// - /// Takes as arguments: - /// - an actor, which fires the signal - /// - signal(s) (string or array of strings), which are watched for - /// - a callback, which is called when the signal is fired - connect(actor, signals, handler) { - if (signals instanceof Array) { - signals.forEach(signal => { - let id = actor.connect(signal, handler); - this.process_connection(actor, id); - }); - } else { - let id = actor.connect(signals, handler); - this.process_connection(actor, id); - } - - } - - /// Process the given actor and id. - /// - /// This makes sure that the signal is disconnected when the actor is - /// destroyed, and that the signal can be managed through other Connections - /// methods. - process_connection(actor, id) { - let infos = { - actor: actor, - id: id - }; - - // remove the signal when the actor is destroyed - if ( - actor.connect && - ( - !(actor instanceof GObject.Object) || - GObject.signal_lookup('destroy', actor) - ) - ) { - let destroy_id = actor.connect('destroy', () => { - actor.disconnect(id); - actor.disconnect(destroy_id); - - let index = this.buffer.indexOf(infos); - if (index >= 0) { - this.buffer.splice(index, 1); - } - }); - infos.destroy_id = destroy_id; - } - - this.buffer.push(infos); - } - - /// Disconnects every connection found for an actor. - disconnect_all_for(actor) { - // get every connection stored for the actor - let actor_connections = this.buffer.filter( - infos => infos.actor === actor - ); - - // remove each of them - 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`); - } - - // remove from buffer - let index = this.buffer.indexOf(connection); - this.buffer.splice(index, 1); - }); - } - - /// Disconnect every connection for each actor. - disconnect_all() { - 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`); - } - }); - - // reset buffer - this.buffer = []; - } - - _warn(str) { - console.warn(`[Blur my Shell > connections] ${str}`); - } -}; \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js deleted file mode 100644 index 544d68cf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/dummy_pipeline.js +++ /dev/null @@ -1,112 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js deleted file mode 100644 index 947d535f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/effects_manager.js +++ /dev/null @@ -1,90 +0,0 @@ -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.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, true); - }); - - this.connections.connect(effect, 'notify::actor', _ => { - let actor = effect.get_actor(); - - if (effect.old_actor && actor != effect.old_actor) - effect.old_actor.disconnect(effect.old_actor_id); - - if (actor && actor != effect.old_actor) { - effect.old_actor_id = actor.connect('destroy', _ => { - this.remove(effect, true); - }); - } - }); - } - - // 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; - delete effect.old_actor_id; - - let index = this.used.indexOf(effect); - if (index >= 0) { - this.used.splice(index, 1); - - 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() { - 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js deleted file mode 100644 index 1e1dba84..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/keys.js +++ /dev/null @@ -1,188 +0,0 @@ -import { Type } from './settings.js'; - -// This lists the preferences keys -export const KEYS = [ - { - component: "general", schemas: [ - { type: Type.PIPELINES, name: "pipelines" }, - { type: Type.I, name: "hacks-level" }, - { type: Type.B, name: "debug" }, - ] - }, - { - component: "overview", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.S, name: "pipeline" }, - { type: Type.I, name: "style-components" }, - ] - }, - { - component: "appfolder", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.I, name: "style-dialogs" }, - ] - }, - { - component: "panel", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.B, name: "static-blur" }, - { type: Type.S, name: "pipeline" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.B, name: "unblur-in-overview" }, - { type: Type.B, name: "force-light-text" }, - { type: Type.B, name: "override-background" }, - { type: Type.I, name: "style-panel" }, - { type: Type.B, name: "override-background-dynamically" }, - ] - }, - { - component: "dash-to-dock", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.B, name: "static-blur" }, - { type: Type.S, name: "pipeline" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { type: Type.B, name: "unblur-in-overview" }, - { type: Type.B, name: "override-background" }, - { type: Type.I, name: "style-dash-to-dock" }, - ] - }, - { - component: "applications", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - { 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" }, - { type: Type.AS, name: "blacklist" }, - ] - }, - { - component: "lockscreen", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.S, name: "pipeline" }, - ] - }, - { - component: "window-list", schemas: [ - { type: Type.B, name: "blur" }, - { type: Type.S, name: "pipeline" }, - { type: Type.I, name: "sigma" }, - { type: Type.D, name: "brightness" }, - ] - }, - { - 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.S, name: "pipeline" }, - ] - }, - { - component: "hidetopbar", schemas: [ - { type: Type.B, name: "compatibility" }, - ] - }, - { - component: "dash-to-panel", schemas: [ - { 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js deleted file mode 100644 index 5fbfee47..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/paint_signals.js +++ /dev/null @@ -1,91 +0,0 @@ -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; - - -export const PaintSignals = class PaintSignals { - constructor(connections) { - this.buffer = []; - this.connections = connections; - } - - connect(actor, blur_effect) { - let paint_effect = new EmitPaintSignal(); - let infos = { - actor: actor, - paint_effect: paint_effect - }; - let counter = 0; - - actor.add_effect(paint_effect); - this.connections.connect(paint_effect, 'update-blur', () => { - try { - // checking if blur_effect.queue_repaint() has been recently called - if (counter === 0) { - counter = 2; - blur_effect.queue_repaint(); - } - else counter--; - } catch (e) { } - }); - - // remove the actor from buffer when it is destroyed - if ( - actor.connect && - ( - !(actor instanceof GObject.Object) || - GObject.signal_lookup('destroy', actor) - ) - ) - this.connections.connect(actor, 'destroy', () => { - const immutable_buffer = [...this.buffer]; - immutable_buffer.forEach(infos => { - if (infos.actor === actor) { - // remove from buffer - let index = this.buffer.indexOf(infos); - this.buffer.splice(index, 1); - } - }); - }); - - this.buffer.push(infos); - } - - disconnect_all_for_actor(actor) { - 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); - - // remove from buffer - let index = this.buffer.indexOf(infos); - this.buffer.splice(index, 1); - } - }); - } - - disconnect_all() { - this.buffer.forEach(infos => { - this.connections.disconnect_all_for(infos.paint_effect); - infos.actor.remove_effect(infos.paint_effect); - }); - - this.buffer = []; - } -}; - -export const EmitPaintSignal = GObject.registerClass({ - GTypeName: 'EmitPaintSignal', - Signals: { - 'update-blur': { - param_types: [] - }, - } -}, - class EmitPaintSignal extends Clutter.Effect { - vfunc_paint(node, paint_context, paint_flags) { - this.emit("update-blur"); - super.vfunc_paint(node, paint_context, paint_flags); - } - } -); \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js deleted file mode 100644 index 84b1d7af..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipeline.js +++ /dev/null @@ -1,223 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js deleted file mode 100644 index 0fdfe9ea..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/pipelines_manager.js +++ /dev/null @@ -1,168 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js deleted file mode 100644 index 53f8497c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings.js +++ /dev/null @@ -1,363 +0,0 @@ -import GLib from 'gi://GLib'; -const Signals = imports.signals; - -/// An enum non-extensively describing the type of gsettings key. -export const Type = { - B: 'Boolean', - I: 'Integer', - D: 'Double', - S: 'String', - C: 'Color', - AS: 'StringArray', - PIPELINES: 'Pipelines' -}; - -/// An object to get and manage the gsettings preferences. -/// -/// Should be initialized with an array of keys, for example: -/// -/// let settings = new Settings([ -/// { type: Type.I, name: "panel-corner-radius" }, -/// { type: Type.B, name: "debug" } -/// ]); -/// -/// Each {type, name} object represents a gsettings key, which must be created -/// in the gschemas.xml file of the extension. -export const Settings = class Settings { - constructor(keys, settings) { - this.settings = settings; - this.keys = keys; - - this.keys.forEach(bundle => { - let component = this; - let component_settings = settings; - if (bundle.component !== "general") { - let bundle_component = bundle.component.replaceAll('-', '_'); - this[bundle_component] = { - settings: this.settings.get_child(bundle.component) - }; - component = this[bundle_component]; - component_settings = settings.get_child(bundle.component); - } - - - bundle.schemas.forEach(key => { - let property_name = this.get_property_name(key.name); - - switch (key.type) { - case Type.B: - Object.defineProperty(component, property_name, { - get() { - return component_settings.get_boolean(key.name); - }, - set(v) { - component_settings.set_boolean(key.name, v); - } - }); - break; - - case Type.I: - Object.defineProperty(component, property_name, { - get() { - return component_settings.get_int(key.name); - }, - set(v) { - component_settings.set_int(key.name, v); - } - }); - break; - - case Type.D: - Object.defineProperty(component, property_name, { - get() { - return component_settings.get_double(key.name); - }, - set(v) { - component_settings.set_double(key.name, v); - } - }); - break; - - case Type.S: - Object.defineProperty(component, property_name, { - get() { - return component_settings.get_string(key.name); - }, - set(v) { - component_settings.set_string(key.name, v); - } - }); - break; - - case Type.C: - Object.defineProperty(component, property_name, { - // returns the array [red, blue, green, alpha] with - // values between 0 and 1 - get() { - let val = component_settings.get_value(key.name); - return val.deep_unpack(); - }, - // takes an array [red, blue, green, alpha] with - // values between 0 and 1 - set(v) { - let val = new GLib.Variant("(dddd)", v); - component_settings.set_value(key.name, val); - } - }); - break; - - case Type.AS: - Object.defineProperty(component, property_name, { - get() { - let val = component_settings.get_value(key.name); - return val.deep_unpack(); - }, - set(v) { - let val = new GLib.Variant("as", v); - component_settings.set_value(key.name, val); - } - }); - 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) { - component[property_name + '_signal_ids'].push( - component_settings.connect('changed::' + key.name, cb) - ); - }; - - component[property_name + '_disconnect'] = function () { - component[property_name + '_signal_ids'].forEach( - id => component_settings.disconnect(id) - ); - component[property_name + '_signal_ids'] = []; - }; - }); - }); - }; - - /// Reset the preferences. - reset() { - this.keys.forEach(bundle => { - let component = this; - if (bundle.component !== "general") { - let bundle_component = bundle.component.replaceAll('-', '_'); - component = this[bundle_component]; - } - - bundle.schemas.forEach(key => { - let property_name = this.get_property_name(key.name); - component[property_name + '_reset'](); - }); - }); - - this.emit('reset', true); - } - - /// From the gschema name, returns the name of the associated property on - /// the Settings object. - get_property_name(name) { - return name.replaceAll('-', '_').toUpperCase(); - } - - /// Remove all connections managed by the Settings object, i.e. created with - /// `settings.PROPERTY_changed(callback)`. - disconnect_all_settings() { - this.keys.forEach(bundle => { - let component = this; - if (bundle.component !== "general") { - let bundle_component = bundle.component.replaceAll('-', '_'); - component = this[bundle_component]; - } - - bundle.schemas.forEach(key => { - let property_name = this.get_property_name(key.name); - component[property_name + '_disconnect'](); - }); - }); - } - - _warn(str) { - console.warn(`[Blur my Shell > settings] ${str}`); - } -}; - -Signals.addSignalMethods(Settings.prototype); \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js deleted file mode 100644 index 2affbc1a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/settings_updater.js +++ /dev/null @@ -1,40 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js deleted file mode 100644 index 0277e0eb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/conveniences/utils.js +++ /dev/null @@ -1,38 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/client.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/client.js deleted file mode 100644 index 3867b3a6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/client.js +++ /dev/null @@ -1,58 +0,0 @@ -import Gio from 'gi://Gio'; - -const bus_name = 'org.gnome.Shell'; -const iface_name = 'dev.aunetx.BlurMyShell'; -const obj_path = '/dev/aunetx/BlurMyShell'; - - -/// Call pick() from the DBus service, it will open the Inspector from -/// gnome-shell to pick an actor on stage. -export function pick() { - Gio.DBus.session.call( - bus_name, - obj_path, - iface_name, - 'pick', - null, - null, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - null, - null - ); -} - -/// Connect to DBus 'picking' signal, which will be emitted when the inspector -/// is picking a window. -export function on_picking(cb) { - const id = Gio.DBus.session.signal_subscribe( - bus_name, - iface_name, - 'picking', - obj_path, - null, - Gio.DBusSignalFlags.NONE, - _ => { - cb(); - Gio.DBus.session.signal_unsubscribe(id); - } - ); -} - -/// Connect to DBus 'picked' signal, which will be emitted when a window is -/// picked. -export function on_picked(cb) { - const id = Gio.DBus.session.signal_subscribe( - bus_name, - iface_name, - 'picked', - obj_path, - null, - Gio.DBusSignalFlags.NONE, - (conn, sender, obj_path, iface, signal, params) => { - const val = params.get_child_value(0); - cb(val.get_string()[0]); - Gio.DBus.session.signal_unsubscribe(id); - } - ); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/iface.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/iface.xml deleted file mode 100644 index 4f298ad1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/iface.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/services.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/services.js deleted file mode 100644 index 4b1f4f0c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/dbus/services.js +++ /dev/null @@ -1,93 +0,0 @@ -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as LookingGlass from 'resource:///org/gnome/shell/ui/lookingGlass.js'; - - -export const ApplicationsService = class ApplicationsService { - constructor() { - let decoder = new TextDecoder(); - let path = GLib.filename_from_uri(GLib.uri_resolve_relative( - import.meta.url, 'iface.xml', GLib.UriFlags.NONE) - )[0]; - let [, buffer] = GLib.file_get_contents(path); - let iface = decoder.decode(buffer); - GLib.free(buffer); - - this.DBusImpl = Gio.DBusExportedObject.wrapJSObject(iface, this); - } - - /// Pick Window for Preferences Page, exported to DBus client. - pick() { - // emit `picking` signal to know we are listening - const send_picking_signal = _ => - this.DBusImpl.emit_signal( - 'picking', - null - ); - - // emit `picked` signal to send wm_class - const send_picked_signal = wm_class => - this.DBusImpl.emit_signal( - 'picked', - new GLib.Variant('(s)', [wm_class]) - ); - - // notify the preferences that we are listening - send_picking_signal(); - - // A very interesting way to pick a window: - // 1. Open LookingGlass to mask all event handles of window - // 2. Use inspector to pick window, thats is also lookingGlass do - // 3. Close LookingGlass when done - // It will restore event handles of window - - // open then hide LookingGlass - const looking_class = Main.createLookingGlass(); - looking_class.open(); - looking_class.hide(); - - // inspect window now - const inspector = new LookingGlass.Inspector(Main.createLookingGlass()); - inspector.connect('target', (me, target, x, y) => { - // remove border effect when window is picked. - const effect_name = 'lookingGlass_RedBorderEffect'; - target - .get_effects() - .filter(e => e.toString().includes(effect_name)) - .forEach(e => target.remove_effect(e)); - - // get wm_class_instance property of window, then pass it to DBus - // client - const type_str = target.toString(); - - let actor = target; - if (type_str.includes('MetaSurfaceActor')) - actor = target.get_parent(); - - if (!actor.toString().includes('WindowActor')) - actor = actor.get_parent(); - - if (!actor.toString().includes('WindowActor')) - return send_picked_signal('window-not-found'); - - send_picked_signal( - actor.meta_window.get_wm_class() ?? 'window-not-found' - ); - }); - - // close LookingGlass when we're done - inspector.connect('closed', _ => looking_class.close()); - } - - export() { - this.DBusImpl.export( - Gio.DBus.session, - '/dev/aunetx/BlurMyShell' - ); - }; - - unexport() { - this.DBusImpl.unexport(); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl deleted file mode 100644 index 142b89bf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.glsl +++ /dev/null @@ -1,13 +0,0 @@ -uniform sampler2D tex; -uniform float red; -uniform float green; -uniform float blue; -uniform float blend; - -void main() { - vec4 c = texture2D(tex, cogl_tex_coord_in[0].st); - vec3 pix_color = c.xyz; - vec3 color = vec3(red, green, blue); - - cogl_color_out = vec4(mix(pix_color, color, blend), 1.); -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js deleted file mode 100644 index 7de753d6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/color.js +++ /dev/null @@ -1,140 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl deleted file mode 100644 index 760798ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.glsl +++ /dev/null @@ -1,93 +0,0 @@ -// 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js deleted file mode 100644 index 109be126..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/corner.js +++ /dev/null @@ -1,211 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl deleted file mode 100644 index 64c16821..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.glsl +++ /dev/null @@ -1,71 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js deleted file mode 100644 index 04d61004..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/derivative.js +++ /dev/null @@ -1,120 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl deleted file mode 100644 index 98712683..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.glsl +++ /dev/null @@ -1,76 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js deleted file mode 100644 index 8103486f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/downscale.js +++ /dev/null @@ -1,140 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js deleted file mode 100644 index 8678d9a9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/effects.js +++ /dev/null @@ -1,332 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl deleted file mode 100644 index 809cc93d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.glsl +++ /dev/null @@ -1,70 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js deleted file mode 100644 index 113a6fdb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/gaussian_blur.js +++ /dev/null @@ -1,213 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl deleted file mode 100644 index 58d26949..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.glsl +++ /dev/null @@ -1,14 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js deleted file mode 100644 index fe531145..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/hsl_to_rgb.js +++ /dev/null @@ -1,31 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl deleted file mode 100644 index 4142a467..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.glsl +++ /dev/null @@ -1,44 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js deleted file mode 100644 index fbf01a7b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/monte_carlo_blur.js +++ /dev/null @@ -1,187 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js deleted file mode 100644 index 556ffa49..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_dynamic_gaussian_blur.js +++ /dev/null @@ -1,43 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js deleted file mode 100644 index fe003f5b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/native_static_gaussian_blur.js +++ /dev/null @@ -1,43 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl deleted file mode 100644 index 6d701b60..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.glsl +++ /dev/null @@ -1,20 +0,0 @@ -uniform sampler2D tex; -uniform float noise; -uniform float lightness; - -float PHI = 1.61803398874989484820459; -float SEED = 24; - -float noise_gen(in vec2 xy) { - float r = fract(tan(distance(xy * PHI, xy) * SEED) * xy.x); - r = r != r ? 0.0 : r; - return r; -} - -void main() { - vec4 c = texture2D(tex, cogl_tex_coord_in[0].st); - vec3 pix_color = c.xyz; - float blend = noise * (1. - noise_gen(gl_FragCoord.xy)); - - cogl_color_out = vec4(mix(pix_color, lightness * pix_color, blend), 1.); -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js deleted file mode 100644 index 3049fa1d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/noise.js +++ /dev/null @@ -1,76 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js deleted file mode 100644 index e9cad9b0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/pixelize.js +++ /dev/null @@ -1,88 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl deleted file mode 100644 index b7a35ac3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.glsl +++ /dev/null @@ -1,18 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js deleted file mode 100644 index 5c4eb05e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/rgb_to_hsl.js +++ /dev/null @@ -1,31 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl deleted file mode 100644 index 5cc06ec8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.glsl +++ /dev/null @@ -1,57 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js deleted file mode 100644 index fb719c31..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/effects/upscale.js +++ /dev/null @@ -1,120 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/extension.js deleted file mode 100644 index 443d7b6b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/extension.js +++ /dev/null @@ -1,589 +0,0 @@ -import Meta from 'gi://Meta'; -import Clutter from 'gi://Clutter'; -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 { PanelBlur } from './components/panel.js'; -import { OverviewBlur } from './components/overview.js'; -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'; - - -/// The main extension class, created when the GNOME Shell is loaded. -export default class BlurMyShell extends Extension { - /// Enables the extension. - enable() { - // add the extension to global to make it accessible to other extensions - // 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._log("enabling extension..."); - - // create main extension Connections instance - this._connection = new Connections; - - // store it in a global array - this._connections = [this._connection]; - - // 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 = () => { - // create a Connections instance, to manage signals - let connection = new Connections; - - // store it to keeps track of them globally - this._connections.push(connection); - - return [connection, this._settings, this._effects_manager]; - }; - - this._panel_blur = new PanelBlur(...init()); - this._dash_to_dock_blur = new DashBlur(...init()); - this._overview_blur = new OverviewBlur(...init()); - 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()); - - // connect each component to preferences change - this._connect_to_settings(); - - // enable the lockscreen blur, only one important in both `user` session and `unlock-dialog` - if (this._settings.lockscreen.BLUR && !this._lockscreen_blur.enabled) - this._lockscreen_blur.enable(); - - // ensure we take the correct action for the current session mode - this._user_session_mode_enabled = false; - this._on_session_mode_changed(Main.sessionMode); - - // watch for changes to the session mode - this._connection.connect(Main.sessionMode, 'updated', - () => this._on_session_mode_changed(Main.sessionMode) - ); - } - - /// Enables the components related to the user session (everything except lockscreen blur). - _enable_user_session() { - this._log("changing mode to user session..."); - - // maybe disable clipped redraw - this._update_clipped_redraws(); - - // enable every component - // if the shell is still starting up, wait for it to be entirely loaded; - // this should prevent bugs like #136 and #137 - if (Main.layoutManager._startingUp) { - this._connection.connect( - Main.layoutManager, - 'startup-complete', - () => this._enable_components() - ); - } 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 - try { - if (this._settings.overview.BLUR && !this._overview_blur.enabled) - this._overview_blur.enable(); - } catch (e) { - this._log("Could not enable overview blur directly"); - this._log(e); - } - try { - if (this._settings.dash_to_dock.BLUR - && !this._dash_to_dock_blur.enabled) - this._dash_to_dock_blur.enable(); - } catch (e) { - this._log("Could not enable dash-to-dock blur directly"); - this._log(e); - } - try { - if (this._settings.panel.BLUR && !this._panel_blur.enabled) - this._panel_blur.enable(); - } catch (e) { - this._log("Could not enable panel blur directly"); - this._log(e); - } - - // tells the extension we have enabled the user session components, so that we do not - // disable them later if they were not even enabled to begin with - this._user_session_mode_enabled = true; - } - - /// Disables the extension. - /// - /// This extension needs to use the 'unlock-dialog' session mode in order to change the blur on - /// the lockscreen. We have kind of two states of enablement for this extension: - /// - the 'enabled' state, which means that we have created the necessary components (which only - /// are js objects) and enabled the lockscreen blur (which means swapping two functions from - /// the `UnlockDialog` constructor with our ones; - /// - the 'user session enabled` mode, which means that we are in the 'enabled' mode AND we are - /// in the user mode, and so we enable all the other components that we created before. - /// We switch from one state to the other thanks to `this._on_session_mode_changed`, and we - /// track wether or not we are in the user mode with `this._user_session_mode_enabled` (because - /// `this._on_session_mode_changed` might be called multiple times while in the user session - /// mode, typically when going back from simple lockscreen and not sleep mode). - disable() { - this._log("disabling 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(); - - // untrack them - this._panel_blur = null; - this._dash_to_dock_blur = null; - this._overview_blur = null; - 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; - - // make sure no settings change can re-enable them - this._settings.disconnect_all_settings(); - - // force disconnecting every signal, even if component crashed - this._connections.forEach((connections) => { - connections.disconnect_all(); - }); - this._connections = []; - - // remove the clipped redraws flag - this._reenable_clipped_redraws(); - - // remove the extension from GJS's global - delete global.blur_my_shell; - - this._log("extension disabled."); - - this._settings = null; - } - - /// Disables the components related to the user session (everything except lockscreen blur). - _disable_user_session() { - this._log("disabling user session mode..."); - - // disable every component except lockscreen blur - this._panel_blur.disable(); - this._dash_to_dock_blur.disable(); - 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(); - - // remove the clipped redraws flag - this._reenable_clipped_redraws(); - - // tells the extension we have disabled the user session components, so that we do not - // disable them later again if they were already disabled - this._user_session_mode_enabled = false; - } - - /// Restarts the components related to the user session. - _restart() { - this._log("restarting..."); - - this._disable_user_session(); - this._enable_user_session(); - - this._log("restarted."); - } - - /// Changes the extension to operate either on 'user' mode or 'unlock-dialog' mode, switching - /// from one to the other means enabling/disabling every component except lockscreen blur. - _on_session_mode_changed(session) { - if (session.currentMode === 'user' || session.parentMode === 'user') { - if (!this._user_session_mode_enabled) - // we need to activate everything - this._enable_user_session(); - } - else if (session.currentMode === 'unlock-dialog') { - if (this._user_session_mode_enabled) - // we need to disable the components related to the user session mode - this._disable_user_session(); - } - } - - /// Add or remove the clutter debug flag to disable clipped redraws. - /// This will entirely fix the blur effect, but should not be used except if - /// the user really needs it, as clipped redraws are a huge performance - /// boost for the compositor. - _update_clipped_redraws() { - if (this._settings.HACKS_LEVEL === 2) - this._disable_clipped_redraws(); - else - this._reenable_clipped_redraws(); - } - - /// Add the Clutter debug flag. - _disable_clipped_redraws() { - Meta.add_clutter_debug_flags( - null, Clutter.DrawDebugFlag.DISABLE_CLIPPED_REDRAWS, null - ); - } - - /// Remove the Clutter debug flag. - _reenable_clipped_redraws() { - Meta.remove_clutter_debug_flags( - null, Clutter.DrawDebugFlag.DISABLE_CLIPPED_REDRAWS, null - ); - } - - /// Enables every component from the user session needed, should be called when the shell is - /// entirely loaded as the `enable` methods interact with it. - _enable_components() { - // enable each component if needed, and if it is not already enabled - - if (this._settings.panel.BLUR && !this._panel_blur.enabled) - this._panel_blur.enable(); - - if (this._settings.dash_to_dock.BLUR && !this._dash_to_dock_blur.enabled) - this._dash_to_dock_blur.enable(); - - if (this._settings.overview.BLUR && !this._overview_blur.enabled) - this._overview_blur.enable(); - - if (this._settings.appfolder.BLUR) - this._appfolder_blur.enable(); - - if (this._settings.applications.BLUR) - this._applications_blur.enable(); - - 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(); - - this._log("all components enabled."); - } - - /// Updates needed things in each component when a preference changed - _connect_to_settings() { - // 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()); - - - // ---------- OVERVIEW ---------- - - // toggled on/off - this._settings.overview.BLUR_changed(() => { - if (this._settings.overview.BLUR) - this._overview_blur.enable(); - 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) - this._overview_blur.update_components_classname(); - }); - - - // ---------- APPFOLDER ---------- - - // toggled on/off - this._settings.appfolder.BLUR_changed(() => { - if (this._settings.appfolder.BLUR) - this._appfolder_blur.enable(); - 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 - this._settings.appfolder.STYLE_DIALOGS_changed(() => { - if (this._settings.appfolder.BLUR) - this._appfolder_blur.blur_appfolders(); - }); - - - // ---------- PANEL ---------- - - // toggled on/off - this._settings.panel.BLUR_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.enable(); - else - this._panel_blur.disable(); - }); - - // 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.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 - this._settings.panel.UNBLUR_IN_OVERVIEW_changed(() => { - this._panel_blur.connect_to_windows_and_overview(); - }); - - // force light text toggled on/off - this._settings.panel.FORCE_LIGHT_TEXT_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.update_light_text_classname(); - }); - - // panel override background toggled on/off - this._settings.panel.OVERRIDE_BACKGROUND_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.connect_to_windows_and_overview(); - }); - - // panel style changed - this._settings.panel.STYLE_PANEL_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.connect_to_windows_and_overview(); - }); - - // panel background's dynamic overriding toggled on/off - this._settings.panel.OVERRIDE_BACKGROUND_DYNAMICALLY_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.connect_to_windows_and_overview(); - }); - - - // ---------- DASH TO DOCK ---------- - - // toggled on/off - this._settings.dash_to_dock.BLUR_changed(() => { - if (this._settings.dash_to_dock.BLUR) - this._dash_to_dock_blur.enable(); - else - this._dash_to_dock_blur.disable(); - }); - - // static blur toggled on/off - this._settings.dash_to_dock.STATIC_BLUR_changed(() => { - if (this._settings.dash_to_dock.BLUR) - this._dash_to_dock_blur.change_blur_type(); - }); - - // 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 - this._settings.dash_to_dock.OVERRIDE_BACKGROUND_changed(() => { - if (this._settings.dash_to_dock.BLUR) - this._dash_to_dock_blur.update_background(); - }); - - // dash-to-dock style changed - this._settings.dash_to_dock.STYLE_DASH_TO_DOCK_changed(() => { - if (this._settings.dash_to_dock.BLUR) - this._dash_to_dock_blur.update_background(); - }); - - // dash-to-dock blur's overview connection toggled on/off - this._settings.dash_to_dock.UNBLUR_IN_OVERVIEW_changed(() => { - if (this._settings.dash_to_dock.BLUR) - this._dash_to_dock_blur.connect_to_overview(); - }); - - - // ---------- APPLICATIONS ---------- - - // toggled on/off - this._settings.applications.BLUR_changed(() => { - if (this._settings.applications.BLUR) - this._applications_blur.enable(); - else - this._applications_blur.disable(); - }); - - // application 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(() => { - if (this._settings.applications.BLUR) - this._applications_blur.connect_to_overview(); - }); - - // application 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(() => { - if ( - this._settings.applications.BLUR - && !this._settings.applications.ENABLE_ALL - ) - this._applications_blur.update_all_windows(); - }); - - // application blacklist changed - this._settings.applications.BLACKLIST_changed(() => { - if ( - this._settings.applications.BLUR - && this._settings.applications.ENABLE_ALL - ) - this._applications_blur.update_all_windows(); - }); - - - // ---------- LOCKSCREEN ---------- - - // toggled on/off - this._settings.lockscreen.BLUR_changed(() => { - if (this._settings.lockscreen.BLUR) - this._lockscreen_blur.enable(); - else - this._lockscreen_blur.disable(); - }); - - // lockscreen pipeline changed - this._settings.lockscreen.PIPELINE_changed(() => { - if (this._settings.lockscreen.BLUR) - this._lockscreen_blur.update_lockscreen(); - }); - - - // ---------- WINDOW LIST ---------- - - // toggled on/off - this._settings.window_list.BLUR_changed(() => { - if (this._settings.window_list.BLUR) - this._window_list_blur.enable(); - 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(); - }); - - - // ---------- HIDETOPBAR ---------- - - // toggled on/off - this._settings.hidetopbar.COMPATIBILITY_changed(() => { - // no need to verify if it is enabled or not, it is done anyway - this._panel_blur.connect_to_windows_and_overview(); - }); - - - // ---------- DASH TO PANEL ---------- - - // toggled on/off - this._settings.dash_to_panel.BLUR_ORIGINAL_PANEL_changed(() => { - if (this._settings.panel.BLUR) - this._panel_blur.reset(); - }); - - - // ---------- SCREENSHOT ---------- - - // toggled on/off - this._settings.screenshot.BLUR_changed(() => { - if (this._settings.screenshot.BLUR) - this._screenshot_blur.enable(); - else - this._screenshot_blur.disable(); - }); - - // screenshot pipeline changed - this._settings.screenshot.PIPELINE_changed(() => { - if (this._settings.screenshot.BLUR) - this._screenshot_blur.update_pipeline(); - }); - } - - _log(str) { - if (this._settings.DEBUG) - console.log(`[Blur my Shell > extension] ${str}`); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg deleted file mode 100644 index bdab3095..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/add-row-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/applications-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/applications-symbolic.svg deleted file mode 100644 index 87f307f5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/applications-symbolic.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/bottom-panel-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/bottom-panel-symbolic.svg deleted file mode 100644 index 2eda98b7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/bottom-panel-symbolic.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dash-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dash-symbolic.svg deleted file mode 100644 index 5a78b467..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dash-symbolic.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg deleted file mode 100644 index 652f8c0d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/down-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg deleted file mode 100644 index 925e9007..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/duplicate-row-symbolic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg deleted file mode 100644 index c37b9aa7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/dynamic-mode-symbolic.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg deleted file mode 100644 index f4115ada..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/edit-row-symbolic.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg deleted file mode 100644 index fa045a8b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/heart-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/other-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/other-symbolic.svg deleted file mode 100644 index 45e703e4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/other-symbolic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/overview-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/overview-symbolic.svg deleted file mode 100644 index 445f6621..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/overview-symbolic.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg deleted file mode 100644 index d451b238..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/pipelines-symbolic.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg deleted file mode 100644 index a8da14f5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/remove-row-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/reset-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/reset-symbolic.svg deleted file mode 100644 index e443de4f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/reset-symbolic.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg deleted file mode 100644 index e6d2d9e7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-row-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-window-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-window-symbolic.svg deleted file mode 100644 index cad2da87..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/select-window-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg deleted file mode 100644 index 5b0eb20c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/icons/hicolor/scalable/actions/static-mode-symbolic.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 9228b72cb3cfcae96fe60b20b1efa0f81b858f4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7995 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 T>1mwxX=Gwj{4Co9He%B9v34ccyozt(oqv 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 L|M!1IyZ8Pdl-J5} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 118ad996c8e5eaac3afd6b7041dbb48fea5269e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 818a7e23bfcf957eb8460644755798b4b7b049ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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-vGqPRS1)|);d>GB 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 155dcbb6f3faafe23c5efd60a31ceb7ab396d896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 0a31cf83b4f4df6d0c7d0f5d7ea3f1a2e0b84905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15289 zcmbuFeUKz)UB?>?1QsxmfFvOJ@ES;V_UfTSkr%+;nVy->&U8<@ zdvX5d0}P4|c#Gg1f=@{A>{1 z3w{E81NdF=2>8;=g5Z_ly`TdNkg0-4!Iyzw0Qn2P%-2i7zXD$feiPJl|5D!nF8F4y ze+-JAH}dct*ah|cqaaHLkAvFJm%szySHP!0E%rR%J0K(n{{iZ`AA!#YFTFenU|sOD zC0+sYQ*b4yao2#Cg1f;hz`fvWz@y+h!27_P!7qaQ!KXmc{}vuz0IvtN&N)!?d;pZ- zezm-Q&C7$}6i749n*XDq=zatg ze;xy2UGRDE?ckq)8TcLWCh(r03xX5iW8fL^DNy{p8R3bJBcRs37es}E`$5hB0I2mI z0+}lKwetSwLADnBKKOC)tDsc!@RdPu6?h8N_yH)oGf?wB0M3FR1@-&|Q1bd3sD1ox zdH-9W`1`M*`1-x_`um{feGZF=KbL}gz^g#*{|Ko0?kO<__52#Bc^&}u+{56j!QTK+ zgMSQ)FPC66((AiG@%?wf+rhsE`3o**&^y5vI08Qa9t8grybIimk!pXR0uO*+18)VN zk20MFmq6*$XTkm8KZD}SYcX2kHQ-V3?V#lI5UA%r1-=#hJ5YA{Bk)=<`~`2f9|y(1 z3!vutIw*So2KfK>|v?4}tfCkAa84 z7rrqFZUIk$-vd7hO8)PElh?Z!zuEKUHjp8~m%#}9N6>+{UhVO{py+%Mg!RG4KvXjL zJy7!bbI|kwl-_*{gq6Yfz}?^s&gyRPCU8Iao1p0b7AU>>cTjrwKj591g{2GV|f^UE=@G0;x_zHw_8~9#O z`t&=X_VojB8N3YTxD?Dl?QaA8I{0vTe~HNuRd5U}z#*vpKM6{1KLBUIkKr6O?_=Og zz%PL;5nKdc1bzq9KE4lXU;hir&VyZEFJ1;pA7{Z|1|J4*2A>0S9|ms)d*CK0JG&Mm zlbmh=9e5VJ3_J&lA0Gj=pGQDcA^2@j>;EMvJ^Tjv5%AwY(LcD(+us@}zJ3}MeZK{2 zzAu9N!6(Y=?}IPn`p2Nwx$GA`UIo6G>oJE$FP9I4H*x)KZ~=VPjh@bTml%Ux?vKHjgZ~7c z1^){~WWnKm-Yz#lZUrx3GNuX^K=JQ=p!WSC5R(cX0WlAY!B>HrTOY@ved;6qP3( zd72!g1Nyv*tY4qGq6y(D+E&79XXp53gUM;v57ky3Vdhu$MKwc*v z=X35%KhCQSa5hY{$c?h79p@2bj|(=i?gmi~J)?rXZA2ZdI*9YarCqlcv&*&IB`Nz) zjU7AvT>sSRxFus(Fwg19coYrdB(jUMHkX|mTN%VA-E!Do>1F8{MzNso_(feF4Pbkk zIku(Sc{_`uB=1AY9fzTU`J3~kt5LQZM{A7w+!$I21U0$pYu!wqKK6T;8FVt3H^EIyh_=N#a$V`KU z+DGO70-dR>p}b+fCLFj?m_!4wg^OX{mrbA4E&rI5V7ob14=$!CSahzy2GPn{hYlbp zoXR+t9vB&#p-4yNI<@sRW-W!_A739u!9rRT_{36#!2-1Qiv*Vx+}011o)^8CQ2B=e zgm`Bl`dJ;}%F9)xU5##-R!6d|xpEq>0$6&u8mIMSo%JNdr8o6JUNfq!->rs&aineb zp$oT*^Gt_BTrZoR(SzH~v$Wf_7+)SGMVv*9>%@78ak%y%9*wYmyntyw-tFM=6UUZZ z-j4e-z8P1<%kdyC*11ZG z3|opioXW(4#V}jpEAQKvIB0?ugM-CrdEDdM{9dqFQVfL?b*k>I^$9Xz<*MOM5`~QS zBT80FWESqGG{{E6l_;xRb2a(g(~Xx_m71$%pUGf0o#dl1Lj~3=y=hFbm2xzh)l>60 z-o6%7oQ51wB{vaaTG(I*Ayf`u2H=eu^u1Eae4p3@d0j?sHH=%0d$SEShij!CN6OdVKQae;9PWLCbbIz!=AT&6crT1x?5t0f{S>Y3$Dz(Ec5YSFVc~toC zW@g~;OeG5n6$^@6!*zFB@z}*EE8A8gPl!ET*B~b8(^jLDVK6w|r@)x#%IUZ_41?1a z5rQ-5I7P?g$1}(?98&dInPs`SxKD~c7wEU;NfuN^FRfP&$1E%xDRYyd`ORVFG~_^C zKg^Vinw`i{HK)(Wxn(&zHs%u@yOQ#k^kDyOWew>7LqjeIUnV5|t!S~C{G?O)6GQVs zy2ipXwlu+2D|1mgf@d`2qCjohO1UFHS4>twa#^p_*z+@Z!qT?oxYuKS%S>mD_L3s* zSX#A=ZiyQ^F6Mt4jE8ZOHVG+v-;^BBG z3#CAlvn^EiS%noTFTkIU(3Bm@H@fvHHx9@#VXAmyCzY41&yf z5`Vn7?Qxbt8N-a6K`Z*2hv#)+lg30t&9g=DWob^FRhD0Rp@x(y&77u}&~2-lV;z+I zuM!{WC=b**lqK_08_SbC8NQuSE$B;yxiW7i)>sXKQPhv^xz3HwH8L4L&DOBzYcZ38 zcK-BH>lqF2kW|m2Az_94KD8b5X&PNVSwjAS)R zEY}MBv(`9s#})p{^Bpq6Dh##`cUpHUV5P}Ev*p%s-3w)ZI8LJC92tNzr`EB&7k663 z$GmkW-REXbo@kwlR$~opEs}EWbJy*@?rp8zH?;QL=yvbjxBJFxck`J!N;%mwO(C03 zvwiONG;&K>$KAXZEi1v^e_z^GBPyF4rW?aB9?T)sTN#)1#)RnBnJ66Ya|a`}zTD0I zq8R1-cI~3zK?ZZ>9CI|BcA*mr?D;Nvn8`M_Ty>&d_1ya?+h>j)KDJb|053hGDj0)o zouS{b&nk>vqd^!aH&JJW89x1%JI)+v?X91a9ncnQEhTMAs-(Bi?Ol$GnUl~F4qB8e z!+f7hMs}Isa@|eNpWc$V*WKdw+%)s9*1?Ek+whcCbMzQ7oBQ%{Z)+1z4Tftue?a&f9$o zUEK^ z`5C5{Myb?74zQ1U9nuSeCz?W@Iov$I`FPxGEUSG=?qW~6rMs*JW7vpE#!+X8q%okHT;en}mO_i3qY({CbMIPinD3t6goq&&_KbXJvPtq1}jXpAmDS>dk-dh$wgSjOm6e zg*{Liq&~%`G0F-l6Mexh7NXTO+Zc;4(vRgR<`%q0RNS&Ev}KL@)-=P= zLGM6lgjmO3Q_}=1DcF&k$Q=kXGB9ZvYfZ{6wpH2bwoNRxSD3VPU(hRsC~1xR{4l2Z zv_Taj6Tm6aVO1lIgu*ylk%QuM&(GxzI4?FYK<;)rrJ)N_OXO)eMCq0$9s&7Hv0}=l z{y$t)Q2P>ipVumzr&$M=ms8=zWb~{*(dP0e-|?W;Uu${uT&`^r0up*lwf)y?HgDrl z)u^xf{yS|qYLZ*JjM{>O6IJTt3v@}P>hbtHV>wQ#*^r_HXC{x)Buv|^MyPGvTFTf3 zHlvWTWiY95st_X~W1|Sp+=t4rjEaDB7~FZf$~_jqdBt>h zlwYhN8}Xv@m+mmhL+)-X-$L-NCF_&apuV^!{6s;}CPKtLtkRrGaHR1TV)J|v98TPk z@>N72gAW$R$x1Y^cM$fa8o*ve)ci;L^g5zqlIGABYJF}HZMr(yfsX+YRz=Y&d>$uF z(#srFqTa7jvo6Nn5&&GAa?G zOQTHmZlRC6H5HoIr)Bd5eR{5P!9JndF8z!juxfOt7vV{mj7-Zjdu~P!TpZWEqm+Hg zM$4r#(8_BdyOa!qcct>KupG_M8y)% z%0OC!&nyL>pASCEHY z+2-AR8Cjs&svTpIk7lJy(``h`f1{YjxM9S5R@)*9 zTZR9rndF^atg6YW23I^k61_7YdZ$H{s^2{+`j&5>$`H1QZ5)gApEXhptI?|Ng@xHt zP3g1h$vTa;$7=^!R#>F6@WJ(Q+bY3u0r(O;MimB?70}O__8=CipbY;l#p5j`tj4wa zB`t;YsQ|L2%10IPF;m`Nt)s~<%B0YqLl|W`ET3S$YGQAu2sS(av4`l!kgEhPYb5N` zWu*0_2E@M{J<80rBoZF31JY>QOss$BmY!QF6XA#eC6W(g!+OU>Qf&O3av5HHCF7sb zlkRq2K4+U3HXnyN{@@{uV{a+{>rhc`)d4@sQg))Ena26wk4E%Q3iDA$W#zgM_5!^K zZJpw&R&2|e>6p-Lt;-QT;`?I_KjY`O_hBIxzU14G5}H+D_hAY62s{}z3{6aT_t?@Q z{`;_3D%$1+wKPgylgomUFt))+&8ETz7cccHJE?x<`D8=wG|X4aiX^}4v*T`k(7Rfn&N>077g1=!@B)yA&V{98+{Ya5;_KRsKq^0E;` zJx%rVMYL<@eNAStu+^HH;)Jy@tcTSgrBH0K^vi4o_t?nLC;PSOW?iy*vDhe!>DZM6 zrNic)%YllyNDDC>wAXA_!V@9FJkBkM)socO_*MlKN-Ljdv3;Tn>6f&*3R-3bTPk&P zZB^#fNb(d^7x`Bgn&^`$8wnNmA&T+kRYy((PAuCJW4(0Pyy&BwYB9Zcn{c6FxKIf@ zEyDWB!>7+a?pud&4m+phkow!y2dHJd(=!7iJ@swEoh(Vz;3)L2&sw6^!wi>sv4D0> rhZhL3QpT@o`(UKCt0>8y`M~-mUKz0Me^}}mYI~R}Ei7F6hFb7{;~d|! diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index fc3ca9baefcb18db688e98c6fad1643ea138f3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10265 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 Zj`j>|YSx-8T9i@ET-s-&L+OjY_kSGLO5Fee diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 756a7237ed42d819880ed6feb2f61a5cfbffe175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17156 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 2719fca7e3ea8be90f70fbfdd33c338452e9c314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 zcmb7FJC7Vi5N?BcczGDiBLb@&AOddY9>TI&`@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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 09c4422105b74b4df2d4a605eedbee852561fda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7609 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 1bb85eba81a7ea77a7bd865ec97c84d8b94fafd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17284 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index abb4ac00d3cd401d964ab4adcc06716f6ff089c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmZ8d%We}f6de$3MyyzOaW_3S(@WOEcPhc~!zcnRYs1nYU4HpU06l1p6BR7{Mk zQ`;}((|@-3Pc@isW^-sTo}NulHV))T79SZMP}8SZmbMCb6;i8&)FUVx;XH=oD|F#6n|l_QKRdf{oK0&&yzfk);H_x_0RP$I&Y%C0=%nr diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index ee819a73273299b58c3665b8ddd7ba64573a0e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25807 zcmd6u36N!HRmVRGYa0XtQ4o!kK+96vxTMOZq|{Ohhz#+f1Ds_<%1l_5{0K4)0 zC9e*FCBiGfN$?y{^FIR0uXlil!27`0gRgsy^Xf8C`o0syH6a7F-h05azz>5O{|Ly` z@VlVKKLg6|{|ri>{{-cS=R-DK9|0BDSAnwgjo@3s6zqU^gW}6KV$@!67kB`?3sfBc z0hHeV0ZOmaNrG<#&jPj1D5!Pc1j_D9K&|^-@&3C&`8@@H9GnGT44y_1P&J$mO3vA! z?AZWH{)ONM@G4N_XF%~}9+dpU@%qO=#p@mr(cykj{{DQt{#&5r{|P96{sp)h{4yxN zyn*DD+$|BW1U3G8P;w4{8uu;`7lec0e(*3TKm8f_o!};dqkMZisCfMhcrEyO5EqA+ zCHMq9AABSD!{7{f9NYz-!KCj7-wDd@p98N3{}Q|$JogPD+yqX6SAf3=UJ3p;D1Ti^ z@(cHX^5Z)|`L_n{0e=KkJbx3^{67WH17CwOsw-E47l03dsylxK%Fq7=O74p=Qg*x& zJn;?WJa|6mUpm`y@f$;U9K3iFxeR_8oC2RAsP6~&ZVBOO@DIW3!N=d^ae2X; zJ$~N>Uc&Vzcq{m`@qE);-0lV_zuf^!-$y}2g+B%rpBIxnzYdOr;`0R;`nab+@$XBZ z^7B7I`R~k&Lij!K_2Ay;h44?Hu3v!?8n+uf9UKSez;?uE;`Q&p)OpYVHSROu^TA&N zaZUKuc>SNjGdTZm5K4wKF7xxv;KiKp0N(-rDEKk(i{MAVI^?rPuf00Qncb!Y{3J@isU`T=sxE|IO{r?>`4$%Jq#`xxSa}aQfsQG z+V*35@@Z2%9|KX#@=TXr!SQ;181l0@UXxE|Ih4a)4%}yTwg-w&r*SC%sy`QT@*NzC zzkU`tuH<+>NB;Ajd{AA&eOBl01fhQT1c!b;#WBV4Vvah;^EmW_c>${1o{v^i>^noAc&$n<~!LgU) zg&fe?e$J2hI`C4CcXPZtUdy4)hX%({j&nJ#<R`Q`KAz6;CXUzWB>wCIzlq}g7PhRo zvMm{J%yyD&ax$y+lHPRMOPcj&z1B_Aq?5KL+RbDxZ5-T?jL#=C_1eLDYYMzMYjl&z z*-mdd>m-aSKhLG}$z+FF^MG?TQ^NP6w5OtZ(r5DmJ`cDpy- zm`As)HPOu%oU8YyB`%r5mKN$w)MvY6$${y5H#dM!&2}eCW;$7|-px>Zwub@pNh9l` z&rA>7-jhve)keMBOWKpkTpcUtx=E{z{cUr{u-oOWiHT&VxhrhrPZNjgD2I8Z+q(At6$|*-mB>x-Mco!*>(r``lteI+0DLvyEPLVAMICnQ7E( z(5Bt$j*T2>C&bH*$?#hz>oSeVw7cCpQQCmu-gJ9*Y8ume)7+n!tz{Dl%1pL9&9qg^ zx*L-D_H0s1TS;xY-R@>4O(AKwlBX9wb$vTYJH7g3TI)T%@Kd=*xUp9}NuIv-Cz5OM zBau9mH8i4^j-z)g54~|Woq#R{b6agVFqZ7=WRpmcgRg71dRcN++G%*C6SQNzai-mw zN?Y|>F0VeBw6bi%$kM+^WM!Jv+6{|cblFU#!V0b6SF2k~;h-r|Z>Ce3WyK8atiwW& zey=?<+Q=q*$nCT&HTu_`=%nz}Z^C=AgUOAQctr9}r-!0j&1as~L@Db)hjCjxpFZe0 zOKNhXqT&iWW@lDdVYx2P4pY9!H>Y5=$edD&hixSpiCBY*W)g>8pQxve_Eb0N_U0QT zWjV3icT&!uC;r_Th@LhorE&wsiyMt}rjgd_X=^NOFOyg~Sv~i)wlnges!G^imej7F z5aB#|;{_{?EIE_5vW6$kj+Y zwx&jmO_9FLK?1`PFqmew3Dr|sx{EZ zOPI_+2}YYa>v6ZLLNN+-2OeP)K5MeVXgqbBdVe(!ZV zlkRlZXi(uOpEk4JoS{gmnsx9|lO$HjtyH?CTc2vxCn=w;USl3RRVVn(yk330-l+HH zIcxPgq;58$j}&&Qsr>21!P4rQ{d=~t0CVAIO(~Y#uxtA^$s0aFcLyd&h9;<>0IW0F zXwN0v8okj2>3A6$&xajp=U@=K?3WfaiW%Q`WaG0_VTW%RV9`|UsCUv@*b%*m*9xZR z*XE|#uG4(eBVw%#KE=B+{GyRr-A8VlNu*fKyN5#f*lP3T#F$iCc0H2`L<<*ppyhnd z<%))Z=8>G6P8`xsIuW<1^TH0#k+3tZO&b;4E$r12+6D9dXhSkLUDp7%-f?(7 z&F0(6H&~LK&3vZanlKNurzY2AbWp`!-O12vgLJ7+QY%S<3Az?`QFCq@=T&d^1 zB?G{;;-FG! zadplRUQG^rQjO<27)OSa(#l!&tWvO(&9pl`($c9{l{eY0#Ui99AD)WRce9bk1WtJJ z!XXqAe{iq>umR4fJXmkv$fn{ZCZR3$va!(&gY9*=9){48PE}bSDxE%`Y0<-8_BU;c zpj7EskgJht!5#&|Ufj@u|CP?Dyr!yD>1|>`@oFC9mOfj!W&PO54P`%(%(mRFpZFUP*itE z1=XWhTmrp#eqiERIY5$LS+z?5W zY-j7gA?s#6|6Oh4{7PSEr#*DLcE9F)vR}sl{PCwr`Q zjE!W|_J(F&n6ybG(`iS~8i-^Uj57V9k4yF#NGf_)YG=xks1IeLrWUW=ARh^ucuA&- z=D98=$rZIH#A4g$%}86jDKBFXqg;)nsx2{hy0mhrr_61)*tFD)s>7sLuuSDmNj34J z-7c$6Q^jLLsZGT*>lk63_;`J4iuLW8V}n^3HR6hO%Hz;eaTvOo-)hV@>#cTGk@(cU zjVj#h$)m98oXumK&T*MVg!0G9vUIz|W{R)*Mf=^r<*{}cFL)Y+e$uF!-du0aHdP6D zouKmGQ)^}K12T0}_UbG)7L^xaJa!vtFx#I$%+5k5bE3UX@HzgnNei}So8wHvmU^*q zI&*9|D#PovL#M^Z#2=3tuM-nmr+JW^0S?6%NqU3Op2>+-31v?5etqe5Y*j1ejTof7 zU6iL75Vr_k=Ga4=xMkg?tKl!-@&)}#aV$PBvAY>-$**$Q<}Jz0&6WPo#SCt={@89& zkmalIlk1v3!IR7eXq0vcD2;Jveq(%bJ7j)u zE=vy@$t!K^Sh#80UJk1jvo~AfeeuFXyP4`@O?98*s#kb%b>U#sSQlaWtC0>k|29nkzGx@A+c`Au6lU3|eNen$52u3^;Z#1l%pvo&E8PMd5M6Bk~1VRGqQHm)a^F<##k zSFh~yrlXP3X|l-?;mZ*M0cjpa4`gX`YjO=H){{%8d%c31UYC%;qX&3Dwbh>BHu7e!-nxXx*|ft> zaoLRrt{%Op9H+$Lt?%g0R*fgu*3{PIqValfWFLB@jZq#4o87HRYsOBymu zNA3E3%S-RqdQ#|<%ZtD0@=%pIk1_a;<)sDS0ey-WWW}N{^3?Lukqz8Nea$o}Pv+xn zvD=mxxxk&n40~jG2^}T&Nx#7ATsXmnpLDo&dGRj4#l&N#1?yG@aQOk7k6or2qANzR z7K$%1;t^9x&M?(aEH5pF!uC`07Ybk;8p{#)*~#sEx(jK3ffaBjD?}R)FE8H0ozKviv}^0EOivk5yRj-T#uou z31*PI$r6tMOoW7R5}ztgCPZt+Rf7cUeoi!}h7b6VO_m2vn$KB7{^Ep1m~fmpna!W& zDhuc)c5?^vEqHW>NO$W|OOhjvTroNSl%%hc5mIgOv*wXof<=vZ;vT~1?BTPVr0f|O z+qeAiA(%*fP~4)VK#)p=7#<%@Zrsfzl7baPm_c!5AyM|!gI!37X&2pxLFDcecIVjg zA_;*vMWQ~b{Z3UnsMs)M&>)Y&Nz)C>k?vkl_MwXC=w@(ESX5-N0$~&~Jad;{hKdT4 zssen%B#6LWCTPw76_xP{e!{6xll+uoxC>uA$fuZFq{LsLjm!gZ8k#_|D~A`ijp6Ngh>jc81C8QQVXl7vvVAJkVTc@dE~`}Q>!4=X>O z3#flW-^5yB!qiXmDff;^KsvS_;j)J+#?rS=vH^!L;31dcLr@r+v8Wf8wzp< zuPMM5Cv$8l_JLJO0;7qgDkeU`#NnGHghNkdMb!HgBPLS>CGM*B@Dk0uOvI(6ofnzDQk&BuUtTv6;A_Vk*q3&4vo>B zM5IC*mjLc``ddxz_XRg`W>gij-D%|^YFqlW!d8nV(Q8rtA(lkdbwk~ z;vr0wa$3n>r@)yN(LyjJVpUWkqYI``Y`m9{qx(G(iUd9dR(!As?&w;3p%28}Rt|`j)45zY5J^}>VA&nyK)=lck*9xuA~9>#?(f-5 zSZi*d4<*PQ>K5Z|wd-MJ2)XZekc@c)p9S;gz_5N9TA+({m;|6Us8{T?Or|o~TloVS}D9vWxSy3NTNWi(K|5 zg1U`fu*gH8mm-7Hxm1`GQ;JJ*t&`>j3dKpawql^NDqpBdN7myGi!qqRC`{-gb@43I zq#tSO#fl;K7qyJ5IE3*e1BvgYsq#Kx&IijOyk3^XtsA>s^b@RRlgxLXV#MWhD%9l*DGC^vl zSA~aOJ|A_r$NNRJa4?HQ=Aw+4S~#3gxu*#m!(B@TN_nP8e5q(5FGk-YQ#{g%Ow!i* zgo#YPE9CtfK0+%l;Xfq+H&_zB$!Jchbpqw=&&D)GjUdXk!!CTl`EO?HLQy>%6h|crZM$SQPTcY{B_&fHHJ!M6Bbp| z@ILXx1D_l6_iyIR)vE&2kDKdASw(FyKe===rnvY%*h~0y(wB^t0<6X*n2lXB$5vNr zmrff-dyB7Ld$Eb>LEOD`gipwUEbvD!?l_Mv4wUDFaOzsz<<=BDM5Q7-K7|ZIf&NHR zf>C0~kw^RgNXC4l+B;Yul|gy=LUH0EZbzBGDi2;?lSa!>MX3?@04e(%sq?I!R|Z;S zwCEaPC>6vR-f)N)c(-sk<%poF93W~iY%!>LJ7Xfsy!C=Wy+dSCsTYexSDg@#hB&um z;JQ7Am8`sgNc7AZ;&s{eSTaLa?;~wmPAN22=ZF)@H7jJMXYr+noN;O$o|jzQifAR7 zshGQfwB|Abv4Yi(SQf!l-^f&?nSoQt(c{6YKy^4QCVb}MbE6b78(H%8;Er$}0;ob> zbz>*NrDB+u4fZMoin@2(mZeX(`vvr3b?&-?{yCboieD^UjX`3E_DU!Nt)gdfGdALB ze&6qWV+g$(j!=my=@4Jkp@GW~7}IlxM)q-;D(6j(2yrXg0;{TCzP7<@a;6QI7g7CT zGx(&rzw%ZEeHm;!zZ-xv2~cT36p9wg0VL*{nt0O`i>>c{xOmN;7P#T=HhHQ)vm#5P%94TeO<$P-OYWF_Q^pYmW^ z(a#^Dp3BEH0${!@bsBU)3{p|SB0um3ra@i8t6h*`-*PMNof_Xp0}#e|A{k9Mg=N6y1&Y zF#bgKZ=}~qtzcUD4ss7m5BC(K2HIW4FK)pqH_Tk|F4_wbcS?3Ys}Og)r~#Fk$|7(e zu29OcJxM&_&amBtnFN^75lMnkNRn999IS*kOh!1PPTCtN-(v7xEE+!46UyDPKoVW@8 zV@%~SV0rOlwge)Nj#l@r+a*~mVaUodYq3NvbnN>&G&%)+^1jMODkj=Ft(Y2@VrC9% z%@_p}=z9ZH+JFJ9K{l#SM`7e}qL*~c`G2J|WLV>cr4)9=1)$*+w@7Q6-Q;9+4GK8$~Xo3Vo*M0zpu1TweToUL!@myCF`d$`eb>g#7PR zirgW*(z$qSNJzQv|h$%^E)iDj{LZFqr)PO2oU zMTID+ExgqNisITV@HSRMWm$o7eLIWYw>uDpVOYuj>b%gyDU-QTzRHsfq@xc#9r+8F z7!r3n5|PQ3ZHd7#DOuNJ%e4-_v1B)Qwh((A+VKY4nq#!*N8&-%FgfMAY6%xSX z$%KXY2j(i~OAAnnn<9vhafzIZW`#sr90~)2{RvT?j?I+UGa3_$#9>biRw5o^vPD6( z9lXR^cZ>g~AfY&7vCyG8-5W>RdfBF*xu5IG2|i>6Mxc*$YKz8lDo*2$j)W7UzCA(6{i zLxd<7=vyp8)QhkG%`z87s2J`&7(-&%`bcR1izymv|C4Dwj~EtlRB-wH4TYCd6$YxG zc1OR%O7OswuGo!o{kXi~3&RG}S7MlmE0*%&i-S~gY?D>E`X+JC{TKrO&-%sxmohKK zlv_h=(ZS?7K!jX(h~tX0zA^_t`ucFG^0mZJg-mBgmrolI2`xNuK80XFewY;NO`oOk<66|UUlxu{e5v-bDY@)0sm4-;E{IQH&qFNXG zduIUWaS!1Ww#xlltwNXh1x*5gs~us5=-OXW9ZbhJxvq zaHm?;2$XVxf!<*eC`H^aK_^RfX+b%5tu=$;EBZPwSI2EWE@dtrJYp8GvX_2Y!(0|Y z%KiN2gc`z$du)~6(3Q|l23zD!<1!Nl-_SC$pADLY777tJ7MwzyNCXgDL+C|4MZ0zO zL(Ck`FmDXCXnZejVa)w@#9ieYvfbhcHaE=~E=`nI11;5J5UhS#hx{B!K|Gs}zQ6TY zSaC8BlfMKMuFLlxaa?ULaS3rbj$2Z4(6!WQ4X>JuBci!QKw?s_YT=6XkGZR~@c)5W z6b9w2wE-|Da&5RvVM+4+t~L$B`MY8C zaJy9J2U}D3i<$*niD!4OL%fY*o*E5rhQ!A5QKB%&GqU{Zfx+ah7nK2J$bP&op%yiD zXuhn=i0O{CIL&qvt2pH>Q$T9Q1cJ1AAayln7Cw+)%jc}PX0aLz3^8)0yK~B5Dl1V* zq@b~%>8>)|!yMl!JQx-_$_R?x>05_WkJT%*HplcC=Cl@D2%+`^&!{2x4Wm2@(yQuw z)-pYY^PM3@=;9{IrN|pNzF@AW#y(*qZP)cei7K(tjH&W0#k_x0vxsX8FSoWn`^g!c z?3+V;fMxKYHKdjPO5twHuK4iLU*+%)LgL=d(5S0d?6|>U4{@Z}sap7w2&S3bFsO|$i$=@;^J@_U4YD~5 zlWFA2D*F+1L>Z02O}52--S3pl-bm#BLPD@m2&2|~C5N3TBG0-5Aq?k_iwa}|z7$0Z z{yDFnFtJC;q>UB?%)+%)E!?0I5fl0Le4-aOqCw2!_Y^~3mFYf{%S!k)8vvukG_)q| zUD;#Hi+%qKXT@SpDlF+M>e%fvNv?ai{_agm^}yA)@Wtn~w<`79;D3O> zDG%PJ)CzDncnZ89+yo==z2N6S4Sogu1@ODzFM~e?e+7K&+m(6;_+C)%?*;D%4}!AJ zGhiM3G${Lg4Lk|H0*XlYF!>k3`#^br0K5}CQs8m$SGnH?W&Aaet<@iZzXn?Hx4;qj zVeqfPqu{IHaqun{6}g`RPk;>&)z#mF?*?B0cfc=!BL9Q$RB8xrfIL#42k!#E0E!%6 z2W9{N0!5zhgJO>#frr35*en4LgGa#6f)~L51{tCrL0OsqI4JYafTG8f;9r0i#5C$B z;BSEc3(C0n{F0aF9#GbK09*wh0$E!9QGq>B#*aaf_m9DK@ROj(`DKtL)ytra`%myP z_#IH<;V6Ti0k46Nfu9Gjfjji2S@0E5-rvWj4}uL47pPBwGVZTH zS^sar7w%B%UqKnSi}LRSKLx%E{1>nW{yTUH{26#JcpfKw0PKSz|EEE*&je&^m4mX+ z%b>*HYv2a>Hk^DFJOPS)&x2yGZ-VE+Z-Zio5533R=Ljh4oB_p8*FcHKkAWgr3zYev z1ZCg90e=_#94Py~3~qxz14aH#l1Sq2Qy?Z*uYwl*HYod?{dGU@Y4GFRe;m}{|AC(Y zHA*6)`Xb09^(u%-)DJ<4<2x~`#LGKDvD00k>~{!!794>m!5@Pk10TKH%kg}H{{YH5 z{|q9s`Zw@1;47f$IfO*s5B@3m7Vrg7#{Cm0`g|3X{k{Q;U+yLuajkj~6#Eme@j`TMxUX7ahn zb%;xHLHvG-3)8z;d^0FMmCx^caNlc{-x4#`59W9Aak_XYIV61X1XrC4x^eYKVn^ae zJ`c#(rVfKN)A5ep3!+xMm+C0abQbGII7sSCUYD<0Eq%?+QJegf@iH&#SluwqZaaww zQA-wU?-%1==Z~*X|f=W^iCYMcqf7_d)^967`IcMW~0zn2c+smDZiUtx%Z<_gp3fw zsS~0$n@vS69wb3Kh)k&aCbA*gXC1v|(vBGDqCE1$mfLDNa4T+hwS6|jK&Z2-gB=}Y zI!LjAZPm*avbbODQ<|pYfuLvFSmp#Gb+X8&sd~I)qPF#(a^ia*h3w}YB4V-$BiL;w z!2_x8Cw9jsHfq|mt{#uWIN`h3$KH(~46+e-QI?oAvn{n{k}h9q$9>6?P9bN|E!!Bh z)t22cgD_KDL24SIm7tiJar$hpV9ZKJer#3rL@uveB?lpGJTd+d_ThtgJTea^KCE4ZK#w^YorsvDLp z703HvN;7QUERu99j!b6NcI2!`Qs~A=w+iF>r=_KwHHxf^Zx^O6=zP+$bCI;wfQb8& zY6Qc{IB8nAgc#EqBm9GMTk(Gb>n1Vz8jdtMzlXc=E#mIQNf#p$Rn=6guUwJ%>zR>m z8VScV?y&``I$M+VHra`jo*^7bi*z7Cd78x3p&gQ9r-POyHyS1>W0;5SPIY3c&IU~~ z%!0_S&X!5wBK4f<`b_Z*RQvw(9zVp}&Qr%Wr9FS*1*0}xUfGVpE!C-#C`<=Lt( zBLVe`RGcG)N*dx6vdzE;OSi<)=4MKqQlDsu^wqhgYH)8O#_D)ocyd*nW)=*wzIK^4 ziU;H(QGtMo?Z-)`P2}BBSLb7Gk}TL^in@Sfg&Ho1^6CQ1COD=->E$yQ`lY>!DD~-7 z*umV+d_<6~uUxXtxYx5$3jqgF2dB@3+=cv)Enu`9ZNn1coi+upb?Jh>T+3RT}WScMYy0; zbvbDFjJhIKdsZQ)L?*+v-Pu7x+^;*5J3|u=tnRr)?@g0KGG2E~BK6kAg9N0k8Nk1k zuWZJRvZQ|%`?#3yRdfh2g4DCZ^-Ba`2QR{2AVh~KaRMvYHp*g9*>o|Ze2J$YKsa9C zIw9WB^cE#;l|4+->_~}7Mr(;psbi8NbUZgN4=ssUl^kEYjfgEN{bddRx##{17Ejd98jTSEVE>Owr5S(xvIkOb#<*1WY#rZzU|cKNg-AIUc$@MvG%-BAY!6TL^#E&ZX_3RU`S*+Ld@iuUx!PyJUxfOss7|d>i`UfrAg# z4jif-d{nPLys`es2M_RBIZMM+yCMdrIK{~ZESL>VR3jT&Mj!Qeb$55XXM(U1KU@pcPTb4)!%>{(*E5nSe^JxZm~Ko>$Bg;@uBof-H#BNf=IKs6 z9_Ra}mG7rUovtjtYqS~r#fR)@(s9OSoqRu|Vaz9VY4h9o@$PjOQp+baZTVzup}pB0 zp-8#OCrLM-^dZD_9LeGc4rg&X3A-lj86--3&;-LP5;+lX8qv@96MDaKK502iz-9UM zaDXbE8E;hb-$=RD?raEc6)+f@uNf1CUQLtenwK>+b{j^g-(I4BehmSBSI!{{@ zUk_8;#&>BxY3CE^!Zv5`U02=>ct1g(>)A`sm9~p4N1Zvp%Hpe-P~21+vO#i?T9{Jr z*f3=YPj!oiysay)24TM6j#HFqvluQ(@)yNxHiupf(X?~X>}EKb$s{033N$tUi1Z)2gw2ss@zsJc`ftVj%) zKGB9ZdzM(t)R~}b`pq;(xm!B3I>uYrr3z+6%Wi&SY(w#R{wJiue5{Mo-RTaJ5%a!X za00PZF9mYLU(aU@7hf-pKpo;46z;|}4>S4QlHUJrR+f%mdd^24{fdOnO^W3cbf7<_ zZOC72#gy&cIC9)m*o`&2fke-|-LvI#MRmPBCMBtIU25RMq?A7ZsI#`c8#fx%@O-}) zw}lMS1#%H*iRw4fbj-2Ai7mvzk*;l9`6L|KF+$xc37zF;u2`Ce-W7M z+%d!-QEVs#vOh*n$8h(qtsV{M2uYonp8kN?R8z)KA6evz1-C=Z#UEq-v^ci| z^`a74yPo2f@>@|?P^Jv-VLmBTrbeY>$;Y{uh>nVNea4eO%g6GRp#A?Z6=I{TmRslh z6wBph&n(uh#j2F=M^bE^EWUbfvh|GVkyXx+yF#Q+aB)1;JDJM6+2v?Sz;lo$Z7UAO zV{lzYsg+*eg%UkWKn4de} z6APtzr@^+w@^bd^r5-k^uWasOkC4K!iV<+x&^onHg~SU-99K-&BykJnOe2!CDGs16 zs5v=Rsdw&X+H-V^6Dh%7HUuv5l~4a_kU5>_^GIFA*of={r09drPNU*?N2}KvGDr&b>@x{(gM0V|9*^mehmR640bUI>^me^J!ne|PEYTs^QP|D~H* zWg1@+32%T09EZH_GP*_6!!VMgXk#!MCM269@lh#Iz>8IlMd>>7>q9blK?pq1hl*r1 zv8XIul905NW%lYd&ph*#IaQAMS!^h$MDTMiQxegvU`#_`MiM5I*2y(4PD4i?F@GOa zj@h$l(?nwrPtVR0oQ9+c5ZP>AWy6O`_gk=EtD}mjJqHdTQ>q}M}2WD x`2Tem=HIuu+NgJp^b>A9=Y*5CL*U9;jVkE6FJXiapkV+gJo9xW)9f|+!`Ru#(uJ0~)d$-x$^VvxV)J)gT z)J;$KsQ>JGf)L`L-~sazAyCAFA0xp7ga=TN65t^O`SO55M0jx`fkXl?27y8(9{BvK zs;7I`dpQHGt@&8M!FPav1oEf;k{@~h zN__rx@FDKM4GP_Nuvs760cGD`=I2@Pw?JX_tKi$fe*pPY|IE*uz<-bU9q@;^|8G#{ z-}@G&IFfn*ydQiw_!HnN_%wJGd=mU^@ErIGDEz&ZpLOtE;G4lufIkcl!F_NJ%DKJ? z9)SM_z6Tt`99yg31RnrD4GKS>1%;2#gTmKefg+zTgO7q=2Mh4+_bPP;{1xyT_ytht z+{mE?(+z&2;?*U<5T><5s zFU0$w2W8z96#h%_6!_~PB-NjSu&n+%;@3c#|Bvzgx4~WRzYD$>+=9qQz#J62`aJjo z_%-k;aOFOwZh#pmdifG~4tz6*6Mip%SHN9R-oFe!0)7+3bkq_;l6en+LSKWQy$e}_ zhur@Y%3B3L@go6W0uinH0=NNw1>6Sj!9u)mwTc` z{|G409|eWZCMbOV94Pw!eNgQBk3re*i=gcD3MlLU7Q76;3L+}?(>lbhO;FDL8{iG_ z_dwD2YoOTegE+w&I0K&o{{R$v{{rrT-vQ5oR}l73fiHpb{!b$Q1&9dMSHQbK(V^J0 zT+cGZhF@TOA4BX_cz%e1d3k#TydMe=k1@n|?qk2B;F|G~`sB{G&vY)1TD zuImB3p5ni1i+_6Y22=C7t9d8-J;!(_Lu{(K#NO5!k1{^Sc%JbV#`_s^eLR5w-Hrcy z8;k#oKdbY4kk*B^`}=lS>1u2$T~7178mDvK*eoga%)MySQXjf%>@sci$Q{^B7bbCa z+1GnxS2oM}Z<-fY&k8$qrCrv8y3&Vcu2WlON(YKD(x_taQE))hx*mOP%HH zo_l6adfmQC5`Dw3QRn&BGtbLvZ1unlC!->-vqT8XlR#XTHsx@6pile$x}m9Dp6UHO zP1r{cdD8R5nKU1jx~%4@?M^7wdMgXRx^o|9ucyoqC8+gQ|E!Z6c5Y-49~5rnGL!0= z$!zK^L2sCHEE?OEM`7B@N@yl-!xOe$k$&4#w@t7q~w zFZi9#5dOfWu9|a~RfQ=lo2U&_O!z6s{zpjq1IdnR!w%{Zzx$?6E4ATDgX@U3EyUP7 zI~?OWrZG&|$*f_0SW&iT*e~+wLd1R}ztU!vEgC~?i1%-|UL+DVCfmM|#hf-PXGUZ) zZ@j2O;yCAMkll0dy}_hG+9)XbDo-n68)+9<%1ywMOZPTUehFt3lFO`Mby!hLsbdo+UnAV(`$g#^`QZHARQKs(xd-aN1I zRU{9Cg`MR^rO}F4Q(s-hdJn7~b(N*A=GqjM+lP+2hBZh$xh4`(*VwB-Tb%^cKJ)(4 z3Ne~?@WCh?b0?W%cDBE?V~6>4N(zVTI`b)5PH|{5pK6D7S>=+CHBSqD;p(-mO$k6# zqN{KyDRA+RhSUtIS=FSQ5cmDBHw(4hny=b+nB^i^c&$qcmVl2hJBSQZQRXTte2mLZZv|f&#KElmy~IK7@izDiK9sS zwwr}ld9c*xV6lQCut{2u#@J!4IW3!n^TvHb9hlk?a*vxHcl=PcP~#v8n7_T>2FC8N zJRvhL6I@I&980Dv<|~CQNyp;JRD`c5PjnSobVAX}o%WClrY%MO*Xx55A0e-H50F@PNM3o8)H{lUr2_sTwlehRs8>i^wGF`?^4oxP8>7O z)_efzP3Pe(=S-d1>P6z0gxTI!IdVylI8gTX@-@A*eXX}+51cIQZ4jT=^y$^pAL^|> z(OW&OS5L34KJmd-uB9u~ZM{7aFgZ3a*7T13l+ou?5^Q4hlLdDs+?;;w9Io!tKB9Sw zb=jyU6!rG3nXc(e^e2>=l7pWdSJkXsTUiF4=H7+}&hr|s6;o0kZ&-NZ~=gA4F zVtbp}Fi)rr*Yx89S1oPBhe>-BGShNRXET3Wo;`I&hkwtmo>_Xncfn@12;#XBPNP5E zf4rC2gC(`OZ!veMO!XX@=&79!OkGTn#LP`7qj0yODU6=hDW;Z~l$oI|gzrL5QTMf{ z;xb2-GH`SZ7ULs0*~-kEosXZ9PEZ8%gWZV!}@z#em${%#f_5-$s9heh7W>hUH>^FR{_w`GiMv_?IX^L=eL#L>P z+Qb$&%`&pgMx#2D9Vi>%rZ~23KZt)qXMqBk(m( zL5|d#bAwQ&r))aUW&+J+m>Jr%qY?@Wk3EY@yyz-3?O0M+KQnk>M;^^nX)YHOr;a?Y#@ zvI={q2&}+{v!RQIiHo38%q2FKd^A9&3*K-80;VZ4qb_%%uqnCqji$PQ)y?n#+Dw1c z=Jax!V{PUZL0r_1DRxEKJf2v2twqucqqP%LsV#U6E4`t5^X_hgiTagtmJ(;{5T|lJ zVQ~=W8(Y<6TVj@rp5;F&#MKKimRaT?9%MP@5*U4a}iI^;;HRd_eH-?Yqtp7(Dy8 zGuoKCqZR4}4Rn^zkU(P@{-E1tQc~LUOu{Fp_R^MT!Y)&yktO0&Gbh24w%7}2U^6Vy zyH()6qqN&R?k`;;C?|$+EM73T12Yhc13O^z8I=gBO|*oc)EZOZ_+veBUlm+w*IVHc-FEfiX|CqK)rDfx3wP!ZJuSs1T~TT(os&ZxMq z!rC@9*miIy2^93Jd}f)T+>yi~?EVUs2bR~ir$>)+yXV-P#PZjR%4e~Y#J#A)sQ{KX zTwy2FwiIfmk8u+_tnp`kUP?ENg(ltGY+2*poU$So#12-b^wmzAY(sj2obO+|;Y@9} z-!47F>T)n|`qyr<_a1=55r0quJn<=zP3c|@!IDPSyYEG*e|StKIJc9gk-cKjgUpsj zc1ygKc2d`P$?@Bc`5c?rd855kEV|oRfE{ge{S-V9=i^j3Bw6a{iDE*Q0&Su~pXI0DW*Q1Mlj1SA(&NTS17xA9-7ygSdk@-R_SvyH8ZteX?zUvl} zYTFv3Epxq(4t;3Xoz9hyO=QBJPltCTL> n&7(v{wG{b_j1?==SzWm?U+nPRSZz>l`G%t@KE#q1nOXf0+Qede diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 484f405068d1f7b720535d2d1433292d4a3104ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15008 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 1a8f89e4fd8551df113ae462bdb9daf72145d5ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17069 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 b%TO=bd0(J@y{sasZ(cK5C>z_^Wo`Z+p$G3T diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index c940d4bdc3feec396f64eae131c6e827af11d890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14981 zcmb`MZE#%GdB+be35k-D#FT`jO>*MAkP=C@Ng&2Rf{hIrFgUh>P)O3N)s=Md?%rj0 zWudeL*_MfH%drh!TQ-srL|~gS>4Ib<27A&@Gf6)*U;2`!oyp7OLzC*>?W8l!bdsho zzvrBD_uiFcLT0+-qyOH!=jA!i^M78>@eh|=TvL2@(f*LO_F|=`!TekJ!)N8&l-dqn z2lj)nfgb=@yj`jHfg8a#a4X0^waq>61aIZ}Yv5||d*H{xD}GO@SHRU^H~33%Irzm( zm3k1|4}KVo!8^crzC)?^fDeKitb$CXYT&!TXF>j{8UDNz{1*6D@E<_w_apZ{20zC0 ze}f{=N9f!M_JGpA2C}4j8kGHf1H1)%75phEi@gc>8HmX0-$3d2Yw*qBB}BcyTK#i7VxK_=<^1QCvw~Y%DNANP)I!t%KVRlvffUR zsnlNg{uz+1sT1Hn@HJ2<5nkU9ir$|CZwJ2v@=q;c(C5GoumnB^-U|L4ydPYNlgj>{0B-@m34R8AGi16C zTn7rDCcvA(AAq8l58$+dSAlne*Mef7ouKr80{kQJZ$a_PUxS|jy$@Qy-3N;P&Vn+} zUw|U--+;$1!rtIso_DaRuY#8@wSIjVlzG1cir)Smgc|C9L9yGrarU*~hroNm9`I)H zJoxwEMIV6!;P*hW!&g44)SrQMkXNeXV@hoRH-Q?Q1V0J>C5Q{DUx27yz2!=~{!&o* zxEvHat#02Fy%bk7$PyhQ$0pp3r_d^31I*bDv%_zv{&*Y5rI*|g~E zN1*ikSNHsLhra@ae-~e6dHyc&tvr9!;W7{vsOvyPP+tJW{<}c2-;cnJU^_+f1^T*(w;4eT-qt;wUE|T9tTv5dim#ngW zw-S{7-vL4abuWl}m>m3Gu!kleP3w~{e7b0%`G!A%_t7qQ&s!Wajam0L@Ut}3W&E`Q zeu;*e6k9Xg1B`9Af?t*gKKIjZq=|10&^|YfGum2pCf{*z5itgzzSNr_3rdRrXz#G&(WkvEFgKd5h@w$WlN~hk^7gUlB@U0M*eO)U1xuD`B zc7K%(4C=gJL7q~Ty?xp5mR0jXrK-aoJrJ7M>_0T>SnTKYr|xdO&ZtYR=Ih3w zD2fH;ja^h%{5)z8%bIP;>q@Td`^8EhqTEBu zlKHdqgxmb`w!k0AOxUjbD^9UusC>yQVG=A=?JxUghKik{%SU(JM)%2%F=@Bo7GcYn_B z)(F!RmJ41n=U3YGVA!v7UQy@z!m#3-*~BDaQU7FU{H{=Yg$`ma^6~6 zBOUz>XTox?R}6B=d_j*c`hK?|OY0(zm7dOpd1E`LvXZ010;#&o9t6vU<)UAPuwvGr zs`DO-bgb+1wmE&6&02Rvy?z-xb{Wx=;q$j_yb)4YOs}Be^@`n#DcP<4vmX9i`IlOq zG68kvyHTZ(a4-m-A5SLqX<-YBnZHzC17cT7624I!BSNEIK1mF*f1U?_r0e?@p; z#E==PVactNdS7N%X9U}Qu;i;XVYNz3bS6}5khQN`BqXVu`@CYWHN7Yyi4S=MvB5y( zXLXD#Q7#efO1NQI?Tcr1x@jy0@N{om5T=uL4;DQ_dX@(gHT}f<^)@fx@5?s(kc+TO z@C*wDLNA+cla34B)A{W{KrHu*)u8M%t~;oBIET*VgHj3aCkhzm6WwmT>+TKfbfwSF z=ZO^rA~P~5lyG;63uTm3DD_t*cx7USt^~cspoc(ItmX&Vr+6HH8CMOuf_zXNJ>*D+*R?{jUCA{+hU_);fuiut}%n-9R5n#!Esq+9~=T z%j1YeRyD1faxjB7|XKMjfP33Hagw)~PC0RBy>7^A)|Suhv?IsdZki&loZ+vI7|; z(Kv~V?RuaukPf7PE?Ck>5-28t9^W9Tl)_@S(HXH_-{zCan>nNGvr;>ux;y9@G!*J4 zdlJo!>Rjk$Ik?4}AgO6^4x6njYF*K=Q_7Dt^|`mHJ&ny=nzjYZ>jV`OB5W2%KQ4=B zz0~>%LfjITb3R1}j<2iqurJbOg{3H^R1V=kzC;l)04ZT0;tqu6t(Y2Dmp4r^;hWI1 zKzWn%Bt}%i0!yGK!-y77!n-T|5-HLgs%{IqeIi+xhpv*q!b@^^)&cwM z9$f(cLq6vrw_7G``5&|JJWz>+;D@p)mqLLBORt1Yf52QNc30` zfn}J}S(-h3Dh|o-O@E-SD^pt)f{x6)_6*I@nhUEfewzuY*pi6i5%d>b5`JU~q$DjS z=}&fu^x3iL)~MmSr22s@k}HXZxoWTtqv0L6gYaGI4iT{Im%?%tN?Yq?=j#b`&LyRK zCE0rq6T%(&HPtf;!3k~gXEaIZEs1NH`YiAFy6`EJ7O5Fr*;7&TOC)s{rlmURg<_RJ zTvx(qrds1WWtO@deo8n7MU++nl_}!X-E6)L>oO@geJ6gLNutgLZA5d{@_v(%WzU^$ zo6`KH`-`UZ7qt$ML`1Dm) zGg6u~3=O5kmokEwBZs0Kbzg;q%wo;6L-Iw-`{wHk-#BR@sM=T#AChTGSW0a&2OqV` zu|uyRp>6Uje%1cXRtEM>OR*rSVvXdj!l2$P`B(>#m2FEQPm0}~onT#iY#A0aXFTWx7sg&u^fI zDcib&-d@%>m1(7$9LIXvA@v8AjAxs`Nx{ubY~gJ=#{A%WJP=Cp}#zsNdvN>%rnpM?r2V) zl`7vwp^TLhX12;p>NcyIz?ygZPYNI5C>_!o$`tcL8&fA)G3<3lvYNT!mp)67qM_AF+sAUnTs)_Oz3yD6&MVTf18ppeyT6Y%l4qx zTcpJ5Fvl23%2r@F7t+@wj(V{Q|K(#^xLBoH~-9@qkXf-koo)i^u{PH=9M!!Lf=v4v}fRpwx^td#eH;`JP_ zyfUHu#(TEh(y=n_C-mnwtYcj<$4RQ#yGpO@3aV`zk;BV(a7rmuR_S8NJXUU8alN)* zZ(M$T+vhuO^*LT!jofEiQ?kpuDYxQ_N6($T4*==sw+I(#xd zJR_QG96BHG8j2@|bv!)T*g4Utjm=F@>Ud%%dhVQ#UN{*YJfIt6=Nh$BjT&>z9*Ukm ztsBQq&P|`|)Y0+rXy25MpBim!KMfpUav2xzI2|85)i^v7?>Q6g9f|f%b*lL5=iHi6 zeQfUK^E%ow<0MOkh)zsJ+lQm4&(FO)+FW)l+JoftR%SEtWG$)>A#r?SC^|8!<1^#& z$bDf zo=Wr@)$5{7vDlx_iY8M1qnRU^Wo#;Xc{qBdu5H&hHtpPOJ(`|HpYiy)=oxeg6`nLZ z*3lDFZ)^^f-#9c1C*pHZY$o1?Ja1r2x@{?|H+Bx0`{j7}rD)G{IvyE|r-qj5#?BX+ zMEJZkt_?T#)*GXz8hg<0k;mhS(WUJ6jI5I-baV<1m|5b9Ay^}}h8p+-mWlR5eTcJj zyQqKe{S!op}Mz79==U$nWZ_J)-2En7}X5FKiZepxa6Di#= z^X|y*=){CbBhGgMb=UTwVjM|FCq|5;?l%3JPB%P@iUvh;WC8j?tRzXu5Q^MDH;@l!*7J22|S~=gf5hi&`=aTowkBa{={hry@ zNTf1;Exwrq=jQdQISd;PJFbkI2tADnM^8q>i6f$7ysbIPT*@|%*5c#OksL6b>@PZg zGCPqYon^EMKk{p1Lc+fZ+_eiwCqju^9x6tA&AfL1q?l$*Gy2!@_#_El2?_R|OnHW) zCPZXm*`ku-vS}1(I*RqF`1s`9>&cL01KLKzx zdCn|)bU2^xD zJ5WuXEnv3Wbao@kq}~~}elC95q!o$ML{15tnGLtDDU6x#HWH1ZC#MjZD!>e1K#0tI z8Im?9GV!eTjL-!?txf8vM)8vMu}px^3YVQsDhcRpN44%s2-ciYh}Rf79lfwi!m7~q z0@5WBNfUIblw5*Lb(<*F>~`TqCU{H8woV|$R_X-t(IMTaot%3OPiy+u1ryOz!&HXK zdXbu|Z#V4Qe>xf-C8(M3ULz~Mnn~?RElRy%^RMaET2Ey?tLb;tJJ85&ZC(Z>u_Lry z>6p~7CXeo%fWbHfigNzi}B>R*wHPXO{!*~qiSn$Bz1D)X6p6BlJj9#a3{q< zyH4)CP2`q*FBSE1>}^r`DFI2O~h>uig@?Ei@@qF5C@PMAebvp{PhAsPC_h*|z@Eq;7dRx{O- zRLYe0^|5IBj4}l}fpHSWNphi(6o5&pC0!(GJ02fF1E!u!a`WPeh|;pvJ#5M}MnpM{ z9nI5`E6pX18t2y0*a0Cu651E843CGW;HhN9Q*~HN$dIsULw;){pvO#;Q7)^?xy#OA z$Rx2D?K=?{wZno6zF8u*RzQYS%~HU|c8D^+8Zgy_#LGqOhyiD#vl6Q$T@cx1XU`-j zQp+0?r>18(qC&H{CJybwZQ^>FyxrJ;I(}^mo7!_4j5|AGl}RTgYnS{fC9TON{Op`d zQlyq-uzwevGMa*6Y5sG^ytx@UOOy2$Ez(tlr8xfWtw*z?G8=Tk50;7w#rug9B=6nWTfT!!gVHXOn4}-mgOq z-R6oCPAKAH*vt0jY~xanu#}?9rt_#C6> zzgEp73*V$_jwdJNSlaj+XHjli#6seI$`(5&s7}uiUQSzoBx9t`$@wsOy+;1`CHYSw zllx6Sb|-Pba8trDhisy*`QpO|=UtiD&>+#&M12X?!;S#$X|^&1nmA7{rkH^@ z@i828!Rb3WxDu?)VYbsC>t_8$c*UxciERJq>D>}4<7eveuH8?t(bi@#yIgcNRv!w zv}<3x+rmtR)}kRDAC(gmy0vIqvv3m=)Z zk=~OCT}?DVU+!dABhPTon|JB9;%XaKTz3=JT()j<7;l+($@aP_+LaS&EQOV$=^3pZ z&m6+FNUSe%0lLgyh_OC(@r4$$4!+pL`-kOTILSVQ4pZAKOH++hs^;FLlYnY3C0wd{ z{m%C8Aaf;PXLgeqmd>k&(*%`<#HRMedBi5JfNo7_Nr}O2gj{N;w-nY|?h4&yKb72) zExbYD#38FRkIlxKl)}?zBvDGOM@e<~pgn-gB_@|*?$#3eO6a2QYZhr27{Gx+E_mFn zK8|RdMHC|5yQ6MdN6Mr)0iP!$llTD w=-_j6vqO@L2$7txQ5O3#S3arP7VpJ91uM(hFsZKPv~Q##@xH<0J1GkO4~}pK%K!iX diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 2436b7ce593041297a2637a4a86fcd0d7a865502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7968 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 Ntm$qFi=!lO{tru=fWQC% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index fdca0515aec9120491c7a7d3b75f41c971a11ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17057 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index c872ad07bbf4b4f0094def207c10225fdf320fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 zcmZ8g&5j&35H=7XYB(T74v}&w&WU?w2O({GvnU&O6GdW^RcQV$NS^7MZl~RL%XZJC zC5}1f%7F*q2~ecvyi#5vx4Z%Gz~^4F8)4~FxyvqBeN|t-`TWZ70_$Vo22cW@055>F zPJvH>zk$zySHLykHLwBx0a9%Bo)Evl8rYY>DQct*!jl*sGO_vF@78Cz{Dw@n$M>)$%3+IYR@ zRlG%t8eKQ+X`{@*wAG0cQ|CPLa;-r#7bo65#clbpl0UK!=t(g#l-(#p!^YfIgXQ=v zd&0f*Q67g{SMuIa2U)s;vXjU132$@?l!qWw&|<#$O3rV~#RA)6zPLHZ%Dz(}%F-(v zK-u|%4wcnx==%+L1da{esV2|e@Ya(f?>7jv^`L5&C9AHWN6v3iyR!6Xw9bc??ldv> zp_t7Y7a~{rmY1okx%2f514`_|EH&nW(*M4!on59W$lC1q;qlRBJ9hGU_N}uR6c~&> zC`Nu3XT4F{?$N4I9`*14P~Mljm-iCWHG6qvSFX~wE@*eDV|Ic%l#!5A7m%u-KEwWE zkIuLImcHDloxSX5`G76^^IrXQPKmzGcVxwzEKRNUsuQI)!JM6X(vyILZle+hZPZY6 z(&D5t3Q^fg`AU>%ZLOf*|H3$?EuH;Im>>p3t@EDSNIhIrxbjQZRRGrz5cp1-JUiqV znOclujS_fz%DUFk2A$%lD}sDb#~6_{U=$EsH)%R(oF{Ql8-|2YMH;&rYSfhe#mgF@ j<`%ubMXW6~XQv>*NZ~6@_0y#8i@1(8;>L=h?p*u}YN&N; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 071cbd4fadc6eb3e87e65689d6448ebbfe08fda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14189 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 NoNAUrPLV?I{{cZ;rg8uP diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 8206001164eabd78615d3cc1744eb349e53e6d34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10348 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

! 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 6efb1c7bfef0484e89ab50f06950cb779fd885db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24834 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 603f521bd1d59b2204552a1b42bc9fc9005f82d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16836 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 38b4c47a27536d544ec15630ac564cfdf8e4fb25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21285 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 aVNk7`&)_-%v2SBq3YV@r3p2-J!T$mOw*4yr diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 38be0d019a2712b2458956b5aa717f307967df59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7239 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 Xd6$2n4UT+}ZGm&Onlx!NVDtX~0)pTb diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_Hans/LC_MESSAGES/blur-my-shell@aunetx.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_Hans/LC_MESSAGES/blur-my-shell@aunetx.mo deleted file mode 100644 index 19e2cfb4bbc348828e86f010b766c85a786dfc1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13533 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 p;~eL)*E@l8TpST@&lCR0SmCqZKPN9iVlRY8FT6 { - let list_box = prefs_group - .get_first_child() - .get_last_child() - .get_first_child(); - - let elements = []; - let i = 0; - let element = list_box.get_row_at_index(i); - while (element) { - elements.push(element); - i++; - element = list_box.get_row_at_index(i); - } - - return elements; -}; - - -export const Applications = GObject.registerClass({ - GTypeName: 'Applications', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/applications.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'blur', - 'sigma', - 'brightness', - 'opacity', - 'dynamic_opacity', - 'blur_on_overview', - 'enable_all', - 'whitelist', - 'add_window_whitelist', - 'blacklist', - 'add_window_blacklist' - ], -}, class Applications extends Adw.PreferencesPage { - constructor(preferences, preferences_window) { - super({}); - this._preferences_window = preferences_window; - - this.preferences = preferences; - - this.preferences.applications.settings.bind( - 'blur', this._blur, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.applications.settings.bind( - '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 - ); - this.preferences.applications.settings.bind( - 'enable-all', this._enable_all, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - 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( - 'active', this._whitelist, 'visible', - GObject.BindingFlags.INVERT_BOOLEAN - ); - this._enable_all.bind_property( - 'active', this._blacklist, 'visible', - GObject.BindingFlags.DEFAULT - ); - - // make sure that blacklist / whitelist is correctly hidden - if (this._enable_all.active) - this._whitelist.visible = false; - this._blacklist.visible = !this._whitelist.visible; - - // listen to app row addition - this._add_window_whitelist.connect('clicked', - () => this.add_to_whitelist() - ); - this._add_window_blacklist.connect('clicked', - () => this.add_to_blacklist() - ); - - // add initial applications - this.add_widgets_from_lists(); - - this.preferences.connect('reset', () => { - this.remove_all_widgets(); - this.add_widgets_from_lists(); - }); - } - - // A way to retriew the whitelist widgets. - get _whitelist_elements() { - return make_array(this._whitelist); - } - - // A way to retriew the blacklist widgets. - get _blacklist_elements() { - return make_array(this._blacklist); - } - - add_widgets_from_lists() { - this.preferences.applications.WHITELIST.forEach( - app_name => this.add_to_whitelist(app_name) - ); - - this.preferences.applications.BLACKLIST.forEach( - app_name => this.add_to_blacklist(app_name) - ); - - } - - close_all_expanded_rows() { - this._whitelist_elements.forEach( - element => element.set_expanded(false) - ); - this._blacklist_elements.forEach( - element => element.set_expanded(false) - ); - } - - remove_all_widgets() { - this._whitelist_elements.forEach( - element => this._whitelist.remove(element) - ); - this._blacklist_elements.forEach( - element => this._blacklist.remove(element) - ); - } - - add_to_whitelist(app_name = null) { - let window_row = new ApplicationRow('whitelist', this, app_name); - this._whitelist.add(window_row); - } - - add_to_blacklist(app_name = null) { - let window_row = new ApplicationRow('blacklist', this, app_name); - this._blacklist.add(window_row); - } - - update_whitelist_titles() { - let titles = this._whitelist_elements - .map(element => element._window_class.buffer.text) - .filter(title => title != ""); - - this.preferences.applications.WHITELIST = titles; - } - - update_blacklist_titles() { - let titles = this._blacklist_elements - .map(element => element._window_class.buffer.text) - .filter(title => title != ""); - - this.preferences.applications.BLACKLIST = titles; - } - - remove_from_whitelist(widget) { - this._whitelist.remove(widget); - this.update_whitelist_titles(); - } - - remove_from_blacklist(widget) { - this._blacklist.remove(widget); - this.update_blacklist_titles(); - } -}); \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js deleted file mode 100644 index 4af3bf87..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/applications_management/application_row.js +++ /dev/null @@ -1,112 +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'; - -import { pick, on_picking, on_picked } from '../../dbus/client.js'; - - -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 ApplicationRow extends Adw.ExpanderRow { - constructor(list, app_page, app_name) { - super({}); - this._list = list; - this._app_page = app_page; - - // 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-row-symbolic', - 'width-request': 38, - 'height-request': 38, - 'margin-top': 6, - 'margin-bottom': 6, - }); - remove_button.add_css_class('circular'); - remove_button.add_css_class('flat'); - action_row.add_prefix(remove_button); - - // connect the button to the whitelist / blacklist removal - remove_button.connect('clicked', () => this._remove_row()); - - // bind row title to text buffer - this._window_class.buffer.bind_property( - 'text', this, 'title', - Gio.SettingsBindFlags.BIDIRECTIONNAL - ); - - // set application name if it exists, or open the revealer and pick one - if (app_name) - this._window_class.buffer.text = app_name; - else { - app_page.close_all_expanded_rows(); - this.set_expanded(true); - this._do_pick_window(true); - } - - // pick a window when the picker button is clicked - this._window_picker.connect('clicked', () => this._do_pick_window()); - - // update list on text buffer change - this._window_class.connect('changed', - () => this._update_rows_titles() - ); - } - - _remove_row() { - this._app_page["remove_from_" + this._list](this); - } - - _update_rows_titles() { - this._app_page["update_" + this._list + "_titles"](this); - } - - _do_pick_window(remove_if_failed = false) { - // a mechanism to know if the extension is listening correcly - let has_responded = false; - let should_take_answer = true; - setTimeout(() => { - if (!has_responded) { - // show toast about failure - this._app_page._preferences_window.add_toast( - this._picking_failure_toast - ); - - // prevent title from changing with later picks - should_take_answer = false; - - // remove row if asked - if (remove_if_failed) - this._remove_row(); - } - }, 250); - - on_picking(() => - has_responded = true - ); - - on_picked(wm_class => { - if (should_take_answer) { - if (wm_class == 'window-not-found') { - console.warn("Can't pick window from here"); - this._app_page._preferences_window.add_toast( - this._window_not_found_toast - ); - return; - } - this._window_class.buffer.text = wm_class; - } - }); - - pick(); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js deleted file mode 100644 index aae37685..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/dash.js +++ /dev/null @@ -1,81 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; - - -export const Dash = GObject.registerClass({ - GTypeName: 'Dash', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/dash.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'blur', - '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, 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( - 'sigma', this._sigma, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.dash_to_dock.settings.bind( - 'brightness', this._brightness, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.dash_to_dock.settings.bind( - 'override-background', - this._override_background, 'enable-expansion', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.dash_to_dock.settings.bind( - 'style-dash-to-dock', this._style_dash_to_dock, 'selected', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.dash_to_dock.settings.bind( - 'unblur-in-overview', this._unblur_in_overview, 'active', - 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js deleted file mode 100644 index 899fdcfc..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/menu.js +++ /dev/null @@ -1,68 +0,0 @@ -import Gdk from 'gi://Gdk'; -import Gtk from 'gi://Gtk'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; - - -export function addMenu(window) { - const builder = new Gtk.Builder(); - - // add a dummy page and remove it immediately, to access headerbar - builder.add_from_file(GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, '../ui/menu.ui', GLib.UriFlags.NONE))[0]); - let menu_util = builder.get_object('menu_util'); - window.add(menu_util); - try { - addMenuToHeader(window, builder); - } catch (error) { - // could not add menu... not so bad - } - window.remove(menu_util); -} - -function addMenuToHeader(window, builder) { - // a little hack to get to the headerbar - const page = builder.get_object('menu_util'); - 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().get_next_sibling() - .get_first_child().get_first_child().get_first_child(); // AdwHeaderBar - headerbar.pack_start(builder.get_object('info_menu')); - - // setup menu actions - const actionGroup = new Gio.SimpleActionGroup(); - window.insert_action_group('prefs', actionGroup); - - // a list of actions with their associated link - const actions = [ - { - name: 'open-bug-report', - link: 'https://github.com/aunetx/blur-my-shell/issues' - }, - { - name: 'open-readme', - link: 'https://github.com/aunetx/blur-my-shell' - }, - { - name: 'open-license', - link: 'https://github.com/aunetx/blur-my-shell/blob/master/LICENSE' - }, - { - name: 'donate-github', - link: 'https://github.com/sponsors/aunetx' - }, - { - name: 'donate-kofi', - link: 'https://ko-fi.com/aunetx' - }, - ]; - - actions.forEach(action => { - let act = new Gio.SimpleAction({ name: action.name }); - act.connect( - 'activate', - () => Gtk.show_uri(window, action.link, Gdk.CURRENT_TIME) - ); - actionGroup.add_action(act); - }); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js deleted file mode 100644 index 0fac364a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/other.js +++ /dev/null @@ -1,86 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; - - -export const Other = GObject.registerClass({ - GTypeName: 'Other', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/other.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'lockscreen_blur', - 'lockscreen_pipeline_choose_row', - - 'screenshot_blur', - 'screenshot_pipeline_choose_row', - - 'window_list_blur', - '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, 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_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_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.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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js deleted file mode 100644 index f6fe592a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/overview.js +++ /dev/null @@ -1,59 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; - - -export const Overview = GObject.registerClass({ - GTypeName: 'Overview', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/overview.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'overview_blur', - 'pipeline_choose_row', - 'overview_style_components', - - 'appfolder_blur', - 'appfolder_sigma', - 'appfolder_brightness', - 'appfolder_style_dialogs' - ], -}, class Overview extends Adw.PreferencesPage { - 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.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 - ); - } -}); \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js deleted file mode 100644 index c49f3239..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/panel.js +++ /dev/null @@ -1,102 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; - - -export const Panel = GObject.registerClass({ - GTypeName: 'Panel', - Template: GLib.uri_resolve_relative(import.meta.url, '../ui/panel.ui', GLib.UriFlags.NONE), - InternalChildren: [ - 'blur', - 'pipeline_choose_row', - 'mode_static', - 'mode_dynamic', - 'sigma_row', - 'sigma', - 'brightness_row', - 'brightness', - 'unblur_in_overview', - 'force_light_text', - 'override_background', - 'style_panel', - 'override_background_dynamically', - 'hidetopbar_compatibility', - 'dtp_blur_original_panel' - ], -}, class Panel extends Adw.PreferencesPage { - 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( - 'sigma', this._sigma, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'brightness', this._brightness, 'value', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'unblur-in-overview', this._unblur_in_overview, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'force-light-text', this._force_light_text, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'override-background', - this._override_background, 'enable-expansion', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'style-panel', this._style_panel, 'selected', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.panel.settings.bind( - 'override-background-dynamically', - this._override_background_dynamically, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.hidetopbar.settings.bind( - 'compatibility', this._hidetopbar_compatibility, 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this.preferences.dash_to_panel.settings.bind( - 'blur-original-panel', this._dtp_blur_original_panel, 'active', - 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js deleted file mode 100644 index 158ea9ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines.js +++ /dev/null @@ -1,98 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js deleted file mode 100644 index 130edfdb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effect_row.js +++ /dev/null @@ -1,222 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js deleted file mode 100644 index 222a92e9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/effects_dialog.js +++ /dev/null @@ -1,174 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js deleted file mode 100644 index e0c51658..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_choose_row.js +++ /dev/null @@ -1,106 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js deleted file mode 100644 index 627b5760..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/preferences/pipelines_management/pipeline_group.js +++ /dev/null @@ -1,99 +0,0 @@ -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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/prefs.js deleted file mode 100644 index d90bdda1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/prefs.js +++ /dev/null @@ -1,51 +0,0 @@ -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 { addMenu } from './preferences/menu.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) { - super(metadata); - - // load the icon theme - let iconPath = this.dir.get_child("icons").get_path(); - let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()); - iconTheme.add_search_path(iconPath); - } - - fillPreferencesWindow(window) { - addMenu(window); - - // update from old settings, very important for hacks level specifically - update_from_old_settings(this.getSettings()); - - 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, pipelines_manager, pipelines_page)); - - window.search_enabled = true; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/private_metadata.json deleted file mode 100644 index 582a13f1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/private_metadata.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "_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\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" - }, - "gettext-domain": "blur-my-shell@aunetx", - "name": "Blur my Shell", - "original-authors": [ - "me@aunetx.dev" - ], - "session-modes": [ - "unlock-dialog", - "user" - ], - "settings-schema": "org.gnome.shell.extensions.blur-my-shell", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/aunetx/blur-my-shell", - "uuid": "blur-my-shell@aunetx", - "version": 67 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/gschemas.compiled deleted file mode 100644 index 6f781f41c934e0bd159f143f60f2c83e4a608699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9848 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 UAZN*W4!6%CXR8JFIjkT50~Q`;aR2}S diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml deleted file mode 100644 index 5708ca36..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/schemas/org.gnome.shell.extensions.blur-my-shell.gschema.xml +++ /dev/null @@ -1,585 +0,0 @@ - - - - - - - 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 - Global gaussian sigma to use - - - - 0.6 - Global brightness to use - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - true - Boolean, controls wether or not the color and noise effects are in use globally - - - - 1 - Level of hacks to use (from 0 to 2, 2 disabling clipped redraws entirely) - - - - false - Boolean, set to true to activate debug mode (more verbose journalctl logs) - - - - - - - - - - - - - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - 1 - Enum to select the style of the components in overview (0 not styled, 1 light, 2 dark, 3 transparent) - - - - - - - - true - Boolean, whether to blur activate the blur for this component or not - - - - false - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - 1 - Enum to select the style of the appfolder dialogs (0 not styled, 1 transparent, 2 light, 3 dark) - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - true - Boolean, whether to use a static or dynamic blur for this component - - - - true - Boolean, whether to disable blur from this component when opening the overview or not - - - - false - Boolean, whether or not to force the panel to have light text, useful when using light theme - - - - true - Boolean, whether to override the background or not - - - - 0 - Enum to select the style of the panel (0 transparent, 1 light, 2 dark, 3 contrasted) - - - - false - Boolean, whether to disable blur from this component when a window is close to the panel - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - true - Boolean, whether to use static or dynamic blur for this component - - - - true - Boolean, whether to override the background or not - - - - 0 - Enum to select the style of dash to dock (0 transparent, 1 light, 2 dark) - - - - false - Boolean, whether to disable blur from this component when opening the overview or not - - - - 12 - Radius for the corner rounding effect - - - - - - - - false - Boolean, whether to blur activate the blur for this component or not - - - - true - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 1. - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - 215 - Opacity of the window actor on top of the blur effect - - - - true - Wether or not to make the focused window opaque - - - - false - Wether or not to blur applications on the overview - - - - false - Wether or not to blur all applications by default - - - - [] - List of applications to blur - - - - ["Plank","com.desktop.ding", "Conky"] - List of applications not to blur - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - - - - - 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 - Boolean, whether to customize the blur effect sigma/brightness or use general values - - - - 30 - Gaussian sigma to use for the blur effect - - - - 0.6 - Brightness to use for the blur effect - - - - (0.,0.,0.,0.) - Color to mix with the blur effect - - - - 0. - Amount of noise to add to the blur effect - - - - 0. - Lightness of the noise added to the blur effect - - - - - - - - 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 - Boolean, whether to try compatibility with hidetopbar@mathieu.bidon.ca or not - - - - - - - - true - Boolean, whether to blur the original panel (if option selected) with Dash to Panel - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css deleted file mode 100644 index b61e5305..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/stylesheet.css +++ /dev/null @@ -1,573 +0,0 @@ -/*** PANEL ***/ - -/* -* `.transparent-panel` -*/ -#panel.transparent-panel { - background: transparent; - transition-duration: 500ms; -} - -/* -* `.dark-panel` -*/ -#panel.dark-panel { - background-color: rgba(100, 100, 100, 0.35); - box-shadow: none; - transition-duration: 500ms; -} - -/* -* `.light-panel` -*/ -#panel.light-panel { - background-color: rgba(200, 200, 200, 0.2); - box-shadow: none; - transition-duration: 500ms; -} - -/* -* `.contrasted-panel` -*/ -#panel.contrasted-panel { - background-color: transparent; - box-shadow: none; - transition-duration: 500ms; -} - -.contrasted-panel .panel-button, -.contrasted-panel .clock, -.contrasted-panel .clock-display StIcon { - color: #ffffff; - border-radius: 14px; - border: 3px solid transparent; - background-color: rgba(0, 0, 0, 0.8); - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.03); -} - - -.contrasted-panel .clock-display StIcon { - padding: 8px; - margin: 0; -} - -.contrasted-panel .panel-button:hover, -.contrasted-panel .panel-button:hover .clock { - color: #ffffff; - background-color: rgba(0, 0, 0, 0.8); -} - -.contrasted-panel .clock-display { - background-color: transparent !important; - box-shadow: none !important; - border: none !important; -} - -.contrasted-panel .clock { - margin: 0 !important; -} - - -/*** DASH-TO-DOCK ***/ - -/* -* `.transparent-dash` -*/ -.transparent-dash .dash-background { - background-color: transparent !important; -} - -/* -* `.light-dash` -*/ -.light-dash .dash-background { - background-color: rgba(200, 200, 200, 0.2) !important; -} - -/* -* `.dark-dash` -*/ -.dark-dash .dash-background { - background-color: rgba(100, 100, 100, 0.35) !important; -} - - -/*** OVERVIEW ***/ - -/* -* Add transparency to the workspace animation (between workspaces) -*/ -.blurred-overview .workspace-animation { - background-color: transparent !important; -} - - -/* -* `.overview-components-transparent` -*/ - -.overview-components-transparent .workspace-thumbnail { - border: 1px solid rgba(100, 100, 100, 0.35); -} - -.overview-components-transparent .search-entry { - color: white; - background-color: rgba(0, 0, 0, 0); - border-color: transparent; - box-shadow: none; -} - -.overview-components-transparent .search-entry .search-entry-icon { - color: rgba(255, 255, 255, 0.65); -} - -.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 #dashtopanelScrollview .overview-tile { - background-color: transparent; -} - -.overview-components-transparent .workspace-thumbnail, -.overview-components-transparent .search-section-content, -.overview-components-transparent .overview-tile.app-folder, -.overview-components-transparent .page-navigation-arrow, -.overview-components-transparent .app-folder-dialog .icon-button, -/* this shouldn't apply to Dash to Dock */ -.overview-components-transparent StBoxLayout>StWidget>#dash>.dash-background { - background-color: rgba(0, 0, 0, 0); -} - -.overview-components-transparent .overview-tile:hover, -.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, -.overview-components-transparent .list-search-result:highlighted, -.overview-components-transparent .search-provider-icon:hover, -.overview-components-transparent .search-provider-icon:focus, -.overview-components-transparent .page-navigation-arrow:hover, -.overview-components-transparent .page-navigation-arrow:focus, -.overview-components-transparent .app-folder-dialog .icon-button:hover, -.overview-components-transparent .app-folder-dialog .icon-button:focus, -.overview-components-transparent #dash .overview-tile:hover .overview-icon, -.overview-components-transparent #dash .overview-tile:focus .overview-icon, -.overview-components-transparent #dash .show-apps:hover .overview-icon, -.overview-components-transparent #dash .show-apps:focus .overview-icon { - background-color: rgba(230, 230, 230, 0.08); -} - -.overview-components-transparent .overview-tile:active, -.overview-components-transparent .overview-tile:focus:hover, -.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, -.overview-components-transparent .list-search-result:highlighted:hover, -.overview-components-transparent .search-provider-icon:active, -.overview-components-transparent .search-provider-icon:focus:hover, -.overview-components-transparent .page-navigation-arrow:active, -.overview-components-transparent .page-navigation-arrow:focus:hover, -.overview-components-transparent .app-folder-dialog .icon-button:active, -.overview-components-transparent .app-folder-dialog .icon-button:focus:hover, -.overview-components-transparent #dash .overview-tile:active .overview-icon, -.overview-components-transparent #dash .overview-tile:focus:hover .overview-icon, -.overview-components-transparent #dash .overview-tile:drop .overview-icon, -.overview-components-transparent #dash .show-apps:checked .overview-icon { - background-color: rgba(230, 230, 230, 0.12); -} - -.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, -.overview-components-transparent .search-provider-icon:focus:active, -.overview-components-transparent .page-navigation-arrow:focus:active, -.overview-components-transparent .app-folder-dialog .icon-button:focus:active, -.overview-components-transparent #dash .show-apps:checked .overview-icon:hover { - background-color: rgba(230, 230, 230, 0.15); -} - - -/* -* `.overview-components-light` -*/ - -.overview-components-light .search-entry { - color: white; - background-color: rgba(200, 200, 200, 0.2); - border-color: transparent; - box-shadow: none; -} - -.overview-components-light .search-entry .search-entry-icon { - color: rgba(255, 255, 255, 0.65); -} - -.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 #dashtopanelScrollview .overview-tile { - background-color: transparent; -} - -.overview-components-light .workspace-thumbnail, -.overview-components-light .search-section-content, -.overview-components-light .overview-tile.app-folder, -.overview-components-light .page-navigation-arrow, -.overview-components-light .app-folder-dialog .icon-button, -/* this shouldn't apply to Dash to Dock */ -.overview-components-light StBoxLayout>StWidget>#dash>.dash-background { - background-color: rgba(200, 200, 200, 0.2); -} - -.overview-components-light .overview-tile:hover, -.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, -.overview-components-light .list-search-result:highlighted, -.overview-components-light .search-provider-icon:hover, -.overview-components-light .search-provider-icon:focus, -.overview-components-light .page-navigation-arrow:hover, -.overview-components-light .page-navigation-arrow:focus, -.overview-components-light .app-folder-dialog .icon-button:hover, -.overview-components-light .app-folder-dialog .icon-button:focus, -.overview-components-light #dash .overview-tile:hover .overview-icon, -.overview-components-light #dash .overview-tile:focus .overview-icon, -.overview-components-light #dash .show-apps:hover .overview-icon, -.overview-components-light #dash .show-apps:focus .overview-icon { - background-color: rgba(230, 230, 230, 0.2); -} - -.overview-components-light .overview-tile:active, -.overview-components-light .overview-tile:focus:hover, -.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, -.overview-components-light .list-search-result:highlighted:hover, -.overview-components-light .search-provider-icon:active, -.overview-components-light .search-provider-icon:focus:hover, -.overview-components-light .page-navigation-arrow:active, -.overview-components-light .page-navigation-arrow:focus:hover, -.overview-components-light .app-folder-dialog .icon-button:active, -.overview-components-light .app-folder-dialog .icon-button:focus:hover, -.overview-components-light #dash .overview-tile:active .overview-icon, -.overview-components-light #dash .overview-tile:focus:hover .overview-icon, -.overview-components-light #dash .overview-tile:drop .overview-icon, -.overview-components-light #dash .show-apps:checked .overview-icon { - background-color: rgba(230, 230, 230, 0.25); -} - -.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, -.overview-components-light .search-provider-icon:focus:active, -.overview-components-light .page-navigation-arrow:focus:active, -.overview-components-light .app-folder-dialog .icon-button:focus:active, -.overview-components-light #dash .show-apps:checked .overview-icon:hover { - background-color: rgba(230, 230, 230, 0.3); -} - - -/* -* `.overview-components-dark` -*/ - -.overview-components-dark .search-entry { - color: white; - background-color: rgba(100, 100, 100, 0.35); - border-color: transparent; - box-shadow: none; -} - -.overview-components-dark .search-entry .search-entry-icon { - color: rgba(255, 255, 255, 0.65); -} - -.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 #dashtopanelScrollview .overview-tile { - background-color: transparent; -} - -.overview-components-dark .workspace-thumbnail, -.overview-components-dark .search-section-content, -.overview-components-dark .overview-tile.app-folder, -.overview-components-dark .page-navigation-arrow, -.overview-components-dark .app-folder-dialog .icon-button, -/* this shouldn't apply to Dash to Dock */ -.overview-components-dark StBoxLayout>StWidget>#dash>.dash-background { - background-color: rgba(100, 100, 100, 0.35); -} - -.overview-components-dark .overview-tile:hover, -.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, -.overview-components-dark .list-search-result:highlighted, -.overview-components-dark .search-provider-icon:hover, -.overview-components-dark .search-provider-icon:focus, -.overview-components-dark .page-navigation-arrow:hover, -.overview-components-dark .page-navigation-arrow:focus, -.overview-components-dark .app-folder-dialog .icon-button:hover, -.overview-components-dark .app-folder-dialog .icon-button:focus, -.overview-components-dark #dash .overview-tile:hover .overview-icon, -.overview-components-dark #dash .overview-tile:focus .overview-icon, -.overview-components-dark #dash .show-apps:hover .overview-icon, -.overview-components-dark #dash .show-apps:focus .overview-icon { - background-color: rgba(120, 120, 120, 0.35); -} - -.overview-components-dark .overview-tile:active, -.overview-components-dark .overview-tile:focus:hover, -.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, -.overview-components-dark .list-search-result:highlighted:hover, -.overview-components-dark .search-provider-icon:active, -.overview-components-dark .search-provider-icon:focus:hover, -.overview-components-dark .page-navigation-arrow:active, -.overview-components-dark .page-navigation-arrow:focus:hover, -.overview-components-dark .app-folder-dialog .icon-button:active, -.overview-components-dark .app-folder-dialog .icon-button:focus:hover, -.overview-components-dark #dash .overview-tile:active .overview-icon, -.overview-components-dark #dash .overview-tile:focus:hover .overview-icon, -.overview-components-dark #dash .overview-tile:drop .overview-icon, -.overview-components-dark #dash .show-apps:checked .overview-icon { - background-color: rgba(120, 120, 120, 0.4); -} - -.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, -.overview-components-dark .search-provider-icon:focus:active, -.overview-components-dark .page-navigation-arrow:focus:active, -.overview-components-dark .app-folder-dialog .icon-button:focus:active, -.overview-components-dark #dash .show-apps:checked .overview-icon:hover { - background-color: rgba(120, 120, 120, 0.45); -} - - -/*** APPFOLDER DIALOG ***/ - -/* -* `.appfolder-dialogs-transparent` -*/ - -.appfolder-dialogs-transparent { - background-color: rgba(0, 0, 0, 0); - border: none; - box-shadow: none; -} - -.appfolder-dialogs-transparent .folder-name-entry { - color: white; - background-color: rgba(0, 0, 0, 0); - border: 0; - box-shadow: none; -} - -/* -* `.appfolder-dialogs-light` -*/ - -.appfolder-dialogs-light { - background-color: rgba(200, 200, 200, 0.2); - border: none; - box-shadow: none; -} - -.appfolder-dialogs-light .folder-name-entry { - color: white; - background-color: rgba(200, 200, 200, 0.2); - border: 0; - box-shadow: none; -} - - -/* -* `.appfolder-dialogs-dark` -*/ - -.appfolder-dialogs-dark { - background-color: rgba(100, 100, 100, 0.35); - border: none; - box-shadow: none; -} - -.appfolder-dialogs-dark .folder-name-entry { - color: white; - background-color: rgba(100, 100, 100, 0.35); - border: 0; - box-shadow: none; -} - - -/*** PANEL LIGHT TEXT ***/ - -/* -* `.panel-light-text`, adapted from gnome-shell-light.css -*/ - -#panel.panel-light-text .panel-button, -#panel.panel-light-text .panel-button.clock-display, -#panel.panel-light-text .netSpeedLabel { - color: #f6f5f4; - box-shadow: none; -} - -#panel.panel-light-text .panel-button:active, -#panel.panel-light-text .panel-button:focus, -#panel.panel-light-text .panel-button:checked, -#panel.panel-light-text .panel-button.clock-display:active .clock, -#panel.panel-light-text .panel-button.clock-display:focus .clock, -#panel.panel-light-text .panel-button.clock-display:checked .clock { - box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); -} - -#panel.panel-light-text .panel-button:active:hover, -#panel.panel-light-text .panel-button:focus:hover, -#panel.panel-light-text .panel-button:checked:hover, -#panel.panel-light-text .panel-button.clock-display:active:hover, -#panel.panel-light-text .panel-button.clock-display:focus:hover, -#panel.panel-light-text .panel-button.clock-display:checked:hover, -#panel.panel-light-text .panel-button.clock-display:active .clock:hover, -#panel.panel-light-text .panel-button.clock-display:focus .clock:hover, -#panel.panel-light-text .panel-button.clock-display:checked .clock:hover { - box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); -} - -#panel.panel-light-text .panel-button:hover, -#panel.panel-light-text .panel-button.clock-display:hover, -#panel.panel-light-text .panel-button.clock-display:hover .clock { - box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); -} - -#panel.panel-light-text .panel-button#panelActivities .workspace-dot { - background-color: #f6f5f4; -} - -#panel.panel-light-text .panel-button.clock-display:active, -#panel.panel-light-text .panel-button.clock-display:focus, -#panel.panel-light-text .panel-button.clock-display:checked, -#panel.panel-light-text .panel-button.clock-display:hover { - box-shadow: none !important; -} - -#panel.panel-light-text .panel-button.screen-recording-indicator { - color: #f6f5f4; - box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.8); -} - -#panel.panel-light-text .panel-button.screen-recording-indicator:active, -#panel.panel-light-text .panel-button.screen-recording-indicator:focus, -#panel.panel-light-text .panel-button.screen-recording-indicator:checked { - box-shadow: inset 0 0 0 100px #c01c28; -} - -#panel.panel-light-text .panel-button.screen-recording-indicator:active:hover, -#panel.panel-light-text .panel-button.screen-recording-indicator:focus:hover, -#panel.panel-light-text .panel-button.screen-recording-indicator:checked:hover { - box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.95); -} - -#panel.panel-light-text .panel-button.screen-recording-indicator:hover { - box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.9); -} - -#panel.panel-light-text .panel-button.screen-sharing-indicator { - color: #282828; - box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.8); -} - -#panel.panel-light-text .panel-button.screen-sharing-indicator:active, -#panel.panel-light-text .panel-button.screen-sharing-indicator:focus, -#panel.panel-light-text .panel-button.screen-sharing-indicator:checked { - box-shadow: inset 0 0 0 100px #ff7800; -} - -#panel.panel-light-text .panel-button.screen-sharing-indicator:active:hover, -#panel.panel-light-text .panel-button.screen-sharing-indicator:focus:hover, -#panel.panel-light-text .panel-button.screen-sharing-indicator:checked:hover { - box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.95); -} - -#panel.panel-light-text .panel-button.screen-sharing-indicator:hover { - box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.9); -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui deleted file mode 100644 index 2a26d145..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/application-row.ui +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Could not pick window, make sure that the extension is enabled. - - - - Could not pick window from here, does not seem like a valid window. - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/applications.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/applications.ui deleted file mode 100644 index 452a6b6d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/applications.ui +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - 0 - 100 - 1 - - - - 0.0 - 1.0 - 0.01 - - - - 25 - 255 - 1 - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/dash.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/dash.ui deleted file mode 100644 index b08a4d1b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/dash.ui +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - 0 - 100 - 1 - - - - 0.0 - 1.0 - 0.01 - - - - - Transparent - Light - Dark - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui deleted file mode 100644 index c6baf62e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/effects-dialog.ui +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -
- - Include advanced effects - effects-dialog.advanced-effects-bool - -
-
-
\ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui deleted file mode 100644 index 6d2a4741..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/menu.ui +++ /dev/null @@ -1,37 +0,0 @@ - - - -
- - Project page - prefs.open-readme - - - Report a Bug - prefs.open-bug-report - - - License - prefs.open-license - - - Donate - - GitHub - prefs.donate-github - - - Ko-fi - prefs.donate-kofi - - -
-
- - - info_menu_model - heart-symbolic - - - -
\ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui deleted file mode 100644 index e136e381..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/other.ui +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - 0 - 100 - 1 - - - - 0.0 - 1.0 - 0.01 - - - - - High performances - Default - No artifact - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui deleted file mode 100644 index 36b91fc7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/overview.ui +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - Do not style - Light - Dark - Transparent - - - - - 0 - 100 - 1 - - - - 0.0 - 1.0 - 0.01 - - - - - - Do not style - Transparent - Light - Dark - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui deleted file mode 100644 index 306f4efa..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/panel.ui +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - Transparent - Light - Dark - Contrasted - - - - - 0 - 100 - 1 - - - - 0.0 - 1.0 - 0.01 - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui deleted file mode 100644 index 72b854bd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-choose-row.ui +++ /dev/null @@ -1,39 +0,0 @@ - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui deleted file mode 100644 index 19a12bf7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipeline-group.ui +++ /dev/null @@ -1,29 +0,0 @@ - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui deleted file mode 100644 index 555ec0a2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/blur-my-shell@aunetx/ui/pipelines.ui +++ /dev/null @@ -1,44 +0,0 @@ - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/LICENSE.rst b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/LICENSE.rst deleted file mode 100644 index 45cad828..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/LICENSE.rst +++ /dev/null @@ -1,24 +0,0 @@ -====================== -The MIT License (MIT) -====================== - -Copyright (c) 2014, Yotam Bar-On ------------------------------------------ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -*The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software.* - -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.** diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/README.rst b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/README.rst deleted file mode 100644 index 57804f65..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/README.rst +++ /dev/null @@ -1,88 +0,0 @@ -============================ -📋 Clipboard Indicator -============================ - -.. image:: https://raw.githubusercontent.com/andyholmes/gnome-shell-extensions-badge/eb9af9a1c6f04eb060cb01de6aeb5c84232cd8c0/get-it-on-ego.svg?sanitize=true - :target: https://extensions.gnome.org/extension/779/clipboard-indicator/ - :width: 180 - :alt: Get it on GNOME Extensions - -The most popular, reliable and feature-rich clipboard manager for GNOME with -over **1M** downloads. - -|Screenshot| - -.. |Screenshot| image:: ./screenshot.png - :width: 400 - :alt: A screenshot of the clipboard manager, showing clipboard history including images - -This extension is also packaged by the community for many popular Linux distros -— search your package manager. - -🧰 Features: ----------------- - -- Highly customizable -- Supports both text and images -- Allows pinning items to top -- Includes a "private" mode -- Has configurable shortcuts -- Keyboard control - -In-Menu Keyboard Controls -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- Use arrows to navigate -- :code:`v` to paste directly from menu -- :code:`p` to pin item -- :code:`` to delete an item - -📦 Install from source ----------------- - -Installation via git is performed by cloning the repo into your local gnome-shell extensions directory (usually :code:`~/.local/share/gnome-shell/extensions/`):: - - $ git clone https://github.com/Tudmotu/gnome-shell-extension-clipboard-indicator.git /clipboard-indicator@tudmotu.com - -After cloning the repo, the extension is practically installed yet disabled. In order to enable it, run the following command:: - - $ gnome-extensions enable clipboard-indicator@tudmotu.com - - -✅ GNOME Version Support --------------------------- -Depending on your GNOME version, you will need to install the following -Clipboard Indicator versions: - -* GNOME 46 and above: - - * Use latest version - -* GNOME 45: - - * v57 - -* GNOME 42-44 - - * v47 - -* GNOME 40-41 - - * v39 - -* GNOME <40 - - * v37 - -⌨️ Contributing ----------------- -Contributions to this project are welcome. - -Please follow these guidelines when contributing: - -- If you want to contribute code, your best bet is to look for an issue with the label "Up for grabs" -- DO NOT open unsolicited PRs unless they are for updating translations -- Look at the list of previous PRs before you open a PR, if your PR conflicts with another, it will be rejected -- If you have a feature idea, open an issue and discuss it there before implementing. DO NOT open a PR as a platform for discussion - -Note: I have very little time to maintain this project, so expect long (months) of response time. Apologies in advance. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/confirmDialog.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/confirmDialog.js deleted file mode 100644 index 745e912e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/confirmDialog.js +++ /dev/null @@ -1,72 +0,0 @@ -import St from 'gi://St'; -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; -import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js'; - -export class DialogManager { - #openDialog; - - open (title, message, sub_message, ok_label, cancel_label, callback) { - if (this.#openDialog) return; - this.#openDialog = new ConfirmDialog(title, message + "\n" + sub_message, ok_label, cancel_label, callback); - this.#openDialog.onFinish = () => this.#openDialog = null; - this.#openDialog.open(); - } - - destroy () { - if (this.#openDialog) this.#openDialog.destroy(); - this.#openDialog = null; - } -} - -const ConfirmDialog = GObject.registerClass( - class ConfirmDialog extends ModalDialog.ModalDialog { - - _init(title, desc, ok_label, cancel_label, callback) { - super._init(); - - let main_box = new St.BoxLayout({ - vertical: false - }); - this.contentLayout.add_child(main_box); - - let message_box = new St.BoxLayout({ - vertical: true - }); - main_box.add_child(message_box); - - let subject_label = new St.Label({ - style: 'font-weight: bold', - x_align: Clutter.ActorAlign.CENTER, - text: title - }); - message_box.add_child(subject_label); - - let desc_label = new St.Label({ - style: 'padding-top: 12px', - x_align: Clutter.ActorAlign.CENTER, - text: desc - }); - message_box.add_child(desc_label); - - this.setButtons([ - { - label: cancel_label, - action: () => { - this.close(); - this.onFinish(); - }, - key: Clutter.Escape - }, - { - label: ok_label, - action: () => { - this.close(); - this.onFinish(); - callback(); - } - } - ]); - } - } -); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/constants.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/constants.js deleted file mode 100644 index 0c728a53..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/constants.js +++ /dev/null @@ -1,24 +0,0 @@ -export const PrefsFields = { - HISTORY_SIZE : 'history-size', - PREVIEW_SIZE : 'preview-size', - CACHE_FILE_SIZE : 'cache-size', - CACHE_ONLY_FAVORITE : 'cache-only-favorites', - DELETE : 'enable-deletion', - NOTIFY_ON_COPY : 'notify-on-copy', - CONFIRM_ON_CLEAR : 'confirm-clear', - MOVE_ITEM_FIRST : 'move-item-first', - ENABLE_KEYBINDING : 'enable-keybindings', - TOPBAR_PREVIEW_SIZE : 'topbar-preview-size', - TOPBAR_DISPLAY_MODE_ID : 'display-mode', - DISABLE_DOWN_ARROW : 'disable-down-arrow', - STRIP_TEXT : 'strip-text', - KEEP_SELECTED_ON_CLEAR : 'keep-selected-on-clear', - PASTE_BUTTON : 'paste-button', - PINNED_ON_BOTTOM : 'pinned-on-bottom', - BINDING_TOGGLE_MENU : 'toggle-menu', - BINDING_CLEAR_HISTORY : 'clear-history', - BINDING_PREV_ENTRY : 'prev-entry', - BINDING_NEXT_ENTRY : 'next-entry', - BINDING_PRIVATE_MODE : 'private-mode-binding', - CLEAR_ON_BOOT : 'clear-on-boot' -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/extension.js deleted file mode 100644 index 4645f988..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/extension.js +++ /dev/null @@ -1,1172 +0,0 @@ -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; - -import * as AnimationUtils from 'resource:///org/gnome/shell/misc/animationUtils.js'; -import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; - -import { Registry, ClipboardEntry } from './registry.js'; -import { DialogManager } from './confirmDialog.js'; -import { PrefsFields } from './constants.js'; -import { Keyboard } from './keyboard.js'; - -const CLIPBOARD_TYPE = St.ClipboardType.CLIPBOARD; - -const INDICATOR_ICON = 'edit-paste-symbolic'; - -let DELAYED_SELECTION_TIMEOUT = 750; -let MAX_REGISTRY_LENGTH = 15; -let MAX_ENTRY_LENGTH = 50; -let CACHE_ONLY_FAVORITE = false; -let DELETE_ENABLED = true; -let MOVE_ITEM_FIRST = false; -let ENABLE_KEYBINDING = true; -let PRIVATEMODE = false; -let NOTIFY_ON_COPY = true; -let CONFIRM_ON_CLEAR = true; -let MAX_TOPBAR_LENGTH = 15; -let TOPBAR_DISPLAY_MODE = 1; //0 - only icon, 1 - only clipboard content, 2 - both, 3 - neither -let CLEAR_ON_BOOT = false; -let DISABLE_DOWN_ARROW = false; -let STRIP_TEXT = false; -let KEEP_SELECTED_ON_CLEAR = false; -let PASTE_BUTTON = true; -let PINNED_ON_BOTTOM = false; - -export default class ClipboardIndicatorExtension extends Extension { - enable () { - this.clipboardIndicator = new ClipboardIndicator({ - clipboard: St.Clipboard.get_default(), - settings: this.getSettings(), - openSettings: this.openPreferences, - uuid: this.uuid - }); - - Main.panel.addToStatusArea('clipboardIndicator', this.clipboardIndicator, 1); - } - - disable () { - this.clipboardIndicator.destroy(); - this.clipboardIndicator = null; - } -} - -const ClipboardIndicator = GObject.registerClass({ - GTypeName: 'ClipboardIndicator' -}, class ClipboardIndicator extends PanelMenu.Button { - #refreshInProgress = false; - - destroy () { - this._disconnectSettings(); - this._unbindShortcuts(); - this._disconnectSelectionListener(); - this._clearDelayedSelectionTimeout(); - this.#clearTimeouts(); - this.dialogManager.destroy(); - this.keyboard.destroy(); - - super.destroy(); - } - - _init (extension) { - super._init(0.0, "ClipboardIndicator"); - this.extension = extension; - this.registry = new Registry(extension); - this.keyboard = new Keyboard(); - this._settingsChangedId = null; - this._selectionOwnerChangedId = null; - this._historyLabel = null; - this._buttonText = null; - this._disableDownArrow = null; - - this._shortcutsBindingIds = []; - this.clipItemsRadioGroup = []; - - let hbox = new St.BoxLayout({ - style_class: 'panel-status-menu-box clipboard-indicator-hbox' - }); - - this.hbox = hbox; - - this.icon = new St.Icon({ - icon_name: INDICATOR_ICON, - style_class: 'system-status-icon clipboard-indicator-icon' - }); - - this._buttonText = new St.Label({ - text: _('Text will be here'), - y_align: Clutter.ActorAlign.CENTER - }); - - this._buttonImgPreview = new St.Bin({ - style_class: 'clipboard-indicator-topbar-preview' - }); - - hbox.add_child(this.icon); - hbox.add_child(this._buttonText); - hbox.add_child(this._buttonImgPreview); - this._downArrow = PopupMenu.arrowIcon(St.Side.BOTTOM); - hbox.add_child(this._downArrow); - this.add_child(hbox); - this._createHistoryLabel(); - this._loadSettings(); - - if (CLEAR_ON_BOOT) this.registry.clearCacheFolder(); - - this.dialogManager = new DialogManager(); - this._buildMenu().then(() => { - this._updateTopbarLayout(); - this._setupListener(); - }); - } - - #updateIndicatorContent(entry) { - if (this.preventIndicatorUpdate || (TOPBAR_DISPLAY_MODE !== 1 && TOPBAR_DISPLAY_MODE !== 2)) { - return; - } - - if (!entry || PRIVATEMODE) { - this._buttonImgPreview.destroy_all_children(); - this._buttonText.set_text("...") - } else { - if (entry.isText()) { - this._buttonText.set_text(this._truncate(entry.getStringValue(), MAX_TOPBAR_LENGTH)); - this._buttonImgPreview.destroy_all_children(); - } - else if (entry.isImage()) { - this._buttonText.set_text(''); - this._buttonImgPreview.destroy_all_children(); - this.registry.getEntryAsImage(entry).then(img => { - img.add_style_class_name('clipboard-indicator-img-preview'); - img.y_align = Clutter.ActorAlign.CENTER; - - // icon only renders properly in setTimeout for some arcane reason - this._imagePreviewTimeout = setTimeout(() => { - this._buttonImgPreview.set_child(img); - }, 0); - }); - } - } - } - - async _buildMenu () { - let that = this; - const clipHistory = await this._getCache(); - let lastIdx = clipHistory.length - 1; - let clipItemsArr = that.clipItemsRadioGroup; - - /* This create the search entry, which is add to a menuItem. - The searchEntry is connected to the function for research. - The menu itself is connected to some shitty hack in order to - grab the focus of the keyboard. */ - that._entryItem = new PopupMenu.PopupBaseMenuItem({ - reactive: false, - can_focus: false - }); - that.searchEntry = new St.Entry({ - name: 'searchEntry', - style_class: 'search-entry', - can_focus: true, - hint_text: _('Type here to search...'), - track_hover: true, - x_expand: true, - y_expand: true, - primary_icon: new St.Icon({ icon_name: 'edit-find-symbolic' }) - }); - - that.searchEntry.get_clutter_text().connect( - 'text-changed', - that._onSearchTextChanged.bind(that) - ); - - that._entryItem.add_child(that.searchEntry); - - that.menu.connect('open-state-changed', (self, open) => { - this._setFocusOnOpenTimeout = setTimeout(() => { - if (open) { - if (this.clipItemsRadioGroup.length > 0) { - that.searchEntry.set_text(''); - global.stage.set_key_focus(that.searchEntry); - } - else { - global.stage.set_key_focus(that.privateModeMenuItem); - } - } - }, 50); - }); - - // Create menu sections for items - // Favorites - that.favoritesSection = new PopupMenu.PopupMenuSection(); - - that.scrollViewFavoritesMenuSection = new PopupMenu.PopupMenuSection(); - this.favoritesScrollView = new St.ScrollView({ - style_class: 'ci-history-menu-section', - overlay_scrollbars: true - }); - this.favoritesScrollView.add_child(that.favoritesSection.actor); - - that.scrollViewFavoritesMenuSection.actor.add_child(this.favoritesScrollView); - this.favoritesSeparator = new PopupMenu.PopupSeparatorMenuItem(); - - // History - that.historySection = new PopupMenu.PopupMenuSection(); - - that.scrollViewMenuSection = new PopupMenu.PopupMenuSection(); - this.historyScrollView = new St.ScrollView({ - style_class: 'ci-main-menu-section ci-history-menu-section', - overlay_scrollbars: true - }); - this.historyScrollView.add_child(that.historySection.actor); - - that.scrollViewMenuSection.actor.add_child(this.historyScrollView); - - // Add separator - this.historySeparator = new PopupMenu.PopupSeparatorMenuItem(); - - // Add sections ordered according to settings - if (PINNED_ON_BOTTOM) { - that.menu.addMenuItem(that.scrollViewMenuSection); - that.menu.addMenuItem(that.scrollViewFavoritesMenuSection); - } - else { - that.menu.addMenuItem(that.scrollViewFavoritesMenuSection); - that.menu.addMenuItem(that.scrollViewMenuSection); - } - - // Private mode switch - that.privateModeMenuItem = new PopupMenu.PopupSwitchMenuItem( - _("Private mode"), PRIVATEMODE, { reactive: true }); - that.privateModeMenuItem.connect('toggled', - that._onPrivateModeSwitch.bind(that)); - that.privateModeMenuItem.insert_child_at_index( - new St.Icon({ - icon_name: 'security-medium-symbolic', - style_class: 'clipboard-menu-icon', - y_align: Clutter.ActorAlign.CENTER - }), - 0 - ); - that.menu.addMenuItem(that.privateModeMenuItem); - - // Add 'Clear' button which removes all items from cache - this.clearMenuItem = new PopupMenu.PopupMenuItem(_('Clear history')); - this.clearMenuItem.insert_child_at_index( - new St.Icon({ - icon_name: 'user-trash-symbolic', - style_class: 'clipboard-menu-icon', - y_align: Clutter.ActorAlign.CENTER - }), - 0 - ); - this.clearMenuItem.connect('activate', that._removeAll.bind(that)); - - // Add 'Settings' menu item to open settings - this.settingsMenuItem = new PopupMenu.PopupMenuItem(_('Settings')); - this.settingsMenuItem.insert_child_at_index( - new St.Icon({ - icon_name: 'preferences-system-symbolic', - style_class: 'clipboard-menu-icon', - y_align: Clutter.ActorAlign.CENTER - }), - 0 - ); - that.menu.addMenuItem(this.settingsMenuItem); - this.settingsMenuItem.connect('activate', that._openSettings.bind(that)); - - // Empty state section - this.emptyStateSection = new St.BoxLayout({ - style_class: 'clipboard-indicator-empty-state', - vertical: true - }); - this.emptyStateSection.add_child(new St.Icon({ - icon_name: INDICATOR_ICON, - style_class: 'system-status-icon clipboard-indicator-icon', - x_align: Clutter.ActorAlign.CENTER - })); - this.emptyStateSection.add_child(new St.Label({ - text: _('Clipboard is empty'), - x_align: Clutter.ActorAlign.CENTER - })); - - // Add cached items - clipHistory.forEach(entry => this._addEntry(entry)); - - if (lastIdx >= 0) { - that._selectMenuItem(clipItemsArr[lastIdx]); - } - - this.#showElements(); - } - - #hideElements() { - if (this.menu.box.contains(this._entryItem)) this.menu.box.remove_child(this._entryItem); - if (this.menu.box.contains(this.favoritesSeparator)) this.menu.box.remove_child(this.favoritesSeparator); - if (this.menu.box.contains(this.historySeparator)) this.menu.box.remove_child(this.historySeparator); - if (this.menu.box.contains(this.clearMenuItem)) this.menu.box.remove_child(this.clearMenuItem); - if (this.menu.box.contains(this.emptyStateSection)) this.menu.box.remove_child(this.emptyStateSection); - } - - #showElements() { - if (this.clipItemsRadioGroup.length > 0) { - if (this.menu.box.contains(this._entryItem) === false) { - this.menu.box.insert_child_at_index(this._entryItem, 0); - } - if (this.menu.box.contains(this.clearMenuItem) === false) { - this.menu.box.insert_child_below(this.clearMenuItem, this.settingsMenuItem); - } - if (this.menu.box.contains(this.emptyStateSection) === true) { - this.menu.box.remove_child(this.emptyStateSection); - } - - if (this.favoritesSection._getMenuItems().length > 0) { - if (this.menu.box.contains(this.favoritesSeparator) === false) { - this.menu.box.insert_child_above(this.favoritesSeparator, this.scrollViewFavoritesMenuSection.actor); - } - } - else if (this.menu.box.contains(this.favoritesSeparator) === true) { - this.menu.box.remove_child(this.favoritesSeparator); - } - - if (this.historySection._getMenuItems().length > 0) { - if (this.menu.box.contains(this.historySeparator) === false) { - this.menu.box.insert_child_above(this.historySeparator, this.scrollViewMenuSection.actor); - } - } - else if (this.menu.box.contains(this.historySeparator) === true) { - this.menu.box.remove_child(this.historySeparator); - } - } - else if (this.menu.box.contains(this.emptyStateSection) === false) { - this.#renderEmptyState(); - } - } - - #renderEmptyState () { - this.#hideElements(); - this.menu.box.insert_child_at_index(this.emptyStateSection, 0); - } - - /* When text change, this function will check, for each item of the - historySection and favoritesSestion, if it should be visible or not (based on words contained - in the clipContents attribute of the item). It doesn't destroy or create - items. It the entry is empty, the section is restored with all items - set as visible. */ - _onSearchTextChanged () { - let searchedText = this.searchEntry.get_text().toLowerCase(); - - if(searchedText === '') { - this._getAllIMenuItems().forEach(function(mItem){ - mItem.actor.visible = true; - }); - } - else { - this._getAllIMenuItems().forEach(function(mItem){ - let text = mItem.clipContents.toLowerCase(); - let isMatching = text.indexOf(searchedText) >= 0; - mItem.actor.visible = isMatching - }); - } - } - - _truncate (string, length) { - let shortened = string.replace(/\s+/g, ' '); - - let chars = [...shortened] - if (chars.length > length) - shortened = chars.slice(0, length - 1).join('') + '...'; - - return shortened; - } - - _setEntryLabel (menuItem) { - const { entry } = menuItem; - if (entry.isText()) { - menuItem.label.set_text(this._truncate(entry.getStringValue(), MAX_ENTRY_LENGTH)); - } - else if (entry.isImage()) { - this.registry.getEntryAsImage(entry).then(img => { - img.add_style_class_name('clipboard-menu-img-preview'); - if (menuItem.previewImage) { - menuItem.remove_child(menuItem.previewImage); - } - menuItem.previewImage = img; - menuItem.insert_child_below(img, menuItem.label); - }); - } - } - - _findNextMenuItem (currentMenutItem) { - let currentIndex = this.clipItemsRadioGroup.indexOf(currentMenutItem); - - // for only one item - if(this.clipItemsRadioGroup.length === 1) { - return null; - } - - // when focus is in middle of the displayed list - for (let i = currentIndex - 1; i >= 0; i--) { - let menuItem = this.clipItemsRadioGroup[i]; - if (menuItem.actor.visible) { - return menuItem; - } - } - - // when focus is at the last element of the displayed list - let beforeMenuItem = this.clipItemsRadioGroup[currentIndex + 1]; - if(beforeMenuItem.actor.visible){ - return beforeMenuItem; - } - - return null; - } - - #selectNextMenuItem (menuItem) { - let nextMenuItem = this._findNextMenuItem(menuItem); - - if (nextMenuItem) { - nextMenuItem.actor.grab_key_focus(); - } else { - this.privateModeMenuItem.actor.grab_key_focus(); - } - } - - _addEntry (entry, autoSelect, autoSetClip) { - let menuItem = new PopupMenu.PopupMenuItem(''); - - menuItem.menu = this.menu; - menuItem.entry = entry; - menuItem.clipContents = entry.getStringValue(); - menuItem.radioGroup = this.clipItemsRadioGroup; - const allowedKeysyms = [ - Clutter.KEY_KP_Enter, - Clutter.KEY_Return, - ]; - menuItem.keyPressId = menuItem.connect('key-press-event', (actor, event) => { - if (allowedKeysyms.includes(event.get_key_symbol())) { - this._onMenuItemSelectedAndMenuClose(menuItem, 'activate') - return true; - } - return false; - }) - menuItem.buttonPressId = menuItem.connect('activate', - autoSet => this._onMenuItemSelectedAndMenuClose(menuItem, autoSet)); - menuItem.connect('key-focus-in', () => { - const viewToScroll = menuItem.entry.isFavorite() ? - this.favoritesScrollView : this.historyScrollView; - AnimationUtils.ensureActorVisibleInScrollView(viewToScroll, menuItem); - }); - menuItem.actor.connect('key-press-event', (actor, event) => { - if(event.get_key_symbol() === Clutter.KEY_Delete) { - this.#selectNextMenuItem(menuItem); - this._removeEntry(menuItem, 'delete'); - } - else if (event.get_key_symbol() === Clutter.KEY_p) { - this.#selectNextMenuItem(menuItem); - this._favoriteToggle(menuItem); - } - else if (event.get_key_symbol() === Clutter.KEY_v) { - this.#pasteItem(menuItem); - } - }) - - this._setEntryLabel(menuItem); - this.clipItemsRadioGroup.push(menuItem); - - // Favorite button - let iconfav = new St.Icon({ - icon_name: 'view-pin-symbolic', - style_class: 'system-status-icon' - }); - - let icofavBtn = new St.Button({ - style_class: 'ci-pin-btn ci-action-btn', - can_focus: true, - child: iconfav, - x_align: Clutter.ActorAlign.END, - x_expand: true, - y_expand: true - }); - - menuItem.actor.add_child(icofavBtn); - menuItem.icofavBtn = icofavBtn; - menuItem.favoritePressId = icofavBtn.connect('clicked', - () => this._favoriteToggle(menuItem) - ); - - // Paste button - menuItem.pasteBtn = new St.Button({ - style_class: 'ci-action-btn', - can_focus: true, - child: new St.Icon({ - icon_name: 'edit-paste-symbolic', - style_class: 'system-status-icon' - }), - x_align: Clutter.ActorAlign.END, - x_expand: false, - y_expand: true, - visible: PASTE_BUTTON - }); - - menuItem.pasteBtn.connect('clicked', - () => this.#pasteItem(menuItem) - ); - - menuItem.actor.add_child(menuItem.pasteBtn); - - // Delete button - let icon = new St.Icon({ - icon_name: 'edit-delete-symbolic', //'mail-attachment-symbolic', - style_class: 'system-status-icon' - }); - - let icoBtn = new St.Button({ - style_class: 'ci-action-btn', - can_focus: true, - child: icon, - x_align: Clutter.ActorAlign.END, - x_expand: false, - y_expand: true - }); - - menuItem.actor.add_child(icoBtn); - menuItem.icoBtn = icoBtn; - menuItem.deletePressId = icoBtn.connect('clicked', - () => this._removeEntry(menuItem, 'delete') - ); - - if (entry.isFavorite()) { - this.favoritesSection.addMenuItem(menuItem, 0); - } else { - this.historySection.addMenuItem(menuItem, 0); - } - - if (autoSelect === true) { - this._selectMenuItem(menuItem, autoSetClip); - } - else { - menuItem.setOrnament(PopupMenu.Ornament.NONE); - } - - this.#showElements(); - } - - _favoriteToggle (menuItem) { - menuItem.entry.favorite = menuItem.entry.isFavorite() ? false : true; - this._moveItemFirst(menuItem); - this._updateCache(); - this.#showElements(); - } - - _confirmRemoveAll () { - const title = _("Clear all?"); - const message = _("Are you sure you want to delete all clipboard items?"); - const sub_message = _("This operation cannot be undone."); - - this.dialogManager.open(title, message, sub_message, _("Clear"), _("Cancel"), () => { - this._clearHistory(); - } - ); - } - - _clearHistory () { - // Don't remove pinned items - this.historySection._getMenuItems().forEach(mItem => { - if (KEEP_SELECTED_ON_CLEAR === false || !mItem.currentlySelected) { - this._removeEntry(mItem, 'delete'); - } - }); - this._showNotification(_("Clipboard history cleared")); - } - - _removeAll () { - if (PRIVATEMODE) return; - var that = this; - - if (CONFIRM_ON_CLEAR) { - that._confirmRemoveAll(); - } else { - that._clearHistory(); - } - } - - _removeEntry (menuItem, event) { - let itemIdx = this.clipItemsRadioGroup.indexOf(menuItem); - - if(event === 'delete' && menuItem.currentlySelected) { - this.#clearClipboard(); - } - - menuItem.destroy(); - this.clipItemsRadioGroup.splice(itemIdx,1); - - if (menuItem.entry.isImage()) { - this.registry.deleteEntryFile(menuItem.entry); - } - - this._updateCache(); - this.#showElements(); - } - - _removeOldestEntries () { - let that = this; - - let clipItemsRadioGroupNoFavorite = that.clipItemsRadioGroup.filter( - item => item.entry.isFavorite() === false); - - const origSize = clipItemsRadioGroupNoFavorite.length; - - while (clipItemsRadioGroupNoFavorite.length > MAX_REGISTRY_LENGTH) { - let oldestNoFavorite = clipItemsRadioGroupNoFavorite.shift(); - that._removeEntry(oldestNoFavorite); - - clipItemsRadioGroupNoFavorite = that.clipItemsRadioGroup.filter( - item => item.entry.isFavorite() === false); - } - - if (clipItemsRadioGroupNoFavorite.length < origSize) { - that._updateCache(); - } - } - - _onMenuItemSelected (menuItem, autoSet) { - for (let otherMenuItem of menuItem.radioGroup) { - let clipContents = menuItem.clipContents; - - if (otherMenuItem === menuItem && clipContents) { - menuItem.setOrnament(PopupMenu.Ornament.DOT); - menuItem.currentlySelected = true; - if (autoSet !== false) - this.#updateClipboard(menuItem.entry); - } - else { - otherMenuItem.setOrnament(PopupMenu.Ornament.NONE); - otherMenuItem.currentlySelected = false; - } - } - } - - _selectMenuItem (menuItem, autoSet) { - this._onMenuItemSelected(menuItem, autoSet); - this.#updateIndicatorContent(menuItem.entry); - } - - _onMenuItemSelectedAndMenuClose (menuItem, autoSet) { - for (let otherMenuItem of menuItem.radioGroup) { - let clipContents = menuItem.clipContents; - - if (menuItem === otherMenuItem && clipContents) { - menuItem.setOrnament(PopupMenu.Ornament.DOT); - menuItem.currentlySelected = true; - if (autoSet !== false) - this.#updateClipboard(menuItem.entry); - } - else { - otherMenuItem.setOrnament(PopupMenu.Ornament.NONE); - otherMenuItem.currentlySelected = false; - } - } - - menuItem.menu.close(); - } - - _getCache () { - return this.registry.read(); - } - - #addToCache (entry) { - const entries = this.clipItemsRadioGroup - .map(menuItem => menuItem.entry) - .filter(entry => CACHE_ONLY_FAVORITE == false || entry.isFavorite()) - .concat([entry]); - this.registry.write(entries); - } - - _updateCache () { - const entries = this.clipItemsRadioGroup - .map(menuItem => menuItem.entry) - .filter(entry => CACHE_ONLY_FAVORITE == false || entry.isFavorite()); - - this.registry.write(entries); - } - - async _onSelectionChange (selection, selectionType, selectionSource) { - if (selectionType === Meta.SelectionType.SELECTION_CLIPBOARD) { - this._refreshIndicator(); - } - } - - async _refreshIndicator () { - if (PRIVATEMODE) return; // Private mode, do not. - if (this.#refreshInProgress) return; - this.#refreshInProgress = true; - - try { - const result = await this.#getClipboardContent(); - - if (result) { - for (let menuItem of this.clipItemsRadioGroup) { - if (menuItem.entry.equals(result)) { - this._selectMenuItem(menuItem, false); - - if (!menuItem.entry.isFavorite() && MOVE_ITEM_FIRST) { - this._moveItemFirst(menuItem); - } - - return; - } - } - - this.#addToCache(result); - this._addEntry(result, true, false); - this._removeOldestEntries(); - if (NOTIFY_ON_COPY) { - this._showNotification(_("Copied to clipboard"), notif => { - notif.addAction(_('Cancel'), this._cancelNotification); - }); - } - } - } - catch (e) { - console.error('Clipboard Indicator: Failed to refresh indicator'); - console.error(e); - } - finally { - this.#refreshInProgress = false; - } - } - - _moveItemFirst (item) { - this._removeEntry(item); - this._addEntry(item.entry, item.currentlySelected, false); - this._updateCache(); - } - - _findItem (text) { - return this.clipItemsRadioGroup.filter( - item => item.clipContents === text)[0]; - } - - _getCurrentlySelectedItem () { - return this.clipItemsRadioGroup.find(item => item.currentlySelected); - } - - _getAllIMenuItems () { - return this.historySection._getMenuItems().concat(this.favoritesSection._getMenuItems()); - } - - _setupListener () { - const metaDisplay = Shell.Global.get().get_display(); - const selection = metaDisplay.get_selection(); - this._setupSelectionTracking(selection); - } - - _setupSelectionTracking (selection) { - this.selection = selection; - this._selectionOwnerChangedId = selection.connect('owner-changed', (selection, selectionType, selectionSource) => { - this._onSelectionChange(selection, selectionType, selectionSource); - }); - } - - _openSettings () { - this.extension.openSettings(); - } - - _initNotifSource () { - if (!this._notifSource) { - this._notifSource = new MessageTray.Source({ - title: 'Clipboard Indicator', - 'icon-name': INDICATOR_ICON - }); - - this._notifSource.connect('destroy', () => { - this._notifSource = null; - }); - - Main.messageTray.add(this._notifSource); - } - } - - _cancelNotification () { - if (this.clipItemsRadioGroup.length >= 2) { - let clipSecond = this.clipItemsRadioGroup.length - 2; - let previousClip = this.clipItemsRadioGroup[clipSecond]; - this.#updateClipboard(previousClip.entry); - previousClip.setOrnament(PopupMenu.Ornament.DOT); - previousClip.icoBtn.visible = false; - previousClip.currentlySelected = true; - } else { - this.#clearClipboard(); - } - let clipFirst = this.clipItemsRadioGroup.length - 1; - this._removeEntry(this.clipItemsRadioGroup[clipFirst]); - } - - _showNotification (message, transformFn) { - const dndOn = () => - !Main.panel.statusArea.dateMenu._indicator._settings.get_boolean( - 'show-banners', - ); - if (PRIVATEMODE || dndOn()) { - return; - } - - let notification = null; - - this._initNotifSource(); - - if (this._notifSource.count === 0) { - notification = new MessageTray.Notification({ - source: this._notifSource, - body: message, - 'is-transient': true - }); - } - else { - notification = this._notifSource.notifications[0]; - notification.body = message; - notification.clearActions(); - } - - if (typeof transformFn === 'function') { - transformFn(notification); - } - - this._notifSource.addNotification(notification); - } - - _createHistoryLabel () { - this._historyLabel = new St.Label({ - style_class: 'ci-notification-label', - text: '' - }); - - global.stage.add_child(this._historyLabel); - - this._historyLabel.hide(); - } - - togglePrivateMode () { - this.privateModeMenuItem.toggle(); - } - - _onPrivateModeSwitch () { - let that = this; - PRIVATEMODE = this.privateModeMenuItem.state; - // We hide the history in private ModeTypee because it will be out of sync (selected item will not reflect clipboard) - this.scrollViewMenuSection.actor.visible = !PRIVATEMODE; - this.scrollViewFavoritesMenuSection.actor.visible = !PRIVATEMODE; - // If we get out of private mode then we restore the clipboard to old state - if (!PRIVATEMODE) { - let selectList = this.clipItemsRadioGroup.filter((item) => !!item.currentlySelected); - - if (selectList.length) { - this._selectMenuItem(selectList[0]); - } else { - // Nothing to return to, let's empty it instead - this.#clearClipboard(); - } - - this.#getClipboardContent().then(entry => { - if (!entry) return; - this.#updateIndicatorContent(entry); - }).catch(e => console.error(e)); - - this.hbox.remove_style_class_name('private-mode'); - this.#showElements(); - } else { - this.hbox.add_style_class_name('private-mode'); - this.#updateIndicatorContent(null); - this.#hideElements(); - } - } - - _loadSettings () { - this._settingsChangedId = this.extension.settings.connect('changed', - this._onSettingsChange.bind(this)); - - this._fetchSettings(); - - if (ENABLE_KEYBINDING) - this._bindShortcuts(); - } - - _fetchSettings () { - const { settings } = this.extension; - MAX_REGISTRY_LENGTH = settings.get_int(PrefsFields.HISTORY_SIZE); - MAX_ENTRY_LENGTH = settings.get_int(PrefsFields.PREVIEW_SIZE); - CACHE_ONLY_FAVORITE = settings.get_boolean(PrefsFields.CACHE_ONLY_FAVORITE); - DELETE_ENABLED = settings.get_boolean(PrefsFields.DELETE); - MOVE_ITEM_FIRST = settings.get_boolean(PrefsFields.MOVE_ITEM_FIRST); - NOTIFY_ON_COPY = settings.get_boolean(PrefsFields.NOTIFY_ON_COPY); - CONFIRM_ON_CLEAR = settings.get_boolean(PrefsFields.CONFIRM_ON_CLEAR); - ENABLE_KEYBINDING = settings.get_boolean(PrefsFields.ENABLE_KEYBINDING); - MAX_TOPBAR_LENGTH = settings.get_int(PrefsFields.TOPBAR_PREVIEW_SIZE); - TOPBAR_DISPLAY_MODE = settings.get_int(PrefsFields.TOPBAR_DISPLAY_MODE_ID); - CLEAR_ON_BOOT = settings.get_boolean(PrefsFields.CLEAR_ON_BOOT); - DISABLE_DOWN_ARROW = settings.get_boolean(PrefsFields.DISABLE_DOWN_ARROW); - STRIP_TEXT = settings.get_boolean(PrefsFields.STRIP_TEXT); - KEEP_SELECTED_ON_CLEAR = settings.get_boolean(PrefsFields.KEEP_SELECTED_ON_CLEAR); - PASTE_BUTTON = settings.get_boolean(PrefsFields.PASTE_BUTTON); - PINNED_ON_BOTTOM = settings.get_boolean(PrefsFields.PINNED_ON_BOTTOM); - - } - - async _onSettingsChange () { - try { - var that = this; - - // Load the settings into variables - that._fetchSettings(); - - // Remove old entries in case the registry size changed - that._removeOldestEntries(); - - // Re-set menu-items lables in case preview size changed - this._getAllIMenuItems().forEach(function (mItem) { - that._setEntryLabel(mItem); - mItem.pasteBtn.visible = PASTE_BUTTON; - }); - - //update topbar - this._updateTopbarLayout(); - that.#updateIndicatorContent(await this.#getClipboardContent()); - - // Bind or unbind shortcuts - if (ENABLE_KEYBINDING) - that._bindShortcuts(); - else - that._unbindShortcuts(); - } catch (e) { - console.error('Clipboard Indicator: Failed to update registry'); - console.error(e); - } - } - - _bindShortcuts () { - this._unbindShortcuts(); - this._bindShortcut(PrefsFields.BINDING_CLEAR_HISTORY, this._removeAll); - this._bindShortcut(PrefsFields.BINDING_PREV_ENTRY, this._previousEntry); - this._bindShortcut(PrefsFields.BINDING_NEXT_ENTRY, this._nextEntry); - this._bindShortcut(PrefsFields.BINDING_TOGGLE_MENU, this._toggleMenu); - this._bindShortcut(PrefsFields.BINDING_PRIVATE_MODE, this.togglePrivateMode); - } - - _unbindShortcuts () { - this._shortcutsBindingIds.forEach( - (id) => Main.wm.removeKeybinding(id) - ); - - this._shortcutsBindingIds = []; - } - - _bindShortcut (name, cb) { - var ModeType = Shell.hasOwnProperty('ActionMode') ? - Shell.ActionMode : Shell.KeyBindingMode; - - Main.wm.addKeybinding( - name, - this.extension.settings, - Meta.KeyBindingFlags.NONE, - ModeType.ALL, - cb.bind(this) - ); - - this._shortcutsBindingIds.push(name); - } - - _updateTopbarLayout () { - if(TOPBAR_DISPLAY_MODE === 0){ - this.icon.visible = true; - this._buttonText.visible = false; - this.show(); - } - if(TOPBAR_DISPLAY_MODE === 1){ - this.icon.visible = false; - this._buttonText.visible = true; - this.show(); - } - if(TOPBAR_DISPLAY_MODE === 2){ - this.icon.visible = true; - this._buttonText.visible = true; - this.show(); - } - if (TOPBAR_DISPLAY_MODE === 3) { - this.hide(); - } - if(!DISABLE_DOWN_ARROW) { - this._downArrow.visible = true; - } else { - this._downArrow.visible = false; - } - } - - _disconnectSettings () { - if (!this._settingsChangedId) - return; - - this.extension.settings.disconnect(this._settingsChangedId); - this._settingsChangedId = null; - } - - _disconnectSelectionListener () { - if (!this._selectionOwnerChangedId) - return; - - this.selection.disconnect(this._selectionOwnerChangedId); - } - - _clearDelayedSelectionTimeout () { - if (this._delayedSelectionTimeoutId) { - clearInterval(this._delayedSelectionTimeoutId); - } - } - - _selectEntryWithDelay (entry) { - let that = this; - that._selectMenuItem(entry, false); - - that._delayedSelectionTimeoutId = setTimeout(function () { - that._selectMenuItem(entry); //select the item - that._delayedSelectionTimeoutId = null; - }, DELAYED_SELECTION_TIMEOUT); - } - - _previousEntry () { - if (PRIVATEMODE) return; - let that = this; - - that._clearDelayedSelectionTimeout(); - - this._getAllIMenuItems().some(function (mItem, i, menuItems){ - if (mItem.currentlySelected) { - i--; //get the previous index - if (i < 0) i = menuItems.length - 1; //cycle if out of bound - let index = i + 1; //index to be displayed - that._showNotification(index + ' / ' + menuItems.length + ': ' + menuItems[i].entry.getStringValue()); - if (MOVE_ITEM_FIRST) { - that._selectEntryWithDelay(menuItems[i]); - } - else { - that._selectMenuItem(menuItems[i]); - } - return true; - } - return false; - }); - } - - _nextEntry () { - if (PRIVATEMODE) return; - let that = this; - - that._clearDelayedSelectionTimeout(); - - this._getAllIMenuItems().some(function (mItem, i, menuItems){ - if (mItem.currentlySelected) { - i++; //get the next index - if (i === menuItems.length) i = 0; //cycle if out of bound - let index = i + 1; //index to be displayed - that._showNotification(index + ' / ' + menuItems.length + ': ' + menuItems[i].entry.getStringValue()); - if (MOVE_ITEM_FIRST) { - that._selectEntryWithDelay(menuItems[i]); - } - else { - that._selectMenuItem(menuItems[i]); - } - return true; - } - return false; - }); - } - - _toggleMenu () { - this.menu.toggle(); - } - - #pasteItem (menuItem) { - this.menu.close(); - const currentlySelected = this._getCurrentlySelectedItem(); - this.preventIndicatorUpdate = true; - this.#updateClipboard(menuItem.entry); - this._pastingKeypressTimeout = setTimeout(() => { - if (this.keyboard.purpose === Clutter.InputContentPurpose.TERMINAL) { - this.keyboard.press(Clutter.KEY_Control_L); - this.keyboard.press(Clutter.KEY_Shift_L); - this.keyboard.press(Clutter.KEY_Insert); - this.keyboard.release(Clutter.KEY_Insert); - this.keyboard.release(Clutter.KEY_Shift_L); - this.keyboard.release(Clutter.KEY_Control_L); - } - else { - this.keyboard.press(Clutter.KEY_Shift_L); - this.keyboard.press(Clutter.KEY_Insert); - this.keyboard.release(Clutter.KEY_Insert); - this.keyboard.release(Clutter.KEY_Shift_L); - } - - this._pastingResetTimeout = setTimeout(() => { - this.preventIndicatorUpdate = false; - this.#updateClipboard(currentlySelected.entry); - }, 50); - }, 50); - } - - #clearTimeouts () { - if (this._imagePreviewTimeout) clearTimeout(this._imagePreviewTimeout); - if (this._setFocusOnOpenTimeout) clearTimeout(this._setFocusOnOpenTimeout); - if (this._pastingKeypressTimeout) clearTimeout(this._pastingKeypressTimeout); - if (this._pastingResetTimeout) clearTimeout(this._pastingResetTimeout); - } - - #clearClipboard () { - this.extension.clipboard.set_text(CLIPBOARD_TYPE, ""); - this.#updateIndicatorContent(null); - } - - #updateClipboard (entry) { - this.extension.clipboard.set_content(CLIPBOARD_TYPE, entry.mimetype(), entry.asBytes()); - this.#updateIndicatorContent(entry); - } - - async #getClipboardContent () { - const mimetypes = [ - "text/plain;charset=utf-8", - "UTF8_STRING", - "text/plain", - "STRING", - 'image/gif', - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/webp', - 'image/svg+xml', - 'text/html', - ]; - - for (let type of mimetypes) { - let result = await new Promise(resolve => this.extension.clipboard.get_content(CLIPBOARD_TYPE, type, (clipBoard, bytes) => { - if (bytes === null || bytes.get_size() === 0) { - resolve(null); - return; - } - - const entry = new ClipboardEntry(type, bytes.get_data(), false); - if (entry.isImage()) { - this.registry.writeEntryFile(entry); - } - resolve(entry); - })); - - if (result) return result; - } - - return null; - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/keyboard.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/keyboard.js deleted file mode 100644 index 6ec9baa9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/keyboard.js +++ /dev/null @@ -1,41 +0,0 @@ -import Clutter from 'gi://Clutter'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -export class Keyboard { - #device; - #contentPurpose; - - constructor () { - let seat = Clutter.get_default_backend().get_default_seat(); - this.#device = seat.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); - - Main.inputMethod.connectObject('notify::content-purpose', (method) => { - this.#contentPurpose = method.content_purpose; - }, this); - } - - destroy () { - Main.inputMethod.disconnectObject(this); - this.#device.run_dispose(); - } - - #notify (key, state) { - this.#device.notify_keyval( - Clutter.get_current_event_time() * 1000, - key, - state - ); - } - - get purpose () { - return this.#contentPurpose; - } - - press (key) { - this.#notify(key, Clutter.KeyState.PRESSED); - } - - release (key) { - this.#notify(key, Clutter.KeyState.RELEASED); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ar/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ar/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 6bbca1efae9f42ca59bf2fe7600537591d981600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmai!+fN)-9LG;>>t(f7>#g;Y9wR33Fx!P%LKY}eY%PgYg!T3~%pP{f%*=p1W@CdjF-Vc5X9tA%GQ{Xl57`O^P4%Wd_;1A#v z;4k1K;2$8x`3r0V4WA?=Hx}pTS4L zKf$NLV@UQ4*am)xp8CKsoHtQC#XW>(sQ%*(o&qUeTZ7#o<+%)!E)(EO;Bw=<0aBbF z!2$3$@Hz1G1B`WnyXquoHG2#TWf+~QHhL%~QZdM4^a1uC%Ks1+&FLf->5lQ3Isx;L2BZ^d z*?b;uZW^Tdv%ygC8Cm90xv`nHgP6yX=Y=O?!EMjuj^~ypq#fqD8w)=gU>9UuWJ7k~ z2#*bU!VZ()WIWK=7TqY8;S5eq-ys>qB8U&%G;9zbAw-@H$&xGblzcxUyPU+~!sv?lDCWq93a*s>3A~e&+$q|j?Z7bNZeZLd zQ2J;nrd%;?GVu16O-J%ZmZL_X(a@c;A&D>Zf{h8E>X=-5j1p)>2#XCTeQstBg*}cM&$>P#~RLC??3|-ljVg#`ofBe z!t*Q?Bm%m&_T{(SAWwzMFf}GhGK{T}sNm+U3*|y&;`S{DOH<}tD?@0oDp)TmbuZO^(SLqE#$pk$6we^)P0w*Bn^f3cr;cJ!v+ zvtAbg4UM`Ql_KxPyepkacc++M(hFRz>P1!Kx}s{>&Z{kRqvtu!b-hC8n`&FnaN*bJ!SpL^)i=g?oi)S3)mX!+ zqHgNtB-jqpESMWr)64qm!4!8Cylc9`ThX{O4*zXM85Uu%$@Q#WxyNQtZBcjBLaU>e zWl{+=SYj8shU+|YE|9QOZ359SG#xv*W@!w z^iQUgRDuW?Dny?r(Yap2%PLF5ds{D=)R4GBk|8z9t#a5_V7-{U#8->(Xxk)!8@|Iv z_A}UQ?rW;&VD~i|TW9#Ugr4SAO|3N&A~IsHVGcJKOsb}&Mi2WD&7%Q6vqcBU*@BwKoR2W0v`c?0iOi_07X~bsnmnOW1z?{fer9^@Hwyziu^_J zVeoxWL;D__`Pe8GM4Lk|n0MCFwgHM3JgZuFLH+V1B0nWt#1bhno7}Vf3a0&bs zd>s4>yc;})&nfT>xD37ku7JJy{sepg>yPIA3=}(Gf)f9apy=NOp9TK}2|Rg^QV6Ra zQm51N|B|EFlOcJFt_*}<56S(0OoUetn5oBI_||ouuLY8?)I{ndwS{Y?Hhmnct&B~e zu`QzyhgjKS;7v$r%e%-f{%2<{Ly2f`sb;B@zt5 z_->UCIFKJwGB&{^kwZz=!9qa;6I3tozU6~jnU;@aR%R!@D(8lJ!S0*Ll>3y`9>-|i zs8oAne?ZPhJG6<3);q#4@x`I)OAH4#%V@wf=D@1&N281>j$wpdrTT}(>_pNjkzX=y zHk<0*v5EDLm_8P%zsyP0+o^sBNx)Z!M$YG~%Q0t}hCg<)trw-y)}<1c4~y7vH>+CqpQtNq6ZKTy^t9iDe&gFx2dc9Pe zl}!z0x2}FZdz02=c#Te;K@}=sgW=FT#+Y$FE zAGcILccZ#^>ITOpkES=Ifp&d92rS}>3DYlTuO87O9$Xa!tAc~|K`pErDx?$2%49Z9 zOk$_k(GCmcm4y$37M-c05uhYpp?V^ia|~Rn9bY0Es+?IgMr{pA)#(M*&FWhvQ=q5q z6^1UE531=mC}^Hn(Ma}ak?D7;TPE;etJygrYBH2?KxDVBex)u})34Ey;!qB5&+i|1 C%C{H* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/cs/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/cs/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 112a8606305550325a567449d0eb0c29afa62694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2125 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 E58b`e5C8xG diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/eu/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/eu/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index dab2f1504d7952c47ab9406395ea380ba649f429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fi/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fi/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 964a92195f9fe551a24ebe3b611b4b7753d1f66b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092 zcmYk4&u<$=6vw9!ei>+KdnlDadKH&MWt?>?XyY_hA*3PDl&EnLt<=NR`?7xC@yu#w zHm!mG0de5U$tSp?NSuA*!e4-T(JyI@oE7;J&VMZ5;j!vARz{}p@_{_l(UAK*Foe}g~3p2IG{ zfAp$SAAuwAeeh?n>GK=d6;|p5q^DNjaAPVg=I0U4{T7#K%=_?6B zJ7Ie4g7=Yb4&k?p;Aiet+sWK*DW!cVw@~Yf+7zsNY(`y*wI2!Hw7xV}q8FD$;~|;b zh4*+7G^wlD?)%YcDU|N*?ropGPp6%=w!BLit?rF0=uVjQYGsYM4QhrPIc+}Z-O)Er z^BVbw9Q3y9`y4~<(v2sQTKl#R#_BshjAEBuHFM+U+6K)ZH82DYC8S3A8-oP?kKLPFB=*&en=!car_E wjFQF}wOFG*!+`1%f9l?JGEPt|cGPHyIBKTGaE#_8x>|`?p9~%0tCf)QKL-po%m4rY diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fr_FR/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/fr_FR/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 013809d74c0cf511764156302a7b646f1662ff13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1971 zcmZXUO>Epm6vqb|z7`6le3dUT60MS`@@A8^sM<6QX_}TuNmw>Z;f7}Ix9dUnj2VxU zrb0a;A#O-WzzK;%yPS%|0SSf9^DY48nj3j6@PAN&Zs5BwNxfS-bg!7stb!LPw*!4iA| z{0)2r{0n3||ANQCLx<}9GvG@Yp8|Q`Huxx*g1qm2@I~-L@Imkf$m?!_?C&Q~g1>@~ zf&YL{gNNbl8Spr`f}GBQGZlW2pi&kD%#55VWa z>)%;PHda=M|s3kxF;8D z&2{EjCKu;%_r>)WD~{xzEo5GdUv`!8(pwo(LY|~b5*a2s>s#d_sXe9nvbbPtXqgA#t%BK{5_4nJ!03Il}Sr$YC^Y7X!OwWULA=*3dNN zi13Gi(~eNYmQDNkZ-D8rYM=5ZJnx5rQ%b538y0n?q7o&URyf7wjRNhozh(B0=?o6S zaugv5LOa89hSoxg+eL=Al;ebpy03DHs4N>Us^XLAz-C(B^aw+&4A5BU9`pzu?6dL< zJ|8R}+D(&~VXbGyDmoLrTK!8%?8yiPDZhd-iA)M;gGQTJoeNcE9Lm-WhrF&y9cr0z QL_Al`bJtDw{7;$x0BDUA#Q*>R diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/hu/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/hu/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index bb2c2dfab1983bbdc652d583e79309ee3091b4d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2127 zcmZvcPiz}S6vn4eC^ZnEE&o9bsFm8nx^^fixP;Jz6r$o18dKoL*dDL9o}IB~#tvSA zgt#CC9CDx%;uH?3K2)Ma@~J{XqudY|xPpKy;s8S8zyZFucG|Qs^6byEJMYc+zS-Fy z_w4+bq1})E0Q#Tk2hhLSfeYFj*D-b!6yQ$q9C#!6DR=|;8CU?%gSUbk;2q%C;Jx5? z;9l@I@D^~#_2WEK;C_tvf)qakJ_Ig+6xRT!z_&q)`w%33pMVd7Bk(5hdywY;0MfdD zfgIcovA2PT!Mnf;csKYmcmlO0;1P_!KoPY5PaxIxD@b|&0QZ1@gA_l7hcrF_a&QLR z2fhwceHuhc_AYoBd=I=C{1SWw{0b!9KZCo#e?Y2h7Y0v(`@jf11ybE_fd{}3K&ty9 zNO``UjDH7d&!!-DKX@3VErVQkCpy(ieo!s9qhq;TAFWA^Vv&NuuG}Z!a-%wTqf>q4 zE$PAb;R*!*af4#)PCEY$sFWI3fW`}rkltn zEq-}L_QE(1Ur92_mKsL0s_DyI2u<{D33Rz=d1<+W=7vu&>6CoabF2mhr+R4}&rFLq z+QNzkCOV$zJgg4s%U1Rixtg!Q4_=vbX#B+V+$7PmP5J_sq^2p^X_=CardicoSZh|d zr<^=oZNo3u6%E*EO;4jV$YLwf`$Wf%t+WxQjZa!hLy&BaU&C|jye+L{ zHJHUsSK9H!hR_J4r$}qGEV7!3V+Au{NGf%Y)dt;hDB0v-aHCx;7TK$9k#Db~wXbr) zoP~GMQZqUOgCM5D3#Vn*SRYkgoHV2PUhJZp!R_UjqSNqGss-A?-1S86AsnJe>1 zPfOZpQ8!Ez`%vLC^~4umi=LO7>?NVgMm7`Ar;A66<-)S+S)rm6#-^^qbvGZn+390^ z{CD=C<`2*E@}Xk|HlJkPxW{Dh=D*YU*Cc4?d z`>?sjs$m#AY%~Rhp=06PI3~}68*+{z-5J#vSLb(GSVyL%4vy2Ja+_;-5!C=+iPU7V@QC4^1O+MKvV7FTRkM>} z)R(>^Gn8}^=dFYD2DRgCT=166bGfkIuM5h&xu(M~lO8gLmOeQLJCm?OV?jtnM=z|? zl#M1k&Xq)#Fyv{^L&yf#gK$A{sUV9Fv=#c8JG!)+UR**+}UF&5&s(j?yVmWgp1~04woM%{g2!K0_EU(ssI20 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/it/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/it/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index c12403b33b886a128fa8ab3279c49fb5670aefbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2846 zcmZ9NJ8T?97{`YfHK|%siQXxPBiH0r`J-=`F?3j$S``f*p`5yoI=DXi-yZXFh?BRNV z>%i#}@LKpSyas*`r{It9M)(W775)Y9h5y3a;ms_* z9zF_p!Y85FJIrk_d>)G3Rk#}#Q0#sP#qP)OVfY1n4E_Yg{zZ5b+(|HE_kQ>w+y{5T zQ&9Yl;SP8X%DQ*pZSXvlct3|4ehqJize0)UA9xqM2t}G5{CGFq30Kf;H|+EN)^$o9 zhd)E{cMCTj)x8t$g5qZyioGLHbXkUX!qo}ig_6gI@P7CS#I^bc9)sUOiR%iIc^qC3 zCEll?Rr=I%)7T`P+Z6Ris3#L$(nD9-Eae+&uCmRS zSWh0-jZb1@Xjx^o$#b3Mt{enY4Yf_{`>NKDVZ7?=tz=V%7Ckn{1S)}UT-Z(FsH1+QMVw$za@v&5=4 zU9*~OrJI=aWQ98I3YVf<3~RPYKpdp81*LB1w?-T`&)Bz8Yf7C7$*sD~Bz}+TOkE7H z99DHUHkH9;6}1z!OFckjf*?8<1BW^@&vXtP)H8>Bvj?A; znVp%LI?Z|M^ef|IZm80pUJe6XJ~xo1-NOf87!}6l-7FN(GuMx5GqRn&HAPRq>55{b z8#7!acWK_%v>qikwYac&@=~-1x-(Og;_pcQy=L3?m$`BNNK;PHrlYU*PjwDmnkT`n z+NyKXXJN?R_4J_umfz^SXuYT|Q7;8MDu(?_P%+-T%#Ka$qDa#u1w723etAY=C z7&&uHoup-%V&K%A_cb5Y$#(gq*W{aa0$rx*KCJ(r30jCWnVLGGbtt#x-8bF0~xi5a?bLdC>pV(lf2CeJm_I4gEniZu;n&f z7H-p;oLZuo$z(5!Mav-dpSfaU0^6HrtvV}P66-9pG14J6yVTf9hq4uY+u@D^p+Pw& z=Jb5}QJx39MAyV7LBu9Zt5;o&60FQz4IJLfv)(JkQC1SozAeMkZ5$e+g!0V;X-`T@@X-xvc2H-&(T) zbo`7{Ll6Q34?a#k*UsS%zIs8Ll)G@0(i?0(OwK|xMPuDAER6K+I3iCIm< aloLXV_Rse|leRY>qM^x4+!+1ee*Fjf8UbJc diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ja/LC_MESSAGES/ja.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/ja/LC_MESSAGES/ja.mo deleted file mode 100644 index ac33b2ebce6c58e9e69f8ca1fa49d2481905c5c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2191 zcmai!Yitx%6vr=u57syMesN>a_{gl=O0X^<+6qdfSm~-5{or)=c6V@h?q+6|QWKS( z5$pp*tvuQy*xE{^v}j5QSj6z%Z<_E)zTD0hJ{V(SV*KX+%*;}VCQf$dcOU1Rd(Qvd z?D<6t_Aos6;=K>=pLid_`_nvp@VtE$W6MAtTmbF`uK@?atHEI~0giz;f>YqF;92l) z@Mmx__#1cwIB$Lw=O%C|=8Hk{ZvdBoO(6Lh;7#CrAo=YCDZhU3e((f%9rz1K_P>I3 z?q47W7b4l4!Nu<*EZ86^mS7Lo2-aiK}#r!--=gvp5 z%fSahI`0jTde$D#J&;;PJ)yj)R?-8@>=wLqCQ1%{fzTJB8RQD6Rf1tf?S$JNlCG>Ufwp9aq|&nALonq~!|By=*16L41S|S=J;= zrpVIamri6aMsawn`L1B=3~8}uxkZGDkfECwK#A+^uCTd-oDJ86(FU>AMgd|Vv3IN1pdgJ&7;wdEIVJ8YaVWvbj^0t&?#+>pCL<~EJNvc zn9#mW@Vu}E%RnqHOTvx}4c&qx?INtSM3QA>E?0mU5Tq!qGRt(9B3F{hfxt#SnM|_R z^Lp4`ht9r21-Tj8Y3s7uYY+&@q{Amuwr zLl&Qbxs@yHIiY2QUc@oAd75w56V2GGrDFNb`m^(@kvBUJw@PN*T6Dku_cZB;s$Q?Y*xGJ?`&apLAy#=mXD$Pr_Xm^sEo&VggOLMebSfnZ0 zFy$Rn{t@N-%HOB_1IjXTkO{RrxyT?zz}MqAL3^R$iC#c7@{) zRpqd%^s7qm@23y3nUh1+y{8azLit}Qe@c1N${(*C;SDpys-EZyKAsMp&&+vVIxX6+ zx%@k;9ovJ+Q|!th$mtL~rj-9VrB68`bhtY6;}^li{+a0$)ji+BWLSA4q2Uy}SUFkk zIT)PTsVd{~hQCAkU!r2=cg1>C#%B*t2fce(_2`hQoMdx5{wLv4lfkb27mgeZqmzC| zmEWiQQS4RseiTgXqm7^&T9GgIzo7*D{!nEcG8_)N|0nJa64X0|!-G%9l-GmqD1T7- z$HHLf1-1q#5(em3+^K%$^|A|N6T##FDv!mf_Is%J; z{>BxAsGS&IfYG35FxsB1_U)Sa;Xt_RBT}^stwj6biCc0kybY)p@((JnPi^y1+K}>l eBTZO!7%Q6vw9!K59w}E#Cz(6|K}zt&^BajT}Nq)2{$2X<`~KNQ`%%*AvgqSTnOR ziG&0PPH+VYapQpaID+6@l_LivxB?Oq;?x^b#Rc(yUMCKWy#9H2-^c&Gnde`RPJAe^ zj^la~*I&3!;rihKzOdfBLx{7W0w=(az`Mauz`MXt!5a8Ect7|x_#k)#d>s4drH4?x!UG58etEqE{ZGsyP8fSmU>D8Yje zdjxzId<1NQkAm00mr$Dq8@T@lMQ|N|;_D!I3*`E4gIv!)AnQMbhpb0}C%`F?^;`pw zf)-@|cfm8@`ylK74txUq9y|&D26DX<_Xu$xcm#X~JPvYQ3n2Tw0kYpF$bRpEr@$}4 zhrk~}*7e7Te}lYbkSiX>#kF!jxJM7*LfYZ}aco|^-*6FV*RW5(-r{<=7S6-H<+`zb z!#;9OUaXDlc#LmGi|g6HxPM~NliYTt4CUy@K-nmxlNlL`B$Y8THM-w+%4bqXD#C&| z?_yUhDVvfJONNxMzS($T^s}o&bbcFmyS_`#MzV3=laUSLBLrn)$@Mj5oO~~%xKhQD z>w1U8a_X#Daa%ML!iKR+Kwqj(BrgLrr%}V`D!mmYvO&SsvS{O->&UdLyh>phq_#u1 zHl(k5+R`)_W{{`HHj~vGSB6obRj;=cT2i=-#2OW>BXa{QmG^G2Kji4;po@NmzDm(X z?@Ei(AWN)MjN0ZwtassNUDO?&DwZwrNnL+iv{?Q?qxWr+UGgMaXqI$+@|9t#EFAeQ z!a7TJ(Q(~Syh0k<5W zPcD_?) zg;<7c*~X!VpT*yUGJB2qy8kXLPRz{nwqz3FnuPdC5f-5B=_^Hl}FHb#lf@aSuFh%GMQ ztn|&RluD#aA)#{Uwh#<7({ZF0wPlYW2aGmP{9i)o5~ E0i+Eo!~g&Q diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/oc/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/oc/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 6aaba6e4906670f70e49d17cbfee5176ee0dcac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2102 zcmZvcO^6&t6vrzjeq_}cv&Qd_!Vff&p3Lm#u#CvE*{pFOyUy;8(W7s=YiCM(sybEG zJMMxI@Z!OX2ZiWGyf{IEu%bdPB7G1<@Su28AvX`66!hr-_4IxOx0#+_ch`IMUj1La z`t8`E_XVzpa6gRuZ`@De{^0=raJ_bu5T`)`4}l+mw}2mkH-n#m6W|EE6Z`_a8~hf0 z0Q?D@1pfr@01q4-&vOKP67Q2B`_F)nf%72y#o!U}Es*`*1v$UV;3MEy;BDZ~Alv^6 za@>DF2_8nWcY!Ctd%-4nAGi!2#M(62!utS=xE1`m;x`q)1KIyakn{f?(f>U4{WF6lIp8($j?*YFA z9|gY$S(iUR&gWlHg2y2SmkjBNl?~>{6e%@wzu0CQqQmJAHMH+4*;h`94#bi+ zQ*LY+lYt|TVp?ldO>}IpmqH8(GEgQLosDel$})Kf9QSLrns}v8WqCcvzCi{1I<$*g zNpt}MA(^I}SW%gEAzJi3okVByo{u^fpW81*E6|LMqO(w>DW~dFji}Lxrs}eBx>=uo zw%(}MC(e@(QOA+-DPc1-<#LXaAZUB;T=C8-#!WA$o{Bn(2AFsIy(w)xvDjK%*iEHT zt4~xLDB_hhODRufDQWXuSy->a^DlQ^h-P-}IP#iu(SnI>0>zthrmMrmtI;`SSV&H( zZB?R!oW}g(f=!E2*p%za1xj==as(*@dLwgspdFM%J!NXKBT~gfp4&uT%r&-6Mj5+Y zzx4U6I1iJ=dNF76G{qiU@G-4{9n?&XpG&*yyG*ZNx?FB_9it1lPkMRy|J+`*xT|!$ z&rmfl`U_oz8e_qn>W#^H(V?_YaF^-R+W}i~v1Le{#a2zJ_>^3kPPIbpeM88FGFObU zafij+VGC$3N(f(iTvZZFcF@Hcf~n)O&7g&sBvX>;GKZL0<9Mn+a diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pl/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pl/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index ae34e92f01bf290d94060f7a979243efec9555c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3694 zcmZ{mO^h5z6~`-JLs&u}36Kx-Q4Yl3CGPRe#)z=?X4zfau(H>TcE?@|L{Lq4?MzL7 zR8v*$PPdW+h85z12oOapOOd!CaX`pY4%iSWJ99+>PJqOfI}#rf7yhri$Fr76YkPj( zRn@QF`@dIJ`?trByuomt#{DVWKYNI=b?}k*;|JGMM;KcLp9ar>-vl29e+=S}?c?W3 z@GbBI;M?F)@VDR`cmU3WzXv}8{u_J@Jc>b2gHM8wgB|b*@H|NNuY(^01^6gvz(>IE zf-u2;1fB$c3evoHz^A}>!Ow$#1wRN9% z4oEt_3%-UN`~|#*_v@JCBKRwi;`kT%8So*zd=caz*}DdkKi>jB0S-V9d<`UBf7$RI zkiP#DNPhkUr13{T%ozUIG5kCOo&=A9Yar?QG6+f8_du$HAA&UR@4!WH0+J5@Y1)rL zM2i1ekaRx-ehyp%+u$xpdc6sfAHN1^+!!P~e*|gXe}Z2CpFt;FWfwpi-vwKs50c%V zfaLevAjR_sZ~^=~NV-3UtlLRtx+9NZA>rHn{rBdW2-@6x!|d=PV#={oKCpY zTnc~4W#UZ1-B36lNoRSXvu2=jJWxjZE-KinkyVe)nulB@j%)-HUr8>ai2IRB`&yWQ zD<@;S!q((a+)&!EHSLCM9kWTUlc?aSN)p)&Lwn-Oh^HfM)tLK&A_G`Z&NSUb>a}+p_Zu$pXQRmp&n(qj8j*zb)71>hRE*C%+4z-`Vq!o zNQm4HwQ+vtEE=3N_ukpp8W*=!DcOdv6Lv|;lv`-zJ6Nr?7Q6IO6)$hTV3$>_U~f~r z!u?98T}2bY4xis#TVR{|hOA^I&m44gI_0&Y+PcDISENFh0bg2HxfQf!+et=3%~ItX-=(ujnau(*T@@6=A6Rh^D|Qm zb&t*&3Dj zshTSkdS7zLELjir#C0l7ZQd6NY*8;9*NJSgo*oR4Mv^X;Nrv~7WbPGdZGn<$QHuVs z)oQV;8*GP`AvMzUhZAG;2&wQk0`D4fhKQH=+?GsHhu)?gsK8sx2G;9oGQkObn#glOo1E)AuEwM&IsUp4;5myfE{w(`wH(3(%u@m#R#jP9vd` zvsL+7>6WkdE_yG{#*s6-(s&mVUk6C%5`VF;+}w5Vt1=;#D=)PSurn>T+O0El-6%66 z@-Au<+a;c))vH~8;VgWjp5^&udAY+^c$=g9xla3~h^y zK9%Y+7m=t&tML!`K%+FuR8MYU>q(Sm>-ctrf|iq8Je9eU$tga$DxVmm4JB@s-1({#@I3bv(71YxFLC_W!4 zzwC=cS}oKWn5JaJ^P-QM9`8{x6#j@L(P)H{6q6)H8nsk?1Qa*|LR-WlN(ye88PiCG zbSP8yd^O9S9My+I*N`bHBP2A{emUNA5T%-m=2sb;+!2Aq34t{~-cPGxp0VU|Eg*!ZVm=wJ|y z_kxVi(*z2~g+|fQVj#C`e|o0q!(fpMhg4m)+2s4&I#Y_t%@FeCJUF;LxjFN!8PZo6 z0AI*1`6GkV2p=j;ZuwXkJ5Y2$lO#BOBvxWolugv6vn^#MqJTYza;VhUey~8gnpQgu z%~Zq2@SZt+uiwQ;m?{+6;S_UioUQZk!0h+MMmG7H6s&YlhWM`l-!EYBu)3l~Br6;gFn;ZnUk HPzV15o`oQV diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pt_BR/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/pt_BR/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 82ec9356fb1eeea8c4182fe2906d24138f7aa67a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2201 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 Y*_WBfPGLr%R|z>H-SD!%Cp?n>2l53wi~s-t diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/sk/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/sk/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index f261c25512ab497c0d93f53004676404355842f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3495 zcmZ{mO^h5z6~`-JV%P+TLrC~aczikQ#68(r+ro^!S$|{$i?jAU34lW=05*Kv5#$1BVD9B&3NzD2EjX1V|QM33^9-95^8)BouBOkU((D4gRltc6V$+ zYi54kUDfa7|6Wzk8xJ0NRp2;@?}zaH>ODf71OM_C{NVWQTZOm?{ti41-giU@e8dI( zJOVC(_kv#n-v&nD47dfp6D+`E;5WhdgRg=Qf?oL{5bdpko|rQWWTR~9|pe*9tVE`vi~}fJ5-3;I}}w^J9?n_!Y?c{ShSaZ{WMZqetsF9|0f6^Vkn_~w2f>#>w(}YYDa6k~uJ12F_Wy6N3BC!Q0-w0Aw);GYkMQ_mf8PL~1b+as z-oFP~pTC2w%Mpk?3qA}U2Nyw}w*kVmcnO3A;yYjfeh=h%zX7=p{{-<751^=zfscaR zC+9(~;|j<+eG!Bd;_D#C^$G}i#S{2`3}23s{q7$R;e_*Kt+!AONL3VXLBDG-r7f$Kp*7-)QW-g99C}!-m6IF%P?ZKvo)FLJ zRKwnie38N`{SD2IV25T`E}al7wy!FYI5H1;yv?XKR9n|@c2<YaimO^?E~x(&N4p zSBta@mv)1~p3Eg;$sK8~XhvO#*-m5#lQ26G+#y~(i6T^YyA}1i76zC^M z_uvD7I&&$O)*mv@s!YJ12(gLN7p;i zVO6&^+O?~wr*b7a=p(Y3%4_qXG_b{^2;3Ug5FNX@iSn_asWJtwGnTnC$Z88*M28j( zdyPgzTwfNSHHQ> zo1bhpFKnh#CymgiPh-B>EaavNI!dPSvwz(p7k_!}%FN30%Fy^0 zQ&}RlIajrxQ-0xk=h@)w;XDpzL*>De32lUOw&-kE`*}blupx~{w$CR_^48lEaFyD)zI0%ghwMd|k9{-zJ=LoRp)!a<-4DE=I4! z191bQZ9$sDv0Ia|LaeL3-Pk%jc^LF^Y~i+zrHeg{WgK+Tk>#y@N$`3@Woj`X)y~wT z)xJI8eY=6e?wfYd)aC`AK^6u9Vq-(4Wm^6aVO1M?n`?a=yD}%PTmg6RJSkkk9W&(a zLGQ;jv_m7)0)=;Y3l&@Ctq`x~y2esm&+O3V2ED~O?A=tJFg>Jv6aV^f0uQCx`Y zsm4A!ei_Po>_2g+i>VH{jaNI|y39s4p3({N_t3CWL9_kZa@ebO{3z^|qX?~dXFO}= ztvI)-DQ{!j9`EW@T$^gq@u=L%;sRyG26=aY)kIkZ2r*I>4Hf=rK%WTzMTWB4O7I?9 zAB;I3^b8z~_{BiE9kS)TQUN-7*{@F5_FKZDq(g3);y^A|USrjvdGD&~jsH7)sx^1S z;k5mwj#WRs)b_#bQ__O(R2-dhjMdcIc3%qXybLf xA1W15JyhgMqGN;CBr2D(Cg`rJF5F&Ng#0F1wZk4d7wd5E+ZJuJpYz>1{})!w3UB}b diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/tr/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/tr/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 1e04ff26388f4bd5cd2ab61537d9226aea3605b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2050 zcmai!O>7%Q7=|ZMC^b-^Ex)DWgMyS&t#Lvs1*aiRLYqbpahSAx4?(N@4$z^AHfp%6ZklI2Yd?L1)m3h1y6#1 zfscVB4-VoS2VcebB*^}g;7i~<$bKPs9Q+Jqzb`?q?_2N;xD7r6{syxB?;z*>2PE(q zihTln9ef6?g3p3Czy^BLU=`!LXoBM(MN{0@DLjsXr@^PevmnQP3*>m$K+bm)JOSpz z?_Yqd$2Z_B;13|{u?voYzksaq2!iwXGvG1sJjmZKfGqh95I<4F<1Ba+Wc@w|Iqz4) z@y{S(ybH2!e}e4KHE`YBE7#2$J&7CX`|HQO^2IsfA|O}4FW}(fzPPqixH%`U1D3C^ zBiF*$3%GgRp5wvrdUXF~NbXb2Iz?TZQR=S9^S4lP_ z=B#gtd1*owi}_edH+Zt~%<#3PGjClNqkZ3bYrHc4o-aci#777fiFuo96>;)|jNretmz`SEs?*OvqlY%<1~WF#hJluyUXzd{v5^uhD&aaJ+c6}avz>cG4ktS;=#`~1 zgpAJS2CbniQB&S))67Jz1vg{8Ue%%GvI)P?rd?6z@;e&ZHx#v$Q=$&B$fn8-3`1$) z$g>D*jVg<}Z8l?w0YMUFa#8Q516P(QgTP^{TrP_bTe82r8Rx!F1^WrK3l^i`0|%du6TC})z0^#kj?1A<-iC*1=CY}Rx{^ti>bYy{tVI`% z>Ke7GvP*d*H$D%%D;wnx?W^QnX=!ok@?r5~iN72CZHY*nX?rcB3)Y7@3OYqu#D#79; z&=}(xaTOa_Lkf*!DSEe4FJtVHM6bsRb1A;#VDiYo0d6y5K^2>c-rG2s5zCypce~g` zUgQ~!oBuU4(O{-4sg0c|V`-w^)H$tHIlIuw>9uSL3Kqv4dX7%e@Ua z)~s=|t*NOUA{XCho{CMZV%tk<7Td1aF}~PA;VOg*Z5+^c|0K(9Z!3d;aSH;(DpAAC zG`eqdj_2UCAA13In%X+OKMUq0||41VK1-^Dc$N&HU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/uk/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/uk/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index 94fdd63ced8f7d66fa08e36c4d8227534d924a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4593 zcmb7`-E$RZ9miJzt+B1zs%?FJuognw6HWl9oj{-o(GWcik!=M%w$339@KL~yiTnnxPcY=yz2$Y`_p!}Q%#m8mv z^WZ$V7W@;a_}&9Q0*q6o7445<3N1U?QP1!eCoPGfBe0B%$%#%8>DbBpNlz zkeisAm&9f?Y!(~+#8myrt0c8iXJ_QumAF~_7;%F{HmV+{Jmc1Crc(18{h=FGjh}e+ zc!#sg8*+#JFmiT<$&j-fZ=MN*+Nf#xLEshJm=7vm&DmY^+$jGmYdeac%SMO%I0*@r z*yB+Wshh~_55uI`SS&MIjAC~fBxKhzvuL6sUtYCk#gC0wZzQA6?y%t#8ksG5cJ}zO z+h1e<-au&Lp)g7+%_L?b@uH=%^R*(x!~V;jv%eAs&H>MBm>7;K308Bi-2ol4`I_Q{ z^Q>R@vDf1sH5JR#fGbY1P8A3X7Ls7U< z*bFEHxp4HmO_Uf@@i=j##195-Jgj*^tke&CiDqNx@KSB~HDaj2fFIRu{>ow{>vl`f zLXoyq!p5k~jI8LF*y$6iBR)d!_Y5?9P9J(QVZ)1Z^A$J1mR1Qo47?7fFB}}CjH0gY z1x>~c(cCxM$StUtF;c7yb#!z%&+m6$P#bDe?pq5Jh2NnRrTx{?H>epIcbT?BUIQJL zdg4L9TH4hdj7xnX)4g9W9il$kRN4dkU1n2x)0R@1f16F`=C0226Xnh2a@(`q2Bp5p z4dR+hV|AHtdc#9rV0yzwc*JZw>eiB{j&{UeH0)QrX9nx8U+buZ_3a!C2Al4nSL*ZJ zIt~}dU8Z@Yt!IDF-sKoOJIZZE888$9x+d?{H zx4y06RW{vBXW2gXq{&Weifv3!@^?NvC(A9ym^hKnn(Siss=)|nvt!x0^m;btq(4s= zvQx6miF8(B;e6KawX-JDyHE=^Gq)EgNHXA~!BCucgyQ!PuW9l;@qT^y#E;%94^@Jnf{H30nD+m)_eZ zZ2svqA>}(y7jCn0duRay#XUbkv3oWF%S z#`7uYki1x(mw1_`#7rKOOCzfC7>K@5wd@r#Vdt6mJ&H8m|LD&M`>N&j*h;=HqCcF^ z5zRvSHtr{g4+UOCqEhQLlQvKZ{fb?`!LMsA3b$p)Ej@&^Tj*9Rt|%_fE=&4Yomo!n z5* z>vX_RIDIOgU|<`DDj2h&ent}@et0%Eb$8mw&*74#?RZyf?)mO`Aj#&xgB&TQ!uV?ZkwNR8* z_2SMMGwrvAY}wTXyL=qsw^Ur3fxhBqS*n(*N>I7*=Ml3yPvTLp>hhov`JJ5yeHYZI zg>p;94JaBG?BzLwBxoRA&6DaDj4v46i8lFz5pGsFW=c(ZVL5sGEnv#tNQKb2SZD2C z`wh|I35IHiX=?bVHqR(qBlEivpQg6sh!l zo#`1^k~XM@uCWy#p$g1P9z diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/zh_CN/LC_MESSAGES/clipboard-indicator.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/locale/zh_CN/LC_MESSAGES/clipboard-indicator.mo deleted file mode 100644 index e6af608f0e85484fdb3e55f55984771a41899503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3298 zcmZvcTWlOx8OINhLNO)K3$&$NPPw!RWwz_oQlgElDt6KmwRWwuau^eAxsYrbT3ElvS2iP;S`$As0Jn+K*n>oHD z;%H}nbI$qBcR%~r$F__zj2H2I6VKVtFxCn_@;SUPp4!6L9`I?f3H%xOFgOC@$1dRY zB=|n~d2kMV2wVXhz~6$~z~6&k2LA&-3O)p(r@<$|$G}GLad0n4`VWC$1$A&M=zx!a zM?t7yC&A~zGa%Vr0-pju0lyFa1^fa?o8-sCAlZK${0{gm_#C(gBtJ4B*?AWvJEuU( z$NS*7z$Nfm@J}H5_h0af;1(G9F1QsWJ&hp6^BPET{v70>4SoeY1>z{10KX1Sfu99e zLCWJN;IB}FKZ6?PhhXG~U_VIbJ_aeydGKrCAJlrF_z$)JFOdA*ir^`pI7s%JLGrIn z&EEn^j}4Okel;If`~al$3u^yUko5je&F_JfpMQhj2A}v+l$Vzjn?ch1D)yv7}3X+~rL8LwGjTb<=4{L+!Lxbu?gZgMY9;y%Z2>D65MazXf_YIJGga+k?2KCkt z@Q^L?^9ek3#prIt@X+`X9*Twfh~uHYf?MIBn7@bT`Dl9I8>wF(bZ4H!Lw5uz3ws9$ z2jyjLP_I#*>CUYUx;K;~>RYxaop!m-ZQb<*Pv$+(GP!4Qp{Fujn4Z(iy^QYhtnggk zYvq-o;qkQLh?JM@WqTYE?znmN(W9Fl=|~Hl5?s$_c`9qzNlSOq-0(!seVMh0jDEzh z9M)oa8P*DGf?H;`m)nME3MGbhGbOUDH7j%{dXu)7)#rxNjNy6~T!rs$F9OMNM+$zBt}<}PxS@}M=!wcbUC!g#ql!Cp6V2K2S*Z}U`` zr!IpGK@Z>7*0PeR`Se49zDzEk)lYu0b}jLz?K8P?M1d&yX6^OMoRav@3QuM zE(z0C7f)q$M~6?2%MI!Un|EI9hh zJUY=u#a&N#Jj3h`{lT6vT?+l6@MzU#2iI$ZuO5yXbQw-AjGv;oKkK20xhX{?lCtbx zQqyzaeQ{YQWwpmZqbCJNng#1bKXJO= z+3; zE5S2{VPtfyo85W6TWFm^&q3eXJi*_|{GzqJp>2QLz6~!LWAO%c(KL!H5mxL)JF6S! z?y${V;WfY6`HHq{LynAg2}j#!rmQr|mf*XRhS$)M%{zKld&P2cZi1V3ICYyFck}48 zIljB$koKxDDdXgEhb7YZmwGAI6l=szG}T&kSJ=9jN$}Xl;=wS@9az@l32r;0%Z(j& z|L=Zdg0D9g$uL=(@^2Qa^B?+`CW7%wb>X-iIq9Fj8KDrXP{A(^$)OKP;?ioQLXM2xTfWR{6DO+ki%gE+^{))b((OD*o=lr=r=Fj&*y+UNAR+*72qe^*jdns7DTpt*g zBRBoAxky}|?3cw`ksKWjZY)Mi>_OWb^E}4> zHqGR60fy^mE5Z1Ax%wM__zu2V?d}=bckRK|$OVMwkItxUsJNmXq`SI$33;d&hN|<^ zDi8GwBe2cs4mT6Drbt(A16-u$8SJ^oawJmETDYB^(FXQpO~w^H^r*+ z!%-peb-X%XfNEARTnsK>W03H#6jhlo9+T5!!AFyDus%>^P!^RWz(!cBV5K4#M_K*q zvD)>)`sk`$oV>R@7#+H|JOuT>UQ>T@B)ERmpPG=%MFwY3#K;sPgF5)(A0G-T)3Q9P zw*7MhP$W-H$?;i8Aoan8l}I(KmkMY#Rpn`P+YR~gD63WO!XdVi_s!L(W(b>C1sc`x z!BrLb=FWy6e(58`P8VXjEX&7K?lAGs3|Ci5NT)2`^iP-TXA6HXyvyX^fIob-RxHV3 s { - const originalValue = this.schema.get_strv(pref)[0]; - - if (!originalValue) { - button.set_label(_('Disabled')); - } - else { - button.set_label(originalValue); - } - }; - - const startEditing = () => { - button.isEditing = button.label; - button.set_label(_('Enter shortcut')); - }; - - const revertEditing = () => { - button.set_label(button.isEditing); - button.isEditing = null; - }; - - const stopEditing = () => { - setLabelFromSettings(); - button.isEditing = null; - }; - - setLabelFromSettings(); - - button.connect('clicked', () => { - if (button.isEditing) { - revertEditing(); - return; - } - - startEditing(); - - const eventController = new Gtk.EventControllerKey(); - button.add_controller(eventController); - - let debounceTimeoutId = null; - const connectId = eventController.connect('key-pressed', (_ec, keyval, keycode, mask) => { - if (debounceTimeoutId) clearTimeout(debounceTimeoutId); - - mask = mask & Gtk.accelerator_get_default_mod_mask(); - - if (mask === 0) { - switch (keyval) { - case Gdk.KEY_Escape: - revertEditing(); - return Gdk.EVENT_STOP; - case Gdk.KEY_BackSpace: - this.schema.set_strv(pref, []); - setLabelFromSettings(); - stopEditing(); - eventController.disconnect(connectId); - return Gdk.EVENT_STOP; - } - } - - const selectedShortcut = Gtk.accelerator_name_with_keycode( - null, - keyval, - keycode, - mask - ); - - debounceTimeoutId = setTimeout(() => { - eventController.disconnect(connectId); - this.schema.set_strv(pref, [selectedShortcut]); - stopEditing(); - }, 400); - - return Gdk.EVENT_STOP; - }); - - button.show(); - }); - - return button; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/private_metadata.json deleted file mode 100644 index fcca6919..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/private_metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "The most popular clipboard manager for GNOME, with over 1M downloads", - "gettext-domain": "clipboard-indicator", - "name": "Clipboard Indicator", - "settings-schema": "org.gnome.shell.extensions.clipboard-indicator", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/Tudmotu/gnome-shell-extension-clipboard-indicator", - "uuid": "clipboard-indicator@tudmotu.com", - "version": 65 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/registry.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/registry.js deleted file mode 100644 index 9fc26411..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/registry.js +++ /dev/null @@ -1,319 +0,0 @@ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import St from 'gi://St'; -import { PrefsFields } from './constants.js'; - -const FileQueryInfoFlags = Gio.FileQueryInfoFlags; -const FileCopyFlags = Gio.FileCopyFlags; -const FileTest = GLib.FileTest; - -export class Registry { - constructor ({ settings, uuid }) { - this.uuid = uuid; - this.settings = settings; - this.REGISTRY_FILE = 'registry.txt'; - this.REGISTRY_DIR = GLib.get_user_cache_dir() + '/' + this.uuid; - this.REGISTRY_PATH = this.REGISTRY_DIR + '/' + this.REGISTRY_FILE; - this.BACKUP_REGISTRY_PATH = this.REGISTRY_PATH + '~'; - } - - write (entries) { - const registryContent = []; - - for (let entry of entries) { - const item = { - favorite: entry.isFavorite(), - mimetype: entry.mimetype() - }; - - registryContent.push(item); - - if (entry.isText()) { - item.contents = entry.getStringValue(); - } - else if (entry.isImage()) { - const filename = this.getEntryFilename(entry); - item.contents = filename; - this.writeEntryFile(entry); - } - } - - this.writeToFile(registryContent); - } - - writeToFile (registry) { - let json = JSON.stringify(registry); - let contents = new GLib.Bytes(json); - - // Make sure dir exists - GLib.mkdir_with_parents(this.REGISTRY_DIR, parseInt('0775', 8)); - - // Write contents to file asynchronously - let file = Gio.file_new_for_path(this.REGISTRY_PATH); - file.replace_async(null, false, Gio.FileCreateFlags.NONE, - GLib.PRIORITY_DEFAULT, null, (obj, res) => { - - let stream = obj.replace_finish(res); - - stream.write_bytes_async(contents, GLib.PRIORITY_DEFAULT, - null, (w_obj, w_res) => { - - w_obj.write_bytes_finish(w_res); - stream.close(null); - }); - }); - } - - async read () { - return new Promise(resolve => { - if (GLib.file_test(this.REGISTRY_PATH, FileTest.EXISTS)) { - let file = Gio.file_new_for_path(this.REGISTRY_PATH); - let CACHE_FILE_SIZE = this.settings.get_int(PrefsFields.CACHE_FILE_SIZE); - - file.query_info_async('*', FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, null, (src, res) => { - // Check if file size is larger than CACHE_FILE_SIZE - // If so, make a backup of file, and resolve with empty array - let file_info = src.query_info_finish(res); - - if (file_info.get_size() >= CACHE_FILE_SIZE * 1024 * 1024) { - let destination = Gio.file_new_for_path(this.BACKUP_REGISTRY_PATH); - - file.move(destination, FileCopyFlags.OVERWRITE, null, null); - resolve([]); - return; - } - - file.load_contents_async(null, (obj, res) => { - let [success, contents] = obj.load_contents_finish(res); - - if (success) { - let max_size = this.settings.get_int(PrefsFields.HISTORY_SIZE); - const registry = JSON.parse(new TextDecoder().decode(contents)); - const entriesPromises = registry.map( - jsonEntry => { - return ClipboardEntry.fromJSON(jsonEntry) - } - ); - - Promise.all(entriesPromises).then(clipboardEntries => { - clipboardEntries = clipboardEntries - .filter(entry => entry !== null); - - let registryNoFavorite = clipboardEntries - .filter(entry => entry.isFavorite()); - - while (registryNoFavorite.length > max_size) { - let oldestNoFavorite = registryNoFavorite.shift(); - let itemIdx = clipboardEntries.indexOf(oldestNoFavorite); - clipboardEntries.splice(itemIdx,1); - - registryNoFavorite = clipboardEntries.filter( - entry => entry.isFavorite() - ); - } - - resolve(clipboardEntries); - }).catch(e => { - console.error(e); - }); - } - else { - console.error('Clipboard Indicator: failed to open registry file'); - } - }); - }); - } - else { - resolve([]); - } - }); - } - - #entryFileExists (entry) { - const filename = this.getEntryFilename(entry); - return GLib.file_test(filename, FileTest.EXISTS); - } - - async getEntryAsImage (entry) { - const filename = this.getEntryFilename(entry); - - if (entry.isImage() === false) return; - - if (this.#entryFileExists(entry) == false) { - await this.writeEntryFile(entry); - } - - const gicon = Gio.icon_new_for_string(this.getEntryFilename(entry)); - const stIcon = new St.Icon({ gicon }); - return stIcon; - } - - getEntryFilename (entry) { - return `${this.REGISTRY_DIR}/${entry.asBytes().hash()}`; - } - - async writeEntryFile (entry) { - if (this.#entryFileExists(entry)) return; - - let file = Gio.file_new_for_path(this.getEntryFilename(entry)); - - return new Promise(resolve => { - file.replace_async(null, false, Gio.FileCreateFlags.NONE, - GLib.PRIORITY_DEFAULT, null, (obj, res) => { - - let stream = obj.replace_finish(res); - - stream.write_bytes_async(entry.asBytes(), GLib.PRIORITY_DEFAULT, - null, (w_obj, w_res) => { - - w_obj.write_bytes_finish(w_res); - stream.close(null); - resolve(); - }); - }); - }); - } - - async deleteEntryFile (entry) { - const file = Gio.file_new_for_path(this.getEntryFilename(entry)); - - try { - await file.delete_async(GLib.PRIORITY_DEFAULT, null); - } - catch (e) { - console.error(e); - } - } - - clearCacheFolder() { - - const CANCELLABLE = null; - try { - const folder = Gio.file_new_for_path(this.REGISTRY_DIR); - const enumerator = folder.enumerate_children("", 1, CANCELLABLE); - - let file; - while ((file = enumerator.iterate(CANCELLABLE)[2]) != null) { - file.delete(CANCELLABLE); - } - - } - catch (e) { - console.error(e); - } - } -} - -export class ClipboardEntry { - #mimetype; - #bytes; - #favorite; - - static #decode (contents) { - return Uint8Array.from(contents.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); - } - - static __isText (mimetype) { - return mimetype.startsWith('text/') || - mimetype === 'STRING' || - mimetype === 'UTF8_STRING'; - } - - static async fromJSON (jsonEntry) { - const mimetype = jsonEntry.mimetype || 'text/plain;charset=utf-8'; - const favorite = jsonEntry.favorite; - let bytes; - - if (ClipboardEntry.__isText(mimetype)) { - bytes = new TextEncoder().encode(jsonEntry.contents); - } - else { - const filename = jsonEntry.contents; - if (!GLib.file_test(filename, FileTest.EXISTS)) return null; - - let file = Gio.file_new_for_path(filename); - - const contentType = await file.query_info_async('*', FileQueryInfoFlags.NONE, GLib.PRIORITY_DEFAULT, null, (obj, res) => { - try { - const fileInfo = obj.query_info_finish(res); - return fileInfo.get_content_type(); - } catch (e) { - console.error(e); - } - }); - - if (contentType && !contentType.startsWith('image/') && !contentType.startsWith('text/')) { - bytes = new TextEncoder().encode(jsonEntry.contents); - } - else { - bytes = await new Promise((resolve, reject) => file.load_contents_async(null, (obj, res) => { - let [success, contents] = obj.load_contents_finish(res); - - if (success) { - resolve(contents); - } - else { - reject( - new Error('Clipboard Indicator: could not read image file from cache') - ); - } - })); - } - } - - return new ClipboardEntry(mimetype, bytes, favorite); - } - - constructor (mimetype, bytes, favorite) { - this.#mimetype = mimetype; - this.#bytes = bytes; - this.#favorite = favorite; - } - - #encode () { - if (this.isText()) { - return this.getStringValue(); - } - - return [...this.#bytes] - .map(x => x.toString(16).padStart(2, '0')) - .join(''); - } - - getStringValue () { - if (this.isImage()) { - return `[Image ${this.asBytes().hash()}]`; - } - return new TextDecoder().decode(this.#bytes); - } - - mimetype () { - return this.#mimetype; - } - - isFavorite () { - return this.#favorite; - } - - set favorite (val) { - this.#favorite = !!val; - } - - isText () { - return ClipboardEntry.__isText(this.#mimetype); - } - - isImage () { - return this.#mimetype.startsWith('image/'); - } - - asBytes () { - return GLib.Bytes.new(this.#bytes); - } - - equals (otherEntry) { - return this.getStringValue() === otherEntry.getStringValue(); - // this.asBytes().equal(otherEntry.asBytes()); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/gschemas.compiled deleted file mode 100644 index 30815b42193449e07d1616f31b387628be8fed65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1661 zcmZuxPiRy}93KB{szwtvY6Zbt;Vm+|rY)jY>LI0y*+M}mIW*e$_Dyz&eLM4b@9ier zl9qZgEeX8{{<)Zo2=>sPY@rAq6H+7~Jr<-brL^_XlR^&d_sx4T8|lEu_r34^=Fe|t zesk^vKheI)M9~g|Cvxp=T{pp{gF^g^mjA1{m=EFqeDidVVbm3IUd)5v+$O{puuU43 zhOuo`Nt-H)DrzQECe_xYm3pM(!1_rjwF!0I&uoGYLU^2?jr}o<*bbBmyaFZ$f!)BK z0>j|F1@?nS04!G=dI=nxSe?ER4uHANA<-4*!S4b7O0Y(sdKdf&a0~dN)wxZdn*I!U z7Pxiz`f>Wy2jJfT-vh?)XJ65$-VOhI@B`rKDfv5nYWl0-zkv0x> z_Zd&U2k{f&Nx*LT@dSP9z3^jj2e`Z3?9iuX{2X`z_^fhql0G%(T?GFCEIn?0PM@0V zUj_dJ_yhYsp-;_xpMckZv9o_ZqfbqL2M*>4uyW;}YxJo(uLph$_-+0Tk3RJX{P)2v z;L_FFRr=J2;Lm{l;frqo7 z4)U&2m*77KA4A}B`!&mW>OuG?!508olH2K155xZmtbm0tw~f=MrauFo1&qz~R8LwX z>o#_`A3?$k%5kE)Qkg92i8EssY@@f|9UaA{cz#+=vqZ--LlrPQkJnv4Q?hMCB?DH1 zX}Eu)um4Hp%xVCbcFnH9HQ-0SbI#VeF zf^z=Hjl$g4`@2Cl`Wu`?aa#TRJ^FfaUU^!@n)=T3c=128ae%ye=vqw|i{}2V&lf`X zt+%CAEK?P!dX{fWU-}Gm=jjKLlA)b8(oYgQo$t%$DLAS)3UD6I_tHGdxItQ~S6nIX zin}kB*w32yK&#?$uDZv$>K^Cn#^YT5pU1f>1dgWBz~b7 T>85*7tSCh88J>U6@7D7le6~)# diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/org.gnome.shell.extensions.clipboard-indicator.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/org.gnome.shell.extensions.clipboard-indicator.gschema.xml deleted file mode 100644 index badd69d9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/schemas/org.gnome.shell.extensions.clipboard-indicator.gschema.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - true - Add button to paste an entry - - If true, adds another button to each menu entry that lets you immediately paste it - - - - - false - Display the pinned section on the bottom - - If true, places the "pinned" section on the bottom - - - - - true - Enable the deletion of clipboard items from your history - - If true, displays 'delete' buttons on each item, and a 'Clear History' option - - - - - 15 - The number of items to save in history - - - - - - 0 - What to display in top bar - - - - - true - Remove down arrow in top bar - - - - false - Clear clipboard history on every system reboot. - - - - 30 - Amount of visible characters for clipboard items - - The number of characters to display for every clipboard item in - the history menu - - - - - - 10 - Amount of visible characters in topbar - - The number of characters to display for current clipboard item in the topbar - - - - - - 5 - The allowed size for the registry cache file in MB - - If the cache overflows this limit, the file will be overriden. - High limit might cause slowness of shell startup. - - - - - - false - Disable the registry cache file for favorites and use memory only - - Contents which are not favorites are not stored and retrieved from a cache (registry.txt) file. - This can avoid writing passwords to a plaintext file, but at the cost of persistant history. - Your clipboard history, except favorite items, is lost after a gnome-shell session ends or the extension is reloaded. - - - - - false - Show notification on copy to clipboard - - If true, a notification is shown when content is copied to clipboard. - - - - - true - Show confirmation dialog on Clear History - - If true, a confirmation dialog is shown when attempting to Clear History. - - - - - false - Remove whitespace around text - - If true, white spaces around text will be removed. - - - - false - Move items to the top of the list when selected. - - If true, move items to the top of the list when it is selected. - - - - false - Keep selected item on clear - - Whether to keep the currently selected entry in the clipboard - after clearing the history - - - - true - Enable the keyboard shortcuts - - If true, user can delete and cycle through the history with keyboard shortcuts - - - - F10']]]> - Key to clear the history - - - - - F11']]]> - Key to cycle to the previous entry in the clipboard - - - - - F12']]]> - Next entry - - Key to cycle to the next entry in the clipboard - - - - F9']]]> - Toggle the menu - - Key to toggle the clipboard menu - - - - F8']]]> - Toggle "Private Mode" - - Key to toggle the private mode - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/stylesheet.css deleted file mode 100644 index 05665edf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/clipboard-indicator@tudmotu.com/stylesheet.css +++ /dev/null @@ -1,75 +0,0 @@ -.clipboard-indicator-hbox.private-mode { - color: rgba(255,255,255,0.3); -} - -.ci-notification-label { - font-weight: bold; - color: #ffffff; - background-color: rgba(10,10,10,0.7); - border-radius: 6px; - font-size:2em; - padding:.5em; - width:400px; -} - -.ci-history-menu-section .popup-menu-item { - margin-right: .8em; -} - -.popup-menu-item .ci-action-btn StIcon { - icon-size:1.2em; - margin-left:.25em; -} - -.popup-menu-item StEntry StIcon { - icon-size:1em; - margin:0 .25em; -} - -.clipboard-indicator-empty-state { - width:350px; - color:#aaa; -} - -.clipboard-indicator-empty-state StIcon { - icon-size:5em; - margin-top:3em; -} - -.clipboard-indicator-empty-state StLabel { - margin:1em 0 3em 0; -} - -.ci-history-menu-section { - max-height:450px; -} - -.ci-main-menu-section StButton.ci-pin-btn { - color: rgba(255,255,255,0.3); -} - -.clipboard-hidden { - display:none!important; -} - -.clipboard-menu-icon { - width:1em; - height:1em; - margin-right:.5em; -} - -.clipboard-menu-img-preview { - border:solid 1px white; - overflow:hidden; - width:1.5em; - height:1.5em; - margin:0; - padding:0; -} - -.clipboard-indicator-img-preview { - border:solid 1px white; - width:1em; - height:1em; - margin-right:.25em; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/COPYING deleted file mode 100644 index 8d61b15e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/COPYING +++ /dev/null @@ -1,341 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/README.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/README.md deleted file mode 100644 index 53a8e81b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/README.md +++ /dev/null @@ -1,194 +0,0 @@ -

- -

-
- -![](media/design/png/dtp-main-p2.png) - -### Introduction - -Dash to Panel is an icon taskbar for Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications. - -Beyond that, just about every aspect of the panel is fully customizable. From positioning and scaling panel elements to running indicators to multi-monitor display, to window previews and even intellihide, Dash to Panel has everything you need to make your workspace feel like home. - -### Features - -|Customizable appearance| -|:-----:| -|![screenshot](media/design/gif/customizable.gif)| -|Hide & show panel elements and set their positions, sizes & colors| - -## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Customizable running indicators
MetroCiliora/Dashes
CilioraSquares/Segmented
DashesDots/Solid
Set position, style, weight & color of running indicators to easily and quickly identify focused and unfocused applications
- -## - -|Live Previews on Hover| -|:-----:| -|![screenshot](media/design/gif/previews.gif)| -|Hover over the launcher icon for an open application to get a live window preview| - -## -|Launch by Number| -|:-----:| -|![](media/design/png/indicators-num.png.png)| -|Optionally launch your favorite applications via keyboard| - -## - -|Panel Intellihide| -|:-----:| -|![Intellihide](media/design/gif/Intellihide.gif)| -|Hide and reveal the panel according to your set preferences| - -## -|Additional Features|Feature Implemented| -|:-----|:-----:| -|Add "Show Desktop" button to panel|![](media/design/png/done.png)| -|Isolate running apps by workspaces and/or monitors|![](media/design/png/done.png)| -|Custom click behaviors (launch new window, cycle open windows, minimize, etc)|![](media/design/png/done.png)| -|Integrate native Gnome appMenu into right-click secondary menu|![](media/design/png/done.png)| -|Multi-monitor support|![](media/design/png/done.png)| -|Dynamic transparency|![](media/design/png/done.png)| -|Ungroup application windows|![](media/design/png/done.png)| -|Export and import settings|![](media/design/png/done.png)| -## - -### Installation - -**To install the most recent official release: -[Visit Dash-to-Panel at GNOME Extensions](https://extensions.gnome.org/extension/1160/dash-to-panel/)** - -To install a development version from source, please see the [Installation wiki page](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Installation). - -## -### FAQ - -How do I customize the panel? [See the Wiki](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Enable-and-Customize#customize-it) - -How do I embed my bottom left notification drawer into the panel like a system tray? [Top Icons Plus](https://extensions.gnome.org/extension/2311/topicons-plus) or [(K)StatusNotifierItem/AppIndicator Support](https://extensions.gnome.org/extension/615/appindicator-support) - -How do I add a traditional start menu? [Arc Menu](https://extensions.gnome.org/extension/3628/arcmenu/) - -How do I disable the hot corner? [No Topleft Hot Corner](https://extensions.gnome.org/extension/118/no-topleft-hot-corner) - -How do I move the notifications to somewhere other than the top center? [Notification Banner Reloaded](https://extensions.gnome.org/extension/4651/notification-banner-reloaded/) - -How do I display Minimize & Maximize buttons? In the Tweak Tool application, turn on `Windows > Titlebar Buttons > Minimize & Maximize`. - -How do I reset the extension to its default settings? `dconf reset -f /org/gnome/shell/extensions/dash-to-panel/`. - -## -### Themes -While this extension works well with most popular Gnome Shell themes, the following themes are known to have explicitly added custom styles for this extension: -- [Ciliora Tertia](https://github.com/zagortenay333/ciliora-tertia-shell) / [Ciliora Secunda](https://github.com/zagortenay333/ciliora-secunda-shell) -- [Plano](https://github.com/lassekongo83/plano-theme) - - -## -### Compatibility - -This extension has been tested with Gnome 3.18+. - -This extension manipulates the Gnome Main Panel, aka Top Bar. So, most other extensions which operate on the top bar should be compatible. - -## -### Volunteers needed! - -This extension could be even better with your help! Any items in the issue tracker labelled `help wanted` or `good first issue` are up for grabs. For more info, see the [Contributing wiki page](https://github.com/home-sweet-gnome/dash-to-panel/wiki/Contributing). - -## -### Credits - -This extension is developed and maintained by [@jderose9](https://github.com/jderose9) and [@charlesg99](https://github.com/charlesg99). - -Significant portions of code in this extension were derived from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html). - -Additional credits: This extension leverages the work for [ZorinOS Taskbar](https://github.com/ZorinOS/zorin-taskbar) (used in [ZorinOS](https://zorinos.com/)) to show window previews and allow the dash from [Dash-to-Dock](https://micheleg.github.io/dash-to-dock/index.html) to be embedded in the Gnome main panel. -Code to set anchor position taken from [Thoma5/gnome-shell-extension-bottompanel](https://github.com/Thoma5/gnome-shell-extension-bottompanel). -Pattern for moving panel contents based on [Frippery Move Clock](http://frippery.org/extensions/) by R M Yorston. -Ideas for recursing child actors and assigning inline styles are based on code from the extension [StatusAreaHorizontalSpacing](https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension). -## - -#### Thanks to the following people for contributing via pull requests: - -- @franglais125 for launching apps by number (w/ overlay), bug fixes, and issue support -- @LinxGem33 and @sbarrett322 for artwork, logos, screenshots and design effort -- @dziku1337 for peek mode in window previews -- @robrobinbin for configuring appMenu on/off in the panel -- @MartinPL for toggling favorites on/off in panel -- @jackwickham for thumbnail middle and right click actions -- @abakkk for centering the taskbar icons in the panel, and animated taskbar hovering -- @quasoft for changing of font weight of ungrouped application titles -- @jordanribera for using icon's dominant color as running indicator color -- @tper0700 for dynamically building context menu based on system capabilities -- @levacic for configurable minimized application title font color -- @l3nn4rt for toggling workspace switch popup -- @hlechner for adjustable show desktop line color and window preview icon size -- @ArtyomZorin for animated urgent icons -- @jvpessoa10 for additional click window cycle options -- @marksvc for assigning percent of display for panel length -- @philippun1 for GNOME 40 support :rocket: -- @HaselLoyance for toggle for notification counter badge -- @rastersoft for Desktop Icons NG integration - -#### Bug Fixes: -@imrvelj, @Teslator, @bil-elmoussaoui, @brandon-schumann, @sw9, @rockon999 , @lexruee, @3v1n0, @freeroot, @moqmar, @ArtyomZorin, @lkc0987, @saibotk, @vanillajonathan, @Zkdc, @leebickmtu, @l3nn4rt, @Melix19, @Aikatsui, @melix99, @kyrillzorin, @oneshadab, @CorvetteCole, @vantu5z, @spectreseven1138 - -#### Documentation Improvements: -@BoQsc, @zakkak, @dandv - -#### Translations: -@frnogueira / @victorwpbastos / @vagkaefer (pt_BR), @zeten30 (cs), @franglais125 / @calotam / @oeramirez (es), @LaurentTreguier / @SolarLiner (fr), @elsieholmes (uk), @hosiet (zh\_CN), @jonnius / @linuxr01 / @daPhipz (de), @urbalazs / @pappfer (hu), @crayxt (kk), @pkomur / @MartinPL / @alex4401 (pl), @AlexGluck / @GoodNike / @rjapolov / @vantu5z (ru), @sicklylife-jp / @ryonakano / @nexryai (ja), @oltulu / @TeknoMobil / @daenney (tr), @sbadux / @kowalski7cc / @l3nn4rt (it), @OriginCode / @pan93412 (zh\_TW), @ojn (sv), @frandieguez (gl), @kuroehanako / @MarongHappy (ko) - - -## -### License & Terms ![](media/design/png/copyleft-16.png) - -Dash to Panel is available under the terms of the GPL-v2 or later license See [`COPYING`](https://github.com/home-sweet-gnome/dash-to-panel/blob/master/COPYING) for details. - -![](https://img.shields.io/badge/Language-JavaScript-yellow.svg) ![](https://img.shields.io/badge/Licence-GPL--2.0-blue.svg) diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/appIcons.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/appIcons.js deleted file mode 100644 index c24e1339..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/appIcons.js +++ /dev/null @@ -1,1904 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ - - -import Clutter from 'gi://Clutter'; -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import Graphene from 'gi://Graphene'; -import GObject from 'gi://GObject'; -import Mtk from 'gi://Mtk'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; - -import * as AppDisplay from 'resource:///org/gnome/shell/ui/appDisplay.js'; -import * as AppMenu from 'resource:///org/gnome/shell/ui/appMenu.js'; -import * as Dash from 'resource:///org/gnome/shell/ui/dash.js'; -import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import * as Util from 'resource:///org/gnome/shell/misc/util.js'; -import * as BoxPointer from 'resource:///org/gnome/shell/ui/boxpointer.js'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; - -import * as Utils from './utils.js'; -import * as PanelSettings from './panelSettings.js'; -import * as Taskbar from './taskbar.js'; -import * as Progress from './progress.js'; -import {DTP_EXTENSION, SETTINGS, DESKTOPSETTINGS, TERMINALSETTINGS, EXTENSION_PATH} from './extension.js'; -import {gettext as _, ngettext} from 'resource:///org/gnome/shell/extensions/extension.js'; - -//timeout names -const T2 = 'mouseScrollTimeout'; -const T3 = 'showDotsTimeout'; -const T4 = 'overviewWindowDragEndTimeout'; -const T5 = 'switchWorkspaceTimeout'; -const T6 = 'displayProperIndicatorTimeout'; - -//right padding defined for .overview-label in stylesheet.css -const TITLE_RIGHT_PADDING = 8; -const DOUBLE_CLICK_DELAY_MS = 450; - -let LABEL_GAP = 5; -let MAX_INDICATORS = 4; -export const DEFAULT_PADDING_SIZE = 4; - -let APPICON_STYLE = { - NORMAL: "NORMAL", - SYMBOLIC: "SYMBOLIC" -} - -let DOT_STYLE = { - DOTS: "DOTS", - SQUARES: "SQUARES", - DASHES: "DASHES", - SEGMENTED: "SEGMENTED", - CILIORA: "CILIORA", - METRO: "METRO", - SOLID: "SOLID" -} - -let DOT_POSITION = { - TOP: "TOP", - BOTTOM: "BOTTOM", - LEFT: 'LEFT', - RIGHT: 'RIGHT' -} - -let recentlyClickedAppLoopId = 0; -let recentlyClickedApp = null; -let recentlyClickedAppWindows = null; -let recentlyClickedAppIndex = 0; -let recentlyClickedAppMonitorIndex; - -let tracker = Shell.WindowTracker.get_default(); - -/** - * Extend AppIcon - * - * - Apply a css class based on the number of windows of each application (#N); - * - Draw a dot for each window of the application based on the default "dot" style which is hidden (#N); - * a class of the form "running#N" is applied to the AppWellIcon actor. - * like the original .running one. - * - add a .focused style to the focused app - * - Customize click actions. - * - Update minimization animation target - * - */ - -export const TaskbarAppIcon = GObject.registerClass({ -}, class TaskbarAppIcon extends AppDisplay.AppIcon { - - _init(appInfo, panel, iconParams, previewMenu, iconAnimator) { - this.dtpPanel = panel; - this._nWindows = 0; - this.window = appInfo.window; - this.isLauncher = appInfo.isLauncher; - this._previewMenu = previewMenu; - this.iconAnimator = iconAnimator; - this.lastClick = 0; - - super._init(appInfo.app, iconParams); - - this._timeoutsHandler = new Utils.TimeoutsHandler(); - - // Fix touchscreen issues before the listener is added by the parent constructor. - this._onTouchEvent = function(actor, event) { - if (event.type() == Clutter.EventType.TOUCH_BEGIN) { - // Open the popup menu on long press. - this._setPopupTimeout(); - } else if (this._menuTimeoutId != 0 && (event.type() == Clutter.EventType.TOUCH_END || event.type() == Clutter.EventType.TOUCH_CANCEL)) { - // Activate/launch the application. - this.activate(1); - this._removeMenuTimeout(); - } - // Disable dragging via touch screen as it's buggy as hell. Not perfect for tablet users, but the alternative is way worse. - // Also, EVENT_PROPAGATE launches applications twice with this solution, so this.activate(1) above must only be called if there's already a window. - return Clutter.EVENT_STOP; - }; - // Hack for missing TOUCH_END event. - this._onLeaveEvent = function(actor, event) { - this.fake_release(); - if (this._menuTimeoutId != 0) this.activate(1); // Activate/launch the application if TOUCH_END didn't fire. - this._removeMenuTimeout(); - }; - - - this._dot.set_width(0); - this._isGroupApps = SETTINGS.get_boolean('group-apps'); - - this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() }); - this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() }); - this._dtpIconContainer = new St.Widget({ layout_manager: new Clutter.BinLayout(), style: getIconContainerStyle(panel.checkIfVertical()) }); - - this.remove_child(this._iconContainer); - - this._dtpIconContainer.add_child(this._iconContainer); - - if (appInfo.window) { - let box = new St.BoxLayout(); - - this._windowTitle = new St.Label({ - y_align: Clutter.ActorAlign.CENTER, - x_align: Clutter.ActorAlign.START, - style_class: 'overview-label' - }); - - this._updateWindowTitle(); - this._updateWindowTitleStyle(); - - this._scaleFactorChangedId = Utils.getStageTheme().connect('changed', () => this._updateWindowTitleStyle()); - - box.add_child(this._dtpIconContainer); - box.add_child(this._windowTitle); - - this._dotsContainer.add_child(box); - } else { - this._dotsContainer.add_child(this._dtpIconContainer); - } - - this._container.add_child(this._dotsContainer); - this.set_child(this._container); - - if (panel.checkIfVertical()) { - this.set_width(panel.geom.w); - } - - // Monitor windows-changes instead of app state. - // Keep using the same Id and function callback (that is extended) - if(this._stateChangedId > 0) { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - this._onAnimateAppiconHoverChanged(); - this._setAppIconPadding(); - this._setAppIconStyle(); - this._showDots(); - - this._focusWindowChangedId = global.display.connect('notify::focus-window', - this._onFocusAppChanged.bind(this)); - - this._windowEnteredMonitorId = this._windowLeftMonitorId = 0; - this._stateChangedId = this.app.connect('windows-changed', this.onWindowsChanged.bind(this)); - - if (!this.window) { - if (SETTINGS.get_boolean('isolate-monitors')) { - this._windowEnteredMonitorId = Utils.DisplayWrapper.getScreen().connect('window-entered-monitor', this.onWindowEnteredOrLeft.bind(this)); - this._windowLeftMonitorId = Utils.DisplayWrapper.getScreen().connect('window-left-monitor', this.onWindowEnteredOrLeft.bind(this)); - } - - this._titleWindowChangeId = 0; - this._minimizedWindowChangeId = 0; - } else { - this._titleWindowChangeId = this.window.connect('notify::title', - this._updateWindowTitle.bind(this)); - - this._minimizedWindowChangeId = this.window.connect('notify::minimized', - this._updateWindowTitleStyle.bind(this)); - } - - this._scrollEventId = this.connect('scroll-event', this._onMouseScroll.bind(this)); - - this._overviewWindowDragEndId = Main.overview.connect('window-drag-end', - this._onOverviewWindowDragEnd.bind(this)); - - this._switchWorkspaceId = global.window_manager.connect('switch-workspace', - this._onSwitchWorkspace.bind(this)); - - this._hoverChangeId = this.connect('notify::hover', () => this._onAppIconHoverChanged()); - - this._dtpSettingsSignalIds = [ - SETTINGS.connect('changed::animate-appicon-hover', this._onAnimateAppiconHoverChanged.bind(this)), - SETTINGS.connect('changed::dot-position', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-size', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-style-focused', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-style-unfocused', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-dominant', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-override', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-1', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-2', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-3', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-4', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-unfocused-different', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-unfocused-1', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-unfocused-2', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-unfocused-3', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::dot-color-unfocused-4', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::focus-highlight', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::focus-highlight-dominant', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::focus-highlight-color', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::focus-highlight-opacity', this._settingsChangeRefresh.bind(this)), - SETTINGS.connect('changed::group-apps-label-font-size', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-label-font-weight', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-label-font-color', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-label-font-color-minimized', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-label-max-width', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-use-fixed-width', this._updateWindowTitleStyle.bind(this)), - SETTINGS.connect('changed::group-apps-underline-unfocused', this._settingsChangeRefresh.bind(this)) - ] - - this._progressIndicator = new Progress.ProgressIndicator(this, panel.progressManager); - - this._numberOverlay(); - } - - getDragActor() { - return this.app.create_icon_texture(this.dtpPanel.taskbar.iconSize); - } - - // Used by TaskbarItemContainer to animate appIcons on hover - getCloneButton() { - // The source of the clone is this._container, - // using this.actor directly would break DnD style. - let clone = new Clutter.Clone({ - source: this.child, - x: this.child.x, y: this.child.y, - width: this.child.width, height: this.child.height, - pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }), - opacity: 255, - reactive: false, - x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, - }); - - clone._delegate = this._delegate; - - // "clone" of this.actor - return new St.Button({ - child: clone, - x: this.x, y: this.y, - width: this.width, height: this.height, - reactive: false, - }); - } - - shouldShowTooltip() { - if (!SETTINGS.get_boolean('show-tooltip') || - (!this.isLauncher && SETTINGS.get_boolean("show-window-previews") && - this.getAppIconInterestingWindows().length > 0)) { - return false; - } else { - return this.hover && !this.window && - (!this._menu || !this._menu.isOpen) && - (this._previewMenu.getCurrentAppIcon() !== this); - } - } - - _onAppIconHoverChanged() { - if (!SETTINGS.get_boolean('show-window-previews') || - (!this.window && !this._nWindows)) { - return; - } - - if (this.hover) { - this._previewMenu.requestOpen(this); - } else { - this._previewMenu.requestClose(); - } - } - - _onDestroy() { - super._onDestroy(); - - this._timeoutsHandler.destroy(); - - this._previewMenu.close(true); - - // Disconect global signals - if (this._stateChangedId > 0) { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - if(this._overviewWindowDragEndId) - Main.overview.disconnect(this._overviewWindowDragEndId); - - if(this._focusWindowChangedId) - global.display.disconnect(this._focusWindowChangedId); - - if(this._titleWindowChangeId) - this.window.disconnect(this._titleWindowChangeId); - - if(this._minimizedWindowChangeId) - this.window.disconnect(this._minimizedWindowChangeId); - - if (this._windowEnteredMonitorId) { - Utils.DisplayWrapper.getScreen().disconnect(this._windowEnteredMonitorId); - Utils.DisplayWrapper.getScreen().disconnect(this._windowLeftMonitorId); - } - - if(this._switchWorkspaceId) - global.window_manager.disconnect(this._switchWorkspaceId); - - if(this._scaleFactorChangedId) - Utils.getStageTheme().disconnect(this._scaleFactorChangedId); - - if (this._hoverChangeId) { - this.disconnect(this._hoverChangeId); - } - - if (this._scrollEventId) { - this.disconnect(this._scrollEventId); - } - - for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { - SETTINGS.disconnect(this._dtpSettingsSignalIds[i]); - } - } - - onWindowsChanged() { - this._updateWindows(); - this.updateIcon(); - - if (this._isGroupApps) - this._setIconStyle(); - } - - onWindowEnteredOrLeft(display, number, metaWindow) { - if (number > 0 && tracker.get_window_app(metaWindow) == this.app) { - this._updateWindows(); - this._displayProperIndicator(); - } - } - - updateTitleStyle() { - this._updateWindowTitleStyle(); - } - - // Update indicator and target for minimization animation - updateIcon() { - - // If (for unknown reason) the actor is not on the stage the reported size - // and position are random values, which might exceeds the integer range - // resulting in an error when assigned to the a rect. This is a more like - // a workaround to prevent flooding the system with errors. - if (this.get_stage() == null) - return; - - let rect = new Mtk.Rectangle(); - - [rect.x, rect.y] = this.get_transformed_position(); - [rect.width, rect.height] = this.get_transformed_size(); - - let windows = this.window ? [this.window] : this.getAppIconInterestingWindows(true); - windows.forEach(function(w) { - w.set_icon_geometry(rect); - }); - } - - _onAnimateAppiconHoverChanged() { - if (SETTINGS.get_boolean('animate-appicon-hover')) { - this._container.add_style_class_name('animate-appicon-hover'); - - // Workaround to prevent scaled icon from being ugly when it is animated on hover. - // It increases the "resolution" of the icon without changing the icon size. - this.icon.createIcon = (iconSize) => this.app.create_icon_texture(2 * iconSize); - this._iconIconBinActorAddedId = this.icon._iconBin.connect('child-added', () => { - let size = this.icon.iconSize * Utils.getScaleFactor() - - if (this.icon._iconBin.child.mapped) { - this.icon._iconBin.child.set_size(size, size); - } else { - let iconMappedId = this.icon._iconBin.child.connect('notify::mapped', () => { - this.icon._iconBin.child.set_size(size, size); - this.icon._iconBin.child.disconnect(iconMappedId); - }); - } - }); - if (this.icon._iconBin.child) - this.icon._createIconTexture(this.icon.iconSize); - } else { - this._container.remove_style_class_name('animate-appicon-hover'); - - if (this._iconIconBinActorAddedId) { - this.icon._iconBin.disconnect(this._iconIconBinActorAddedId); - this._iconIconBinActorAddedId = 0; - this.icon.createIcon = this._createIcon.bind(this); - } - } - } - - _onMouseScroll(actor, event) { - let scrollAction = SETTINGS.get_string('scroll-icon-action'); - - if (scrollAction === 'PASS_THROUGH') { - return this.dtpPanel._onPanelMouseScroll(actor, event); - } else if (scrollAction === 'NOTHING' || (!this.window && !this._nWindows)) { - return; - } - - let direction = Utils.getMouseScrollDirection(event); - - if (direction && !this._timeoutsHandler.getId(T2)) { - this._timeoutsHandler.add([T2, SETTINGS.get_int('scroll-icon-delay'), () => {}]); - - let windows = this.getAppIconInterestingWindows(); - - windows.sort(Taskbar.sortWindowsCompareFunction); - Utils.activateSiblingWindow(windows, direction, this.window); - } - } - - _showDots() { - // Just update style if dots already exist - if (this._focusedDots && this._unfocusedDots) { - this._updateWindows(); - return; - } - - if (!this._isGroupApps) { - this._focusedDots = new St.Widget({ - layout_manager: new Clutter.BinLayout(), - x_expand: true, y_expand: true, - visible: false - }); - - let mappedId = this.connect('notify::mapped', () => { - this._displayProperIndicator(); - this.disconnect(mappedId); - }); - } else { - this._focusedDots = new St.DrawingArea(), - this._unfocusedDots = new St.DrawingArea(); - - this._focusedDots.connect('repaint', () => { - if (!this._dashItemContainer.animatingOut) - // don't draw and trigger more animations if the icon is in the middle of - // being removed from the panel - this._drawRunningIndicator(this._focusedDots, SETTINGS.get_string('dot-style-focused'), true); - }); - - this._unfocusedDots.connect('repaint', () => { - if (!this._dashItemContainer.animatingOut) - this._drawRunningIndicator(this._unfocusedDots, SETTINGS.get_string('dot-style-unfocused'), false); - }); - - this._dotsContainer.add_child(this._unfocusedDots); - - this._updateWindows(); - - this._timeoutsHandler.add([T3, 0, () => { - this._resetDots(); - this._displayProperIndicator(); - }]); - } - - this._dotsContainer.add_child(this._focusedDots); - } - - _resetDots() { - let position = SETTINGS.get_string('dot-position'); - let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; - let sizeProp = isHorizontalDots ? 'width' : 'height'; - let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); - let unfocusedDotStyle = SETTINGS.get_string('dot-style-unfocused'); - - this._focusedIsWide = this._isWideDotStyle(focusedDotStyle); - this._unfocusedIsWide = this._isWideDotStyle(unfocusedDotStyle); - - [, this._containerSize] = this._container[`get_preferred_${sizeProp}`](-1); - - [this._focusedDots, this._unfocusedDots].forEach(d => { - d.set_size(-1, -1); - d.x_expand = d.y_expand = false; - - d[sizeProp] = 1; - d[(isHorizontalDots ? 'y' : 'x') + '_expand'] = true; - }); - } - - _settingsChangeRefresh() { - if (this._isGroupApps) { - this._updateWindows(); - this._resetDots(); - this._focusedDots.queue_repaint(); - this._unfocusedDots.queue_repaint(); - } - - this._displayProperIndicator(); - } - - _updateWindowTitleStyle() { - if (this._windowTitle) { - let useFixedWidth = SETTINGS.get_boolean('group-apps-use-fixed-width'); - let fontWeight = SETTINGS.get_string('group-apps-label-font-weight'); - let fontScale = DESKTOPSETTINGS.get_double('text-scaling-factor'); - let fontColor = this.window.minimized ? - SETTINGS.get_string('group-apps-label-font-color-minimized') : - SETTINGS.get_string('group-apps-label-font-color'); - let scaleFactor = Utils.getScaleFactor(); - let maxLabelWidth = SETTINGS.get_int('group-apps-label-max-width') * scaleFactor; - let variableWidth = !useFixedWidth || this.dtpPanel.checkIfVertical() || this.dtpPanel.taskbar.fullScrollView; - - this._windowTitle[(maxLabelWidth > 0 ? 'show' : 'hide')](); - this._windowTitle.set_width(variableWidth ? -1 : maxLabelWidth + TITLE_RIGHT_PADDING * scaleFactor); - - this._windowTitle.clutter_text.natural_width = useFixedWidth ? maxLabelWidth : 0; - this._windowTitle.clutter_text.natural_width_set = useFixedWidth; - - this._windowTitle.set_style('font-size: ' + SETTINGS.get_int('group-apps-label-font-size') * fontScale + 'px;' + - 'font-weight: ' + fontWeight + ';' + - (useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') + - 'color: ' + fontColor); - } - } - - _updateWindowTitle() { - if (this._windowTitle.text != this.window.title) { - this._windowTitle.text = (this.window.title ? this.window.title : this.app.get_name()).replace(/\r?\n|\r/g, '').trim(); - - if (this._focusedDots) { - this._displayProperIndicator(); - } - } - } - - _setIconStyle(isFocused) { - let inlineStyle = 'margin: 0;'; - - if(SETTINGS.get_boolean('focus-highlight') && - this._checkIfFocusedApp() && !this.isLauncher && - (!this.window || isFocused) && !this._isThemeProvidingIndicator() && this._checkIfMonitorHasFocus()) { - let focusedDotStyle = SETTINGS.get_string('dot-style-focused'); - let pos = SETTINGS.get_string('dot-position'); - let highlightMargin = this._focusedIsWide ? SETTINGS.get_int('dot-size') : 0; - - if(!this.window) { - let containerWidth = this._dtpIconContainer.get_width() / Utils.getScaleFactor(); - let backgroundSize = containerWidth + "px " + - (containerWidth - (pos == DOT_POSITION.BOTTOM ? highlightMargin : 0)) + "px;"; - - if (focusedDotStyle == DOT_STYLE.CILIORA || focusedDotStyle == DOT_STYLE.SEGMENTED) - highlightMargin += 1; - - if (this._nWindows > 1 && focusedDotStyle == DOT_STYLE.METRO) { - let bgSvg = '/img/highlight_stacked_bg'; - - if (pos == DOT_POSITION.LEFT || pos == DOT_POSITION.RIGHT) { - bgSvg += (this.dtpPanel.checkIfVertical() ? '_2' : '_3'); - } - - inlineStyle += "background-image: url('" + EXTENSION_PATH + bgSvg + ".svg');" + - "background-position: 0 " + (pos == DOT_POSITION.TOP ? highlightMargin : 0) + "px;" + - "background-size: " + backgroundSize; - } - } - - let highlightColor = this._getFocusHighlightColor(); - inlineStyle += "background-color: " + cssHexTocssRgba(highlightColor, SETTINGS.get_int('focus-highlight-opacity') * 0.01); - } - - if(this._dotsContainer.get_style() != inlineStyle) { - this._dotsContainer.set_style(inlineStyle); - } - } - - _checkIfFocusedApp() { - return tracker.focus_app == this.app; - } - - _checkIfMonitorHasFocus() { - return global.display.focus_window && - (!SETTINGS.get_boolean('multi-monitors') || // only check same monitor index if multi window is enabled. - !SETTINGS.get_boolean('isolate-monitors') || - global.display.focus_window.get_monitor() === this.dtpPanel.monitor.index); - } - - _setAppIconPadding() { - let padding = getIconPadding(this.dtpPanel.monitor.index); - let margin = SETTINGS.get_int('appicon-margin'); - - this.set_style('padding:' + (this.dtpPanel.checkIfVertical() ? margin + 'px 0' : '0 ' + margin + 'px;')); - this._iconContainer.set_style('padding: ' + padding + 'px;'); - } - - _setAppIconStyle() { - let symbolic_icon_style_name = 'symbolic-icon-style'; - if (SETTINGS.get_string('appicon-style') === APPICON_STYLE.SYMBOLIC) { - this.add_style_class_name(symbolic_icon_style_name); - } else { - this.remove_style_class_name(symbolic_icon_style_name); - } - } - - popupMenu() { - this._removeMenuTimeout(); - this.fake_release(); - - if (!this._menu) { - this._menu = new TaskbarSecondaryMenu(this, this.dtpPanel.geom.position); - this._menu.setApp(this.app); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - else - this._previewMenu.close(true); - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this.connect('destroy', () => { - Main.overview.disconnect(id); - }); - - // We want to keep the item hovered while the menu is up - this._menu.blockSourceEvents = true; - - Main.uiGroup.add_child(this._menu.actor); - this._menuManager.addMenu(this._menu); - } - this._menu.updateQuitText(); - - this.emit('menu-state-changed', true); - - this.set_hover(true); - this._menu.open(BoxPointer.PopupAnimation.FULL); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } - - _onFocusAppChanged(windowTracker) { - this._displayProperIndicator(); - } - - _onOverviewWindowDragEnd(windowTracker) { - this._timeoutsHandler.add([T4, 0, () => { - if (SETTINGS.get_boolean('isolate-workspaces')) - this._updateWindows() - - this._displayProperIndicator() - }]); - } - - _onSwitchWorkspace(windowTracker) { - if (this._isGroupApps) { - this._timeoutsHandler.add([T5, 0, () => this._displayProperIndicator()]); - } else { - this._displayProperIndicator(); - } - } - - _displayProperIndicator() { - let isFocused = this._isFocusedWindow(); - let position = SETTINGS.get_string('dot-position'); - let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; - - this._setIconStyle(isFocused); - - if(!this._isGroupApps) { - if (this.window && (SETTINGS.get_boolean('group-apps-underline-unfocused') || isFocused)) { - let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END']; - - this._focusedDots.set_size(0, 0); - this._focusedDots[isHorizontalDots ? 'height' : 'width'] = this._getRunningIndicatorSize(); - - this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL; - this._focusedDots[(isHorizontalDots ? 'y' : 'x') + '_align'] = align; - this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused); - this._focusedDots.show(); - } else if (this._focusedDots.visible) { - this._focusedDots.hide(); - } - } else { - let sizeProp = isHorizontalDots ? 'width' : 'height'; - let newFocusedDotsSize = 0; - let newFocusedDotsOpacity = 0; - let newUnfocusedDotsSize = 0; - let newUnfocusedDotsOpacity = 0; - - isFocused = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); - - this._timeoutsHandler.add([T6, 0, () => { - if(isFocused) - this.add_style_class_name('focused'); - else - this.remove_style_class_name('focused'); - }]); - - if(this._focusedIsWide) { - newFocusedDotsSize = (isFocused && this._nWindows > 0) ? this._containerSize : 0; - newFocusedDotsOpacity = 255; - } else { - newFocusedDotsSize = this._containerSize; - newFocusedDotsOpacity = (isFocused && this._nWindows > 0) ? 255 : 0; - } - - if(this._unfocusedIsWide) { - newUnfocusedDotsSize = (!isFocused && this._nWindows > 0) ? this._containerSize : 0; - newUnfocusedDotsOpacity = 255; - } else { - newUnfocusedDotsSize = this._containerSize; - newUnfocusedDotsOpacity = (!isFocused && this._nWindows > 0) ? 255 : 0; - } - - // Only animate if... - // animation is enabled in settings - // AND (going from a wide style to a narrow style indicator or vice-versa - // OR going from an open app to a closed app or vice versa) - let animate = SETTINGS.get_boolean('animate-app-switch') && - ((this._focusedIsWide != this._unfocusedIsWide) || - (this._focusedDots[sizeProp] != newUnfocusedDotsSize || this._unfocusedDots[sizeProp] != newFocusedDotsSize)) - let duration = animate ? Taskbar.DASH_ANIMATION_TIME : 0.001; - - this._animateDotDisplay(this._focusedDots, newFocusedDotsSize, this._unfocusedDots, newUnfocusedDotsOpacity, sizeProp, duration); - this._animateDotDisplay(this._unfocusedDots, newUnfocusedDotsSize, this._focusedDots, newFocusedDotsOpacity, sizeProp, duration); - } - } - - _animateDotDisplay(dots, newSize, otherDots, newOtherOpacity, sizeProp, duration) { - Utils.stopAnimations(dots) - - let tweenOpts = { - time: duration, - transition: 'easeInOutCubic', - onComplete: () => { - if(newOtherOpacity > 0) - otherDots.opacity = newOtherOpacity; - } - }; - - if(newOtherOpacity == 0) - otherDots.opacity = newOtherOpacity; - - tweenOpts[sizeProp] = newSize; - - Utils.animate(dots, tweenOpts); - } - - _isFocusedWindow() { - let focusedWindow = global.display.focus_window; - - while (focusedWindow) { - if (focusedWindow == this.window) { - return true; - } - - focusedWindow = focusedWindow.get_transient_for(); - } - - return false; - } - - _isWideDotStyle(dotStyle) { - return dotStyle == DOT_STYLE.SEGMENTED || - dotStyle == DOT_STYLE.CILIORA || - dotStyle == DOT_STYLE.METRO || - dotStyle == DOT_STYLE.SOLID; - } - - _isThemeProvidingIndicator() { - // This is an attempt to determine if the theme is providing their own - // running indicator by way of a border image on the icon, for example in - // the theme Ciliora - return (this.icon.get_stage() && - this.icon.get_theme_node().get_border_image()); - } - - activate(button, modifiers, handleAsGrouped) { - let event = Clutter.get_current_event(); - - modifiers = event ? event.get_state() : modifiers || 0; - - // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) - modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); - - let ctrlPressed = modifiers & Clutter.ModifierType.CONTROL_MASK - - if (ctrlPressed) { - // CTRL-click or hotkey with ctrl - return this._launchNewInstance(true); - } - - // We check what type of click we have and if the modifier SHIFT is - // being used. We then define what buttonAction should be for this - // event. - let buttonAction = 0; - let doubleClick; - - if (button && button == 2 ) { - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = SETTINGS.get_string('shift-middle-click-action'); - else - buttonAction = SETTINGS.get_string('middle-click-action'); - } - // fixed issue #1676 by checking for button 0 or 1 to also handle touchscreen - // input, probably not the proper fix as i'm not aware button 0 should exist - // but from using this fix for months it seems to not create any issues - else if (button === 0 || button === 1) { - let now = global.get_current_time() - - doubleClick = now - this.lastClick < DOUBLE_CLICK_DELAY_MS - this.lastClick = now - - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = SETTINGS.get_string('shift-click-action'); - else - buttonAction = SETTINGS.get_string('click-action'); - } - - let closePreview = () => this._previewMenu.close(SETTINGS.get_boolean('window-preview-hide-immediate-click')); - let appCount = this.getAppIconInterestingWindows().length; - let previewedAppIcon = this._previewMenu.getCurrentAppIcon(); - - if (this.window || buttonAction != 'TOGGLE-SHOWPREVIEW') - closePreview() - - // We check if the app is running, and that the # of windows is > 0 in - // case we use workspace isolation, - let appIsRunning = this.app.state == Shell.AppState.RUNNING && appCount > 0; - - // We customize the action only when the application is already running - if (appIsRunning && !this.isLauncher) { - if (this.window && !handleAsGrouped) { - //ungrouped applications behaviors - switch (buttonAction) { - case 'RAISE': case 'CYCLE': case 'CYCLE-MIN': case 'MINIMIZE': case 'TOGGLE-SHOWPREVIEW': case 'TOGGLE-CYCLE': - if (!Main.overview._shown && - (buttonAction == 'MINIMIZE' || buttonAction == 'TOGGLE-SHOWPREVIEW' || buttonAction == 'TOGGLE-CYCLE' || buttonAction == 'CYCLE-MIN') && - (this._isFocusedWindow() || (buttonAction == 'MINIMIZE' && (button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK)))) { - this.window.minimize(); - } else { - Main.activateWindow(this.window); - } - - break; - - case "LAUNCH": - this._launchNewInstance(); - break; - - case "QUIT": - this.window.delete(global.get_current_time()); - break; - } - } else { - //grouped application behaviors - let monitor = this.dtpPanel.monitor; - let appHasFocus = this._checkIfFocusedApp() && this._checkIfMonitorHasFocus(); - - switch (buttonAction) { - case "RAISE": - activateAllWindows(this.app, monitor); - break; - - case "LAUNCH": - this._launchNewInstance(); - break; - - case "MINIMIZE": - // In overview just activate the app, unless the acion is explicitely - // requested with a keyboard modifier - if (!Main.overview._shown || modifiers){ - // If we have button=2 or a modifier, allow minimization even if - // the app is not focused - if (appHasFocus || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { - // minimize all windows on double click and always in the case of primary click without - // additional modifiers - let all_windows = (button == 1 && ! modifiers) || doubleClick; - minimizeWindow(this.app, all_windows, monitor); - } - else - activateAllWindows(this.app, monitor); - } - else - this.app.activate(); - break; - - case "CYCLE": - if (!Main.overview._shown){ - if (appHasFocus) - cycleThroughWindows(this.app, false, false, monitor); - else { - activateFirstWindow(this.app, monitor); - } - } - else - this.app.activate(); - break; - case "CYCLE-MIN": - if (!Main.overview._shown){ - if (appHasFocus || (recentlyClickedApp == this.app && recentlyClickedAppWindows[recentlyClickedAppIndex % recentlyClickedAppWindows.length] == "MINIMIZE")) - cycleThroughWindows(this.app, false, true, monitor); - else { - activateFirstWindow(this.app, monitor); - } - } - else - this.app.activate(); - break; - case "TOGGLE-SHOWPREVIEW": - if (!Main.overview._shown) { - if (appCount == 1) { - closePreview() - - if (appHasFocus) - minimizeWindow(this.app, false, monitor); - else - activateFirstWindow(this.app, monitor); - } else { - if (doubleClick) { - // minimize all windows if double clicked - closePreview() - minimizeWindow(this.app, true, monitor); - } else if (previewedAppIcon != this) { - this._previewMenu.open(this); - } - - this.emit('sync-tooltip'); - } - } - else - this.app.activate(); - break; - case "TOGGLE-CYCLE": - if (!Main.overview._shown) { - if (appCount == 1) { - if (appHasFocus) - minimizeWindow(this.app, false, monitor); - else - activateFirstWindow(this.app, monitor); - } else { - cycleThroughWindows(this.app, false, false, monitor); - } - } - else - this.app.activate(); - break; - case "QUIT": - closeAllWindows(this.app, monitor); - break; - } - } - } - else { - this._launchNewInstance(); - } - - global.display.emit('grab-op-begin', null, null); - Main.overview.hide(); - } - - _launchNewInstance(ctrlPressed) { - let maybeAnimate = () => SETTINGS.get_boolean('animate-window-launch') && this.animateLaunch() - - if ((ctrlPressed || this.app.state == Shell.AppState.RUNNING) && - this.app.can_open_new_window()) { - maybeAnimate(); - this.app.open_new_window(-1); - } else { - let windows = this.window ? [this.window] : this.app.get_windows(); - - if (windows.length) { - Main.activateWindow(windows[0]); - } else { - maybeAnimate(); - this.app.activate(); - } - } - } - - _updateWindows() { - let windows = [this.window]; - - if (!this.window) { - windows = this.getAppIconInterestingWindows(); - - this._nWindows = windows.length; - - for (let i = 1; i <= MAX_INDICATORS; i++){ - let className = 'running'+i; - if(i != this._nWindows) - this.remove_style_class_name(className); - else - this.add_style_class_name(className); - } - } - - this._previewMenu.update(this, windows); - } - - _getRunningIndicatorCount() { - return Math.min(this._nWindows, MAX_INDICATORS); - } - - _getRunningIndicatorSize() { - return SETTINGS.get_int('dot-size') * Utils.getScaleFactor(); - } - - _getRunningIndicatorColor(isFocused) { - let color; - const fallbackColor = new Utils.ColorUtils.Color({ red: 82, green: 148, blue: 226, alpha: 255 }); - - if (SETTINGS.get_boolean('dot-color-dominant')) { - let dce = new Utils.DominantColorExtractor(this.app); - let palette = dce._getColorPalette(); - if (palette) { - color = Utils.ColorUtils.color_from_string(palette.original)[1]; - } else { // unable to determine color, fall back to theme - let themeNode = this._dot.get_theme_node(); - color = themeNode.get_background_color(); - - // theme didn't provide one, use a default - if(color.alpha == 0) color = fallbackColor; - } - } else if(SETTINGS.get_boolean('dot-color-override')) { - let dotColorSettingPrefix = 'dot-color-'; - - if(!isFocused && SETTINGS.get_boolean('dot-color-unfocused-different')) - dotColorSettingPrefix = 'dot-color-unfocused-'; - - color = Utils.ColorUtils.color_from_string(SETTINGS.get_string(dotColorSettingPrefix + (this._getRunningIndicatorCount() || 1) ))[1]; - } else { - // Re-use the style - background color, and border width and color - - // of the default dot - let themeNode = this._dot.get_theme_node(); - color = themeNode.get_background_color(); - - // theme didn't provide one, use a default - if(color.alpha == 0) color = fallbackColor; - } - - return color; - } - - _getFocusHighlightColor() { - if (SETTINGS.get_boolean('focus-highlight-dominant')) { - let dce = new Utils.DominantColorExtractor(this.app); - let palette = dce._getColorPalette(); - if (palette) return palette.original; - } - return SETTINGS.get_string('focus-highlight-color'); - } - - _drawRunningIndicator(area, type, isFocused) { - let n = this._getRunningIndicatorCount(); - - if (!n) { - return; - } - - let position = SETTINGS.get_string('dot-position'); - let isHorizontalDots = position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM; - let bodyColor = this._getRunningIndicatorColor(isFocused); - let [areaWidth, areaHeight] = area.get_surface_size(); - let cr = area.get_context(); - let size = this._getRunningIndicatorSize(); - - let areaSize = areaWidth; - let startX = 0; - let startY = 0; - - if (isHorizontalDots) { - if (position == DOT_POSITION.BOTTOM) { - startY = areaHeight - size; - } - } else { - areaSize = areaHeight; - - if (position == DOT_POSITION.RIGHT) { - startX = areaWidth - size; - } - } - - if (type == DOT_STYLE.SOLID || type == DOT_STYLE.METRO) { - if (type == DOT_STYLE.SOLID || n <= 1) { - cr.translate(startX, startY); - cr.setSourceColor(bodyColor); - cr.newSubPath(); - cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [areaSize, size] : [size, areaSize])); - cr.fill(); - } else { - let blackenedLength = (1 / 48) * areaSize; // need to scale with the SVG for the stacked highlight - let darkenedLength = isFocused ? (2 / 48) * areaSize : (10 / 48) * areaSize; - let blackenedColor = new Utils.ColorUtils.Color({ red: bodyColor.red * .3, green: bodyColor.green * .3, blue: bodyColor.blue * .3, alpha: bodyColor.alpha }); - let darkenedColor = new Utils.ColorUtils.Color({ red: bodyColor.red * .7, green: bodyColor.green * .7, blue: bodyColor.blue * .7, alpha: bodyColor.alpha }); - let solidDarkLength = areaSize - darkenedLength; - let solidLength = solidDarkLength - blackenedLength; - - cr.translate(startX, startY); - - cr.setSourceColor(bodyColor); - cr.newSubPath(); - cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [solidLength, size] : [size, solidLength])); - cr.fill(); - cr.setSourceColor(blackenedColor); - cr.newSubPath(); - cr.rectangle.apply(cr, isHorizontalDots ? [solidLength, 0, 1, size] : [0, solidLength, size, 1]); - cr.fill(); - cr.setSourceColor(darkenedColor); - cr.newSubPath(); - cr.rectangle.apply(cr, isHorizontalDots ? [solidDarkLength, 0, darkenedLength, size] : [0, solidDarkLength, size, darkenedLength]); - cr.fill(); - } - } else { - let spacing = Math.ceil(areaSize / 18); // separation between the indicators - let length; - let dist; - let indicatorSize; - let translate; - let preDraw = () => {}; - let draw; - let drawDash = (i, dashLength) => { - dist = i * dashLength + i * spacing; - cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0, dashLength, size] : [0, dist, size, dashLength])); - }; - - switch (type) { - case DOT_STYLE.CILIORA: - spacing = size; - length = areaSize - (size * (n - 1)) - (spacing * (n - 1)); - translate = () => cr.translate(startX, startY); - preDraw = () => { - cr.newSubPath(); - cr.rectangle.apply(cr, [0, 0].concat(isHorizontalDots ? [length, size] : [size, length])); - }; - draw = i => { - dist = length + (i * spacing) + ((i - 1) * size); - cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); - }; - break; - case DOT_STYLE.DOTS: - let radius = size / 2; - - translate = () => { - indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); - cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); - } - draw = i => { - dist = (2 * i + 1) * radius + i * spacing; - cr.arc.apply(cr, (isHorizontalDots ? [dist, radius] : [radius, dist]).concat([radius, 0, 2 * Math.PI])); - }; - break; - case DOT_STYLE.SQUARES: - translate = () => { - indicatorSize = Math.floor((areaSize - n * size - (n - 1) * spacing) / 2); - cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); - } - draw = i => { - dist = i * size + i * spacing; - cr.rectangle.apply(cr, (isHorizontalDots ? [dist, 0] : [0, dist]).concat([size, size])); - }; - break; - case DOT_STYLE.DASHES: - length = Math.floor(areaSize / 4) - spacing; - translate = () => { - indicatorSize = Math.floor((areaSize - n * length - (n - 1) * spacing) / 2); - cr.translate.apply(cr, isHorizontalDots ? [indicatorSize, startY] : [startX, indicatorSize]); - } - draw = i => drawDash(i, length); - break; - case DOT_STYLE.SEGMENTED: - length = Math.ceil((areaSize - ((n - 1) * spacing)) / n); - translate = () => cr.translate(startX, startY); - draw = i => drawDash(i, length); - break; - } - - translate(); - - cr.setSourceColor(bodyColor); - preDraw(); - for (let i = 0; i < n; i++) { - cr.newSubPath(); - draw(i); - } - cr.fill(); - } - - cr.$dispose(); - } - - _numberOverlay() { - // Add label for a Hot-Key visual aid - this._numberOverlayLabel = new St.Label({ style_class: 'badge' }); - this._numberOverlayBin = new St.Bin({ - child: this._numberOverlayLabel, y: 2 - }); - this._numberOverlayLabel.add_style_class_name('number-overlay'); - this._numberOverlayOrder = -1; - this._numberOverlayBin.hide(); - - this._dtpIconContainer.add_child(this._numberOverlayBin); - } - - updateHotkeyNumberOverlay() { - this.updateNumberOverlay(this._numberOverlayBin, true); - } - - updateNumberOverlay(bin, fixedSize) { - // We apply an overall scale factor that might come from a HiDPI monitor. - // Clutter dimensions are in physical pixels, but CSS measures are in logical - // pixels, so make sure to consider the scale. - // Set the font size to something smaller than the whole icon so it is - // still visible. The border radius is large to make the shape circular - let [minWidth, natWidth] = this._dtpIconContainer.get_preferred_width(-1); - let font_size = Math.round(Math.max(12, 0.3 * natWidth) / Utils.getScaleFactor()); - let size = Math.round(font_size * 1.3); - let label = bin.child; - let style = 'font-size: ' + font_size + 'px;' + - 'border-radius: ' + this.icon.iconSize + 'px;' + - 'height: ' + size +'px;'; - - if (fixedSize || label.get_text().length == 1) { - style += 'width: ' + size + 'px;'; - } else { - style += 'padding: 0 2px;'; - } - - bin.x = 2; - label.set_style(style); - } - - setNumberOverlay(number) { - this._numberOverlayOrder = number; - this._numberOverlayLabel.set_text(number.toString()); - } - - toggleNumberOverlay(activate) { - if (activate && this._numberOverlayOrder > -1) - this._numberOverlayBin.show(); - else - this._numberOverlayBin.hide(); - } - - handleDragOver(source, actor, x, y, time) { - if (source == Main.xdndHandler) { - this._previewMenu.close(true); - } - - return DND.DragMotionResult.CONTINUE; - } - - getAppIconInterestingWindows(isolateMonitors) { - return getInterestingWindows(this.app, this.dtpPanel.monitor, isolateMonitors); - } -}); -TaskbarAppIcon.prototype.scaleAndFade = TaskbarAppIcon.prototype.undoScaleAndFade = () => {}; - -export function minimizeWindow(app, param, monitor){ - // Param true make all app windows minimize - let windows = getInterestingWindows(app, monitor); - let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - for (let i = 0; i < windows.length; i++) { - let w = windows[i]; - if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()){ - w.minimize(); - // Just minimize one window. By specification it should be the - // focused window on the current workspace. - if(!param) - break; - } - } -} - -/* - * By default only non minimized windows are activated. - * This activates all windows in the current workspace. - */ -export function activateAllWindows(app, monitor){ - - // First activate first window so workspace is switched if needed, - // then activate all other app windows in the current workspace. - let windows = getInterestingWindows(app, monitor); - let w = windows[0]; - Main.activateWindow(w); - let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace_index(); - - if (windows.length <= 0) - return; - - for (let i = windows.length - 1; i >= 0; i--){ - if (windows[i].get_workspace().index() == activeWorkspace){ - Main.activateWindow(windows[i]); - } - } -} - -export function activateFirstWindow(app, monitor){ - - let windows = getInterestingWindows(app, monitor); - Main.activateWindow(windows[0]); -} - -export function cycleThroughWindows(app, reversed, shouldMinimize, monitor) { - // Store for a little amount of time last clicked app and its windows - // since the order changes upon window interaction - let MEMORY_TIME=3000; - - let app_windows = getInterestingWindows(app, monitor); - - if(shouldMinimize) - app_windows.push("MINIMIZE"); - - if (recentlyClickedAppLoopId > 0) - GLib.Source.remove(recentlyClickedAppLoopId); - - recentlyClickedAppLoopId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, - MEMORY_TIME, resetRecentlyClickedApp); - - // If there isn't already a list of windows for the current app, - // or the stored list is outdated, use the current windows list. - if (!recentlyClickedApp || - recentlyClickedApp.get_id() != app.get_id() || - recentlyClickedAppWindows.length != app_windows.length || - recentlyClickedAppMonitorIndex != monitor.index) { - recentlyClickedApp = app; - recentlyClickedAppWindows = app_windows; - recentlyClickedAppIndex = 0; - recentlyClickedAppMonitorIndex = monitor.index; - } - - if (reversed) { - recentlyClickedAppIndex--; - if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; - } else { - recentlyClickedAppIndex++; - } - let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - - if(recentlyClickedAppWindows[index] === "MINIMIZE") - minimizeWindow(app, true, monitor); - else - Main.activateWindow(recentlyClickedAppWindows[index]); -} - -export function resetRecentlyClickedApp() { - if (recentlyClickedAppLoopId > 0) - GLib.Source.remove(recentlyClickedAppLoopId); - - recentlyClickedAppLoopId=0; - recentlyClickedApp =null; - recentlyClickedAppWindows = null; - recentlyClickedAppIndex = 0; - recentlyClickedAppMonitorIndex = null; - - return false; -} - -export function closeAllWindows(app, monitor) { - let windows = getInterestingWindows(app, monitor); - for (let i = 0; i < windows.length; i++) - windows[i].delete(global.get_current_time()); -} - -// Filter out unnecessary windows, for instance -// nautilus desktop window. -export function getInterestingWindows(app, monitor, isolateMonitors) { - let windows = ( - app ? - app.get_windows() : - global.get_window_actors().map(wa => wa.get_meta_window()) - ).filter(w => !w.skip_taskbar); - - // When using workspace or monitor isolation, we filter out windows - // that are not in the current workspace or on the same monitor as the appicon - if (SETTINGS.get_boolean('isolate-workspaces')) - windows = windows.filter(function(w) { - return w.get_workspace() && - w.get_workspace() == Utils.getCurrentWorkspace(); - }); - - if (monitor && SETTINGS.get_boolean('multi-monitors') && (isolateMonitors || SETTINGS.get_boolean('isolate-monitors'))) { - windows = windows.filter(function(w) { - return w.get_monitor() == monitor.index; - }); - } - - return windows; -} - -export function cssHexTocssRgba(cssHex, opacity) { - let bigint = parseInt(cssHex.slice(1), 16); - let r = (bigint >> 16) & 255; - let g = (bigint >> 8) & 255; - let b = bigint & 255; - - return 'rgba(' + [r, g, b].join(',') + ',' + opacity + ')'; -} - -export function getIconPadding(monitorIndex) { - let panelSize = PanelSettings.getPanelSize(SETTINGS, monitorIndex); - let padding = SETTINGS.get_int('appicon-padding'); - let availSize = panelSize - Taskbar.MIN_ICON_SIZE - panelSize % 2; - - if (padding * 2 > availSize) { - padding = availSize * .5; - } - - return padding; -} - -/** - * Extend AppMenu (AppIconMenu for pre gnome 41) - * - * - hide 'Show Details' according to setting - * - show windows header only if show-window-previews is disabled - * - Add close windows option based on quitfromdash extension - * (https://github.com/deuill/shell-extension-quitfromdash) - */ - -export class TaskbarSecondaryMenu extends AppMenu.AppMenu { - - constructor(source, side) { - super(source, side); - // constructor parameter does nos work for some reason - this._enableFavorites = true; - this._showSingleWindows = true; - - // Remove "Show Details" menu item - if(!SETTINGS.get_boolean('secondarymenu-contains-showdetails')) { - let existingMenuItems = this._getMenuItems(); - for (let i = 0; i < existingMenuItems.length; i++) { - let item = existingMenuItems[i]; - if (item !== undefined && item.label !== undefined) { - if (item.label.text == "Show Details") { - this.box.remove_child(item.actor); - } - } - } - } - - // replace quit item - delete this._quitItem; - this._quitItem = this.addAction(_('Quit'), () => this._quitFromTaskbar()); - } - - updateQuitText() { - let count = this.sourceActor.window ? 1 : - getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor).length; - - if ( count > 0) { - let quitFromTaskbarMenuText = ""; - if (count == 1) - quitFromTaskbarMenuText = _("Quit"); - else - quitFromTaskbarMenuText = ngettext('Quit %d Window', 'Quit %d Windows', count).format(count); - - this._quitItem.label.set_text(quitFromTaskbarMenuText); - } - } - - _quitFromTaskbar() { - let time = global.get_current_time() - let windows = - this.sourceActor.window ? // ungrouped applications - [this.sourceActor.window] : - getInterestingWindows(this._app, this.sourceActor.dtpPanel.monitor) - - if (windows.length == this._app.get_windows().length) - this._app.request_quit() - - GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - windows.forEach((w) => !!w.get_compositor_private() && w.delete(time++)); - - return GLib.SOURCE_REMOVE; - }); - } -} - -/** - * This function is used for extendDashItemContainer - */ -export function ItemShowLabel() { - if (!this._labelText) - return; - - this.label.set_text(this._labelText); - this.label.opacity = 0; - this.label.show(); - - let [stageX, stageY] = this.get_transformed_position(); - let node = this.label.get_theme_node(); - - let itemWidth = this.allocation.x2 - this.allocation.x1; - let itemHeight = this.allocation.y2 - this.allocation.y1; - - let labelWidth = this.label.get_width(); - let labelHeight = this.label.get_height(); - - let position = this._dtpPanel.getPosition(); - let labelOffset = node.get_length('-x-offset'); - - // From TaskbarItemContainer - if (this._getIconAnimationOffset) - labelOffset += this._getIconAnimationOffset(); - - let xOffset = Math.floor((itemWidth - labelWidth) / 2); - let x = stageX + xOffset - let y = stageY + (itemHeight - labelHeight) * .5; - - switch(position) { - case St.Side.TOP: - y = stageY + labelOffset + itemHeight; - break; - case St.Side.BOTTOM: - y = stageY - labelHeight - labelOffset; - break; - case St.Side.LEFT: - x = stageX + labelOffset + itemWidth; - break; - case St.Side.RIGHT: - x = stageX - labelWidth - labelOffset; - break; - } - - // keep the label inside the screen border - // Only needed for the x coordinate. - - // Leave a few pixel gap - let gap = LABEL_GAP; - let monitor = Main.layoutManager.findMonitorForActor(this); - if ( x - monitor.x < gap) - x += monitor.x - x + labelOffset; - else if ( x + labelWidth > monitor.x + monitor.width - gap) - x -= x + labelWidth -( monitor.x + monitor.width) + gap; - - this.label.set_position(Math.round(x), Math.round(y)); - - let duration = Dash.DASH_ITEM_LABEL_SHOW_TIME; - - if (duration > 1) { - duration /= 1000; - } - - Utils.animate(this.label, { - opacity: 255, - time: duration, - transition: 'easeOutQuad', - }); -} - -/** - * A wrapper class around the ShowAppsIcon class. - * - * - Pass settings to the constructor - * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) - * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) - * - * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. - * thus use this pattern where the real showAppsIcon object is encaptulated, and a reference to it will be properly wired upon - * use of this class in place of the original showAppsButton. - * - */ -export const ShowAppsIconWrapper = class extends EventEmitter { - - constructor(dtpPanel) { - super(); - - this.realShowAppsIcon = new Dash.ShowAppsIcon(); - - /* the variable equivalent to toggleButton has a different name in the appIcon class - (actor): duplicate reference to easily reuse appIcon methods */ - this.actor = this.realShowAppsIcon.toggleButton; - this.realShowAppsIcon.show(false); - - // Re-use appIcon methods - this._removeMenuTimeout = AppDisplay.AppIcon.prototype._removeMenuTimeout; - this._setPopupTimeout = AppDisplay.AppIcon.prototype._setPopupTimeout; - this._onKeyboardPopupMenu = AppDisplay.AppIcon.prototype._onKeyboardPopupMenu; - - // No action on clicked (showing of the appsview is controlled elsewhere) - this._onClicked = (actor, button) => this._removeMenuTimeout(); - - this.actor.connect('leave-event', this._onLeaveEvent.bind(this)); - this.actor.connect('button-press-event', this._onButtonPress.bind(this)); - this.actor.connect('touch-event', this._onTouchEvent.bind(this)); - this.actor.connect('clicked', this._onClicked.bind(this)); - this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); - - this._menu = null; - this._menuManager = new PopupMenu.PopupMenuManager(this.actor); - this._menuTimeoutId = 0; - - this.realShowAppsIcon._dtpPanel = dtpPanel; - Taskbar.extendDashItemContainer(this.realShowAppsIcon); - - let customIconPath = SETTINGS.get_string('show-apps-icon-file'); - - this.realShowAppsIcon.icon.createIcon = function(size) { - this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic', - icon_size: size, - style_class: 'show-apps-icon', - track_hover: true }); - - if (customIconPath) { - this._iconActor.gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(customIconPath) }); - } - - return this._iconActor; - }; - - this._changedShowAppsIconId = SETTINGS.connect('changed::show-apps-icon-file', () => { - customIconPath = SETTINGS.get_string('show-apps-icon-file'); - this.realShowAppsIcon.icon._createIconTexture(this.realShowAppsIcon.icon.iconSize); - }); - - this._changedAppIconPaddingId = SETTINGS.connect('changed::appicon-padding', () => this.setShowAppsPadding()); - this._changedAppIconSidePaddingId = SETTINGS.connect('changed::show-apps-icon-side-padding', () => this.setShowAppsPadding()); - - this.setShowAppsPadding(); - } - - _onButtonPress(_actor, event) { - let button = event.get_button(); - if (button == 1) { - this._setPopupTimeout(); - } else if (button == 3) { - this.popupMenu(); - return Clutter.EVENT_STOP; - } - return Clutter.EVENT_PROPAGATE; - } - - _onLeaveEvent(_actor, _event) { - this.actor.fake_release(); - this._removeMenuTimeout(); - } - - _onTouchEvent(actor, event) { - if (event.type() == Clutter.EventType.TOUCH_BEGIN) - this._setPopupTimeout(); - - return Clutter.EVENT_PROPAGATE; - } - - _onMenuPoppedDown() { - this._menu.sourceActor = this.actor; - this.actor.sync_hover(); - this.emit('menu-state-changed', false); - } - - setShowAppsPadding() { - let padding = getIconPadding(this.realShowAppsIcon._dtpPanel.monitor.index); - let sidePadding = SETTINGS.get_int('show-apps-icon-side-padding'); - let isVertical = this.realShowAppsIcon._dtpPanel.checkIfVertical(); - - this.actor.set_style('padding:' + (padding + (isVertical ? sidePadding : 0)) + 'px ' + (padding + (isVertical ? 0 : sidePadding)) + 'px;'); - } - - createMenu() { - if (!this._menu) { - this._menu = new MyShowAppsIconMenu(this.realShowAppsIcon, this.realShowAppsIcon._dtpPanel); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this._menu.actor.connect('destroy', () => { - Main.overview.disconnect(id); - }); - - // We want to keep the item hovered while the menu is up - this._menu.blockSourceEvents = true; - - Main.uiGroup.add_child(this._menu.actor); - this._menuManager.addMenu(this._menu); - } - } - - popupMenu(sourceActor = null) { - this._removeMenuTimeout(); - this.actor.fake_release(); - this.createMenu(); - - this._menu.updateItems(sourceActor == null ? this.realShowAppsIcon : sourceActor); - - this.actor.set_hover(true); - this._menu.open(BoxPointer.PopupAnimation.FULL); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } - - shouldShowTooltip() { - return SETTINGS.get_boolean('show-tooltip') && - (this.actor.hover && (!this._menu || !this._menu.isOpen)); - } - - destroy() { - SETTINGS.disconnect(this._changedShowAppsIconId); - SETTINGS.disconnect(this._changedAppIconSidePaddingId); - SETTINGS.disconnect(this._changedAppIconPaddingId); - - this.realShowAppsIcon.destroy(); - } -}; - -/** - * A menu for the showAppsIcon - */ -export const MyShowAppsIconMenu = class extends PopupMenu.PopupMenu { - - constructor(actor, dtpPanel) { - super(actor, 0, dtpPanel.getPosition()); - - this._dtpPanel = dtpPanel; - - this.updateItems(actor); - } - - updateItems(sourceActor) { - this.sourceActor = sourceActor; - - this.removeAll(); - - if (this.sourceActor != Main.layoutManager.dummyCursor) { - this._appendItem({ - title: _('Power options'), - cmd: ['gnome-control-center', 'power'] - }); - - this._appendItem({ - title: _('Event logs'), - cmd: ['gnome-logs'] - }); - - this._appendItem({ - title: _('System'), - cmd: ['gnome-control-center', 'info-overview'] - }); - - this._appendItem({ - title: _('Device Management'), - cmd: ['gnome-control-center', 'display'] - }); - - this._appendItem({ - title: _('Disk Management'), - cmd: ['gnome-disks'] - }); - - this._appendList( - SETTINGS.get_strv('show-apps-button-context-menu-commands'), - SETTINGS.get_strv('show-apps-button-context-menu-titles') - ) - - this._appendSeparator(); - } - - this._appendItem({ - title: _('Terminal'), - cmd: [TERMINALSETTINGS.get_string('exec')] - }); - - this._appendItem({ - title: _('System monitor'), - cmd: ['gnome-system-monitor'] - }); - - this._appendItem({ - title: _('Files'), - cmd: ['nautilus'] - }); - - this._appendItem({ - title: _('Extensions'), - cmd: ['gnome-shell-extension-prefs'] - }); - - this._appendItem({ - title: _('Settings'), - cmd: ['gnome-control-center'] - }); - - this._appendList( - SETTINGS.get_strv('panel-context-menu-commands'), - SETTINGS.get_strv('panel-context-menu-titles') - ) - - this._appendSeparator(); - - let lockTaskbarMenuItem = this._appendMenuItem(SETTINGS.get_boolean('taskbar-locked') ? _('Unlock taskbar') : _('Lock taskbar')); - lockTaskbarMenuItem.connect('activate', () => { - SETTINGS.set_boolean('taskbar-locked', !SETTINGS.get_boolean('taskbar-locked')); - }); - - let settingsMenuItem = this._appendMenuItem(_('Dash to Panel Settings')); - settingsMenuItem.connect('activate', () => DTP_EXTENSION.openPreferences()) - - if(this.sourceActor == Main.layoutManager.dummyCursor) { - this._appendSeparator(); - let item = this._appendMenuItem(this._dtpPanel._restoreWindowList ? _('Restore Windows') : _('Show Desktop')); - item.connect('activate', this._dtpPanel._onShowDesktopButtonPress.bind(this._dtpPanel)); - } - } - - - // Only add menu entries for commands that exist in path - _appendItem(info) { - if (GLib.find_program_in_path(info.cmd[0])) { - let item = this._appendMenuItem(_(info.title)); - - item.connect('activate', function() { - print("activated: " + info.title); - Util.spawn(info.cmd); - }); - return item; - } - - return null; - } - - _appendList(commandList, titleList) { - if (commandList.length != titleList.length) { - return; - } - - for (let entry = 0; entry < commandList.length; entry++) { - this._appendItem({ - title: titleList[entry], - cmd: commandList[entry].split(' ') - }); - } - } - - _appendSeparator() { - let separator = new PopupMenu.PopupSeparatorMenuItem(); - this.addMenuItem(separator); - } - - _appendMenuItem(labelText) { - // FIXME: app-well-menu-item style - let item = new PopupMenu.PopupMenuItem(labelText); - this.addMenuItem(item); - return item; - } -}; - - -export const getIconContainerStyle = function(isVertical) { - let style = 'padding: '; - - if (SETTINGS.get_boolean('group-apps')) { - style += (isVertical ? '0;' : '0 ' + DEFAULT_PADDING_SIZE + 'px;'); - } else { - style += (isVertical ? '' : '0 ') + DEFAULT_PADDING_SIZE + 'px;'; - } - - return style; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/desktopIconsIntegration.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/desktopIconsIntegration.js deleted file mode 100644 index e403516d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/desktopIconsIntegration.js +++ /dev/null @@ -1,165 +0,0 @@ -/* - * The code in this file is distributed under a "1-clause BSD license", - * which makes it compatible with GPLv2 and GPLv3 too, and others. - * - * License text: - * - * Copyright (C) 2021 Sergio Costas (rastersoft@gmail.com) - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/******************************************************************************* - * Integration class - * - * This class must be added to other extensions in order to integrate - * them with Desktop Icons NG. It allows an extension to notify how much margin - * it uses in each side of each monitor. - * - * DON'T SEND PATCHES TO THIS FILE TO THE EXTENSION MAINTAINER. SEND THEM TO - * DESKTOP ICONS NG MAINTAINER: https://gitlab.com/rastersoft/desktop-icons-ng - * - * In the *enable()* function, create a *DesktopIconsUsableAreaClass()* - * object with - * - * new DesktopIconsIntegration.DesktopIconsUsableAreaClass(object); - * - * Now, in the *disable()* function just call to the *destroy()* method before - * nullifying the pointer. You must create a new object in enable() the next - * time the extension is enabled. - * - * In your code, every time you change the margins, you should call first to - * *resetMargins()* method to clear the current margins, and then call to - * *setMargins(...)* method as many times as you need to set the margins in each - * monitor. You don't need to call it for all the monitors, only for those where - * you are painting something. If you don't set values for a monitor, they will - * be considered zero. - * - * The margins values are relative to the monitor border. - * - *******************************************************************************/ - -import GLib from 'gi://GLib'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as ExtensionUtils from 'resource:///org/gnome/shell/misc/extensionUtils.js'; -import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; - -const IDENTIFIER_UUID = "130cbc66-235c-4bd6-8571-98d2d8bba5e2"; - -export class DesktopIconsUsableAreaClass { - _checkIfExtensionIsEnabled(extension) { - return (extension?.state === ExtensionUtils.ExtensionState.ENABLED) || - (extension?.state === ExtensionUtils.ExtensionState.ACTIVE); - } - - constructor() { - const Me = Extension.lookupByURL(import.meta.url); - this._UUID = Me.uuid; - this._extensionManager = Main.extensionManager; - this._timedMarginsID = 0; - this._margins = {}; - this._emID = this._extensionManager.connect('extension-state-changed', (_obj, extension) => { - if (!extension) - return; - - // If an extension is being enabled and lacks the DesktopIconsUsableArea object, we can avoid launching a refresh - if (this._checkIfExtensionIsEnabled(extension)) { - this._sendMarginsToExtension(extension); - return; - } - // if the extension is being disabled, we must do a full refresh, because if there were other extensions originally - // loaded after that extension, those extensions will be disabled and enabled again without notification - this._changedMargins(); - }); - } - - /** - * Sets or updates the top, bottom, left and right margins for a - * monitor. Values are measured from the monitor border (and NOT from - * the workspace border). - * - * @param {int} monitor Monitor number to which set the margins. - * A negative value means "the primary monitor". - * @param {int} top Top margin in pixels - * @param {int} bottom Bottom margin in pixels - * @param {int} left Left margin in pixels - * @param {int} right Right margin in pixels - */ - setMargins(monitor, top, bottom, left, right) { - this._margins[monitor] = { - 'top': top, - 'bottom': bottom, - 'left': left, - 'right': right - }; - this._changedMargins(); - } - - /** - * Clears the current margins. Must be called before configuring the monitors - * margins with setMargins(). - */ - resetMargins() { - this._margins = {}; - this._changedMargins(); - } - - /** - * Disconnects all the signals and removes the margins. - */ - destroy() { - if (this._emID) { - this._extensionManager.disconnect(this._emID); - this._emID = 0; - } - if (this._timedMarginsID) { - GLib.source_remove(this._timedMarginsID); - this._timedMarginsID = 0; - } - this._margins = null; - this._changedMargins(); - } - - _changedMargins() { - if (this._timedMarginsID) { - GLib.source_remove(this._timedMarginsID); - } - this._timedMarginsID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, ()=> { - this._sendMarginsToAll(); - this._timedMarginsID = 0; - return GLib.SOURCE_REMOVE; - }); - } - - _sendMarginsToAll() { - this._extensionManager.getUuids().forEach(uuid => - this._sendMarginsToExtension(this._extensionManager.lookup(uuid))); - } - - _sendMarginsToExtension(extension) { - // check that the extension is an extension that has the logic to accept - // working margins - if (!this._checkIfExtensionIsEnabled(extension)) - return; - - const usableArea = extension?.stateObj?.DesktopIconsUsableArea; - if (usableArea?.uuid === IDENTIFIER_UUID) - usableArea.setMarginsForExtension(this._UUID, this._margins); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/executable_panelManager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/executable_panelManager.js deleted file mode 100644 index 917c91dd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/executable_panelManager.js +++ /dev/null @@ -1,773 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * - * Code to re-anchor the panel was taken from Thoma5 BottomPanel: - * https://github.com/Thoma5/gnome-shell-extension-bottompanel - * - * Pattern for moving clock based on Frippery Move Clock by R M Yorston - * http://frippery.org/extensions/ - * - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -import * as Overview from './overview.js'; -import * as Panel from './panel.js'; -import * as PanelSettings from './panelSettings.js'; -import * as Proximity from './proximity.js'; -import * as Utils from './utils.js'; -import * as DesktopIconsIntegration from './desktopIconsIntegration.js'; - -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Clutter from 'gi://Clutter'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; - -import * as BoxPointer from 'resource:///org/gnome/shell/ui/boxpointer.js'; -import * as LookingGlass from 'resource:///org/gnome/shell/ui/lookingGlass.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as Layout from 'resource:///org/gnome/shell/ui/layout.js'; -import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js'; -import {SETTINGS} from './extension.js'; -import {SecondaryMonitorDisplay, WorkspacesView} from 'resource:///org/gnome/shell/ui/workspacesView.js'; - - -export const PanelManager = class { - - constructor() { - this.overview = new Overview.Overview(); - this.panelsElementPositions = {}; - this._injectionManager = new InjectionManager(); - - this._saveMonitors(); - } - - enable(reset) { - let dtpPrimaryIndex = SETTINGS.get_int('primary-monitor'); - - this.allPanels = []; - this.dtpPrimaryMonitor = Main.layoutManager.monitors[dtpPrimaryIndex] || Main.layoutManager.primaryMonitor; - this.proximityManager = new Proximity.ProximityManager(); - - if (this.dtpPrimaryMonitor) { - this.primaryPanel = this._createPanel(this.dtpPrimaryMonitor, SETTINGS.get_boolean('stockgs-keep-top-panel')); - this.allPanels.push(this.primaryPanel); - this.overview.enable(this.primaryPanel); - - this.setFocusedMonitor(this.dtpPrimaryMonitor); - } - - if (SETTINGS.get_boolean('multi-monitors')) { - Main.layoutManager.monitors.filter(m => m != this.dtpPrimaryMonitor).forEach(m => { - this.allPanels.push(this._createPanel(m, true)); - }); - } - - global.dashToPanel.panels = this.allPanels; - global.dashToPanel.emit('panels-created'); - - this.allPanels.forEach(p => { - let panelPosition = p.getPosition(); - let leftOrRight = (panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT); - - p.panelBox.set_size( - leftOrRight ? -1 : p.geom.w + p.geom.lrPadding, - leftOrRight ? p.geom.h + p.geom.tbPadding : -1 - ); - - this._findPanelMenuButtons(p.panelBox).forEach(pmb => this._adjustPanelMenuButton(pmb, p.monitor, panelPosition)); - - p.taskbar.iconAnimator.start(); - }); - - this._setDesktopIconsMargins(); - //in 3.32, BoxPointer now inherits St.Widget - if (BoxPointer.BoxPointer.prototype.vfunc_get_preferred_height) { - let panelManager = this; - - this._injectionManager.overrideMethod(BoxPointer.BoxPointer.prototype, 'vfunc_get_preferred_height', () => function(forWidth) { - let alloc = { min_size: 0, natural_size: 0 }; - - [alloc.min_size, alloc.natural_size] = this.vfunc_get_preferred_height(forWidth); - - return panelManager._getBoxPointerPreferredHeight(this, alloc); - }); - } - - this._updatePanelElementPositions(); - - if (reset) return; - - this._desktopIconsUsableArea = new DesktopIconsIntegration.DesktopIconsUsableAreaClass(); - - this._oldUpdatePanelBarrier = Main.layoutManager._updatePanelBarrier; - Main.layoutManager._updatePanelBarrier = (panel) => { - let panelUpdates = panel ? [panel] : this.allPanels; - - panelUpdates.forEach(p => newUpdatePanelBarrier.call(Main.layoutManager, p)); - }; - Main.layoutManager._updatePanelBarrier(); - - this._oldUpdateHotCorners = Main.layoutManager._updateHotCorners; - Main.layoutManager._updateHotCorners = newUpdateHotCorners.bind(Main.layoutManager); - Main.layoutManager._updateHotCorners(); - - this._forceHotCornerId = SETTINGS.connect('changed::stockgs-force-hotcorner', () => Main.layoutManager._updateHotCorners()); - - if (Main.layoutManager._interfaceSettings) { - this._enableHotCornersId = Main.layoutManager._interfaceSettings.connect('changed::enable-hot-corners', () => Main.layoutManager._updateHotCorners()); - } - - this._oldUpdateWorkspacesViews = Main.overview._overview._controls._workspacesDisplay._updateWorkspacesViews; - Main.overview._overview._controls._workspacesDisplay._updateWorkspacesViews = this._newUpdateWorkspacesViews.bind(Main.overview._overview._controls._workspacesDisplay); - - this._oldSetPrimaryWorkspaceVisible = Main.overview._overview._controls._workspacesDisplay.setPrimaryWorkspaceVisible - Main.overview._overview._controls._workspacesDisplay.setPrimaryWorkspaceVisible = this._newSetPrimaryWorkspaceVisible.bind(Main.overview._overview._controls._workspacesDisplay); - - LookingGlass.LookingGlass.prototype._oldResize = LookingGlass.LookingGlass.prototype._resize; - LookingGlass.LookingGlass.prototype._resize = _newLookingGlassResize; - - LookingGlass.LookingGlass.prototype._oldOpen = LookingGlass.LookingGlass.prototype.open; - LookingGlass.LookingGlass.prototype.open = _newLookingGlassOpen; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - //listen settings - this._signalsHandler.add( - [ - SETTINGS, - [ - 'changed::primary-monitor', - 'changed::multi-monitors', - 'changed::isolate-monitors', - 'changed::panel-positions', - 'changed::panel-lengths', - 'changed::panel-anchors', - 'changed::stockgs-keep-top-panel' - ], - () => this._reset() - ], - [ - SETTINGS, - 'changed::panel-element-positions', - () => this._updatePanelElementPositions() - ], - [ - SETTINGS, - 'changed::intellihide-key-toggle-text', - () => this._setKeyBindings(true) - ], - [ - SETTINGS, - 'changed::panel-sizes', - () => { - GLib.idle_add(GLib.PRIORITY_LOW, () => { - this._setDesktopIconsMargins(); - return GLib.SOURCE_REMOVE; - }); - } - ], - [ - Utils.DisplayWrapper.getMonitorManager(), - 'monitors-changed', - () => { - if (Main.layoutManager.primaryMonitor) { - this._saveMonitors(); - this._reset(); - } - } - ] - ); - - Panel.panelBoxes.forEach(c => this._signalsHandler.add( - [ - Main.panel[c], - 'child-added', - (parent, child) => { - this.primaryPanel && - child instanceof St.Bin && - this._adjustPanelMenuButton(this._getPanelMenuButton(child.get_first_child()), this.primaryPanel.monitor, this.primaryPanel.getPosition()) - } - ] - )); - - this._setKeyBindings(true); - - // keep GS overview.js from blowing away custom panel styles - if(!SETTINGS.get_boolean('stockgs-keep-top-panel')) - Object.defineProperty(Main.panel, "style", {configurable: true, set(v) {}}); - } - - disable(reset) { - this.primaryPanel && this.overview.disable(); - this.proximityManager.destroy(); - - this.allPanels.forEach(p => { - p.taskbar.iconAnimator.pause(); - - this._findPanelMenuButtons(p.panelBox).forEach(pmb => { - if (pmb.menu._boxPointer._dtpGetPreferredHeightId) { - pmb.menu._boxPointer._container.disconnect(pmb.menu._boxPointer._dtpGetPreferredHeightId); - } - - pmb.menu._boxPointer.sourceActor = pmb.menu._boxPointer._dtpSourceActor; - delete pmb.menu._boxPointer._dtpSourceActor; - pmb.menu._boxPointer._userArrowSide = St.Side.TOP; - }) - - this._removePanelBarriers(p); - - p.disable(); - - let clipContainer = p.panelBox.get_parent(); - - Main.layoutManager._untrackActor(p.panelBox); - Main.layoutManager.removeChrome(clipContainer); - - if (p.isStandalone) { - p.panelBox.destroy(); - } else { - p.panelBox.remove_child(p); - p.remove_child(p.panel); - p.panelBox.add_child(p.panel); - - p.panelBox.set_position(clipContainer.x, clipContainer.y); - - clipContainer.remove_child(p.panelBox); - Main.layoutManager.addChrome(p.panelBox, { affectsStruts: true, trackFullscreen: true }); - } - }); - - this._injectionManager.clear(); - - if (Main.layoutManager.primaryMonitor) { - Main.layoutManager.panelBox.set_position(Main.layoutManager.primaryMonitor.x, Main.layoutManager.primaryMonitor.y); - Main.layoutManager.panelBox.set_size(Main.layoutManager.primaryMonitor.width, -1); - } - - if (reset) return; - - this._setKeyBindings(false); - - this._signalsHandler.destroy(); - - Main.layoutManager._updateHotCorners = this._oldUpdateHotCorners; - Main.layoutManager._updateHotCorners(); - - SETTINGS.disconnect(this._forceHotCornerId); - - if (this._enableHotCornersId) { - Main.layoutManager._interfaceSettings.disconnect(this._enableHotCornersId); - } - - Main.layoutManager._updatePanelBarrier = this._oldUpdatePanelBarrier; - Main.layoutManager._updatePanelBarrier(); - - Main.overview._overview._controls._workspacesDisplay._updateWorkspacesViews = this._oldUpdateWorkspacesViews; - Main.overview._overview._controls._workspacesDisplay.setPrimaryWorkspaceVisible = this._oldSetPrimaryWorkspaceVisible; - - LookingGlass.LookingGlass.prototype._resize = LookingGlass.LookingGlass.prototype._oldResize; - delete LookingGlass.LookingGlass.prototype._oldResize; - - LookingGlass.LookingGlass.prototype.open = LookingGlass.LookingGlass.prototype._oldOpen; - delete LookingGlass.LookingGlass.prototype._oldOpen - - delete Main.panel.style; - this._desktopIconsUsableArea.destroy(); - this._desktopIconsUsableArea = null; - } - - _setDesktopIconsMargins() { - this._desktopIconsUsableArea?.resetMargins(); - this.allPanels.forEach(p => { - switch(p.geom.position) { - case St.Side.TOP: - this._desktopIconsUsableArea?.setMargins(p.monitor.index, p.geom.h, 0, 0, 0); - break; - case St.Side.BOTTOM: - this._desktopIconsUsableArea?.setMargins(p.monitor.index, 0, p.geom.h, 0, 0); - break; - case St.Side.LEFT: - this._desktopIconsUsableArea?.setMargins(p.monitor.index, 0, 0, p.geom.w, 0); - break; - case St.Side.RIGHT: - this._desktopIconsUsableArea?.setMargins(p.monitor.index, 0, 0, 0, p.geom.w); - break; - } - }); - } - - setFocusedMonitor(monitor) { - this.focusedMonitorPanel = this.allPanels.find(p => p.monitor == monitor) - - if (!this.checkIfFocusedMonitor(monitor)) { - Main.overview._overview.clear_constraints(); - Main.overview._overview.add_constraint(new Layout.MonitorConstraint({ index: monitor.index })); - - Main.overview._overview._controls._workspacesDisplay._primaryIndex = monitor.index; - } - } - - _newSetPrimaryWorkspaceVisible(visible) { - if (this._primaryVisible === visible) - return; - - this._primaryVisible = visible; - - const primaryIndex = Main.overview._overview._controls._workspacesDisplay._primaryIndex; - const primaryWorkspace = this._workspacesViews[primaryIndex]; - if (primaryWorkspace) - primaryWorkspace.visible = visible; - } - - _newUpdateWorkspacesViews() { - for (let i = 0; i < this._workspacesViews.length; i++) - this._workspacesViews[i].destroy(); - - this._workspacesViews = []; - let monitors = Main.layoutManager.monitors; - for (let i = 0; i < monitors.length; i++) { - let view; - if (i === this._primaryIndex) { - view = new WorkspacesView(i, - this._controls, - this._scrollAdjustment, - this._fitModeAdjustment, - this._overviewAdjustment); - - view.visible = this._primaryVisible; - this.bind_property('opacity', view, 'opacity', GObject.BindingFlags.SYNC_CREATE); - this.add_child(view); - } else { - // No idea why atm, but we need the import at the top of this file and to use the - // full imports ns here, otherwise SecondaryMonitorDisplay can't be used ¯\_(ツ)_/¯ - view = new SecondaryMonitorDisplay(i, - this._controls, - this._scrollAdjustment, - this._fitModeAdjustment, - this._overviewAdjustment); - Main.layoutManager.overviewGroup.add_child(view); - } - - this._workspacesViews.push(view); - } - } - - _saveMonitors() { - //Mutter meta_monitor_manager_get_primary_monitor (global.display.get_primary_monitor()) doesn't return the same - //monitor as GDK gdk_screen_get_primary_monitor (imports.gi.Gdk.Screen.get_default().get_primary_monitor()). - //Since the Mutter function is what's used in gnome-shell and we can't access it from the settings dialog, store - //the monitors information in a setting so we can use the same monitor indexes as the ones in gnome-shell - let keyMonitors = 'available-monitors'; - let keyPrimary = 'primary-monitor'; - let primaryIndex = Main.layoutManager.primaryIndex; - let newMonitors = [primaryIndex]; - let savedMonitors = SETTINGS.get_value(keyMonitors).deep_unpack(); - let dtpPrimaryIndex = SETTINGS.get_int(keyPrimary); - let newDtpPrimaryIndex = primaryIndex; - - Main.layoutManager.monitors.filter(m => m.index != primaryIndex).forEach(m => newMonitors.push(m.index)); - - if (savedMonitors[0] != dtpPrimaryIndex) { - // dash to panel primary wasn't the gnome-shell primary (first index of available-monitors) - let savedIndex = savedMonitors.indexOf(dtpPrimaryIndex) - - // default to primary if it was set to a monitor that is no longer available - newDtpPrimaryIndex = newMonitors[savedIndex]; - newDtpPrimaryIndex = newDtpPrimaryIndex == null ? primaryIndex : newDtpPrimaryIndex; - } - - SETTINGS.set_int(keyPrimary, newDtpPrimaryIndex); - SETTINGS.set_value(keyMonitors, new GLib.Variant('ai', newMonitors)); - } - - checkIfFocusedMonitor(monitor) { - return Main.overview._overview._controls._workspacesDisplay._primaryIndex == monitor.index; - } - - _createPanel(monitor, isStandalone) { - let panelBox; - let panel; - let clipContainer = new Clutter.Actor(); - - if (isStandalone) { - panelBox = new St.BoxLayout({ name: 'panelBox' }); - } else { - panelBox = Main.layoutManager.panelBox; - Main.layoutManager._untrackActor(panelBox); - panelBox.remove_child(Main.panel); - Main.layoutManager.removeChrome(panelBox); - } - - Main.layoutManager.addChrome(clipContainer, { affectsInputRegion: false }); - clipContainer.add_child(panelBox); - Main.layoutManager.trackChrome(panelBox, { trackFullscreen: true, affectsStruts: true, affectsInputRegion: true }); - - panel = new Panel.Panel(this, monitor, panelBox, isStandalone); - panelBox.add_child(panel); - panel.enable(); - - panelBox.visible = true; - if (monitor.inFullscreen) { - panelBox.hide(); - } - panelBox.set_position(0, 0); - - return panel; - } - - _reset() { - this.disable(true); - this.allPanels = []; - this.enable(true); - } - - _updatePanelElementPositions() { - this.panelsElementPositions = PanelSettings.getSettingsJson(SETTINGS, 'panel-element-positions'); - this.allPanels.forEach(p => p.updateElementPositions()); - } - - _adjustPanelMenuButton(button, monitor, arrowSide) { - if (button) { - button.menu._boxPointer._dtpSourceActor = button.menu._boxPointer.sourceActor; - button.menu._boxPointer.sourceActor = button; - button.menu._boxPointer._userArrowSide = arrowSide; - button.menu._boxPointer._dtpInPanel = 1; - - if (!button.menu._boxPointer.vfunc_get_preferred_height) { - button.menu._boxPointer._dtpGetPreferredHeightId = button.menu._boxPointer._container.connect('get-preferred-height', (actor, forWidth, alloc) => { - this._getBoxPointerPreferredHeight(button.menu._boxPointer, alloc, monitor); - }); - } - } - } - - _getBoxPointerPreferredHeight(boxPointer, alloc, monitor) { - if (boxPointer._dtpInPanel && boxPointer.sourceActor && SETTINGS.get_boolean('intellihide')) { - monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor); - let panel = Utils.find(global.dashToPanel.panels, p => p.monitor == monitor); - let excess = alloc.natural_size + panel.dtpSize + 10 - monitor.height; // 10 is arbitrary - - if (excess > 0) { - alloc.natural_size -= excess; - } - } - - return [alloc.min_size, alloc.natural_size]; - } - - _findPanelMenuButtons(container) { - let panelMenuButtons = []; - let panelMenuButton; - - let find = parent => parent.get_children().forEach(c => { - if ((panelMenuButton = this._getPanelMenuButton(c))) { - panelMenuButtons.push(panelMenuButton); - } - - find(c); - }); - - find(container); - - return panelMenuButtons; - } - - _removePanelBarriers(panel) { - if (panel.isStandalone && panel._rightPanelBarrier) { - panel._rightPanelBarrier.destroy(); - } - - if (panel._leftPanelBarrier) { - panel._leftPanelBarrier.destroy(); - delete panel._leftPanelBarrier; - } - } - - _getPanelMenuButton(obj) { - return obj instanceof PanelMenu.Button && obj.menu?._boxPointer ? obj : 0; - } - - _setKeyBindings(enable) { - let keys = { - 'intellihide-key-toggle': () => this.allPanels.forEach(p => p.intellihide.toggle()) - }; - - Object.keys(keys).forEach(k => { - Utils.removeKeybinding(k); - - if (enable) { - Utils.addKeybinding(k, SETTINGS, keys[k], Shell.ActionMode.NORMAL); - } - }); - } - -}; - -// This class drives long-running icon animations, to keep them running in sync -// with each other. -export const IconAnimator = class { - - constructor(actor) { - this._count = 0; - this._started = false; - this._animations = { - dance: [], - }; - this._timeline = new Clutter.Timeline({ - duration: 3000, - repeat_count: -1, - }); - - /* Just use the construction property when no need to support 3.36 */ - if (this._timeline.set_actor) - this._timeline.set_actor(actor); - - this._timeline.connect('new-frame', () => { - const progress = this._timeline.get_progress(); - const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; - const dancers = this._animations.dance; - for (let i = 0, iMax = dancers.length; i < iMax; i++) { - dancers[i].target.rotation_angle_z = danceRotation; - } - }); - } - - destroy() { - this._timeline.stop(); - this._timeline = null; - for (let name in this._animations) { - const pairs = this._animations[name]; - for (let i = 0, iMax = pairs.length; i < iMax; i++) { - const pair = pairs[i]; - pair.target.disconnect(pair.targetDestroyId); - } - } - this._animations = null; - } - - pause() { - if (this._started && this._count > 0) { - this._timeline.stop(); - } - this._started = false; - } - - start() { - if (!this._started && this._count > 0) { - this._timeline.start(); - } - this._started = true; - } - - addAnimation(target, name) { - const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); - this._animations[name].push({ target: target, targetDestroyId: targetDestroyId }); - if (this._started && this._count === 0) { - this._timeline.start(); - } - this._count++; - } - - removeAnimation(target, name) { - const pairs = this._animations[name]; - for (let i = 0, iMax = pairs.length; i < iMax; i++) { - const pair = pairs[i]; - if (pair.target === target) { - target.disconnect(pair.targetDestroyId); - pairs.splice(i, 1); - this._count--; - if (this._started && this._count === 0) { - this._timeline.stop(); - } - return; - } - } - } -}; - -function newUpdateHotCorners() { - // destroy old hot corners - this.hotCorners.forEach(function(corner) { - if (corner) - corner.destroy(); - }); - this.hotCorners = []; - - //global.settings is ubuntu specific setting to disable the hot corner (Tweak tool > Top Bar > Activities Overview Hot Corner) - //this._interfaceSettings is for the setting to disable the hot corner introduced in gnome-shell 3.34 - if ((global.settings.list_keys().indexOf('enable-hot-corners') >= 0 && !global.settings.get_boolean('enable-hot-corners')) || - (this._interfaceSettings && !this._interfaceSettings.get_boolean('enable-hot-corners'))) { - this.emit('hot-corners-changed'); - return; - } - - // build new hot corners - for (let i = 0; i < this.monitors.length; i++) { - let panel = Utils.find(global.dashToPanel.panels, p => p.monitor.index == i); - let panelPosition = panel ? panel.getPosition() : St.Side.BOTTOM; - let panelTopLeft = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT; - let monitor = this.monitors[i]; - let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x; - let cornerY = monitor.y; - - let haveTopLeftCorner = true; - - // If the panel is on the bottom, unless this is explicitly forced, don't add a topleft - // hot corner unless it is actually a top left panel. Otherwise, it stops the mouse - // as you are dragging across. In the future, maybe we will automatically move the - // hotcorner to the bottom when the panel is positioned at the bottom - if (i != this.primaryIndex || (!panelTopLeft && !SETTINGS.get_boolean('stockgs-force-hotcorner'))) { - // Check if we have a top left (right for RTL) corner. - // I.e. if there is no monitor directly above or to the left(right) - let besideX = this._rtl ? monitor.x + 1 : cornerX - 1; - let besideY = cornerY; - let aboveX = cornerX; - let aboveY = cornerY - 1; - - for (let j = 0; j < this.monitors.length; j++) { - if (i == j) - continue; - let otherMonitor = this.monitors[j]; - if (besideX >= otherMonitor.x && - besideX < otherMonitor.x + otherMonitor.width && - besideY >= otherMonitor.y && - besideY < otherMonitor.y + otherMonitor.height) { - haveTopLeftCorner = false; - break; - } - if (aboveX >= otherMonitor.x && - aboveX < otherMonitor.x + otherMonitor.width && - aboveY >= otherMonitor.y && - aboveY < otherMonitor.y + otherMonitor.height) { - haveTopLeftCorner = false; - break; - } - } - } - - if (haveTopLeftCorner) { - let corner = new Layout.HotCorner(this, monitor, cornerX, cornerY); - - corner.setBarrierSize = size => Object.getPrototypeOf(corner).setBarrierSize.call(corner, Math.min(size, 32)); - corner.setBarrierSize(panel ? panel.dtpSize : 32); - this.hotCorners.push(corner); - } else { - this.hotCorners.push(null); - } - } - - this.emit('hot-corners-changed'); -} - -function newUpdatePanelBarrier(panel) { - let barriers = { - _rightPanelBarrier: [(panel.isStandalone ? panel : this)], - _leftPanelBarrier: [panel] - }; - - Object.keys(barriers).forEach(k => { - let obj = barriers[k][0]; - - if (obj[k]) { - obj[k].destroy(); - obj[k] = null; - } - }); - - if (!this.primaryMonitor || !panel.panelBox.height) { - return; - } - - let barrierSize = Math.min(10, panel.panelBox.height); - let fixed1 = panel.monitor.y; - let fixed2 = panel.monitor.y + barrierSize; - - if (panel.checkIfVertical()) { - barriers._rightPanelBarrier.push(panel.monitor.y + panel.monitor.height, Meta.BarrierDirection.NEGATIVE_Y); - barriers._leftPanelBarrier.push(panel.monitor.y, Meta.BarrierDirection.POSITIVE_Y); - } else { - barriers._rightPanelBarrier.push(panel.monitor.x + panel.monitor.width, Meta.BarrierDirection.NEGATIVE_X); - barriers._leftPanelBarrier.push(panel.monitor.x, Meta.BarrierDirection.POSITIVE_X); - } - - switch (panel.getPosition()) { - //values are initialized as St.Side.TOP - case St.Side.BOTTOM: - fixed1 = panel.monitor.y + panel.monitor.height - barrierSize; - fixed2 = panel.monitor.y + panel.monitor.height; - break; - case St.Side.LEFT: - fixed1 = panel.monitor.x + barrierSize; - fixed2 = panel.monitor.x; - break; - case St.Side.RIGHT: - fixed1 = panel.monitor.x + panel.monitor.width - barrierSize; - fixed2 = panel.monitor.x + panel.monitor.width; - break; - } - - //remove left barrier if it overlaps one of the hotcorners - for (let k in this.hotCorners) { - let hc = this.hotCorners[k]; - - if (hc && hc._monitor == panel.monitor && - ((fixed1 == hc._x || fixed2 == hc._x) || fixed1 == hc._y || fixed2 == hc._y)) { - delete barriers._leftPanelBarrier; - break; - } - } - - Object.keys(barriers).forEach(k => { - let barrierOptions = { - backend: global.backend, - directions: barriers[k][2] - }; - - barrierOptions[panel.varCoord.c1] = barrierOptions[panel.varCoord.c2] = barriers[k][1]; - barrierOptions[panel.fixedCoord.c1] = fixed1; - barrierOptions[panel.fixedCoord.c2] = fixed2; - - barriers[k][0][k] = new Meta.Barrier(barrierOptions); - }); -} - -function _newLookingGlassResize() { - let primaryMonitorPanel = Utils.find(global.dashToPanel.panels, p => p.monitor == Main.layoutManager.primaryMonitor); - let topOffset = primaryMonitorPanel.getPosition() == St.Side.TOP ? primaryMonitorPanel.dtpSize + 8 : 32; - - this._oldResize(); - - this._hiddenY = Main.layoutManager.primaryMonitor.y + topOffset - this.height; - this._targetY = this._hiddenY + this.height; - this.y = this._hiddenY; - - this._objInspector.set_position(this.x + Math.floor(this.width * 0.1), this._targetY + Math.floor(this.height * 0.1)); -} - -function _newLookingGlassOpen() { - if (this._open) - return; - - this._resize(); - this._oldOpen(); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/extension.js deleted file mode 100644 index f35f903e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/extension.js +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Dash-To-Panel extension for Gnome 3 - * Copyright 2016 Jason DeRose (jderose9) and Charles Gagnon (charlesg99) - * - * 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 2 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'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; -import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as PanelManager from './panelManager.js'; -import * as Utils from './utils.js'; -import * as AppIcons from './appIcons.js'; - - -const UBUNTU_DOCK_UUID = 'ubuntu-dock@ubuntu.com'; - -let panelManager; -let extensionChangedHandler; -let startupCompleteHandler; -let disabledUbuntuDock; -let extensionSystem = Main.extensionManager; - -export let DTP_EXTENSION = null; -export let SETTINGS = null; -export let DESKTOPSETTINGS = null; -export let TERMINALSETTINGS = null; -export let PERSISTENTSTORAGE = null; -export let EXTENSION_UUID = null; -export let EXTENSION_PATH = null; - -export default class DashToPanelExtension extends Extension { - constructor(metadata) { - super(metadata); - - this._realHasOverview = Main.sessionMode.hasOverview; - - //create an object that persists until gnome-shell is restarted, even if the extension is disabled - PERSISTENTSTORAGE = {}; - } - - enable() { - DTP_EXTENSION = this; - - // The Ubuntu Dock extension might get enabled after this extension - extensionChangedHandler = extensionSystem.connect('extension-state-changed', (data, extension) => { - if (extension.uuid === UBUNTU_DOCK_UUID && extension.state === 1) { - _enable(this); - } - }); - - //create a global object that can emit signals and conveniently expose functionalities to other extensions - global.dashToPanel = new EventEmitter(); - - _enable(this); - } - - disable(reset = false) { - panelManager.disable(); - - DTP_EXTENSION = null; - SETTINGS = null; - DESKTOPSETTINGS = null; - TERMINALSETTINGS = null; - panelManager = null; - - if (!reset) { - extensionSystem.disconnect(extensionChangedHandler); - delete global.dashToPanel; - - // Re-enable Ubuntu Dock if it was disabled by dash to panel - if (disabledUbuntuDock) { - (extensionSystem._callExtensionEnable || extensionSystem.enableExtension).call(extensionSystem, UBUNTU_DOCK_UUID); - } - - AppIcons.resetRecentlyClickedApp(); - } - - if (startupCompleteHandler) { - Main.layoutManager.disconnect(startupCompleteHandler); - startupCompleteHandler = null; - } - - Main.sessionMode.hasOverview = this._realHasOverview; - } -} - -function _enable(extension) { - let ubuntuDock = extensionSystem.lookup(UBUNTU_DOCK_UUID); - - if (ubuntuDock && ubuntuDock.stateObj && ubuntuDock.state == 1) { //ExtensionState.ACTIVE - // Disable Ubuntu Dock - let extensionOrder = extensionSystem._extensionOrder; - - ubuntuDock.stateObj.disable(); - extensionSystem._unloadExtensionStylesheet(ubuntuDock); - ubuntuDock.state = 2; //ExtensionState.INACTIVE - extensionOrder.splice(extensionOrder.indexOf(UBUNTU_DOCK_UUID), 1); - - disabledUbuntuDock = true; - - //reset to prevent conflicts with the ubuntu-dock - if (panelManager) { - extension.disable(true); - } - } - - if (panelManager) return; //already initialized - - SETTINGS = extension.getSettings('org.gnome.shell.extensions.dash-to-panel'); - DESKTOPSETTINGS = new Gio.Settings({schema_id: 'org.gnome.desktop.interface'}); - TERMINALSETTINGS = new Gio.Settings({schema_id: 'org.gnome.desktop.default-applications.terminal'}) - EXTENSION_UUID = extension.uuid - EXTENSION_PATH = extension.path - - Main.layoutManager.startInOverview = !SETTINGS.get_boolean('hide-overview-on-startup'); - - if (SETTINGS.get_boolean('hide-overview-on-startup') && Main.layoutManager._startingUp) { - Main.sessionMode.hasOverview = false; - startupCompleteHandler = Main.layoutManager.connect('startup-complete', () => { - Main.sessionMode.hasOverview = extension._realHasOverview - }); - } - - panelManager = new PanelManager.PanelManager(); - - panelManager.enable(); -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg deleted file mode 100644 index 977146b1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg deleted file mode 100644 index 47aa8025..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_2.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg deleted file mode 100644 index 80420fdb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/img/highlight_stacked_bg_3.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/intellihide.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/intellihide.js deleted file mode 100644 index 9bc157ee..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/intellihide.js +++ /dev/null @@ -1,427 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 Clutter from 'gi://Clutter'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; - -import * as GrabHelper from 'resource:///org/gnome/shell/ui/grabHelper.js'; -import * as Layout from 'resource:///org/gnome/shell/ui/layout.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js'; -import * as PointerWatcher from 'resource:///org/gnome/shell/ui/pointerWatcher.js'; - -import * as Proximity from './proximity.js'; -import * as Utils from './utils.js'; -import {SETTINGS} from './extension.js'; - -//timeout intervals -const CHECK_POINTER_MS = 200; -const CHECK_GRAB_MS = 400; -const POST_ANIMATE_MS = 50; -const MIN_UPDATE_MS = 250; - -//timeout names -const T1 = 'checkGrabTimeout'; -const T2 = 'limitUpdateTimeout'; -const T3 = 'postAnimateTimeout'; - -const SIDE_CONTROLS_ANIMATION_TIME = OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / (OverviewControls.SIDE_CONTROLS_ANIMATION_TIME > 1 ? 1000 : 1); - -export const Hold = { - NONE: 0, - TEMPORARY: 1, - PERMANENT: 2 -}; - -export const Intellihide = class { - - constructor(dtpPanel) { - this._dtpPanel = dtpPanel; - this._panelBox = dtpPanel.panelBox; - this._panelManager = dtpPanel.panelManager; - this._proximityManager = this._panelManager.proximityManager; - this._holdStatus = Hold.NONE; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._timeoutsHandler = new Utils.TimeoutsHandler(); - - this._intellihideChangedId = SETTINGS.connect('changed::intellihide', () => this._changeEnabledStatus()); - this._intellihideOnlySecondaryChangedId = SETTINGS.connect('changed::intellihide-only-secondary', () => this._changeEnabledStatus()); - - this.enabled = false; - this._changeEnabledStatus(); - } - - enable() { - this.enabled = true; - this._monitor = this._dtpPanel.monitor; - this._animationDestination = -1; - this._pendingUpdate = false; - this._hoveredOut = false; - this._windowOverlap = false; - this._translationProp = 'translation_' + (this._dtpPanel.checkIfVertical() ? 'x' : 'y'); - - this._panelBox.translation_y = 0; - this._panelBox.translation_x = 0; - - this._setTrackPanel(true); - this._bindGeneralSignals(); - - if (SETTINGS.get_boolean('intellihide-hide-from-windows')) { - this._proximityWatchId = this._proximityManager.createWatch( - this._panelBox.get_parent(), - this._dtpPanel.monitor.index, - Proximity.Mode[SETTINGS.get_string('intellihide-behaviour')], - 0, 0, - overlap => { - this._windowOverlap = overlap; - this._queueUpdatePanelPosition(); - } - ); - } - - this._setRevealMechanism(); - this._queueUpdatePanelPosition(); - } - - disable(reset) { - if (this._proximityWatchId) { - this._proximityManager.removeWatch(this._proximityWatchId); - } - - this._setTrackPanel(false); - - this._signalsHandler.destroy(); - this._timeoutsHandler.destroy(); - - this._removeRevealMechanism(); - - this._revealPanel(!reset); - - this.enabled = false; - } - - destroy() { - SETTINGS.disconnect(this._intellihideChangedId); - SETTINGS.disconnect(this._intellihideOnlySecondaryChangedId); - - if (this.enabled) { - this.disable(); - } - } - - toggle() { - this[this._holdStatus & Hold.PERMANENT ? 'release' : 'revealAndHold'](Hold.PERMANENT); - } - - revealAndHold(holdStatus) { - if (this.enabled && !this._holdStatus) { - this._revealPanel(); - } - - this._holdStatus |= holdStatus; - } - - release(holdStatus) { - this._holdStatus -= holdStatus; - - if (this.enabled && !this._holdStatus) { - this._queueUpdatePanelPosition(); - } - } - - reset() { - this.disable(true); - this.enable(); - } - - _changeEnabledStatus() { - let intellihide = SETTINGS.get_boolean('intellihide'); - let onlySecondary = SETTINGS.get_boolean('intellihide-only-secondary'); - let enabled = intellihide && !(this._dtpPanel.isPrimary && onlySecondary); - - if (this.enabled !== enabled) { - this[enabled ? 'enable' : 'disable'](); - } - } - - _bindGeneralSignals() { - this._signalsHandler.add( - [ - this._dtpPanel.taskbar, - ['menu-closed', 'end-drag'], - () => { - this._panelBox.sync_hover(); - this._onHoverChanged(); - } - ], - [ - SETTINGS, - [ - 'changed::intellihide-use-pressure', - 'changed::intellihide-hide-from-windows', - 'changed::intellihide-behaviour', - 'changed::intellihide-pressure-threshold', - 'changed::intellihide-pressure-time' - ], - () => this.reset() - ], - [ - this._panelBox, - 'notify::hover', - () => this._onHoverChanged() - ], - [ - this._dtpPanel.taskbar.previewMenu, - 'open-state-changed', - () => this._queueUpdatePanelPosition() - ], - [ - Main.overview, - [ - 'showing', - 'hiding' - ], - () => this._queueUpdatePanelPosition() - ] - ); - - if (Meta.is_wayland_compositor()) { - this._signalsHandler.add([ - this._panelBox, - 'notify::visible', - () => Utils.setDisplayUnredirect(!this._panelBox.visible) - ]); - } - } - - _onHoverChanged() { - this._hoveredOut = !this._panelBox.hover; - this._queueUpdatePanelPosition(); - } - - _setTrackPanel(enable) { - let actorData = Utils.getTrackedActorData(this._panelBox) - - actorData.affectsStruts = !enable; - actorData.trackFullscreen = !enable; - - this._panelBox.track_hover = enable; - this._panelBox.reactive = enable; - this._panelBox.visible = enable ? enable : this._panelBox.visible; - - Main.layoutManager._queueUpdateRegions(); - } - - _setRevealMechanism() { - let barriers = Meta.BackendCapabilities.BARRIERS - - if ((global.backend.capabilities & barriers) === barriers && SETTINGS.get_boolean('intellihide-use-pressure')) { - this._edgeBarrier = this._createBarrier(); - this._pressureBarrier = new Layout.PressureBarrier( - SETTINGS.get_int('intellihide-pressure-threshold'), - SETTINGS.get_int('intellihide-pressure-time'), - Shell.ActionMode.NORMAL - ); - this._pressureBarrier.addBarrier(this._edgeBarrier); - this._signalsHandler.add([this._pressureBarrier, 'trigger', () => this._queueUpdatePanelPosition(true)]); - } else { - this._pointerWatch = PointerWatcher.getPointerWatcher() - .addWatch(CHECK_POINTER_MS, (x, y) => this._checkMousePointer(x, y)); - } - } - - _removeRevealMechanism() { - if (this._pointerWatch) { - PointerWatcher.getPointerWatcher()._removeWatch(this._pointerWatch); - } - - if (this._pressureBarrier) { - this._pressureBarrier.destroy(); - this._edgeBarrier.destroy(); - - this._pressureBarrier = 0; - } - } - - _createBarrier() { - let position = this._dtpPanel.geom.position; - let opts = { backend: global.backend }; - - if (this._dtpPanel.checkIfVertical()) { - opts.y1 = this._monitor.y; - opts.y2 = this._monitor.y + this._monitor.height; - opts.x1 = opts.x2 = this._monitor.x; - } else { - opts.x1 = this._monitor.x; - opts.x2 = this._monitor.x + this._monitor.width; - opts.y1 = opts.y2 = this._monitor.y; - } - - if (position == St.Side.TOP) { - opts.directions = Meta.BarrierDirection.POSITIVE_Y; - } else if (position == St.Side.BOTTOM) { - opts.y1 = opts.y2 = opts.y1 + this._monitor.height; - opts.directions = Meta.BarrierDirection.NEGATIVE_Y; - } else if (position == St.Side.LEFT) { - opts.directions = Meta.BarrierDirection.POSITIVE_X; - } else { - opts.x1 = opts.x2 = opts.x1 + this._monitor.width; - opts.directions = Meta.BarrierDirection.NEGATIVE_X; - } - - return new Meta.Barrier(opts); - } - - _checkMousePointer(x, y) { - let position = this._dtpPanel.geom.position; - - if (!this._panelBox.hover && !Main.overview.visible && - ((position == St.Side.TOP && y <= this._monitor.y + 1) || - (position == St.Side.BOTTOM && y >= this._monitor.y + this._monitor.height - 1) || - (position == St.Side.LEFT && x <= this._monitor.x + 1) || - (position == St.Side.RIGHT && x >= this._monitor.x + this._monitor.width - 1)) && - ((x >= this._monitor.x && x < this._monitor.x + this._monitor.width) && - (y >= this._monitor.y && y < this._monitor.y + this._monitor.height))) { - this._queueUpdatePanelPosition(true); - } - } - - _queueUpdatePanelPosition(fromRevealMechanism) { - if (!fromRevealMechanism && this._timeoutsHandler.getId(T2) && !Main.overview.visible) { - //unless this is a mouse interaction or entering/leaving the overview, limit the number - //of updates, but remember to update again when the limit timeout is reached - this._pendingUpdate = true; - } else if (!this._holdStatus) { - this._checkIfShouldBeVisible(fromRevealMechanism) ? this._revealPanel() : this._hidePanel(); - this._timeoutsHandler.add([T2, MIN_UPDATE_MS, () => this._endLimitUpdate()]); - } - } - - _endLimitUpdate() { - if (this._pendingUpdate) { - this._pendingUpdate = false; - this._queueUpdatePanelPosition(); - } - } - - _checkIfShouldBeVisible(fromRevealMechanism) { - if (Main.overview.visibleTarget || this._dtpPanel.taskbar.previewMenu.opened || - this._dtpPanel.taskbar._dragMonitor || this._panelBox.get_hover() || this._checkIfGrab()) { - return true; - } - - if (fromRevealMechanism) { - let mouseBtnIsPressed = global.get_pointer()[2] & Clutter.ModifierType.BUTTON1_MASK; - - //the user is trying to reveal the panel - if (this._monitor.inFullscreen && !mouseBtnIsPressed) { - return SETTINGS.get_boolean('intellihide-show-in-fullscreen'); - } - - return !mouseBtnIsPressed; - } - - if (!SETTINGS.get_boolean('intellihide-hide-from-windows')) { - return this._panelBox.hover; - } - - return !this._windowOverlap; - } - - _checkIfGrab() { - let isGrab - - if (GrabHelper._grabHelperStack) - // gnome-shell < 42 - isGrab = GrabHelper._grabHelperStack.some(gh => gh._owner == this._dtpPanel.panel) - else if (global.stage.get_grab_actor) { - // gnome-shell >= 42 - let grabActor = global.stage.get_grab_actor() - let sourceActor = grabActor?._sourceActor || grabActor - - isGrab = sourceActor && - (sourceActor == Main.layoutManager.dummyCursor || - this._dtpPanel.statusArea.quickSettings?.menu.actor.contains(sourceActor) || - this._dtpPanel.panel.contains(sourceActor)) - } - - if (isGrab) - //there currently is a grab on a child of the panel, check again soon to catch its release - this._timeoutsHandler.add([T1, CHECK_GRAB_MS, () => this._queueUpdatePanelPosition()]); - - return isGrab; - } - - _revealPanel(immediate) { - if (!this._panelBox.visible) { - this._panelBox.visible = true; - this._dtpPanel.taskbar._shownInitially = false; - } - - this._animatePanel(0, immediate); - } - - _hidePanel(immediate) { - let position = this._dtpPanel.geom.position; - let size = this._panelBox[position == St.Side.LEFT || position == St.Side.RIGHT ? 'width' : 'height']; - let coefficient = position == St.Side.TOP || position == St.Side.LEFT ? -1 : 1; - - this._animatePanel(size * coefficient, immediate); - } - - _animatePanel(destination, immediate) { - let animating = Utils.isAnimating(this._panelBox, this._translationProp); - - if (!((animating && destination === this._animationDestination) || - (!animating && destination === this._panelBox[this._translationProp]))) { - //the panel isn't already at, or animating to the asked destination - if (animating) { - Utils.stopAnimations(this._panelBox); - } - - this._animationDestination = destination; - - if (immediate) { - this._panelBox[this._translationProp] = destination; - this._panelBox.visible = !destination; - } else { - let tweenOpts = { - //when entering/leaving the overview, use its animation time instead of the one from the settings - time: Main.overview.visible ? - SIDE_CONTROLS_ANIMATION_TIME : - SETTINGS.get_int('intellihide-animation-time') * 0.001, - //only delay the animation when hiding the panel after the user hovered out - delay: destination != 0 && this._hoveredOut ? SETTINGS.get_int('intellihide-close-delay') * 0.001 : 0, - transition: 'easeOutQuad', - onComplete: () => { - this._panelBox.visible = !destination; - Main.layoutManager._queueUpdateRegions(); - this._timeoutsHandler.add([T3, POST_ANIMATE_MS, () => this._queueUpdatePanelPosition()]); - } - }; - - tweenOpts[this._translationProp] = destination; - Utils.animate(this._panelBox, tweenOpts); - } - } - - this._hoveredOut = false; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/cs/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index d76767577db147eaa648e2056956afb2ce34d47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24663 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 eP2M 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/es/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 610451515ced6f5291bfd4d221ca77f8202101cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21553 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 F{2RuRvH1W1 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fa/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fa/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 82cc5c2888e8238d67f3e78ec8f34eab7774ef37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19898 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 R3t`kByXU_E;073x`CneH+kOB5 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/fr/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index a002a221c3a24b1893c196e680438d9fc3ccd4e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26064 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/it/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 3151da616a0244e04f3744464f14b2e3512eddf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25062 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/kk/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index c23fc213ec658a975c278d566f36c46befd873dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10823 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ko/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ko/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 8bd529eaa23f49b72f70541feb96789cacfd9fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21724 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%0DBKKmMqw=hq~jUu*Q_TKj~SH?9vN*TC41i&4jL z`KfixQ2FRkF#1qmw6)KkE|d>-mmlCs&&SG-ADZYpBLfOXyF1E{_KkdUxV-mZv}auq z^>>!L)&*1*?cX!n(;FS&Sp#zCG&E#`XI0813l@qQT+l(Lwcc>&F;% z)H_i51{poFE;_J2+S?J7w;qh1>NX=s`$vW!2%_F&(Wc(`&c5pz-7pY8FF$^;yrZ9r zPnu}w(@23C)tzmvzc1S5242Y(?dc85Pj!xV9xgw=sl2VDyrnxRZ`;LCB%qPO4@Z3` zkZ%xm3}}M3AM#Q(3@17=G`g$1d}t`Jt@cGb5o}*D+I6tpv0V+8cl4D%au_MA;z#!c zqdPm1w_!r14Vt389VY5I7JYialn?N35Lv0Uk->H4eM1aO-HCdhtZFY;{p!M@Zb@=e zFY~=#bw*nUMjw6vN!k({J2mE0=I!qo-PIfC-SZITlUj6&Vv_o}#<%v340gDa?s4xv zx~aTRMP9J?ZZ`d_30pfyI|h*?;#oIx9J{0ZU6i<@dj*iV|YwucTEr6-6DKSP6-e&|+pR6pXPSU;;0dqCF{&4xxfzh7+ zpxo1CRcUN}H6@&8#Ff3I@@`(Sr)bac7+YuVW1nV~t+S&{uTI&Khfwsb11MiFMq^ZC z&n}Mub;K*g4{Pj!Dmgf}gSQi6tTEwtoR%|DhckP;PN5Vu3I;lWd9D-U*$ZtQVBw8me)K#|x@R?SaqO8LmZ=$2uWYNFmGoAEPk zqP_c=>0o4NopegNUmdqoCBG5}<>ScI589NwyPesZaW0F6#0}ex$F1Wg8tRPt?P3u1 zbmBkuMo*D1xn{dXqt?!C41f@7s^Y$U6enN}&#Nl)p#>;z3>7GUVwe&6g>Q7{K>5M$ z+B`iS<-eu1;XpdAmiIG$CUNtFZW4`bifJzo4&s7q*2l`Lq>=kIIq}U`c8KR6 zt1)(U9qh)N$Z0Shd}>9wqdoEB8d$$=bysIABS%jV1RWgtG#<~|qa1G3*=t9zx3e1B zIK{6l`<0qadHtR-@9gxU;+0uPb(kwPWxx1WbxNK6Q!?)=uTo1Tt8e*3U_SyaWJ7! zUYW3alT;|2fV`VlqmkitBPVbW-e<*bpu8QaCsgp1C2Dl(RMoz4O{|d2v;6*Kr@soR z2srgc`Gu=@CEaoA3%5Z?fNs1 z&Pq&e62W}`L(CV(UVWwtoP&uvpTL9^^Ot+KS0C#ecJ);y2uv>3tY?FS60BzgQ?XTy z^_kVBJ*k1oRY3Nm&~*3U)LM5twx~MiT(DnEq5)P=YY}pgnz6y&SRS$W8)M9Ipiv3& zh7{IB`yXK9a9@i0S=Qxl{Pu&%VADaEMD-QtlziqUO?u-*5Y*wSE8$EmBQrs^(M?^% zvq7}?FwRJ!O*KzaR%1ThxczHjqm@HiXKI3qc;lupeCMV(RC}s}Ma-v3~RaX7~*d%>}c1C z=<$=r0TH^$+4kOvLz5is?H?KLG(=u<^Q_URj2tyV7QTZeMX@$^r&Y<$Y)#CXSi<8; zt%N<*XtEm5R-e^ugxr!BdwmrgYttPj~*V1y1TFvtBBTU18J+zfy^~EI|x9Ne$#FH(8&JU zZEn&JI{#GFS$C{b6Xv<8VB5}2+vP8zwF`=kcE%N>#HuV^Lo3)!y7+E%^ON2%%iFpT zgo{_aG6micCWw!!HO6_zDt!EWg2GxeT(G8aBBC)MN)yNswuF_;g~%qX(o z%@zR7u=yBu$H-BH^kKhVk9)7xR0ms%(CzfmDWciL0ShzXwk6ug_}FTqDRo;lyU~k{ zLMlo(?UBi0Ho&ZM)s02<6voPq?c=^-YryeU)rPyvhfjHup z<$kKSZVP#;w|J9{>u}b= zuUBlBtFOG4`RBMnw%dL)7!MV{OUPZ`PV~9Eo2_KL`M|nHH||NS(O6VvUH7h4$1^PC zI%6VguR7YQ7m$&v8bAH+%%;|nO?-~ycid(MqO{lSuyj0dq@DJP}w*lCOVlGu9a z|LT~V_@`Wy8r>4-H_`Z0G4D~F`ki8t4x-^lwLD9v-G_YR&LmD*yqAIdwK)-ZviY-#&8WU^Ms{yBa3<260a~b}Jw0j1I&bQ0pXK ztW?y~Ro;)6J3odvL-!$+L}h?XV}wHZn;*h+SOrncagV zAJ{GM1po4(W_H}kl2%C;lk(x=@{yhw|0fU#Q+{R>y^gPv$4vGWn@@fB@VelKO$b%% zRjM9D;!lLDcw4Pjq=MaR(G|xG?JIZ%6QCZCD4T`C)Xb0Q!q*BBiUetBd zgBr&cmMiqk#&iMOMC?mZBZryMfdhn3+8%D}U{7GZuU1E&NwNOm!_{+&+B$e=E!yqz z<1&i6tlO;YkLaj%@G_#Y$1>70r8``LM{piDX@h%TOQfbx~m-Fyh{n1k=AC8C@ zaF_~(Z5s$xpE4?|gg@dgA3*rYK;2oYoq|f6(ZGZ8`Mb2b`WeQZxyZcAI|hgjwPdT` zI>4_63}X#v+|hetv3J`_#I3Wn_?%8IL|fYGX8@TAOKwt!`3D&i0^h0J@oB8tFO)NR zUg5&4_(O_~EUaN!F>c%Ct4sdFjGE1fCZX10RW+QGEgwzS>Z48*9y^Yx_?X*g&lVm# zZnqYdZ+x7q)M~Jg<0ssl#1+++aA!w4)wd^3UK_nC)*i7qHMDa-_LRIPqIV-R)p#cn zx5VC>qkT^EkDy()Ds!r{!`Q`E^J$C1RO%CcxRe)Nb7v?L}h_+dVmltd&y~YX$Cv&+oGJUGG3wdB?{pN}gN=E3V0QX1rT+ zYmkE9ih-NxQ;$YRdbLHYd@ZV49=^?=Zd=Rd)Dv%F52tiK<-c-BovatB3Lrj9cO4!cM9mr-x07GV8*#W@+1yt~i1?Wy}jMWgOAvin@xW7@CR*OM~66)G5-x7 CF(0h} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/nl/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/nl/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index b45a90d4c0fc1658ec9ee28ef3f0cbabeb119a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17138 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 TpDc3d2tITz5o~Jwf!zNANfuM@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/ru/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 312b52d9ac70d4c78c8af2cc393acda142f4abaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31991 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/sk/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/sk/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 6732ff6e08a2aee22762fcf347e60fdd33e714ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21075 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 udL{1|!i>GUWg1!2bmk9||M@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/uk/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 7ac58eb531262af191c17d16658d67803f06dd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32668 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 PDgooiT4%IKzj^;}Vhzh) diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_CN/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index 350fd9a2e19d2468c5da00e61cedd534d11849e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19556 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 LJ0Y84Tbud+p%)k! diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/locale/zh_TW/LC_MESSAGES/dash-to-panel.mo deleted file mode 100644 index c82af66a3d94399bbd2ddf566c50d1a3319cbf72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14647 zcmb`LYj9M@m4Mrc9oyKB6X)T_=5g)BHW(x%fo&i_jKN@HFa$)5<2cEc=1LkfnvrKl zfb8sA0t+D|5H?6y4-jvQ_Zx(GC2?(1NoqG$&ic=8%Bgj9=TV!4%2sW%m27tRJKcRp zBMIXDvA1;eP2bzy_w?!0r%&Ja@4B&Fas2@K9P;IlDRsjQN=>+3?kZLE3Cgh8auSq! zkHU|@C6>!9ms`GI`E5(rGGtk4`I2Qdl=sxYkHfgV-(dN=ecoiBH{0@C@J{M?+44as zdL6dqW0of@Pg$OUpQqkA_%3`8@~8Sfsnk92JiHCQ3m3un;p4FIE~8%sl=ijo3vdhk z6g&yVbU%Xk!CycJ{tnK7cTx!xtA+40uoO;)FToPn3vY(+Lh0w9p##&le9Nbm`Xc4e zKxzLd6n&q8pM@bP{l5wyfNS8xa35p{>K~xk>sL_pz6vM9kJH(`a5j|tFTxw)_n?fU z0p1OJU^zSu`BV4s(uZIn90Qj@ssCLl?|Bu_#o_uGT!&0jQ0kNBK8~yW!&F_GG9?!ZiS-P4k+V40x_}r z0E!>{0g7HXV-&IX-Oz!LL$S|tDD_uC8CMIGb~|7pJZ7K24`m+z9f}_R17-Z5#7Gn2 z-B9|O2jzV)z+2!7DD{$1+P?xt-zF&b?tn7ROHlgtp{&b4LYbFO|BX_2z(=6W;}lz- z0cTQv20Cy9l<^#b($7z!=iq@2cmr)&gg})s`N9x<2v)$4z>SuhEw@;9Saw?WSoT`(w%ljg2c`c*Q0DcBz5kBo zkL>fG*ylg9<$r}tnfkRYe+1=3uN$HCceCZKmbY2n0r^vR^6x$P7!*Ie9b?M-?}bvH z2xT6oL;lnzd;cuFpYl6U;*<{w9cm2DE$zMprJo`welQn421D>;up7#J?S=*L3M_)Z zg*U@5j5GZ_1ZCbQ+43SN}2!7*p&ygMZR)1r&R2hNAB= z%OAp9DZd9LzWfT_4)0@eioOp+DL)Ry{&S%8^Ia(O_8OG_dZ5%lW_bnT3hL*!{71{1 zS=3VRZg>-X7-B+I0HvSh@J_e_j)AX28Q(f6_SgtTpZ!qmeG1C>2BEaSm7B6(eGbaJ zPKQ$e+fe#hVastSe)t-c@tlRy&wEh%`4g0OcN88Mb^4%J|x$=zj@Hy9^Y2 z{u#>qZYnYUcsrChem|7=O^2fA3sBm>YVYrd^4`C<_uqvw?!Q=mc9NObiBQJ(B9!{C zL7AUcDE;->@-Lw1anJf;k)p98PHbbd@6w3R445i+J z$IW|QfnTTmb141YKgHPn3HT7@rIxQidA@tL(%6yEpM4>%J)Et zKVzY^D}pz`S%_Q<5z%7?@*;8+Ighj;e~YvuqR%r3L(nnl3Y?3`^#h~>`95+9i6EO1 zxx}wzPP&l;$WG)F$a;h@q4&+t!#1QJS%q9gTtu$r$Wr}_eGr~Nnh@C!B$ml|KZSe- zxf{6`5#JR5ku@#XRs-!TGJdheEr|HGtV{77nddu@k0TPJ0g`;;3tv0Y&k$R zKbSs!)$w2ENiGKwU#dXlns1;E!9~bR$VQ|Jxs1rQ2ib%yM&3aBkk!Zr^DeZxSlfCcuqUI%uF{hW)AD;>WU}P{foLJFCLcP;8YGtMQ`F*jU`DjaJ5EwKZO7 zoGPXURZ3LxBvm|F6+fzqA5+DTtKuoDcq(=%v5gbDwJIr6CB+P7((v1p)#UNR?>wp= zEh3aWj)|tK>EW46t59H$mvqCC#Po^bnNGDAt#!gluUbt{)VNV65q`y+@j#;5jYJ-p zSy~lNI5qKDW!$ZH%45}Dg5Hx=&a5YwE?Tgx^r;2UJI^k1o}0B~$*gBfpD!G<)bpHV zmFG-%ovOH3G2?-%WU?kPZQ{gLt5y|OMr#XW@ydyjaJd&vc!`OzNT?uJsH}+;loS>f zRwb)>@w{i3IrF@z7k4Ah;@UE5ISWj)3C>C{o(RXHPKkpFBW}`*PoL<{bSfx?%)kn# zPn5CDRI@@W-DtTNau(GjX_6SaQ58$B@an{x_CX{P7*5R^`t5kD%e|VU?py{|<9RFS zE*ABiDtDzGY&cFQZh1Ia=OnzOlZB>BvBss@Q&(O$fMmV7Zq2A6XCK5#b~&i(K6)PXn9pQTIoc+RYOYK zrwJy=Jaubou$ybgryq;il3_F(Tb&rEW>KL|v|+B*lO6*KV?(jy!f+@Q@d{?sensK% zM@y^170L0}tWXt-Z;K_E2xE3;-HZHR8^zHMj~`pJn)iew4Bl0G$c|esR-+(Y zm(`+Q)N!LBr^<6fUfijPCBmjcZ35L<8If3A&DI5$k5g^Tr|rO08^fyEb>+-+vWg{N zS(TeNbJs+MgfpJD%oLrdIc}m#hP7Dx%u+9z#BvFJ+XG(2t)p*d3s($>#HvFcrl)sU z72|C|t&o>kk&M+CH<;tCWNA4I-KbmX5e|}SPB^h*M7c&@r>)DH!5A!&>R2?KjK$F< zoY0Sh*(J(}-|IX zttKdxx#cS)hB7yH5#}BRi!xZ@Peol;k+YO|8y`Qms9@?i$4xkis#rW(UW*^eI$+vY z$`V7Z3>6GIiZX}@>tR6!$hSOEy13C`s#h^W7b}}9*RQ4T#<^&5Y&Rt?u;Ik4z zWEy0J>$MoGO`3UlY9+RJA~7cUsns>8r8^E+>z{-cGynF{$THej5JuEo9MlQb#`Ur{ z{m$inLd^}Y_Cji|oeJx3lzF9gUs<3s7kQI}dP&`MRHa}}@+-*3q1V#&dveBxyb8BA zl62TsiYJdVuOHR$TD`CG!j)A?9Yu!1+Asx&YUp)fy~b)dFPwb3woJ{7yP>dHxlG3# zJ91gsfwxG^$<>l2VvIAg%F|)YEH}-%;-|!B39rL#KeC=yO)qG-ygU{+%QnUq>s5Gh zkF6@9bQ1~EImdXKp-1%aud$M-A3P0Kz|(eblU~ECRZv_NX3=_V-#8=tk68%M)>fBM zCgz*+tVnV^_tboe*`XNG$PGM1%{Q)C5hvtnXR|kQzBoTv_||F#j_ziT?M97$zKG2{ zF19SKBJ@xp>5*%&0!dY7)zmB`Inh~)Bq#~}I1&jH?qr`Z8{7OuOmYC{xmbJ!o4!~u zxRnb~&v0b`3fiLCRUWWakbE0 ztz$HMx6bGiYN3~m$CTL>&Hfi`emQ531v?ds%rvw0%{CkCISXz4&($$e)=|%rFT~Ze zv83Mm>%8RsDwsST5T4Z{n}(E|o%DJ>nX|cxxcCDJ!8HP@*?441tj(3VGrFqYsm(*1 zzvOnv#j#c5UUss+UK>uTC2p8qHL%W>jzN*Qk)cww8E!uegJaObL2qPe+gE?9?vNd79QK*fw<*QWeAO z!G>znYO|}Fgh4H_$gUC&M9+&HSr~_MTS^j2A zinr8b9f#a_og+&rmj*BODrKW*Ls%N@D<-cSmi~-R^#UhlxO&$V!(nTa+=@LUOOOPz zgj`tOoKV^_BUZCDkbcA}&t<75Q%uP6u5m*;IO;hZT`_Pd{bY{GX3VQ>A;{WRg+rWI zhI$De59^@9T^WlLV)8dXtGQjioO>j*6~D{hAoUrbnhh;nqf>YjENs&t9m;E9pAgL0 z)ZKVEQfHJ-#$wWk#0>3L=B`;H;@Oe_>14_rTmH&pi4jX11 zceS)GnsirBbEfMFo;kspF4>Earvlw%CiN0>E;In!#Di(Z?!1rxP63Wz-4l2*DXF>8&P-W5g!N z>sOP!$&6J?xUQ`xT#zbkopLzSZM1GW;9Mh6N<+7z!YgMz zIc0Tub!DSUII>@=QaN=I&KRjAnQ~e*=e}GR(dNn>ZGvqh>Ukl$Wu3`-HTDerA}^D~ zjIqi}d{FEQCOV6a*EoT91{H$1TN_f+rymT`HZ2Slc@3`E+95a@a;vP7AENKtq17yZz!CQvDAhW zRbHsj^l10A;4C?TOpcEzSU)(K2T#z8q);@rei3ZBdFs-q-U{`{4_UtY=n^EG!87Y_ zL0lbvo7W_2SRjr*mpIFvv3gyN%k>AmsL1QnjFUMB-zD2B&RwBr&%->=j)hS9FM)kkP7C93cg{! zNKJF}nZ4AW*~cvL@R9UR1Dzh%Vo-3g+OC)0~o`;;98i zj~A3o;Z!tj(vRlP!CiGo>t?9J9Q@e81D0 zFOGTW;FJ`W6c&$J9N~BxDVU2H6Vse%jV>l;6o17rKW7wuWei`Li&d(5OSYqBaA4il zi|bSCJ5oId{q^h8XI{U0vANjs>svDWJJJWYedwptTsLGTL#=`@s6$UDgd$xmTW`6-*Gg%voYO$^jaTS zQ$2^%eJ%dQw!!|5skY67m%9fqTo}C6p4zf?@XGdI*RL6qInseLB@~oZtHED&tS@IFfmL z4?|3?ZA7!+8*8@yWVUM)17(!T6#OfPvh}^$jc4rLRC9f*r`cLA+qpNh`%tQPU%ICy zXHS1`2d~es$0KZ#t#3=cwaFjY?;mfXRi^KVf3z#TX29RvI@n+D*Iz^tSs$ z`oS7jn~p91<%8)rk1GRncd&nds;AyR-sZPvJ=+;X`sl9o=5;E)ry;$&*A~##xU}&(zq5}R zGR!5VM$f@aLs$Cs{UfF~S9PQdv^FvA^rcu6gZ&rG5KOPBj*H6tvNqEC6GXE+k0{Kj z#NQiRGHY8?oyYQ>!#?mgZZIp(E?nMVzYCcUrh}JyWbw84;?()BDAo(sJf7_zT|0Qb zm)Jto@ZW58jH5H_jvO=`LXWK9OIPScuV3At(b&WVi6egFzWiHeNvDrA`}LjISZ;#@ zgy^%WZTm6@Tb18>jMltQel!i(iN98%=~U|A*3_=`Ds^rbHB;^DQ#*Q6tqth`EHr9O z+q!=D08vOWWti0HsPe6m>g&wzYW0t7^LG${v{PG08vWpU?fkuO;p-w|ej zG(i^H=w3%RyRK&GliS##${H?q1h9(gz!)x}Gm%aAj`gk3;1=c<9%N zUB|8k``L|@BvapL?*-pYO;Bc8N+|O$?=UW79Mbxwb;ne&j*YRL0*6+nxf=Z}vwxj` z?2s(?U9BqBe%jx>e&jb&n`NXr2U3l1+wf+0<*u#S?%n>meXL)9V?D7?%GUe@67!4D zNzQ@un~1`iX17Xr@6EGIuwnYg_77feQQ1u$ECk!{`fW-gFMiwFVHbt@DoTtqjyiau zg|1CBH+v!R!R!mcD$3g@@e9<|ed=g#tK_tHWItyDi4~ohJ#B**>aznE2|KBiZ?d^v zz1X1A=lU|8z1gOX>5dI5f2zfyTRT3)@r=cdEsWi-5jM@^e3L74YjoXUotWpcjpS$4^4Tt@WP1Xjv#@RI+(&zU0ZQK0y$0Z*++Lh|> zC;a$(w)h*mC4%WCW?o53Tc2fy^s{WoWwNLI_%iJAb(a#>#D6nQr%WuO54`+FN8RzQ<@`w$TsjaWP2(*xyo3{eD9ail>gAG2zy4Zn8m5@43n(K10jF z`16Rn)@&p0ruz1f12V$=b+5A@olNEW%+Y)zsl#>C;`zge39y-Rsx+%_k*; zu`Hk2U^f~vzi+ziWf}lxqIl52~4iJ5s0GuU_o>&`+xAQy0=_PAG$P_a0s&nH&Zht*RL% zD=6P~!Tu6#o{eWsl#@IveP&Ji&@oxZSQw|uZ)bCo#uL~h-Q7?AC0=*zFh?s6UjD{Y zavnOm)~|m<8g?|1y`+w9H5DWi?cAL1JtC={Zes4R_&Jl&p=>KUCo)e(m+M7AiB*?Q zWP7jZR8^nL%vQx2K+GV+?cGdB$e#eSaY(@EI+SkjWTU!XerQ6R3_)jaI=j?oI2N$! zkx!#$-f=;5NBO#jEtmvG`E4Dkv+MIMXudtLAK9-EBMfZU04HSG70p)5mPoQ@<|Dr= zGZ}Wq^9(1o^PSReBHD?uj~sn3AIRUxboase!3@CkN+qV)gf_bh((6vJpXcZ9_Q7Dk zY|Ann6PL-^dk2`F)EYeHs5$mz8|9$pUl>RqYGHB)FW7X9^ycctZmHR~(ZAd(DZkP7 zz)73=$f^A7;DwIVfnIa|F}aWlp4w}%P~PG;hjOW^J4)$jf^s%98oj^#HFp`czi3~t zXDTxXP8xe@6*%DrUlwwwM?8qyM0LLro3}7DvcY^!#bS9MHgXN6N7J`C%mg1JhCXK4 z$7ZSn$I&0N0@v)wyj{=wBgt}>%O-6XYV)v`d^8!V_B_?Hhu+fbd3ZIm8%Qs?6S`5) tye!qYM`Glt^M-xZurH?QWELK{|i. - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -import * as Intellihide from './intellihide.js'; -import * as Utils from './utils.js'; - -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as WindowManager from 'resource:///org/gnome/shell/ui/windowManager.js'; -import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js'; -import {SETTINGS} from './extension.js'; - -const GS_HOTKEYS_KEY = 'switch-to-application-'; - -// When the dash is shown, workspace window preview bottom labels go over it (default -// gnome-shell behavior), but when the extension hides the dash, leave some space -// so those labels don't go over a bottom panel -const LABEL_MARGIN = 60; - -//timeout names -const T1 = 'swipeEndTimeout'; -const T2 = 'numberOverlayTimeout'; - -export const Overview = class { - - constructor() { - this._injectionManager = new InjectionManager(); - this._numHotkeys = 10; - } - - enable (primaryPanel) { - this._panel = primaryPanel; - this.taskbar = primaryPanel.taskbar; - - this._injectionsHandler = new Utils.InjectionsHandler(); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._timeoutsHandler = new Utils.TimeoutsHandler(); - - this._optionalWorkspaceIsolation(); - this._optionalHotKeys(); - this._optionalNumberOverlay(); - this._optionalClickToExit(); - - this._toggleDash(); - this._adaptAlloc(); - - this._signalsHandler.add([ - SETTINGS, - [ - 'changed::stockgs-keep-dash', - 'changed::panel-sizes' - ], - () => this._toggleDash() - ]); - } - - disable() { - this._signalsHandler.destroy(); - this._injectionsHandler.destroy(); - this._timeoutsHandler.destroy(); - this._injectionManager.clear(); - - this._toggleDash(true); - - // Remove key bindings - this._disableHotKeys(); - this._disableExtraShortcut(); - this._disableClickToExit(); - } - - _toggleDash(visible) { - if (visible === undefined) { - visible = SETTINGS.get_boolean('stockgs-keep-dash'); - } - - let visibilityFunc = visible ? 'show' : 'hide'; - let height = visible ? -1 : LABEL_MARGIN * Utils.getScaleFactor(); - let overviewControls = Main.overview._overview._controls; - - overviewControls.dash[visibilityFunc](); - overviewControls.dash.set_height(height); - } - - _adaptAlloc() { - let overviewControls = Main.overview._overview._controls - - this._injectionManager.overrideMethod(Object.getPrototypeOf(overviewControls), 'vfunc_allocate', - (originalAllocate) => - (box) => { - let focusedPanel = this._panel.panelManager.focusedMonitorPanel - - if (focusedPanel) { - let position = focusedPanel.geom.position - let isBottom = position == St.Side.BOTTOM - - if (focusedPanel.intellihide?.enabled) { - // Panel intellihide is enabled (struts aren't taken into account on overview allocation), - // dynamically modify the overview box to follow the reveal/hide animation - let { transitioning, finalState, progress } = overviewControls._stateAdjustment.getStateTransitionParams() - let size = focusedPanel.geom[focusedPanel.checkIfVertical() ? 'w' : 'h'] * - (transitioning ? Math.abs((finalState != 0 ? 0 : 1) - progress) : 1) - - if (isBottom || position == St.Side.RIGHT) - box[focusedPanel.fixedCoord.c2] -= size - else - box[focusedPanel.fixedCoord.c1] += size - } else if (isBottom) - // The default overview allocation is very good and takes into account external - // struts, everywhere but the bottom where the dash is usually fixed anyway. - // If there is a bottom panel under the dash location, give it some space here - box.y2 -= focusedPanel.geom.h - } - - originalAllocate.call(overviewControls, box) - } - ); - } - - /** - * Isolate overview to open new windows for inactive apps - */ - _optionalWorkspaceIsolation() { - let label = 'optionalWorkspaceIsolation'; - - let enable = () => { - this._injectionsHandler.removeWithLabel(label); - - this._injectionsHandler.addWithLabel(label, [ - Shell.App.prototype, - 'activate', - IsolatedOverview - ]); - - this._signalsHandler.removeWithLabel(label); - - this._signalsHandler.addWithLabel(label, [ - global.window_manager, - 'switch-workspace', - () => this._panel.panelManager.allPanels.forEach(p => p.taskbar.handleIsolatedWorkspaceSwitch()) - ]); - } - - let disable = () => { - this._signalsHandler.removeWithLabel(label); - this._injectionsHandler.removeWithLabel(label); - } - - function IsolatedOverview() { - // These lines take care of Nautilus for icons on Desktop - let activeWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - let windows = this.get_windows().filter(w => w.get_workspace().index() == activeWorkspace.index()); - - if (windows.length > 0 && - (!(windows.length == 1 && windows[0].skip_taskbar) || - this.is_on_workspace(activeWorkspace))) - return Main.activateWindow(windows[0]); - - return this.open_new_window(-1); - } - - this._signalsHandler.add([ - SETTINGS, - 'changed::isolate-workspaces', - () => { - this._panel.panelManager.allPanels.forEach(p => p.taskbar.resetAppIcons()); - - if (SETTINGS.get_boolean('isolate-workspaces')) - enable(); - else - disable(); - } - ]); - - if (SETTINGS.get_boolean('isolate-workspaces')) - enable(); - } - - // Hotkeys - _activateApp(appIndex, modifiers) { - let seenApps = {}; - let apps = []; - - this.taskbar._getAppIcons().forEach(appIcon => { - if (!seenApps[appIcon.app] || this.taskbar.allowSplitApps) { - apps.push(appIcon); - } - - seenApps[appIcon.app] = (seenApps[appIcon.app] || 0) + 1; - }); - - this._showOverlay(); - - if (appIndex < apps.length) { - let appIcon = apps[appIndex]; - let seenAppCount = seenApps[appIcon.app]; - let windowCount = appIcon.window || appIcon._hotkeysCycle ? seenAppCount : appIcon._nWindows; - - if (SETTINGS.get_boolean('shortcut-previews') && windowCount > 1 && - !(modifiers & ~(Clutter.ModifierType.MOD1_MASK | Clutter.ModifierType.SUPER_MASK))) { //ignore the alt (MOD1_MASK) and super key (SUPER_MASK) - if (this._hotkeyPreviewCycleInfo && this._hotkeyPreviewCycleInfo.appIcon != appIcon) { - this._endHotkeyPreviewCycle(); - } - - if (!this._hotkeyPreviewCycleInfo) { - this._hotkeyPreviewCycleInfo = { - appIcon: appIcon, - currentWindow: appIcon.window, - keyFocusOutId: appIcon.connect('key-focus-out', () => appIcon.grab_key_focus()), - capturedEventId: global.stage.connect('captured-event', (actor, e) => { - if (e.type() == Clutter.EventType.KEY_RELEASE && e.get_key_symbol() == (Clutter.KEY_Super_L || Clutter.Super_L)) { - this._endHotkeyPreviewCycle(true); - } - - return Clutter.EVENT_PROPAGATE; - }) - }; - - appIcon._hotkeysCycle = appIcon.window; - appIcon.window = null; - appIcon._previewMenu.open(appIcon, true); - appIcon.grab_key_focus(); - } - - appIcon._previewMenu.focusNext(); - } else { - // Activate with button = 1, i.e. same as left click - let button = 1; - this._endHotkeyPreviewCycle(); - appIcon.activate(button, modifiers, !this.taskbar.allowSplitApps); - } - } - } - - _endHotkeyPreviewCycle(focusWindow) { - if (this._hotkeyPreviewCycleInfo) { - global.stage.disconnect(this._hotkeyPreviewCycleInfo.capturedEventId); - this._hotkeyPreviewCycleInfo.appIcon.disconnect(this._hotkeyPreviewCycleInfo.keyFocusOutId); - - if (focusWindow) { - this._hotkeyPreviewCycleInfo.appIcon._previewMenu.activateFocused(); - } else - this._hotkeyPreviewCycleInfo.appIcon._previewMenu.close() - - this._hotkeyPreviewCycleInfo.appIcon.window = this._hotkeyPreviewCycleInfo.currentWindow; - delete this._hotkeyPreviewCycleInfo.appIcon._hotkeysCycle; - this._hotkeyPreviewCycleInfo = 0; - } - } - - _optionalHotKeys() { - this._hotKeysEnabled = false; - if (SETTINGS.get_boolean('hot-keys')) - this._enableHotKeys(); - - this._signalsHandler.add([ - SETTINGS, - 'changed::hot-keys', - () => { - if (SETTINGS.get_boolean('hot-keys')) - this._enableHotKeys(); - else - this._disableHotKeys(); - } - ]); - } - - _resetHotkeys() { - this._disableHotKeys(); - this._enableHotKeys(); - } - - _enableHotKeys() { - if (this._hotKeysEnabled) - return; - - //3.32 introduced app hotkeys, disable them to prevent conflicts - if (Main.wm._switchToApplication) { - for (let i = 1; i < 10; ++i) { - Utils.removeKeybinding(GS_HOTKEYS_KEY + i); - } - } - - // Setup keyboard bindings for taskbar elements - let shortcutNumKeys = SETTINGS.get_string('shortcut-num-keys'); - let bothNumKeys = shortcutNumKeys == 'BOTH'; - let keys = []; - let prefixModifiers = Clutter.ModifierType.SUPER_MASK - - if (SETTINGS.get_string('hotkey-prefix-text') == 'SuperAlt') - prefixModifiers |= Clutter.ModifierType.MOD1_MASK - - if (bothNumKeys || shortcutNumKeys == 'NUM_ROW') { - keys.push('app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-'); // Regular numbers - } - - if (bothNumKeys || shortcutNumKeys == 'NUM_KEYPAD') { - keys.push('app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-'); // Key-pad numbers - } - - keys.forEach( function(key) { - let modifiers = prefixModifiers - - // for some reason, in gnome-shell >= 40 Clutter.get_current_event() is now empty - // for keyboard events. Create here the modifiers that are needed in appicon.activate - modifiers |= (key.indexOf('-shift-') >= 0 ? Clutter.ModifierType.SHIFT_MASK : 0) - modifiers |= (key.indexOf('-ctrl-') >= 0 ? Clutter.ModifierType.CONTROL_MASK : 0) - - for (let i = 0; i < this._numHotkeys; i++) { - let appNum = i; - - Utils.addKeybinding(key + (i + 1), SETTINGS, () => this._activateApp(appNum, modifiers)); - } - }, this); - - this._hotKeysEnabled = true; - - if (SETTINGS.get_string('hotkeys-overlay-combo') === 'ALWAYS') - this.taskbar.toggleNumberOverlay(true); - } - - _disableHotKeys() { - if (!this._hotKeysEnabled) - return; - - let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-', // Regular numbers - 'app-hotkey-kp-', 'app-shift-hotkey-kp-', 'app-ctrl-hotkey-kp-']; // Key-pad numbers - keys.forEach( function(key) { - for (let i = 0; i < this._numHotkeys; i++) { - Utils.removeKeybinding(key + (i + 1)); - } - }, this); - - if (Main.wm._switchToApplication) { - let gsSettings = new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }); - - for (let i = 1; i < 10; ++i) { - Utils.addKeybinding(GS_HOTKEYS_KEY + i, gsSettings, Main.wm._switchToApplication.bind(Main.wm)); - } - } - - this._hotKeysEnabled = false; - - this.taskbar.toggleNumberOverlay(false); - } - - _optionalNumberOverlay() { - // Enable extra shortcut - if (SETTINGS.get_boolean('hot-keys')) - this._enableExtraShortcut(); - - this._signalsHandler.add([ - SETTINGS, - 'changed::hot-keys', - this._checkHotkeysOptions.bind(this) - ], [ - SETTINGS, - 'changed::hotkeys-overlay-combo', - () => { - if (SETTINGS.get_boolean('hot-keys') && SETTINGS.get_string('hotkeys-overlay-combo') === 'ALWAYS') - this.taskbar.toggleNumberOverlay(true); - else - this.taskbar.toggleNumberOverlay(false); - } - ], [ - SETTINGS, - 'changed::shortcut-num-keys', - () => this._resetHotkeys() - ]); - } - - _checkHotkeysOptions() { - if (SETTINGS.get_boolean('hot-keys')) - this._enableExtraShortcut(); - else - this._disableExtraShortcut(); - } - - _enableExtraShortcut() { - Utils.addKeybinding('shortcut', SETTINGS, () => this._showOverlay(true)); - } - - _disableExtraShortcut() { - Utils.removeKeybinding('shortcut'); - } - - _showOverlay(overlayFromShortcut) { - //wait for intellihide timeout initialization - if (!this._panel.intellihide) { - return; - } - - // Restart the counting if the shortcut is pressed again - let hotkey_option = SETTINGS.get_string('hotkeys-overlay-combo'); - - if (hotkey_option === 'NEVER') - return; - - if (hotkey_option === 'TEMPORARILY' || overlayFromShortcut) - this.taskbar.toggleNumberOverlay(true); - - this._panel.intellihide.revealAndHold(Intellihide.Hold.TEMPORARY); - - let timeout = SETTINGS.get_int('overlay-timeout'); - - if (overlayFromShortcut) { - timeout = SETTINGS.get_int('shortcut-timeout'); - } - - // Hide the overlay/dock after the timeout - this._timeoutsHandler.add([T2, timeout, () => { - if (hotkey_option != 'ALWAYS') { - this.taskbar.toggleNumberOverlay(false); - } - - this._panel.intellihide.release(Intellihide.Hold.TEMPORARY); - }]); - } - - _optionalClickToExit() { - this._clickToExitEnabled = false; - if (SETTINGS.get_boolean('overview-click-to-exit')) - this._enableClickToExit(); - - this._signalsHandler.add([ - SETTINGS, - 'changed::overview-click-to-exit', - () => { - if (SETTINGS.get_boolean('overview-click-to-exit')) - this._enableClickToExit(); - else - this._disableClickToExit(); - } - ]); - } - - _enableClickToExit() { - if (this._clickToExitEnabled) - return; - - this._signalsHandler.addWithLabel('click-to-exit', [ - Main.layoutManager.overviewGroup, - 'button-release-event', - () => { - let [x, y] = global.get_pointer(); - let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); - - if (pickedActor) { - let parent = pickedActor.get_parent(); - - if ( - ( - pickedActor.has_style_class_name && - pickedActor.has_style_class_name('apps-scroll-view') && - !pickedActor.has_style_pseudo_class('first-child') - ) || ( - parent?.has_style_class_name && - parent.has_style_class_name('window-picker') - ) || - Main.overview._overview._controls._searchEntryBin.contains(pickedActor) || - pickedActor instanceof WindowPreview - ) - return Clutter.EVENT_PROPAGATE - } - - Main.overview.toggle() - } - ]); - - this._clickToExitEnabled = true; - } - - _disableClickToExit() { - if (!this._clickToExitEnabled) - return; - - this._signalsHandler.removeWithLabel('click-to-exit') - - this._clickToExitEnabled = false; - } - - _onSwipeBegin() { - this._swiping = true; - return true; - } - - _onSwipeEnd() { - this._timeoutsHandler.add([ - T1, - 0, - () => this._swiping = false - ]); - return true; - } - -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panel.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panel.js deleted file mode 100644 index d025b9bf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panel.js +++ /dev/null @@ -1,1263 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * - * Code to re-anchor the panel was taken from Thoma5 BottomPanel: - * https://github.com/Thoma5/gnome-shell-extension-bottompanel - * - * Pattern for moving clock based on Frippery Move Clock by R M Yorston - * http://frippery.org/extensions/ - * - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import * as AppIcons from './appIcons.js'; -import * as Utils from './utils.js'; -import * as Taskbar from './taskbar.js'; -import * as TaskbarItemContainer from './taskbar.js'; -import * as Pos from './panelPositions.js'; -import * as PanelSettings from './panelSettings.js'; -import * as PanelStyle from './panelStyle.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Dash from 'resource:///org/gnome/shell/ui/dash.js'; -import * as CtrlAltTab from 'resource:///org/gnome/shell/ui/ctrlAltTab.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import St from 'gi://St'; -import Meta from 'gi://Meta'; -import Pango from 'gi://Pango'; -import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; -import Shell from 'gi://Shell'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import * as DateMenu from 'resource:///org/gnome/shell/ui/dateMenu.js'; -import * as Volume from 'resource:///org/gnome/shell/ui/status/volume.js'; -import * as Progress from './progress.js'; - -import * as Intellihide from './intellihide.js'; -import * as Transparency from './transparency.js'; -import {SETTINGS, DESKTOPSETTINGS, PERSISTENTSTORAGE} from './extension.js'; -import {gettext as _, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js'; - -let tracker = Shell.WindowTracker.get_default(); -export const panelBoxes = ['_leftBox', '_centerBox', '_rightBox']; - -//timeout names -const T2 = 'startIntellihideTimeout'; -const T4 = 'showDesktopTimeout'; -const T5 = 'trackerFocusAppTimeout'; -const T6 = 'scrollPanelDelayTimeout'; -const T7 = 'waitPanelBoxAllocation'; - -export const Panel = GObject.registerClass({ -}, class Panel extends St.Widget { - - _init(panelManager, monitor, panelBox, isStandalone) { - super._init({ layout_manager: new Clutter.BinLayout() }); - - this._timeoutsHandler = new Utils.TimeoutsHandler(); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._injectionManager = new InjectionManager(); - - this.panelManager = panelManager; - this.panelStyle = new PanelStyle.PanelStyle(); - - this.monitor = monitor; - this.panelBox = panelBox; - - // when the original gnome-shell top panel is kept, all panels are "standalone", - // so in this case use isPrimary to get the panel on the primary dtp monitor, which - // might be different from the system's primary monitor. - this.isStandalone = isStandalone; - this.isPrimary = !isStandalone || (SETTINGS.get_boolean('stockgs-keep-top-panel') && - monitor == panelManager.dtpPrimaryMonitor); - - this._sessionStyle = null; - this._unmappedButtons = []; - this._elementGroups = []; - - let systemMenuInfo = Utils.getSystemMenuInfo(); - - if (isStandalone) { - this.panel = new SecondaryPanel({ name: 'panel', reactive: true }); - this.statusArea = this.panel.statusArea = {}; - - //next 3 functions are needed by other extensions to add elements to the secondary panel - this.panel.addToStatusArea = function(role, indicator, position, box) { - return Main.panel.addToStatusArea.call(this, role, indicator, position, box); - }; - - this.panel._addToPanelBox = function(role, indicator, position, box) { - Main.panel._addToPanelBox.call(this, role, indicator, position, box); - }; - - this.panel._onMenuSet = function(indicator) { - Main.panel._onMenuSet.call(this, indicator); - }; - - this._leftBox = this.panel._leftBox = new St.BoxLayout({ name: 'panelLeft' }); - this._centerBox = this.panel._centerBox = new St.BoxLayout({ name: 'panelCenter' }); - this._rightBox = this.panel._rightBox = new St.BoxLayout({ name: 'panelRight' }); - - this.menuManager = this.panel.menuManager = new PopupMenu.PopupMenuManager(this.panel); - - this._setPanelMenu(systemMenuInfo.name, systemMenuInfo.constructor, this.panel); - this._setPanelMenu('dateMenu', DateMenu.DateMenuButton, this.panel); - this._setPanelMenu('activities', Main.panel.statusArea.activities.constructor, this.panel); - - this.panel.add_child(this._leftBox); - this.panel.add_child(this._centerBox); - this.panel.add_child(this._rightBox); - } else { - this.panel = Main.panel; - this.statusArea = Main.panel.statusArea; - this.menuManager = Main.panel.menuManager; - - panelBoxes.forEach(p => this[p] = Main.panel[p]); - - ['activities', systemMenuInfo.name, 'dateMenu'].forEach(b => { - let container = this.statusArea[b].container; - let parent = container.get_parent(); - let siblings = parent.get_children(); - let index = siblings.indexOf(container); - - container._dtpOriginalParent = parent; - container._dtpOriginalIndex = index && index == siblings.length - 1 ? -1: index; - parent ? parent.remove_child(container) : null; - this.panel.add_child(container); - }); - } - - // Create a wrapper around the real showAppsIcon in order to add a popupMenu. Most of - // its behavior is handled by the taskbar, but its positioning is done at the panel level - this.showAppsIconWrapper = new AppIcons.ShowAppsIconWrapper(this); - this.panel.add_child(this.showAppsIconWrapper.realShowAppsIcon); - - this.panel._delegate = this; - - this.add_child(this.panel); - - if (Main.panel._onButtonPress || Main.panel._tryDragWindow) { - this._signalsHandler.add([ - this.panel, - [ - 'button-press-event', - 'touch-event' - ], - this._onButtonPress.bind(this) - ]); - } - - if (Main.panel._onKeyPress) { - this._signalsHandler.add([this.panel, 'key-press-event', Main.panel._onKeyPress.bind(this)]); - } - - Main.ctrlAltTabManager.addGroup(this, _("Top Bar")+" "+ monitor.index, 'focus-top-bar-symbolic', - { sortGroup: CtrlAltTab.SortGroup.TOP }); - } - - enable () { - let { name: systemMenuName } = Utils.getSystemMenuInfo(); - - if (this.statusArea[systemMenuName] && this.statusArea[systemMenuName]._volumeOutput) { - Utils.getIndicators(this.statusArea[systemMenuName]._volumeOutput)._dtpIgnoreScroll = 1; - } - - this.geom = this.getGeometry(); - - this._setPanelPosition(); - - if (!this.isStandalone) { - this._injectionManager.overrideMethod(Object.getPrototypeOf(this.panel), 'vfunc_allocate', () => (box) => this._mainPanelAllocate(box)); - - // remove the extra space before the clock when the message-indicator is displayed - if (DateMenu.IndicatorPad) { - this._injectionManager.overrideMethod(DateMenu.IndicatorPad.prototype, 'vfunc_get_preferred_width', () => () => [0,0]); - this._injectionManager.overrideMethod(DateMenu.IndicatorPad.prototype, 'vfunc_get_preferred_height', () => () => [0,0]); - } - } - - if (!DateMenu.IndicatorPad && this.statusArea.dateMenu) { - //3.36 switched to a size constraint applied on an anonymous child - let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); - - this._dateMenuIndicatorPadContraints = indicatorPad.get_constraints(); - indicatorPad.clear_constraints(); - } - - this.menuManager._oldChangeMenu = this.menuManager._changeMenu; - this.menuManager._changeMenu = (menu) => { - if (!SETTINGS.get_boolean('stockgs-panelbtn-click-only')) { - this.menuManager._oldChangeMenu(menu); - } - }; - - this.dynamicTransparency = new Transparency.DynamicTransparency(this); - - this.taskbar = new Taskbar.Taskbar(this); - - this.panel.add_child(this.taskbar.actor); - - this._setShowDesktopButton(true); - - this._setAllocationMap(); - - this.panel.add_style_class_name('dashtopanelMainPanel ' + this.getOrientation()); - - this._timeoutsHandler.add([T2, SETTINGS.get_int('intellihide-enable-start-delay'), () => this.intellihide = new Intellihide.Intellihide(this)]); - - this._signalsHandler.add( - // this is to catch changes to the theme or window scale factor - [ - Utils.getStageTheme(), - 'changed', - () => (this._resetGeometry(), this._setShowDesktopButtonStyle()), - ], - [ - // sync hover after a popupmenu is closed - this.taskbar, - 'menu-closed', - () => this.panel.sync_hover() - ], - [ - Main.overview, - [ - 'showing', - 'hiding' - ], - () => this._adjustForOverview() - ], - [ - Main.overview, - 'hidden', - () => { - if (this.isPrimary) { - //reset the primary monitor when exiting the overview - this.panelManager.setFocusedMonitor(this.monitor); - } - } - ], - [ - this.statusArea.activities, - 'captured-event', - (actor, e) => { - if (e.type() == Clutter.EventType.BUTTON_PRESS || e.type() == Clutter.EventType.TOUCH_BEGIN) { - //temporarily use as primary the monitor on which the activities btn was clicked - this.panelManager.setFocusedMonitor(this.monitor); - } - } - ], - [ - this._centerBox, - 'child-added', - () => this._onBoxActorAdded(this._centerBox) - ], - [ - this._rightBox, - 'child-added', - () => this._onBoxActorAdded(this._rightBox) - ], - [ - this.panel, - 'scroll-event', - this._onPanelMouseScroll.bind(this) - ], - [ - Main.layoutManager, - 'startup-complete', - () => this._resetGeometry() - ] - ); - - this._bindSettingsChanges(); - - this.panelStyle.enable(this); - - if (this.checkIfVertical()) { - this._signalsHandler.add([ - this.panelBox, - 'notify::visible', - () => { - if (this.panelBox.visible) { - this._refreshVerticalAlloc(); - } - } - ]); - - if (this.statusArea.dateMenu) { - this._formatVerticalClock(); - - this._signalsHandler.add([ - this.statusArea.dateMenu._clock, - 'notify::clock', - () => this._formatVerticalClock() - ]); - } - } - - // Since we are usually visible but not usually changing, make sure - // most repaint requests don't actually require us to repaint anything. - // This saves significant CPU when repainting the screen. - this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); - - this._initProgressManager(); - } - - disable() { - this.panelStyle.disable(); - - this._timeoutsHandler.destroy(); - this._signalsHandler.destroy(); - - this.panel.remove_child(this.taskbar.actor); - - if (this.intellihide) { - this.intellihide.destroy(); - } - - this.dynamicTransparency.destroy(); - - this.progressManager.destroy(); - - this.taskbar.destroy(); - this.showAppsIconWrapper.destroy(); - - this.menuManager._changeMenu = this.menuManager._oldChangeMenu; - - this._unmappedButtons.forEach(a => this._disconnectVisibleId(a)); - - if (this.statusArea.dateMenu) { - this.statusArea.dateMenu._clockDisplay.text = this.statusArea.dateMenu._clock.clock; - this.statusArea.dateMenu._clockDisplay.clutter_text.set_width(-1); - - if (this._dateMenuIndicatorPadContraints) { - let indicatorPad = this.statusArea.dateMenu.get_first_child().get_first_child(); - - this._dateMenuIndicatorPadContraints.forEach(c => indicatorPad.add_constraint(c)); - } - } - - this._setVertical(this.panel, false); - this._setVertical(this._centerBox, false); - this._setVertical(this._rightBox, false); - - let { name: systemMenuName } = Utils.getSystemMenuInfo(); - - if (!this.isStandalone) { - ['vertical', 'horizontal', 'dashtopanelMainPanel'].forEach(c => this.panel.remove_style_class_name(c)); - - if (!Main.sessionMode.isLocked) { - ['activities', systemMenuName, 'dateMenu'].forEach(b => { - let container = this.statusArea[b].container; - let originalParent = container._dtpOriginalParent; - - this.panel.remove_child(container); - - originalParent && originalParent.insert_child_at_index( - container, - Math.min(container._dtpOriginalIndex, originalParent.get_children().length - 1) - ); - - delete container._dtpOriginalParent; - delete container._dtpOriginalIndex; - }); - } - - this._setShowDesktopButton(false); - - delete Utils.getIndicators(this.statusArea[systemMenuName]._volumeOutput)._dtpIgnoreScroll; - - this._injectionManager.clear(); - - this.panel._delegate = this.panel; - } else { - this._removePanelMenu('dateMenu'); - this._removePanelMenu(systemMenuName); - this._removePanelMenu('activities'); - } - - Main.ctrlAltTabManager.removeGroup(this); - } - - getPosition() { - let position = PanelSettings.getPanelPosition(SETTINGS, this.monitor.index); - - if (position == Pos.TOP) { - return St.Side.TOP; - } else if (position == Pos.RIGHT) { - return St.Side.RIGHT; - } else if (position == Pos.BOTTOM) { - return St.Side.BOTTOM; - } - - return St.Side.LEFT; - } - - checkIfVertical() { - let position = this.getPosition(); - - return (position == St.Side.LEFT || position == St.Side.RIGHT); - } - - getOrientation() { - return (this.checkIfVertical() ? 'vertical' : 'horizontal'); - } - - updateElementPositions() { - let panelPositions = this.panelManager.panelsElementPositions[this.monitor.index] || Pos.defaults; - - this._updateGroupedElements(panelPositions); - - this.panel.hide(); - this.panel.show(); - } - - _updateGroupedElements(panelPositions) { - let previousPosition = 0; - let previousCenteredPosition = 0; - let currentGroup = -1; - - this._elementGroups = []; - - panelPositions.forEach(pos => { - let allocationMap = this.allocationMap[pos.element]; - - if (allocationMap.actor) { - allocationMap.actor.visible = pos.visible; - - if (!pos.visible) { - return; - } - - let currentPosition = pos.position; - let isCentered = Pos.checkIfCentered(currentPosition); - - if (currentPosition == Pos.STACKED_TL && previousPosition == Pos.STACKED_BR) { - currentPosition = Pos.STACKED_BR; - } - - if (!previousPosition || - (previousPosition == Pos.STACKED_TL && currentPosition != Pos.STACKED_TL) || - (previousPosition != Pos.STACKED_BR && currentPosition == Pos.STACKED_BR) || - (isCentered && previousPosition != currentPosition && previousPosition != Pos.STACKED_BR)) { - this._elementGroups[++currentGroup] = { elements: [], index: this._elementGroups.length, expandableIndex: -1 }; - previousCenteredPosition = 0; - } - - if (pos.element == Pos.TASKBAR) { - this._elementGroups[currentGroup].expandableIndex = this._elementGroups[currentGroup].elements.length; - } - - if (isCentered && !this._elementGroups[currentGroup].isCentered) { - this._elementGroups[currentGroup].isCentered = 1; - previousCenteredPosition = currentPosition; - } - - this._elementGroups[currentGroup].position = previousCenteredPosition || currentPosition; - this._elementGroups[currentGroup].elements.push(allocationMap); - - allocationMap.position = currentPosition; - previousPosition = currentPosition; - } - }); - } - - _bindSettingsChanges() { - let isVertical = this.checkIfVertical(); - - this._signalsHandler.add( - [ - SETTINGS, - [ - 'changed::panel-sizes', - 'changed::group-apps' - ], - () => this._resetGeometry() - ], - [ - SETTINGS, - [ - 'changed::appicon-margin', - 'changed::appicon-padding' - ], - () => this.taskbar.resetAppIcons() - ], - [ - SETTINGS, - [ - 'changed::showdesktop-button-width', - 'changed::trans-use-custom-bg', - 'changed::desktop-line-use-custom-color', - 'changed::desktop-line-custom-color', - 'changed::trans-bg-color' - ], - () => this._setShowDesktopButtonStyle() - ], - [ - DESKTOPSETTINGS, - 'changed::clock-format', - () => { - this._clockFormat = null; - - if (isVertical) { - this._formatVerticalClock(); - } - } - ], - [ - SETTINGS, - 'changed::progress-show-bar', - () => this._initProgressManager() - ], - [ - SETTINGS, - 'changed::progress-show-count', - () => this._initProgressManager() - ] - ); - - if (isVertical) { - this._signalsHandler.add([SETTINGS, 'changed::group-apps-label-max-width', () => this._resetGeometry()]); - } - } - - _setPanelMenu(propName, constr, container) { - if (!this.statusArea[propName]) { - this.statusArea[propName] = this._getPanelMenu(propName, constr); - this.menuManager.addMenu(this.statusArea[propName].menu); - container.insert_child_at_index(this.statusArea[propName].container, 0); - } - } - - _removePanelMenu(propName) { - if (this.statusArea[propName]) { - let parent = this.statusArea[propName].container.get_parent(); - - if (parent) { - parent.remove_child(this.statusArea[propName].container); - } - - //calling this.statusArea[propName].destroy(); is buggy for now, gnome-shell never - //destroys those panel menus... - //since we can't destroy the menu (hence properly disconnect its signals), let's - //store it so the next time a panel needs one of its kind, we can reuse it instead - //of creating a new one - let panelMenu = this.statusArea[propName]; - - this.menuManager.removeMenu(panelMenu.menu); - PERSISTENTSTORAGE[propName].push(panelMenu); - this.statusArea[propName] = null; - } - } - - _getPanelMenu(propName, constr) { - PERSISTENTSTORAGE[propName] = PERSISTENTSTORAGE[propName] || []; - - if (!PERSISTENTSTORAGE[propName].length) { - PERSISTENTSTORAGE[propName].push(new constr()); - } - - return PERSISTENTSTORAGE[propName].pop(); - } - - _adjustForOverview() { - let isFocusedMonitor = this.panelManager.checkIfFocusedMonitor(this.monitor); - let isOverview = !!Main.overview.visibleTarget; - let isOverviewFocusedMonitor = isOverview && isFocusedMonitor; - let isShown = !isOverview || isOverviewFocusedMonitor; - let actorData = Utils.getTrackedActorData(this.panelBox) - - // prevent the "chrome" to update the panelbox visibility while in overview - actorData.trackFullscreen = !isOverview - - this.panelBox[isShown ? 'show' : 'hide'](); - } - - _resetGeometry() { - this.geom = this.getGeometry(); - this._setPanelPosition(); - this.taskbar.resetAppIcons(true); - this.dynamicTransparency.updateExternalStyle(); - - if (this.intellihide && this.intellihide.enabled) { - this.intellihide.reset(); - } - - if (this.checkIfVertical()) { - this.showAppsIconWrapper.realShowAppsIcon.toggleButton.set_width(this.geom.w); - this._refreshVerticalAlloc(); - } - } - - getGeometry() { - let scaleFactor = Utils.getScaleFactor(); - let panelBoxTheme = this.panelBox.get_theme_node(); - let lrPadding = panelBoxTheme.get_padding(St.Side.RIGHT) + panelBoxTheme.get_padding(St.Side.LEFT); - let topPadding = panelBoxTheme.get_padding(St.Side.TOP); - let tbPadding = topPadding + panelBoxTheme.get_padding(St.Side.BOTTOM); - let position = this.getPosition(); - let length = PanelSettings.getPanelLength(SETTINGS, this.monitor.index) / 100; - let anchor = PanelSettings.getPanelAnchor(SETTINGS, this.monitor.index); - let anchorPlaceOnMonitor = 0; - let gsTopPanelOffset = 0; - let x = 0, y = 0; - let w = 0, h = 0; - - const panelSize = PanelSettings.getPanelSize(SETTINGS, this.monitor.index); - this.dtpSize = panelSize * scaleFactor; - - if (SETTINGS.get_boolean('stockgs-keep-top-panel') && Main.layoutManager.primaryMonitor == this.monitor) { - gsTopPanelOffset = Main.layoutManager.panelBox.height - topPadding; - } - - if (this.checkIfVertical()) { - if (!SETTINGS.get_boolean('group-apps')) { - // add window title width and side padding of _dtpIconContainer when vertical - this.dtpSize += SETTINGS.get_int('group-apps-label-max-width') + AppIcons.DEFAULT_PADDING_SIZE * 2 / scaleFactor; - } - - this.sizeFunc = 'get_preferred_height', - this.fixedCoord = { c1: 'x1', c2: 'x2' } - this.varCoord = { c1: 'y1', c2: 'y2' }; - - w = this.dtpSize; - h = this.monitor.height * length - tbPadding - gsTopPanelOffset; - } else { - this.sizeFunc = 'get_preferred_width'; - this.fixedCoord = { c1: 'y1', c2: 'y2' }; - this.varCoord = { c1: 'x1', c2: 'x2' }; - - w = this.monitor.width * length - lrPadding; - h = this.dtpSize; - } - - if (position == St.Side.TOP || position == St.Side.LEFT) { - x = this.monitor.x; - y = this.monitor.y + gsTopPanelOffset; - } else if (position == St.Side.RIGHT) { - x = this.monitor.x + this.monitor.width - this.dtpSize - lrPadding; - y = this.monitor.y + gsTopPanelOffset; - } else { //BOTTOM - x = this.monitor.x; - y = this.monitor.y + this.monitor.height - this.dtpSize - tbPadding; - } - - if (this.checkIfVertical()) { - let viewHeight = this.monitor.height - gsTopPanelOffset; - - if (anchor === Pos.MIDDLE) { - anchorPlaceOnMonitor = (viewHeight - h) / 2; - } else if (anchor === Pos.END) { - anchorPlaceOnMonitor = viewHeight - h; - } else { // Pos.START - anchorPlaceOnMonitor = 0; - } - y = y + anchorPlaceOnMonitor; - } else { - if (anchor === Pos.MIDDLE) { - anchorPlaceOnMonitor = (this.monitor.width - w) / 2; - } else if (anchor === Pos.END) { - anchorPlaceOnMonitor = this.monitor.width - w; - } else { // Pos.START - anchorPlaceOnMonitor = 0; - } - x = x + anchorPlaceOnMonitor; - } - - return { - x, y, - w, h, - lrPadding, - tbPadding, - position - }; - } - - _setAllocationMap() { - this.allocationMap = {}; - let setMap = (name, actor) => this.allocationMap[name] = { - actor: actor, - box: new Clutter.ActorBox() - }; - - setMap(Pos.SHOW_APPS_BTN, this.showAppsIconWrapper.realShowAppsIcon); - setMap(Pos.ACTIVITIES_BTN, this.statusArea.activities ? this.statusArea.activities.container : 0); - setMap(Pos.LEFT_BOX, this._leftBox); - setMap(Pos.TASKBAR, this.taskbar.actor); - setMap(Pos.CENTER_BOX, this._centerBox); - setMap(Pos.DATE_MENU, this.statusArea.dateMenu.container); - setMap(Pos.SYSTEM_MENU, this.statusArea[Utils.getSystemMenuInfo().name].container); - setMap(Pos.RIGHT_BOX, this._rightBox); - setMap(Pos.DESKTOP_BTN, this._showDesktopButton); - } - - _mainPanelAllocate(box) { - this.panel.set_allocation(box); - } - - vfunc_allocate(box) { - this.set_allocation(box); - - let fixed = 0; - let centeredMonitorGroup; - let panelAlloc = new Clutter.ActorBox({ x1: 0, y1: 0, x2: this.geom.w, y2: this.geom.h }); - let assignGroupSize = (group, update) => { - group.size = 0; - group.tlOffset = 0; - group.brOffset = 0; - - group.elements.forEach(element => { - if (!update) { - element.box[this.fixedCoord.c1] = panelAlloc[this.fixedCoord.c1]; - element.box[this.fixedCoord.c2] = panelAlloc[this.fixedCoord.c2]; - element.natSize = element.actor[this.sizeFunc](-1)[1]; - } - - if (!group.isCentered || Pos.checkIfCentered(element.position)) { - group.size += element.natSize; - } else if (element.position == Pos.STACKED_TL) { - group.tlOffset += element.natSize; - } else { // Pos.STACKED_BR - group.brOffset += element.natSize; - } - }); - - if (group.isCentered) { - group.size += Math.max(group.tlOffset, group.brOffset) * 2; - group.tlOffset = Math.max(group.tlOffset - group.brOffset, 0); - } - }; - let allocateGroup = (group, tlLimit, brLimit) => { - let startPosition = tlLimit; - let currentPosition = 0; - - if (group.expandableIndex >= 0) { - let availableSize = brLimit - tlLimit; - let expandable = group.elements[group.expandableIndex]; - let i = 0; - let l = this._elementGroups.length; - let tlSize = 0; - let brSize = 0; - - if (centeredMonitorGroup && (centeredMonitorGroup != group || expandable.position != Pos.CENTERED_MONITOR)) { - if (centeredMonitorGroup.index < group.index || (centeredMonitorGroup == group && expandable.position == Pos.STACKED_TL)) { - i = centeredMonitorGroup.index; - } else { - l = centeredMonitorGroup.index; - } - } - - for (; i < l; ++i) { - let refGroup = this._elementGroups[i]; - - if (i < group.index && (!refGroup.fixed || refGroup[this.varCoord.c2] > tlLimit)) { - tlSize += refGroup.size; - } else if (i > group.index && (!refGroup.fixed || refGroup[this.varCoord.c1] < brLimit)) { - brSize += refGroup.size; - } - } - - if (group.isCentered) { - availableSize -= Math.max(tlSize, brSize) * 2; - } else { - availableSize -= tlSize + brSize; - } - - if (availableSize < group.size) { - expandable.natSize -= (group.size - availableSize) * (group.isCentered && !Pos.checkIfCentered(expandable.position) ? .5 : 1); - assignGroupSize(group, true); - } - } - - if (group.isCentered) { - startPosition = tlLimit + (brLimit - tlLimit - group.size) * .5; - } else if (group.position == Pos.STACKED_BR) { - startPosition = brLimit - group.size; - } - - currentPosition = group.tlOffset + startPosition; - - group.elements.forEach(element => { - element.box[this.varCoord.c1] = Math.round(currentPosition); - element.box[this.varCoord.c2] = Math.round((currentPosition += element.natSize)); - - element.actor.allocate(element.box); - }); - - group[this.varCoord.c1] = startPosition; - group[this.varCoord.c2] = currentPosition; - group.fixed = 1; - ++fixed; - }; - - this.panel.allocate(panelAlloc); - - this._elementGroups.forEach(group => { - group.fixed = 0; - - assignGroupSize(group); - - if (group.position == Pos.CENTERED_MONITOR) { - centeredMonitorGroup = group; - } - }); - - if (centeredMonitorGroup) { - allocateGroup(centeredMonitorGroup, panelAlloc[this.varCoord.c1], panelAlloc[this.varCoord.c2]); - } - - let iterations = 0; //failsafe - while (fixed < this._elementGroups.length && ++iterations < 10) { - for (let i = 0, l = this._elementGroups.length; i < l; ++i) { - let group = this._elementGroups[i]; - - if (group.fixed) { - continue; - } - - let prevGroup = this._elementGroups[i - 1]; - let nextGroup = this._elementGroups[i + 1]; - let prevLimit = prevGroup && prevGroup.fixed ? prevGroup[this.varCoord.c2] : - centeredMonitorGroup && group.index > centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c2] : panelAlloc[this.varCoord.c1]; - let nextLimit = nextGroup && nextGroup.fixed ? nextGroup[this.varCoord.c1] : - centeredMonitorGroup && group.index < centeredMonitorGroup.index ? centeredMonitorGroup[this.varCoord.c1] : panelAlloc[this.varCoord.c2]; - - if (group.position == Pos.STACKED_TL) { - allocateGroup(group, panelAlloc[this.varCoord.c1], nextLimit); - } else if (group.position == Pos.STACKED_BR) { - allocateGroup(group, prevLimit, panelAlloc[this.varCoord.c2]); - } else if ((!prevGroup || prevGroup.fixed) && (!nextGroup || nextGroup.fixed)) { // CENTERED - allocateGroup(group, prevLimit, nextLimit); - } - } - } - } - - _setPanelPosition() { - let clipContainer = this.panelBox.get_parent(); - - this.set_size(this.geom.w, this.geom.h); - clipContainer.set_position(this.geom.x, this.geom.y); - - this._setVertical(this.panel, this.checkIfVertical()); - - // styles for theming - Object.keys(St.Side).forEach(p => { - let cssName = 'dashtopanel' + p.charAt(0) + p.slice(1).toLowerCase(); - - this.panel[(St.Side[p] == this.geom.position ? 'add' : 'remove') + '_style_class_name'](cssName); - }); - - this._setPanelClip(clipContainer); - - Main.layoutManager._updateHotCorners(); - Main.layoutManager._updatePanelBarrier(this); - } - - _setPanelClip(clipContainer) { - clipContainer = clipContainer || this.panelBox.get_parent(); - this._timeoutsHandler.add([T7, 0, () => Utils.setClip(clipContainer, clipContainer.x, clipContainer.y, this.panelBox.width, this.panelBox.height)]); - } - - _onButtonPress(actor, event) { - let type = event.type(); - let isPress = type == Clutter.EventType.BUTTON_PRESS; - let button = isPress ? event.get_button() : -1; - let [stageX, stageY] = event.get_coords(); - - if (button == 3 && global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, stageX, stageY) == this.panel) { - //right click on an empty part of the panel, temporarily borrow and display the showapps context menu - Main.layoutManager.setDummyCursorGeometry(stageX, stageY, 0, 0); - - this.showAppsIconWrapper.createMenu(); - this.showAppsIconWrapper.popupMenu(Main.layoutManager.dummyCursor); - - return Clutter.EVENT_STOP; - } else { - const targetActor = global.stage.get_event_actor(event); - - if (Main.modalCount > 0 || targetActor != actor || - (!isPress && type != Clutter.EventType.TOUCH_BEGIN) || - (isPress && button != 1)) { - return Clutter.EVENT_PROPAGATE; - } - } - - let params = this.checkIfVertical() ? [stageY, 'y', 'height'] : [stageX, 'x', 'width']; - let dragWindow = this._getDraggableWindowForPosition.apply(this, params.concat(['maximized_' + this.getOrientation() + 'ly'])); - - if (!dragWindow) - return Clutter.EVENT_PROPAGATE; - - global.display.begin_grab_op(dragWindow, - Meta.GrabOp.MOVING, - false, /* pointer grab */ - true, /* frame action */ - button, - event.get_state(), - event.get_time(), - stageX, stageY); - - return Clutter.EVENT_STOP; - } - - _getDraggableWindowForPosition(stageCoord, coord, dimension, maximizedProp) { - let workspace = Utils.getCurrentWorkspace(); - let allWindowsByStacking = global.display.sort_windows_by_stacking( - workspace.list_windows() - ).reverse(); - - return Utils.find(allWindowsByStacking, metaWindow => { - let rect = metaWindow.get_frame_rect(); - - return metaWindow.get_monitor() == this.monitor.index && - metaWindow.showing_on_its_workspace() && - metaWindow.get_window_type() != Meta.WindowType.DESKTOP && - metaWindow[maximizedProp] && - stageCoord > rect[coord] && stageCoord < rect[coord] + rect[dimension]; - }); - } - - _onBoxActorAdded(box) { - if (this.checkIfVertical()) { - this._setVertical(box, true); - } - } - - _refreshVerticalAlloc() { - this._setVertical(this._centerBox, true); - this._setVertical(this._rightBox, true); - this._formatVerticalClock(); - } - - _setVertical(actor, isVertical) { - let _set = (actor, isVertical) => { - if (!actor || actor instanceof Dash.DashItemContainer || actor instanceof TaskbarItemContainer.TaskbarItemContainer) { - return; - } - - if (actor instanceof St.BoxLayout) { - actor.vertical = isVertical; - } else if ( - actor != this.statusArea.appMenu && - ((actor._delegate || actor) instanceof PanelMenu.ButtonBox || actor == this.statusArea.quickSettings) - ) { - let child = actor.get_first_child(); - - if (isVertical && !actor.visible && !actor._dtpVisibleId) { - this._unmappedButtons.push(actor); - actor._dtpVisibleId = actor.connect('notify::visible', () => { - this._disconnectVisibleId(actor); - this._refreshVerticalAlloc(); - }); - actor._dtpDestroyId = actor.connect('destroy', () => this._disconnectVisibleId(actor)); - } - - if (child) { - let [, natWidth] = actor.get_preferred_width(-1); - - child.x_align = Clutter.ActorAlign[isVertical ? 'CENTER' : 'START']; - actor.set_width(isVertical ? this.dtpSize : -1); - isVertical = isVertical && (natWidth > this.dtpSize); - actor[(isVertical ? 'add' : 'remove') + '_style_class_name']('vertical'); - } - } - - actor.get_children().forEach(c => _set(c, isVertical)); - }; - - _set(actor, false); - - if (isVertical) - _set(actor, isVertical); - } - - _disconnectVisibleId(actor) { - actor.disconnect(actor._dtpVisibleId); - actor.disconnect(actor._dtpDestroyId); - - delete actor._dtpVisibleId; - delete actor._dtpDestroyId; - - this._unmappedButtons.splice(this._unmappedButtons.indexOf(actor), 1); - } - - _formatVerticalClock() { - // https://github.com/GNOME/gnome-desktop/blob/master/libgnome-desktop/gnome-wall-clock.c#L310 - if (this.statusArea.dateMenu) { - let datetime = this.statusArea.dateMenu._clock.clock; - let datetimeParts = datetime.split(' '); - let time = datetimeParts[1]; - let clockText = this.statusArea.dateMenu._clockDisplay.clutter_text; - let setClockText = (text, useTimeSeparator) => { - let stacks = text instanceof Array; - let separator = `\n ${useTimeSeparator ? '‧‧' : '—' } \n`; - - clockText.set_text((stacks ? text.join(separator) : text).trim()); - clockText.set_use_markup(stacks); - clockText.get_allocation_box(); - - return !clockText.get_layout().is_ellipsized(); - }; - - if (clockText.ellipsize == Pango.EllipsizeMode.NONE) { - //on gnome-shell 3.36.4, the clockdisplay isn't ellipsize anymore, so set it back - clockText.ellipsize = Pango.EllipsizeMode.END; - } - - clockText.natural_width = this.dtpSize; - - if (!time) { - datetimeParts = datetime.split(' '); - time = datetimeParts.pop(); - datetimeParts = [datetimeParts.join(' '), time]; - } - - if (!setClockText(datetime) && - !setClockText(datetimeParts) && - !setClockText(time)) { - let timeParts = time.split('∶'); - - if (!this._clockFormat) { - this._clockFormat = DESKTOPSETTINGS.get_string('clock-format'); - } - - if (this._clockFormat == '12h') { - timeParts.push.apply(timeParts, timeParts.pop().split(' ')); - } - - setClockText(timeParts, true); - } - } - } - - _setShowDesktopButton(add) { - if (add) { - if(this._showDesktopButton) - return; - - this._showDesktopButton = new St.Bin({ style_class: 'showdesktop-button', - reactive: true, - can_focus: true, - // x_fill: true, - // y_fill: true, - track_hover: true }); - - this._setShowDesktopButtonStyle(); - - this._showDesktopButton.connect('touch-event', (actor, event) => { - if (event.type() == Clutter.EventType.TOUCH_BEGIN) { - this._onShowDesktopButtonPress(); - } - }); - this._showDesktopButton.connect('button-press-event', () => this._onShowDesktopButtonPress()); - this._showDesktopButton.connect('enter-event', () => { - this._showDesktopButton.add_style_class_name(this._getBackgroundBrightness() ? - 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); - - if (SETTINGS.get_boolean('show-showdesktop-hover')) { - this._timeoutsHandler.add([T4, SETTINGS.get_int('show-showdesktop-delay'), () => { - this._hiddenDesktopWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - this._toggleWorkspaceWindows(true, this._hiddenDesktopWorkspace); - }]); - } - }); - - this._showDesktopButton.connect('leave-event', () => { - this._showDesktopButton.remove_style_class_name(this._getBackgroundBrightness() ? - 'showdesktop-button-light-hovered' : 'showdesktop-button-dark-hovered'); - - if (SETTINGS.get_boolean('show-showdesktop-hover')) { - if (this._timeoutsHandler.getId(T4)) { - this._timeoutsHandler.remove(T4); - } else if (this._hiddenDesktopWorkspace) { - this._toggleWorkspaceWindows(false, this._hiddenDesktopWorkspace); - } - } - }); - - this.panel.add_child(this._showDesktopButton); - } else { - if(!this._showDesktopButton) - return; - - this.panel.remove_child(this._showDesktopButton); - this._showDesktopButton.destroy(); - this._showDesktopButton = null; - } - } - - _setShowDesktopButtonStyle() { - let rgb = this._getBackgroundBrightness() ? "rgba(55, 55, 55, .2)" : "rgba(200, 200, 200, .2)"; - - let isLineCustom = SETTINGS.get_boolean('desktop-line-use-custom-color'); - rgb = isLineCustom ? SETTINGS.get_string('desktop-line-custom-color') : rgb; - - if (this._showDesktopButton) { - let buttonSize = SETTINGS.get_int('showdesktop-button-width') + 'px;'; - let isVertical = this.checkIfVertical(); - - let sytle = "border: 0 solid " + rgb + ";"; - sytle += isVertical ? 'border-top-width:1px;height:' + buttonSize : 'border-left-width:1px;width:' + buttonSize; - - this._showDesktopButton.set_style(sytle); - this._showDesktopButton[(isVertical ? 'x' : 'y') + '_expand'] = true; - } - } - - // _getBackgroundBrightness: return true if panel has a bright background color - _getBackgroundBrightness() { - return Utils.checkIfColorIsBright(this.dynamicTransparency.backgroundColorRgb); - } - - _toggleWorkspaceWindows(hide, workspace) { - let time = SETTINGS.get_int('show-showdesktop-time') * .001; - - workspace.list_windows().forEach(w => { - if (!w.minimized && !w.customJS_ding) { - let tweenOpts = { - opacity: hide ? 0 : 255, - time: time, - transition: 'easeOutQuad' - }; - - Utils.animateWindowOpacity(w.get_compositor_private(), tweenOpts); - } - }); - } - - _onShowDesktopButtonPress() { - let label = 'trackerFocusApp'; - - this._signalsHandler.removeWithLabel(label); - this._timeoutsHandler.remove(T5); - - if(this._restoreWindowList && this._restoreWindowList.length) { - this._timeoutsHandler.remove(T4); - - let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - let windows = current_workspace.list_windows(); - this._restoreWindowList.forEach(function(w) { - if(windows.indexOf(w) > -1) - Main.activateWindow(w); - }); - this._restoreWindowList = null; - } else { - let current_workspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - let windows = current_workspace.list_windows().filter(function (w) { - return w.showing_on_its_workspace() && !w.skip_taskbar; - }); - windows = global.display.sort_windows_by_stacking(windows); - - windows.forEach(function(w) { - w.minimize(); - }); - - this._restoreWindowList = windows; - - this._timeoutsHandler.add([T5, 20, () => this._signalsHandler.addWithLabel( - label, - [ - tracker, - 'notify::focus-app', - () => this._restoreWindowList = null - ] - )]); - } - - Main.overview.hide(); - } - - _onPanelMouseScroll(actor, event) { - let scrollAction = SETTINGS.get_string('scroll-panel-action'); - let direction = Utils.getMouseScrollDirection(event); - - const targetActor = global.stage.get_event_actor(event); - - if (!this._checkIfIgnoredScrollSource(targetActor) && !this._timeoutsHandler.getId(T6)) { - if (direction && scrollAction === 'SWITCH_WORKSPACE') { - let args = [global.display]; - - //adjust for horizontal workspaces - if (Utils.DisplayWrapper.getWorkspaceManager().layout_rows === 1) { - direction = direction == 'up' ? 'left' : 'right'; - } - - //gnome-shell < 3.30 needs an additional "screen" param - global.screen ? args.push(global.screen) : 0; - - let showWsPopup = SETTINGS.get_boolean('scroll-panel-show-ws-popup'); - showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = { display: () => {} }; - Main.wm._showWorkspaceSwitcher.apply(Main.wm, args.concat([0, { get_name: () => 'switch---' + direction }])); - showWsPopup ? 0 : Main.wm._workspaceSwitcherPopup = null; - } else if (direction && scrollAction === 'CYCLE_WINDOWS') { - let windows = this.taskbar.getAppInfos().reduce((ws, appInfo) => ws.concat(appInfo.windows), []); - - Utils.activateSiblingWindow(windows, direction); - } else if (scrollAction === 'CHANGE_VOLUME' && !event.is_pointer_emulated()) { - let proto = Volume.OutputIndicator.prototype; - let func = proto._handleScrollEvent || proto.vfunc_scroll_event || proto._onScrollEvent; - let indicator = Main.panel.statusArea[Utils.getSystemMenuInfo().name]._volumeOutput; - - if (indicator.quickSettingsItems) - // new quick settings menu in gnome-shell > 42 - func(indicator.quickSettingsItems[0], event); - else - func.call(indicator, 0, event); - } else { - return; - } - - const scrollDelay = SETTINGS.get_int('scroll-panel-delay'); - - if (scrollDelay) { - this._timeoutsHandler.add([T6, scrollDelay, () => {}]); - } - } - } - - _checkIfIgnoredScrollSource(source) { - let ignoredConstr = ['WorkspaceIndicator']; - - return source.get_parent()._dtpIgnoreScroll || ignoredConstr.indexOf(source.constructor.name) >= 0; - } - - _initProgressManager() { - const progressVisible = SETTINGS.get_boolean('progress-show-bar'); - const countVisible = SETTINGS.get_boolean('progress-show-count'); - const pm = this.progressManager; - - if(!pm && (progressVisible || countVisible)) - this.progressManager = new Progress.ProgressManager(); - else if (pm) - Object.keys(pm._entriesByDBusName).forEach((k) => pm._entriesByDBusName[k].setCountVisible(countVisible)); - } -}); - -export const SecondaryPanel = GObject.registerClass({ -}, class SecondaryPanel extends St.Widget { - - _init(params) { - super._init(params); - } - - vfunc_allocate(box) { - this.set_allocation(box); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelPositions.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelPositions.js deleted file mode 100644 index a970bdde..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelPositions.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 const SHOW_APPS_BTN = 'showAppsButton'; -export const ACTIVITIES_BTN = 'activitiesButton'; -export const TASKBAR = 'taskbar'; -export const DATE_MENU = 'dateMenu'; -export const SYSTEM_MENU = 'systemMenu'; -export const LEFT_BOX = 'leftBox'; -export const CENTER_BOX = 'centerBox'; -export const RIGHT_BOX = 'rightBox'; -export const DESKTOP_BTN = 'desktopButton'; - -export const STACKED_TL = 'stackedTL'; -export const STACKED_BR = 'stackedBR'; -export const CENTERED = 'centered'; -export const CENTERED_MONITOR = 'centerMonitor'; - -export const TOP = 'TOP'; -export const BOTTOM = 'BOTTOM'; -export const LEFT = 'LEFT'; -export const RIGHT = 'RIGHT'; - -export const START = 'START'; -export const MIDDLE = 'MIDDLE'; -export const END = 'END'; - -export const defaults = [ - { element: SHOW_APPS_BTN, visible: true, position: STACKED_TL }, - { element: ACTIVITIES_BTN, visible: false, position: STACKED_TL }, - { element: LEFT_BOX, visible: true, position: STACKED_TL }, - { element: TASKBAR, visible: true, position: STACKED_TL }, - { element: CENTER_BOX, visible: true, position: STACKED_BR }, - { element: RIGHT_BOX, visible: true, position: STACKED_BR }, - { element: DATE_MENU, visible: true, position: STACKED_BR }, - { element: SYSTEM_MENU, visible: true, position: STACKED_BR }, - { element: DESKTOP_BTN, visible: true, position: STACKED_BR }, -]; - -export const optionDialogFunctions = {}; - -optionDialogFunctions[SHOW_APPS_BTN] = '_showShowAppsButtonOptions'; -optionDialogFunctions[DESKTOP_BTN] = '_showDesktopButtonOptions'; - -export function checkIfCentered(position) { - return position == CENTERED || position == CENTERED_MONITOR; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelSettings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelSettings.js deleted file mode 100644 index fc2d60cd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelSettings.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 * as Pos from './panelPositions.js'; - -/** Return object representing a settings value that is stored as JSON. */ -export function getSettingsJson(settings, setting) { - try { - return JSON.parse(settings.get_string(setting)); - } catch(e) { - log('Error parsing positions: ' + e.message); - } -} -/** Write value object as JSON to setting in settings. */ -export function setSettingsJson(settings, setting, value) { - try { - const json = JSON.stringify(value); - settings.set_string(setting, json); - } catch(e) { - log('Error serializing setting: ' + e.message); - } -} - -/** Returns size of panel on a specific monitor, in pixels. */ -export function getPanelSize(settings, monitorIndex) { - const sizes = getSettingsJson(settings, 'panel-sizes'); - // Pull in deprecated setting if panel-sizes does not have setting for monitor. - const fallbackSize = settings.get_int('panel-size'); - const theDefault = 48; - return sizes[monitorIndex] || fallbackSize || theDefault; -} - -export function setPanelSize(settings, monitorIndex, value) { - if (!(Number.isInteger(value) && value <= 128 && value >= 16)) { - log('Not setting invalid panel size: ' + value); - return; - } - let sizes = getSettingsJson(settings, 'panel-sizes'); - sizes[monitorIndex] = value; - setSettingsJson(settings, 'panel-sizes', sizes); -} - -/** - * Returns length of panel on a specific monitor, as a whole number percent, - * from settings. e.g. 100 - */ -export function getPanelLength(settings, monitorIndex) { - const lengths = getSettingsJson(settings, 'panel-lengths'); - const theDefault = 100; - return lengths[monitorIndex] || theDefault; -} - -export function setPanelLength(settings, monitorIndex, value) { - if (!(Number.isInteger(value) && value <= 100 && value >= 0)) { - log('Not setting invalid panel length: ' + value); - return; - } - let lengths = getSettingsJson(settings, 'panel-lengths'); - lengths[monitorIndex] = value; - setSettingsJson(settings, 'panel-lengths', lengths); -} - -/** Returns position of panel on a specific monitor. */ -export function getPanelPosition(settings, monitorIndex) { - const positions = getSettingsJson(settings, 'panel-positions'); - const fallbackPosition = settings.get_string('panel-position'); - const theDefault = Pos.BOTTOM; - return positions[monitorIndex] || fallbackPosition || theDefault; -} - -export function setPanelPosition(settings, monitorIndex, value) { - if (!(value === Pos.TOP || value === Pos.BOTTOM || value === Pos.LEFT - || value === Pos.RIGHT)) { - log('Not setting invalid panel position: ' + value); - return; - } - const positions = getSettingsJson(settings, 'panel-positions'); - positions[monitorIndex] = value; - setSettingsJson(settings, 'panel-positions', positions); -} - -/** Returns anchor location of panel on a specific monitor. */ -export function getPanelAnchor(settings, monitorIndex) { - const anchors = getSettingsJson(settings, 'panel-anchors'); - const theDefault = Pos.MIDDLE; - return anchors[monitorIndex] || theDefault; -} - -export function setPanelAnchor(settings, monitorIndex, value) { - if (!(value === Pos.START || value === Pos.MIDDLE || value === Pos.END)) { - log('Not setting invalid panel anchor: ' + value); - return; - } - const anchors = getSettingsJson(settings, 'panel-anchors'); - anchors[monitorIndex] = value; - setSettingsJson(settings, 'panel-anchors', anchors); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelStyle.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelStyle.js deleted file mode 100644 index 353e3ef0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/panelStyle.js +++ /dev/null @@ -1,314 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * Credits: - * Ideas for recursing child actors and assigning inline styles - * are based on code from the StatusAreaHorizontalSpacing extension - * https://bitbucket.org/mathematicalcoffee/status-area-horizontal-spacing-gnome-shell-extension - * mathematical.coffee@gmail.com - */ - -import * as Utils from './utils.js'; -import {SETTINGS} from './extension.js'; - - -export const PanelStyle = class { - - enable(panel) { - this.panel = panel; - - this._applyStyles(); - - this._bindSettingsChanges(); - } - - disable() { - for (let i = 0; i < this._dtpSettingsSignalIds.length; ++i) { - SETTINGS.disconnect(this._dtpSettingsSignalIds[i]); - } - - this._removeStyles(); - } - - _bindSettingsChanges() { - let configKeys = [ - "tray-size", - "leftbox-size", - "tray-padding", - "leftbox-padding", - "status-icon-padding", - ]; - - this._dtpSettingsSignalIds = []; - - for(let i in configKeys) { - this._dtpSettingsSignalIds.push(SETTINGS.connect('changed::' + configKeys[i], () => { - this._removeStyles(); - this._applyStyles(); - })); - } - } - - _applyStyles() { - this._rightBoxOperations = []; - - let trayPadding = SETTINGS.get_int('tray-padding'); - let isVertical = this.panel.checkIfVertical(); - let paddingStyle = 'padding: ' + (isVertical ? '%dpx 0' : '0 %dpx'); - - if(trayPadding >= 0) { - let operation = {}; - let trayPaddingStyleLine; - - if (isVertical) { - trayPaddingStyleLine = paddingStyle.format(trayPadding); - operation.compareFn = function (actor) { - let parent = actor.get_parent(); - return ((parent && parent.has_style_class_name && (parent.has_style_class_name('panel-button') && !parent.has_style_class_name('clock-display'))) || - (actor.has_style_class_name && actor.has_style_class_name('clock'))); - }; - } else { - trayPaddingStyleLine = '-natural-hpadding: %dpx'.format(trayPadding); - if (trayPadding < 6) { - trayPaddingStyleLine += '; -minimum-hpadding: %dpx'.format(trayPadding); - } - - operation.compareFn = function (actor) { - return (actor.has_style_class_name && actor.has_style_class_name('panel-button')); - }; - } - - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, trayPaddingStyleLine, operationIdx); - this._refreshPanelButton(actor); - }; - this._rightBoxOperations.push(operation); - } - - let statusIconPadding = SETTINGS.get_int('status-icon-padding'); - if(statusIconPadding >= 0) { - let statusIconPaddingStyleLine = paddingStyle.format(statusIconPadding) - let operation = {}; - operation.compareFn = function (actor) { - return (actor.has_style_class_name && actor.has_style_class_name('system-status-icon')); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, statusIconPaddingStyleLine, operationIdx); - }; - this._rightBoxOperations.push(operation); - } - - let trayContentSize = SETTINGS.get_int('tray-size'); - if(trayContentSize > 0) { - let trayIconSizeStyleLine = 'icon-size: %dpx'.format(trayContentSize) - let operation = {}; - operation.compareFn = function (actor) { - return (actor.constructor && actor.constructor.name == 'St_Icon'); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, trayIconSizeStyleLine, operationIdx); - }; - this._rightBoxOperations.push(operation); - - let trayContentSizeStyleLine = 'font-size: %dpx'.format(trayContentSize) - operation = {}; - operation.compareFn = function (actor) { - return (actor.constructor && actor.constructor.name == 'St_Label'); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, trayContentSizeStyleLine, operationIdx); - }; - this._rightBoxOperations.push(operation); - - this._overrideStyle(this.panel._rightBox, trayContentSizeStyleLine, 0); - this._overrideStyle(this.panel._centerBox, trayContentSizeStyleLine, 0); - } - - // center box has been moved next to the right box and will be treated the same - this._centerBoxOperations = this._rightBoxOperations; - - this._leftBoxOperations = []; - - let leftboxPadding = SETTINGS.get_int('leftbox-padding'); - if(leftboxPadding >= 0) { - let leftboxPaddingStyleLine = paddingStyle.format(leftboxPadding); - let operation = {}; - operation.compareFn = function (actor) { - let parent = actor.get_parent(); - return (parent && parent.has_style_class_name && parent.has_style_class_name('panel-button')); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, leftboxPaddingStyleLine, operationIdx); - }; - this._leftBoxOperations.push(operation); - } - - let leftboxContentSize = SETTINGS.get_int('leftbox-size'); - if(leftboxContentSize > 0) { - let leftboxIconSizeStyleLine = 'icon-size: %dpx'.format(leftboxContentSize) - let operation = {}; - operation.compareFn = function (actor) { - return (actor.constructor && actor.constructor.name == 'St_Icon'); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, leftboxIconSizeStyleLine, operationIdx); - }; - this._leftBoxOperations.push(operation); - - let leftboxContentSizeStyleLine = 'font-size: %dpx'.format(leftboxContentSize) - operation = {}; - operation.compareFn = function (actor) { - return (actor.constructor && actor.constructor.name == 'St_Label'); - }; - operation.applyFn = (actor, operationIdx) => { - this._overrideStyle(actor, leftboxContentSizeStyleLine, operationIdx); - }; - this._leftBoxOperations.push(operation); - - this._overrideStyle(this.panel._leftBox, leftboxContentSizeStyleLine, 0); - } - - this._applyStylesRecursively(); - - /* connect signal */ - this._rightBoxActorAddedID = this.panel._rightBox.connect('child-added', - (container, actor) => { - if(this._rightBoxOperations.length && !this._ignoreAddedChild) - this._recursiveApply(actor, this._rightBoxOperations); - - this._ignoreAddedChild = 0; - } - ); - this._centerBoxActorAddedID = this.panel._centerBox.connect('child-added', - (container, actor) => { - if(this._centerBoxOperations.length && !this._ignoreAddedChild) - this._recursiveApply(actor, this._centerBoxOperations); - - this._ignoreAddedChild = 0; - } - ); - this._leftBoxActorAddedID = this.panel._leftBox.connect('child-added', - (container, actor) => { - if(this._leftBoxOperations.length) - this._recursiveApply(actor, this._leftBoxOperations); - } - ); - } - - _removeStyles() { - /* disconnect signal */ - if (this._rightBoxActorAddedID) - this.panel._rightBox.disconnect(this._rightBoxActorAddedID); - if (this._centerBoxActorAddedID) - this.panel._centerBox.disconnect(this._centerBoxActorAddedID); - if (this._leftBoxActorAddedID) - this.panel._leftBox.disconnect(this._leftBoxActorAddedID); - - this._restoreOriginalStyle(this.panel._rightBox); - this._restoreOriginalStyle(this.panel._centerBox); - this._restoreOriginalStyle(this.panel._leftBox); - - this._applyStylesRecursively(true); - } - - _applyStylesRecursively(restore) { - /*recurse actors */ - if(this._rightBoxOperations.length) { - // add the system menu as we move it from the rightbox to the panel to position it independently - let children = this.panel._rightBox.get_children().concat([this.panel.statusArea[Utils.getSystemMenuInfo().name].container]); - for(let i in children) - this._recursiveApply(children[i], this._rightBoxOperations, restore); - } - - if(this._centerBoxOperations.length) { - // add the date menu as we move it from the centerbox to the panel to position it independently - let children = this.panel._centerBox.get_children().concat([this.panel.statusArea.dateMenu.container]); - for(let i in children) - this._recursiveApply(children[i], this._centerBoxOperations, restore); - } - - if(this._leftBoxOperations.length) { - let children = this.panel._leftBox.get_children(); - for(let i in children) - this._recursiveApply(children[i], this._leftBoxOperations, restore); - } - } - - _recursiveApply(actor, operations, restore) { - for(let i in operations) { - let o = operations[i]; - if(o.compareFn(actor)) - if(restore) - o.restoreFn ? o.restoreFn(actor) : this._restoreOriginalStyle(actor); - else - o.applyFn(actor, i); - } - - if(actor.get_children) { - let children = actor.get_children(); - for(let i in children) { - this._recursiveApply(children[i], operations, restore); - } - } - } - - _overrideStyle(actor, styleLine, operationIdx) { - if (actor._dtp_original_inline_style === undefined) { - actor._dtp_original_inline_style = actor.get_style(); - } - - if(actor._dtp_style_overrides === undefined) { - actor._dtp_style_overrides = {}; - } - - actor._dtp_style_overrides[operationIdx] = styleLine; - let newStyleLine = ''; - for(let i in actor._dtp_style_overrides) - newStyleLine += actor._dtp_style_overrides[i] + '; '; - actor.set_style(newStyleLine + (actor._dtp_original_inline_style || '')); - } - - _restoreOriginalStyle(actor) { - if (actor._dtp_original_inline_style !== undefined) { - actor.set_style(actor._dtp_original_inline_style); - delete actor._dtp_original_inline_style; - delete actor._dtp_style_overrides; - } - - if (actor.has_style_class_name('panel-button')) { - this._refreshPanelButton(actor); - } - } - - _refreshPanelButton(actor) { - if (actor.visible) { - //force gnome 3.34+ to refresh (having problem with the -natural-hpadding) - let parent = actor.get_parent(); - let children = parent.get_children(); - let actorIndex = 0; - - if (children.length > 1) { - actorIndex = children.indexOf(actor); - } - - this._ignoreAddedChild = [this.panel._centerBox, this.panel._rightBox].indexOf(parent) >= 0; - - parent.remove_child(actor); - parent.insert_child_at_index(actor, actorIndex); - } - } - -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/prefs.js deleted file mode 100644 index d2337c2d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/prefs.js +++ /dev/null @@ -1,2343 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg. - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -import GdkPixbuf from 'gi://GdkPixbuf'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; -import Gdk from 'gi://Gdk'; - -import * as PanelSettings from './panelSettings.js'; -import * as Pos from './panelPositions.js'; - -import {ExtensionPreferences, gettext as _, ngettext} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - -const SCALE_UPDATE_TIMEOUT = 500; -const DEFAULT_PANEL_SIZES = [ 128, 96, 64, 48, 32, 24, 16 ]; -const DEFAULT_FONT_SIZES = [ 96, 64, 48, 32, 24, 16, 0 ]; -const DEFAULT_MARGIN_SIZES = [ 32, 24, 16, 12, 8, 4, 0 ]; -const DEFAULT_PADDING_SIZES = [ 32, 24, 16, 12, 8, 4, 0, -1 ]; -// Minimum length could be 0, but a higher value may help prevent confusion about where the panel went. -const LENGTH_MARKS = [ 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 ]; -const MAX_WINDOW_INDICATOR = 4; - -const SCHEMA_PATH = '/org/gnome/shell/extensions/dash-to-panel/'; - -/** - * This function was copied from the activities-config extension - * https://github.com/nls1729/acme-code/tree/master/activities-config - * by Norman L. Smith. - */ -function cssHexString(css) { - let rrggbb = '#'; - let start; - for (let loop = 0; loop < 3; loop++) { - let end = 0; - let xx = ''; - for (let loop = 0; loop < 2; loop++) { - while (true) { - let x = css.slice(end, end + 1); - if ((x == '(') || (x == ',') || (x == ')')) - break; - end++; - } - if (loop == 0) { - end++; - start = end; - } - } - xx = parseInt(css.slice(start, end)).toString(16); - if (xx.length == 1) - xx = '0' + xx; - rrggbb += xx; - css = css.slice(end); - } - return rrggbb; -} - -function setShortcut(settings, shortcutName) { - let shortcut_text = settings.get_string(shortcutName + '-text'); - let [success, key, mods] = Gtk.accelerator_parse(shortcut_text); - - if (success && Gtk.accelerator_valid(key, mods)) { - let shortcut = Gtk.accelerator_name(key, mods); - settings.set_strv(shortcutName, [shortcut]); - } - else { - settings.set_strv(shortcutName, []); - } -} - -function checkHotkeyPrefix(settings) { - settings.delay(); - - let hotkeyPrefix = settings.get_string('hotkey-prefix-text'); - if (hotkeyPrefix == 'Super') - hotkeyPrefix = ''; - else if (hotkeyPrefix == 'SuperAlt') - hotkeyPrefix = ''; - let [ , , mods] = Gtk.accelerator_parse(hotkeyPrefix); - let [ , , shift_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); - let [ , , ctrl_mods] = Gtk.accelerator_parse('' + hotkeyPrefix); - - let numHotkeys = 10; - for (let i = 1; i <= numHotkeys; i++) { - let number = i; - if (number == 10) - number = 0; - let key = Gdk.keyval_from_name(number.toString()); - let key_kp = Gdk.keyval_from_name('KP_' + number.toString()); - if (Gtk.accelerator_valid(key, mods)) { - let shortcut = Gtk.accelerator_name(key, mods); - let shortcut_kp = Gtk.accelerator_name(key_kp, mods); - - // Setup shortcut strings - settings.set_strv('app-hotkey-' + i, [shortcut]); - settings.set_strv('app-hotkey-kp-' + i, [shortcut_kp]); - - // With - shortcut = Gtk.accelerator_name(key, shift_mods); - shortcut_kp = Gtk.accelerator_name(key_kp, shift_mods); - settings.set_strv('app-shift-hotkey-' + i, [shortcut]); - settings.set_strv('app-shift-hotkey-kp-' + i, [shortcut_kp]); - - // With - shortcut = Gtk.accelerator_name(key, ctrl_mods); - shortcut_kp = Gtk.accelerator_name(key_kp, ctrl_mods); - settings.set_strv('app-ctrl-hotkey-' + i, [shortcut]); - settings.set_strv('app-ctrl-hotkey-kp-' + i, [shortcut_kp]); - } - else { - // Reset default settings for the relevant keys if the - // accelerators are invalid - let keys = ['app-hotkey-' + i, 'app-shift-hotkey-' + i, 'app-ctrl-hotkey-' + i, // Regular numbers - 'app-hotkey-kp-' + i, 'app-shift-hotkey-kp-' + i, 'app-ctrl-hotkey-kp-' + i]; // Key-pad numbers - keys.forEach(function(val) { - settings.set_value(val, settings.get_default_value(val)); - }, this); - } - } - - settings.apply(); -} - -function mergeObjects(main, bck) { - for (const prop in bck) { - if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { - main[prop] = bck[prop]; - } - } - - return main; -} - -const Preferences = class { - - constructor(window, settings, path) { - // this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-panel'); - this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); - this._builder = new Gtk.Builder(); - this._builder.set_scope(new BuilderScope(this)); - this._settings = settings; - this._path = path; - - this._metadata = ExtensionPreferences.lookupByURL(import.meta.url).metadata; - this._builder.set_translation_domain(this._metadata['gettext-domain']); - - window.set_search_enabled(true); - - // dialogs - this._builder.add_from_file(this._path + '/ui/BoxAnimateAppIconHoverOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxDotOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxShowDesktopOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxDynamicOpacityOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxIntellihideOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxShowApplicationsOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxWindowPreviewOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxGroupAppsOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxMiddleClickOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxOverlayShortcut.ui'); - this._builder.add_from_file(this._path + '/ui/BoxSecondaryMenuOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxScrollPanelOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxScrollIconOptions.ui'); - this._builder.add_from_file(this._path + '/ui/BoxAdvancedOptions.ui'); - - // pages - this._builder.add_from_file(this._path + '/ui/SettingsPosition.ui'); - let pagePosition = this._builder.get_object('position'); - window.add(pagePosition); - - this._builder.add_from_file(this._path + '/ui/SettingsStyle.ui'); - let pageStyle = this._builder.get_object('style'); - window.add(pageStyle); - - this._builder.add_from_file(this._path + '/ui/SettingsBehavior.ui'); - let pageBehavior = this._builder.get_object('behavior'); - window.add(pageBehavior); - - this._builder.add_from_file(this._path + '/ui/SettingsAction.ui'); - let pageAction = this._builder.get_object('action'); - window.add(pageAction); - - this._builder.add_from_file(this._path + '/ui/SettingsFineTune.ui'); - let pageFineTune = this._builder.get_object('finetune'); - window.add(pageFineTune); - - this._builder.add_from_file(this._path + '/ui/SettingsAbout.ui'); - let pageAbout = this._builder.get_object('about'); - window.add(pageAbout); - - let listbox = this._builder.get_object('taskbar_display_listbox'); - let provider = new Gtk.CssProvider(); - provider.load_from_data('list { background-color: transparent; }', -1); - let context = listbox.get_style_context(); - context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - - // set the window as notebook, it is being used as parent for dialogs - this.notebook = window; - - // Timeout to delay the update of the settings - this._panel_size_timeout = 0; - this._dot_height_timeout = 0; - this._tray_size_timeout = 0; - this._leftbox_size_timeout = 0; - this._appicon_margin_timeout = 0; - this._appicon_padding_timeout = 0; - this._opacity_timeout = 0; - this._tray_padding_timeout = 0; - this._statusicon_padding_timeout = 0; - this._leftbox_padding_timeout = 0; - this._addFormatValueCallbacks(); - this._bindSettings(); - } - - /** - * Connect signals - */ - _connector(builder, object, signal, handler) { - object.connect(signal, this._SignalHandler[handler].bind(this)); - } - - _updateVerticalRelatedOptions() { - let position = this._getPanelPosition(this._currentMonitorIndex); - let isVertical = position == Pos.LEFT || position == Pos.RIGHT; - let showDesktopWidthLabel = this._builder.get_object('show_showdesktop_width_label'); - - showDesktopWidthLabel.set_title(isVertical ? _('Show Desktop button height (px)') : _('Show Desktop button width (px)')); - - this._displayPanelPositionsForMonitor(this._currentMonitorIndex); - } - - _maybeDisableTopPosition() { - let keepTopPanel = this._settings.get_boolean('stockgs-keep-top-panel'); - let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - let topAvailable = !keepTopPanel || (!monitorSync && this._currentMonitorIndex != this.monitors[0]); - let topRadio = this._builder.get_object('position_top_button'); - - topRadio.set_sensitive(topAvailable); - topRadio.set_tooltip_text(!topAvailable ? _('Unavailable when gnome-shell top panel is present') : ''); - } - - _getPanelPosition(monitorIndex) { - return PanelSettings.getPanelPosition(this._settings, monitorIndex); - } - - _setPanelPosition(position) { - const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; - monitorsToSetFor.forEach(monitorIndex => { - PanelSettings.setPanelPosition(this._settings, monitorIndex, position); - }); - this._setAnchorLabels(this._currentMonitorIndex); - } - - _setPositionRadios(position) { - this._ignorePositionRadios = true; - - switch (position) { - case Pos.BOTTOM: - this._builder.get_object('position_bottom_button').set_active(true); - break; - case Pos.TOP: - this._builder.get_object('position_top_button').set_active(true); - break; - case Pos.LEFT: - this._builder.get_object('position_left_button').set_active(true); - break; - case Pos.RIGHT: - this._builder.get_object('position_right_button').set_active(true); - break; - } - - this._ignorePositionRadios = false; - } - - /** - * Set panel anchor combo labels according to whether the monitor's panel is vertical - * or horizontal, or if all monitors' panels are being configured and they are a mix - * of vertical and horizontal. - */ - _setAnchorLabels(currentMonitorIndex) { - const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - const monitorsToSetFor = monitorSync ? this.monitors : [currentMonitorIndex]; - const allVertical = monitorsToSetFor.every(i => { - const position = PanelSettings.getPanelPosition(this._settings, i); - return position === Pos.LEFT || position === Pos.RIGHT - }); - const allHorizontal = monitorsToSetFor.every(i => { - const position = PanelSettings.getPanelPosition(this._settings, i); - return position === Pos.TOP || position === Pos.BOTTOM; - }); - - const anchor_combo = this._builder.get_object('panel_anchor_combo'); - anchor_combo.remove_all(); - - if (allHorizontal) { - anchor_combo.append(Pos.START, _('Left')); - anchor_combo.append(Pos.MIDDLE, _('Center')); - anchor_combo.append(Pos.END, _('Right')); - } else if (allVertical) { - anchor_combo.append(Pos.START, _('Top')); - anchor_combo.append(Pos.MIDDLE, _('Middle')); - anchor_combo.append(Pos.END, _('Bottom')); - } else { - // Setting for a mix of horizontal and vertical panels on different monitors. - anchor_combo.append(Pos.START, _('Start')); - anchor_combo.append(Pos.MIDDLE, _('Middle')); - anchor_combo.append(Pos.END, _('End')); - } - - // Set combo box after re-populating its options. But only if it's for a single-panel - // configuration, or a multi-panel configuration where they all have the same anchor - // setting. So don't set the combo box if there is a multi-panel configuration with - // different anchor settings. - const someAnchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); - if (monitorsToSetFor.every(i => - PanelSettings.getPanelAnchor(this._settings, i) === someAnchor)) { - const panel_anchor = PanelSettings.getPanelAnchor(this._settings, currentMonitorIndex); - this._builder.get_object('panel_anchor_combo').set_active_id(panel_anchor); - } - } - - /** - * When a monitor is selected, update the widgets for panel position, size, anchoring, - * and contents so they accurately show the settings for the panel on that monitor. - */ - _updateWidgetSettingsForMonitor(monitorIndex) { - // Update display of panel screen position setting - this._maybeDisableTopPosition(); - const panelPosition = this._getPanelPosition(monitorIndex); - this._setPositionRadios(panelPosition); - - // Update display of thickness, length, and anchor settings - const panel_size_scale = this._builder.get_object('panel_size_scale'); - const size = PanelSettings.getPanelSize(this._settings, monitorIndex); - panel_size_scale.set_value(size); - - const panel_length_scale = this._builder.get_object('panel_length_scale'); - const length = PanelSettings.getPanelLength(this._settings, monitorIndex); - panel_length_scale.set_value(length); - this._setAnchorWidgetSensitivity(length); - - this._setAnchorLabels(monitorIndex); - - // Update display of panel content settings - this._displayPanelPositionsForMonitor(monitorIndex); - } - - /** - * Anchor is only relevant if panel length is less than 100%. Enable or disable - * anchor widget sensitivity accordingly. - */ - _setAnchorWidgetSensitivity(panelLength) { - const isPartialLength = panelLength < 100; - this._builder.get_object('panel_anchor_label').set_sensitive(isPartialLength); - this._builder.get_object('panel_anchor_combo').set_sensitive(isPartialLength); - } - - _displayPanelPositionsForMonitor(monitorIndex) { - let taskbarListBox = this._builder.get_object('taskbar_display_listbox'); - - while(taskbarListBox.get_first_child()) - { - taskbarListBox.remove(taskbarListBox.get_first_child()); - } - - let labels = {}; - let panelPosition = this._getPanelPosition(monitorIndex); - let isVertical = panelPosition == Pos.LEFT || panelPosition == Pos.RIGHT; - let panelElementPositionsSettings = PanelSettings.getSettingsJson(this._settings, 'panel-element-positions'); - let panelElementPositions = panelElementPositionsSettings[monitorIndex] || Pos.defaults; - let updateElementsSettings = () => { - let newPanelElementPositions = []; - let monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - let monitors = monitorSync ? this.monitors : [monitorIndex]; - - let child = taskbarListBox.get_first_child(); - while (child != null) - { - newPanelElementPositions.push({ - element: child.id, - visible: child.visibleToggleBtn.get_active(), - position: child.positionCombo.get_active_id() - }); - child = child.get_next_sibling(); - } - - monitors.forEach(m => panelElementPositionsSettings[m] = newPanelElementPositions); - this._settings.set_string('panel-element-positions', JSON.stringify(panelElementPositionsSettings)); - }; - - - labels[Pos.SHOW_APPS_BTN] = _('Show Applications button'); - labels[Pos.ACTIVITIES_BTN] = _('Activities button'); - labels[Pos.TASKBAR] = _('Taskbar'); - labels[Pos.DATE_MENU] = _('Date menu'); - labels[Pos.SYSTEM_MENU] = _('System menu'); - labels[Pos.LEFT_BOX] = _('Left box'); - labels[Pos.CENTER_BOX] = _('Center box'); - labels[Pos.RIGHT_BOX] = _('Right box'); - labels[Pos.DESKTOP_BTN] = _('Desktop button'); - - panelElementPositions.forEach(el => { - let row = new Gtk.ListBoxRow(); - let grid = new Gtk.Grid({ margin_start: 12, margin_end: 12, column_spacing: 8 }); - let upDownGrid = new Gtk.Grid({ column_spacing: 2 }); - let upBtn = new Gtk.Button({ tooltip_text: _('Move up') }); - let upImg = new Gtk.Image({ icon_name: 'go-up-symbolic', pixel_size: 12 }); - let downBtn = new Gtk.Button({ tooltip_text: _('Move down') }); - let downImg = new Gtk.Image({ icon_name: 'go-down-symbolic', pixel_size: 12 }); - let visibleToggleBtn = new Gtk.ToggleButton({ label: _('Visible'), active: el.visible }); - let positionCombo = new Gtk.ComboBoxText({ tooltip_text: _('Select element position') }); - let upDownClickHandler = limit => { - let index = row.get_index(); - - if (index != limit) { - taskbarListBox.remove(row); - taskbarListBox.insert(row, index + (!limit ? -1 : 1)); - updateElementsSettings(); - } - }; - - positionCombo.append(Pos.STACKED_TL, isVertical ? _('Stacked to top') : _('Stacked to left')); - positionCombo.append(Pos.STACKED_BR, isVertical ? _('Stacked to bottom') :_('Stacked to right')); - positionCombo.append(Pos.CENTERED, _('Centered')); - positionCombo.append(Pos.CENTERED_MONITOR, _('Monitor Center')); - positionCombo.set_active_id(el.position); - - upBtn.connect('clicked', () => upDownClickHandler(0)); - downBtn.connect('clicked', () => upDownClickHandler(panelElementPositions.length - 1)); - visibleToggleBtn.connect('toggled', () => updateElementsSettings()); - positionCombo.connect('changed', () => updateElementsSettings()); - - upBtn.set_child(upImg); - downBtn.set_child(downImg); - - upDownGrid.attach(upBtn, 0, 0, 1, 1); - upDownGrid.attach(downBtn, 1, 0, 1, 1); - - grid.attach(upDownGrid, 0, 0, 1, 1); - grid.attach(new Gtk.Label({ label: labels[el.element], xalign: 0, hexpand: true }), 1, 0, 1, 1); - - if (Pos.optionDialogFunctions[el.element]) { - let cogImg = new Gtk.Image({ icon_name: 'emblem-system-symbolic' }); - let optionsBtn = new Gtk.Button({ tooltip_text: _('More options') }); - - optionsBtn.get_style_context().add_class('circular'); - optionsBtn.set_child(cogImg); - grid.attach(optionsBtn, 2, 0, 1, 1); - - optionsBtn.connect('clicked', () => this[Pos.optionDialogFunctions[el.element]]()); - } - - grid.attach(visibleToggleBtn, 3, 0, 1, 1); - grid.attach(positionCombo, 4, 0, 1, 1); - - row.id = el.element; - row.visibleToggleBtn = visibleToggleBtn; - row.positionCombo = positionCombo; - - row.set_child(grid); - taskbarListBox.insert(row, -1); - }); - } - - _createPreferencesDialog(title, content, reset_function = null) { - let dialog; - - dialog = new Gtk.Dialog({ title: title, - transient_for: this.notebook.get_root(), - use_header_bar: true, - modal: true }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - if (reset_function != null) - dialog.add_button(_('Reset to defaults'), 1); - - dialog.get_content_area().append(content); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings - if (reset_function) - reset_function(); - } else { - // remove the settings content so it doesn't get destroyed; - dialog.get_content_area().remove(content); - dialog.destroy(); - } - return; - }); - - return dialog; - } - - _showShowAppsButtonOptions() { - let box = this._builder.get_object('show_applications_options'); - - let dialog = this._createPreferencesDialog(_('Show Applications options'), box, () => - { - // restore default settings - this._settings.set_value('show-apps-icon-side-padding', this._settings.get_default_value('show-apps-icon-side-padding')); - this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); - this._settings.set_value('show-apps-override-escape', this._settings.get_default_value('show-apps-override-escape')); - handleIconChange.call(this, null); - }); - - let fileChooserButton = this._builder.get_object('show_applications_icon_file_filebutton'); - let fileChooser = new Gtk.FileChooserNative({ title: _('Open icon'), transient_for: dialog }); - let fileImage = this._builder.get_object('show_applications_current_icon_image'); - let fileFilter = new Gtk.FileFilter(); - fileFilter.add_pixbuf_formats(); - fileChooser.filter = fileFilter; - - let handleIconChange = function(newIconPath) { - if (newIconPath && GLib.file_test(newIconPath, GLib.FileTest.EXISTS)) { - let file = Gio.File.new_for_path(newIconPath); - let pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(file.read(null), 32, 32, true, null); - - fileImage.set_from_pixbuf(pixbuf); - fileChooser.set_file(file); - fileChooserButton.set_label(newIconPath); - } else { - newIconPath = ''; - fileImage.set_from_icon_name('view-app-grid-symbolic'); - let picturesFolder = Gio.File.new_for_path(GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES)); - fileChooser.set_file(picturesFolder); - fileChooserButton.set_label("(None)"); - } - - this._settings.set_string('show-apps-icon-file', newIconPath || ''); - }; - - fileChooserButton.connect('clicked', () => { - fileChooser.show(); - }); - - fileChooser.connect('response', widget => handleIconChange.call(this, widget.get_file().get_path())); - handleIconChange.call(this, this._settings.get_string('show-apps-icon-file')); - - // we have to destroy the fileChooser as well - dialog.connect('response', (dialog, id) => { - if (id != 1) { - fileChooser.destroy(); - } - return; - }); - - dialog.show(); - dialog.set_default_size(1, 1); - } - - _showDesktopButtonOptions() { - let box = this._builder.get_object('box_show_showdesktop_options'); - - let dialog = this._createPreferencesDialog(_('Show Desktop options'), box, () => - { - // restore default settings - this._settings.set_value('showdesktop-button-width', this._settings.get_default_value('showdesktop-button-width')); - this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); - - this._settings.set_value('desktop-line-use-custom-color', this._settings.get_default_value('desktop-line-use-custom-color')); - - this._settings.set_value('show-showdesktop-hover', this._settings.get_default_value('show-showdesktop-hover')); - - this._settings.set_value('show-showdesktop-delay', this._settings.get_default_value('show-showdesktop-delay')); - this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); - - this._settings.set_value('show-showdesktop-time', this._settings.get_default_value('show-showdesktop-time')); - this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); - }); - - this._builder.get_object('show_showdesktop_width_spinbutton').set_value(this._settings.get_int('showdesktop-button-width')); - this._builder.get_object('show_showdesktop_width_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('showdesktop-button-width', widget.get_value()); - }); - - this._builder.get_object('show_showdesktop_delay_spinbutton').set_value(this._settings.get_int('show-showdesktop-delay')); - this._builder.get_object('show_showdesktop_delay_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('show-showdesktop-delay', widget.get_value()); - }); - - this._builder.get_object('show_showdesktop_time_spinbutton').set_value(this._settings.get_int('show-showdesktop-time')); - this._builder.get_object('show_showdesktop_time_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('show-showdesktop-time', widget.get_value()); - }); - - dialog.show(); - dialog.set_default_size(1, 1); - } - - _addFormatValueCallbacks() { - // position - this._builder.get_object('panel_size_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - // style - this._builder.get_object('appicon_margin_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - this._builder.get_object('appicon_padding_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - // fine-tune box1 - this._builder.get_object('tray_size_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - this._builder.get_object('leftbox_size_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - // fine-tune box2 - this._builder.get_object('tray_padding_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - this._builder.get_object('statusicon_padding_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - this._builder.get_object('leftbox_padding_scale') - .set_format_value_func((scale, value) => { - return value + ' px'; - }); - - // animate hovering app icons dialog - this._builder.get_object('animate_appicon_hover_options_duration_scale') - .set_format_value_func((scale, value) => { - return _("%d ms").format(value); - }); - - this._builder.get_object('animate_appicon_hover_options_rotation_scale') - .set_format_value_func((scale, value) => { - return _("%d °").format(value); - }); - - this._builder.get_object('animate_appicon_hover_options_travel_scale') - .set_format_value_func((scale, value) => { - return _("%d %%").format(value); - }); - - this._builder.get_object('animate_appicon_hover_options_zoom_scale') - .set_format_value_func((scale, value) => { - return _("%d %%").format(value); - }); - - this._builder.get_object('animate_appicon_hover_options_convexity_scale') - .set_format_value_func((scale, value) => { - return _("%.1f").format(value); - }); - - this._builder.get_object('animate_appicon_hover_options_extent_scale') - .set_format_value_func((scale, value) => { - return ngettext("%d icon", "%d icons", value).format(value); - }); - } - - _bindSettings() { - // size options - let panel_size_scale = this._builder.get_object('panel_size_scale'); - panel_size_scale.set_range(DEFAULT_PANEL_SIZES[DEFAULT_PANEL_SIZES.length - 1], DEFAULT_PANEL_SIZES[0]); - DEFAULT_PANEL_SIZES.slice(1, -1).forEach(function(val) { - panel_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); - }); - - // Correct for rtl languages - if (this._rtl) { - // Flip value position: this is not done automatically - panel_size_scale.set_value_pos(Gtk.PositionType.LEFT); - // I suppose due to a bug, having a more than one mark and one above a value of 100 - // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable - // and then manually inverting it - panel_size_scale.set_flippable(false); - panel_size_scale.set_inverted(true); - } - - // App icon style option - this._builder.get_object('appicon_style_combo').set_active_id(this._settings.get_string('appicon-style')); - this._builder.get_object('appicon_style_combo').connect('changed', (widget) => { - this._settings.set_string('appicon-style', widget.get_active_id()); - }); - - // Dots Position option - let dotPosition = this._settings.get_string('dot-position'); - - switch (dotPosition) { - case 'BOTTOM': - this._builder.get_object('dots_bottom_button').set_active(true); - break; - case 'TOP': - this._builder.get_object('dots_top_button').set_active(true); - break; - case 'LEFT': - this._builder.get_object('dots_left_button').set_active(true); - break; - case 'RIGHT': - this._builder.get_object('dots_right_button').set_active(true); - break; - } - - this._builder.get_object('dot_style_focused_combo').set_active_id(this._settings.get_string('dot-style-focused')); - this._builder.get_object('dot_style_focused_combo').connect('changed', (widget) => { - this._settings.set_string('dot-style-focused', widget.get_active_id()); - }); - - this._builder.get_object('dot_style_unfocused_combo').set_active_id(this._settings.get_string('dot-style-unfocused')); - this._builder.get_object('dot_style_unfocused_combo').connect('changed', (widget) => { - this._settings.set_string('dot-style-unfocused', widget.get_active_id()); - }); - - for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { - let idx = i; - this._builder.get_object('dot_color_' + idx + '_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('dot-color-' + idx, hexString); - }); - - this._builder.get_object('dot_color_unfocused_' + idx + '_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('dot-color-unfocused-' + idx, hexString); - }); - } - - this._builder.get_object('dot_color_apply_all_button').connect('clicked', () => { - for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { - this._settings.set_value('dot-color-' + i, this._settings.get_value('dot-color-1')); - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-' + i)); - this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); - } - }); - - this._builder.get_object('dot_color_unfocused_apply_all_button').connect('clicked', () => { - for (let i = 2; i <= MAX_WINDOW_INDICATOR; i++) { - this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_value('dot-color-unfocused-1')); - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); - this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); - } - }); - - this._builder.get_object('focus_highlight_color_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('focus-highlight-color', hexString); - }); - - this._builder.get_object('dot_style_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_dots_options'); - - let dialog = this._createPreferencesDialog(_('Running Indicator Options'), box, () => - { - // restore default settings - this._settings.set_value('dot-color-dominant', this._settings.get_default_value('dot-color-dominant')); - this._settings.set_value('dot-color-override', this._settings.get_default_value('dot-color-override')); - this._settings.set_value('dot-color-unfocused-different', this._settings.get_default_value('dot-color-unfocused-different')); - - this._settings.set_value('focus-highlight-color', this._settings.get_default_value('focus-highlight-color')); - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('focus-highlight-color')); - this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); - - this._settings.set_value('focus-highlight-opacity', this._settings.get_default_value('focus-highlight-opacity')); - this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); - - for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { - this._settings.set_value('dot-color-' + i, this._settings.get_default_value('dot-color-' + i)); - rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-' + i)); - this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); - - this._settings.set_value('dot-color-unfocused-' + i, this._settings.get_default_value('dot-color-unfocused-' + i)); - rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); - this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); - } - - this._settings.set_value('dot-size', this._settings.get_default_value('dot-size')); - this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); - - this._settings.set_value('focus-highlight', this._settings.get_default_value('focus-highlight')); - this._settings.set_value('focus-highlight-dominant', this._settings.get_default_value('focus-highlight-dominant')); - }); - - this._settings.bind('dot-color-dominant', - this._builder.get_object('dot_color_dominant_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('dot-color-override', - this._builder.get_object('dot_color_override_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - // when either becomes active, turn the other off - this._builder.get_object('dot_color_dominant_switch').connect('state-set', (widget) => { - if (widget.get_active()) this._settings.set_boolean('dot-color-override', false); - }); - this._builder.get_object('dot_color_override_switch').connect('state-set', (widget) => { - if (widget.get_active()) this._settings.set_boolean('dot-color-dominant', false); - else this._settings.set_boolean('dot-color-unfocused-different', false); - }); - - this._settings.bind('dot-color-unfocused-different', - this._builder.get_object('dot_color_unfocused_different_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('dot-color-override', - this._builder.get_object('grid_dot_color'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('dot-color-override', - this._builder.get_object('dot_color_unfocused_box'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('dot-color-unfocused-different', - this._builder.get_object('grid_dot_color_unfocused'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - for (let i = 1; i <= MAX_WINDOW_INDICATOR; i++) { - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-' + i)); - this._builder.get_object('dot_color_' + i + '_colorbutton').set_rgba(rgba); - - rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('dot-color-unfocused-' + i)); - this._builder.get_object('dot_color_unfocused_' + i + '_colorbutton').set_rgba(rgba); - } - - this._settings.bind('focus-highlight', - this._builder.get_object('focus_highlight_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('focus-highlight', - this._builder.get_object('grid_focus_highlight_options'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('focus-highlight-dominant', - this._builder.get_object('focus_highlight_dominant_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('focus-highlight-dominant', - this._builder.get_object('focus_highlight_color_label'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - - this._settings.bind('focus-highlight-dominant', - this._builder.get_object('focus_highlight_color_colorbutton'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - - - (function() { - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('focus-highlight-color')); - this._builder.get_object('focus_highlight_color_colorbutton').set_rgba(rgba); - }).apply(this); - - this._builder.get_object('focus_highlight_opacity_spinbutton').set_value(this._settings.get_int('focus-highlight-opacity')); - this._builder.get_object('focus_highlight_opacity_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('focus-highlight-opacity', widget.get_value()); - }); - - this._builder.get_object('dot_size_spinbutton').set_value(this._settings.get_int('dot-size')); - this._builder.get_object('dot_size_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('dot-size', widget.get_value()); - }); - - dialog.show(); - dialog.set_default_size(1, 1); - - }); - - //multi-monitor - this.monitors = this._settings.get_value('available-monitors').deep_unpack(); - - let dtpPrimaryMonitorIndex = this.monitors.indexOf(this._settings.get_int('primary-monitor')); - - if (dtpPrimaryMonitorIndex < 0) { - dtpPrimaryMonitorIndex = 0; - } - - this._currentMonitorIndex = this.monitors[dtpPrimaryMonitorIndex]; - - this._settings.connect('changed::panel-positions', () => this._updateVerticalRelatedOptions()); - this._updateVerticalRelatedOptions(); - - for (let i = 0; i < this.monitors.length; ++i) { - //the gnome-shell primary index is the first one in the "available-monitors" setting - let label = !i ? _('Primary monitor') : _('Monitor ') + (i + 1); - - this._builder.get_object('multimon_primary_combo').append_text(label); - this._builder.get_object('taskbar_position_monitor_combo').append_text(label); - } - - this._builder.get_object('multimon_primary_combo').set_active(dtpPrimaryMonitorIndex); - this._builder.get_object('taskbar_position_monitor_combo').set_active(dtpPrimaryMonitorIndex); - - this._settings.bind('panel-element-positions-monitors-sync', - this._builder.get_object('taskbar_position_sync_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('panel-element-positions-monitors-sync', - this._builder.get_object('taskbar_position_monitor_combo'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - - this._settings.connect('changed::panel-element-positions-monitors-sync', () => { - this._maybeDisableTopPosition(); - // The anchor combo box may has different labels for single- or all-monitor configuration. - this._setAnchorLabels(this._currentMonitorIndex); - }); - - this._builder.get_object('multimon_primary_combo').connect('changed', (widget) => { - this._settings.set_int('primary-monitor', this.monitors[widget.get_active()]); - }); - - this._builder.get_object('taskbar_position_monitor_combo').connect('changed', (widget) => { - this._currentMonitorIndex = this.monitors[widget.get_active()]; - this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); - }); - - this._settings.bind('multi-monitors', - this._builder.get_object('multimon_multi_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - if (this.monitors.length === 1) { - this._builder.get_object('multimon_multi_switch').set_sensitive(false); - } - - const panel_length_scale = this._builder.get_object('panel_length_scale'); - panel_length_scale.connect('value-changed', (widget) => { - const value = widget.get_value(); - const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; - monitorsToSetFor.forEach(monitorIndex => { - PanelSettings.setPanelLength(this._settings, monitorIndex, value); - }); - - this._setAnchorWidgetSensitivity(value); - }); - - this._builder.get_object('panel_anchor_combo').connect('changed', (widget) => { - const value = widget.get_active_id(); - // Value can be null while anchor labels are being swapped out - if (value !== null) { - const monitorSync = this._settings.get_boolean('panel-element-positions-monitors-sync'); - const monitorsToSetFor = monitorSync ? this.monitors : [this._currentMonitorIndex]; - monitorsToSetFor.forEach(monitorIndex => { - PanelSettings.setPanelAnchor(this._settings, monitorIndex, value); - }); - } - }); - - this._updateWidgetSettingsForMonitor(this._currentMonitorIndex); - - //dynamic opacity - this._settings.bind('trans-use-custom-bg', - this._builder.get_object('trans_bg_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-bg', - this._builder.get_object('trans_bg_color_colorbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('trans-bg-color')); - this._builder.get_object('trans_bg_color_colorbutton').set_rgba(rgba); - - this._builder.get_object('trans_bg_color_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('trans-bg-color', hexString); - }); - - this._settings.bind('trans-use-custom-opacity', - this._builder.get_object('trans_opacity_override_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-opacity', - this._builder.get_object('trans_opacity_box'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-opacity', - this._builder.get_object('trans_opacity_box2'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('trans_opacity_override_switch').connect('notify::active', (widget) => { - if (!widget.get_active()) - this._builder.get_object('trans_dyn_switch').set_active(false); - }); - - this._builder.get_object('trans_opacity_spinbutton').set_value(this._settings.get_double('trans-panel-opacity') * 100); - this._builder.get_object('trans_opacity_spinbutton').connect('value-changed', (widget) => { - this._settings.set_double('trans-panel-opacity', widget.get_value() * 0.01); - }); - - this._settings.bind('trans-use-dynamic-opacity', - this._builder.get_object('trans_dyn_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-dynamic-opacity', - this._builder.get_object('trans_dyn_options_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-dynamic-behavior', - this._builder.get_object('trans_options_window_type_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-gradient', - this._builder.get_object('trans_gradient_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-gradient', - this._builder.get_object('trans_gradient_box'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('trans-use-custom-gradient', - this._builder.get_object('trans_gradient_box2'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - rgba.parse(this._settings.get_string('trans-gradient-top-color')); - this._builder.get_object('trans_gradient_color1_colorbutton').set_rgba(rgba); - - this._builder.get_object('trans_gradient_color1_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('trans-gradient-top-color', hexString); - }); - - this._builder.get_object('trans_gradient_color1_spinbutton').set_value(this._settings.get_double('trans-gradient-top-opacity') * 100); - this._builder.get_object('trans_gradient_color1_spinbutton').connect('value-changed', (widget) => { - this._settings.set_double('trans-gradient-top-opacity', widget.get_value() * 0.01); - }); - - rgba.parse(this._settings.get_string('trans-gradient-bottom-color')); - this._builder.get_object('trans_gradient_color2_colorbutton').set_rgba(rgba); - - this._builder.get_object('trans_gradient_color2_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('trans-gradient-bottom-color', hexString); - }); - - this._builder.get_object('trans_gradient_color2_spinbutton').set_value(this._settings.get_double('trans-gradient-bottom-opacity') * 100); - this._builder.get_object('trans_gradient_color2_spinbutton').connect('value-changed', (widget) => { - this._settings.set_double('trans-gradient-bottom-opacity', widget.get_value() * 0.01); - }); - - this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); - this._builder.get_object('trans_options_distance_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('trans-dynamic-distance', widget.get_value()); - }); - - this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); - this._builder.get_object('trans_options_min_opacity_spinbutton').connect('value-changed', (widget) => { - this._settings.set_double('trans-dynamic-anim-target', widget.get_value() * 0.01); - }); - - this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); - this._builder.get_object('trans_options_anim_time_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('trans-dynamic-anim-time', widget.get_value()); - }); - - this._builder.get_object('trans_dyn_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_dynamic_opacity_options'); - - let dialog = this._createPreferencesDialog(_('Dynamic opacity options'), box, () => - { - // restore default settings - this._settings.set_value('trans-dynamic-behavior', this._settings.get_default_value('trans-dynamic-behavior')); - - this._settings.set_value('trans-dynamic-distance', this._settings.get_default_value('trans-dynamic-distance')); - this._builder.get_object('trans_options_distance_spinbutton').set_value(this._settings.get_int('trans-dynamic-distance')); - - this._settings.set_value('trans-dynamic-anim-target', this._settings.get_default_value('trans-dynamic-anim-target')); - this._builder.get_object('trans_options_min_opacity_spinbutton').set_value(this._settings.get_double('trans-dynamic-anim-target') * 100); - - this._settings.set_value('trans-dynamic-anim-time', this._settings.get_default_value('trans-dynamic-anim-time')); - this._builder.get_object('trans_options_anim_time_spinbutton').set_value(this._settings.get_int('trans-dynamic-anim-time')); - }); - - dialog.show(); - dialog.set_default_size(1, 1); - - }); - - this._settings.bind('desktop-line-use-custom-color', - this._builder.get_object('override_show_desktop_line_color_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('desktop-line-use-custom-color', - this._builder.get_object('override_show_desktop_line_color_colorbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - rgba.parse(this._settings.get_string('desktop-line-custom-color')); - this._builder.get_object('override_show_desktop_line_color_colorbutton').set_rgba(rgba); - this._builder.get_object('override_show_desktop_line_color_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - this._settings.set_string('desktop-line-custom-color', css); - }); - - - this._settings.bind('intellihide', - this._builder.get_object('intellihide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide', - this._builder.get_object('intellihide_options_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-hide-from-windows', - this._builder.get_object('intellihide_window_hide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-hide-from-windows', - this._builder.get_object('intellihide_behaviour_options'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-behaviour', - this._builder.get_object('intellihide_behaviour_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-use-pressure', - this._builder.get_object('intellihide_use_pressure_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-use-pressure', - this._builder.get_object('intellihide_use_pressure_options'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-use-pressure', - this._builder.get_object('intellihide_use_pressure_options2'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-show-in-fullscreen', - this._builder.get_object('intellihide_show_in_fullscreen_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('intellihide-only-secondary', - this._builder.get_object('intellihide_only_secondary_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('multi-monitors', - this._builder.get_object('grid_intellihide_only_secondary'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('multimon_multi_switch').connect('notify::active', (widget) => { - if (!widget.get_active()) - this._builder.get_object('intellihide_only_secondary_switch').set_active(false); - }); - - this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); - this._builder.get_object('intellihide_pressure_threshold_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('intellihide-pressure-threshold', widget.get_value()); - }); - - this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); - this._builder.get_object('intellihide_pressure_time_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('intellihide-pressure-time', widget.get_value()); - }); - - this._settings.bind('intellihide-key-toggle-text', - this._builder.get_object('intellihide_toggle_entry'), - 'text', - Gio.SettingsBindFlags.DEFAULT); - this._settings.connect('changed::intellihide-key-toggle-text', () => setShortcut(this._settings, 'intellihide-key-toggle')); - - this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); - this._builder.get_object('intellihide_animation_time_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('intellihide-animation-time', widget.get_value()); - }); - - this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); - this._builder.get_object('intellihide_close_delay_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('intellihide-close-delay', widget.get_value()); - }); - - this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); - this._builder.get_object('intellihide_enable_start_delay_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('intellihide-enable-start-delay', widget.get_value()); - }); - - this._builder.get_object('intellihide_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_intellihide_options'); - - let dialog = this._createPreferencesDialog(_('Intellihide options'), box, () => - { - // restore default settings - this._settings.set_value('intellihide-hide-from-windows', this._settings.get_default_value('intellihide-hide-from-windows')); - this._settings.set_value('intellihide-behaviour', this._settings.get_default_value('intellihide-behaviour')); - this._settings.set_value('intellihide-use-pressure', this._settings.get_default_value('intellihide-use-pressure')); - this._settings.set_value('intellihide-show-in-fullscreen', this._settings.get_default_value('intellihide-show-in-fullscreen')); - this._settings.set_value('intellihide-only-secondary', this._settings.get_default_value('intellihide-only-secondary')); - - this._settings.set_value('intellihide-pressure-threshold', this._settings.get_default_value('intellihide-pressure-threshold')); - this._builder.get_object('intellihide_pressure_threshold_spinbutton').set_value(this._settings.get_int('intellihide-pressure-threshold')); - - this._settings.set_value('intellihide-pressure-time', this._settings.get_default_value('intellihide-pressure-time')); - this._builder.get_object('intellihide_pressure_time_spinbutton').set_value(this._settings.get_int('intellihide-pressure-time')); - - this._settings.set_value('intellihide-key-toggle-text', this._settings.get_default_value('intellihide-key-toggle-text')); - - this._settings.set_value('intellihide-animation-time', this._settings.get_default_value('intellihide-animation-time')); - this._builder.get_object('intellihide_animation_time_spinbutton').set_value(this._settings.get_int('intellihide-animation-time')); - - this._settings.set_value('intellihide-close-delay', this._settings.get_default_value('intellihide-close-delay')); - this._builder.get_object('intellihide_close_delay_spinbutton').set_value(this._settings.get_int('intellihide-close-delay')); - - this._settings.set_value('intellihide-enable-start-delay', this._settings.get_default_value('intellihide-enable-start-delay')); - this._builder.get_object('intellihide_enable_start_delay_spinbutton').set_value(this._settings.get_int('intellihide-enable-start-delay')); - }); - - dialog.show(); - dialog.set_default_size(1, 1); - - }); - - // Behavior panel - - this._builder.get_object('show_applications_side_padding_spinbutton').set_value(this._settings.get_int('show-apps-icon-side-padding')); - this._builder.get_object('show_applications_side_padding_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('show-apps-icon-side-padding', widget.get_value()); - }); - - this._settings.bind('show-apps-override-escape', - this._builder.get_object('show_applications_esc_key_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-showdesktop-hover', - this._builder.get_object('show_showdesktop_hide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-showdesktop-hover', - this._builder.get_object('grid_show_showdesktop_hide_options'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-showdesktop-hover', - this._builder.get_object('grid_show_showdesktop_hide_options2'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-window-previews', - this._builder.get_object('show_window_previews_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-window-previews', - this._builder.get_object('show_window_previews_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-tooltip', - this._builder.get_object('show_tooltip_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-favorites', - this._builder.get_object('show_favorite_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-favorites-all-monitors', - this._builder.get_object('multimon_multi_show_favorites_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-favorites', - this._builder.get_object('multimon_multi_show_favorites_switch'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('show-running-apps', - this._builder.get_object('show_runnning_apps_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._setPreviewTitlePosition(); - - this._builder.get_object('grid_preview_title_font_color_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('window-preview-title-font-color', hexString); - }); - - this._builder.get_object('show_window_previews_button').connect('clicked', () => { - let scrolledWindow = this._builder.get_object('box_window_preview_options'); - - let dialog = this._createPreferencesDialog(_('Window preview options'), scrolledWindow, () => - { - // restore default settings - this._settings.set_value('show-window-previews-timeout', this._settings.get_default_value('show-window-previews-timeout')); - this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); - - this._settings.set_value('leave-timeout', this._settings.get_default_value('leave-timeout')); - this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); - - this._settings.set_value('window-preview-hide-immediate-click', this._settings.get_default_value('window-preview-hide-immediate-click')); - - this._settings.set_value('window-preview-animation-time', this._settings.get_default_value('window-preview-animation-time')); - this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); - - this._settings.set_value('preview-use-custom-opacity', this._settings.get_default_value('preview-use-custom-opacity')); - - this._settings.set_value('window-preview-use-custom-icon-size', this._settings.get_default_value('window-preview-use-custom-icon-size')); - - this._settings.set_value('preview-custom-opacity', this._settings.get_default_value('preview-custom-opacity')); - this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); - - this._settings.set_value('window-preview-title-position', this._settings.get_default_value('window-preview-title-position')); - this._setPreviewTitlePosition(); - - this._settings.set_value('peek-mode', this._settings.get_default_value('peek-mode')); - this._settings.set_value('window-preview-show-title', this._settings.get_default_value('window-preview-show-title')); - this._settings.set_value('enter-peek-mode-timeout', this._settings.get_default_value('enter-peek-mode-timeout')); - this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); - this._settings.set_value('peek-mode-opacity', this._settings.get_default_value('peek-mode-opacity')); - this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); - - this._settings.set_value('window-preview-size', this._settings.get_default_value('window-preview-size')); - this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); - - this._settings.set_value('window-preview-fixed-x', this._settings.get_default_value('window-preview-fixed-x')); - this._settings.set_value('window-preview-fixed-y', this._settings.get_default_value('window-preview-fixed-y')); - - this._settings.set_value('window-preview-aspect-ratio-x', this._settings.get_default_value('window-preview-aspect-ratio-x')); - this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); - - this._settings.set_value('window-preview-aspect-ratio-y', this._settings.get_default_value('window-preview-aspect-ratio-y')); - this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); - - this._settings.set_value('window-preview-padding', this._settings.get_default_value('window-preview-padding')); - this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); - - this._settings.set_value('preview-middle-click-close', this._settings.get_default_value('preview-middle-click-close')); - - this._settings.set_value('window-preview-title-font-size', this._settings.get_default_value('window-preview-title-font-size')); - this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); - - this._settings.set_value('window-preview-custom-icon-size', this._settings.get_default_value('window-preview-custom-icon-size')); - this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); - - this._settings.set_value('window-preview-title-font-weight', this._settings.get_default_value('window-preview-title-font-weight')); - this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); - - this._settings.set_value('window-preview-title-font-color', this._settings.get_default_value('window-preview-title-font-color')); - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('window-preview-title-font-color')); - this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); - }); - - this._builder.get_object('preview_timeout_spinbutton').set_value(this._settings.get_int('show-window-previews-timeout')); - this._builder.get_object('preview_timeout_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('show-window-previews-timeout', widget.get_value()); - }); - - this._settings.bind('preview-middle-click-close', - this._builder.get_object('preview_middle_click_close_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('window-preview-fixed-x', - this._builder.get_object('preview_aspect_ratio_x_fixed_togglebutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('window-preview-fixed-y', - this._builder.get_object('preview_aspect_ratio_y_fixed_togglebutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('preview-use-custom-opacity', - this._builder.get_object('preview_custom_opacity_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('preview-use-custom-opacity', - this._builder.get_object('preview_custom_opacity_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-use-custom-icon-size', - this._builder.get_object('preview_custom_icon_size_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-use-custom-icon-size', - this._builder.get_object('preview_custom_icon_size_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('preview_custom_opacity_spinbutton').set_value(this._settings.get_int('preview-custom-opacity')); - this._builder.get_object('preview_custom_opacity_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('preview-custom-opacity', widget.get_value()); - }); - - this._settings.bind('peek-mode', - this._builder.get_object('peek_mode_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('peek-mode', - this._builder.get_object('grid_enter_peek_mode_timeout'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('peek-mode', - this._builder.get_object('grid_peek_mode_opacity'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('window-preview-show-title', - this._builder.get_object('preview_show_title_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-show-title', - this._builder.get_object('grid_preview_custom_icon_size'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-show-title', - this._builder.get_object('grid_preview_title_size'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-show-title', - this._builder.get_object('grid_preview_title_weight'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('window-preview-show-title', - this._builder.get_object('grid_preview_title_font_color'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('enter_peek_mode_timeout_spinbutton').set_value(this._settings.get_int('enter-peek-mode-timeout')); - this._builder.get_object('enter_peek_mode_timeout_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('enter-peek-mode-timeout', widget.get_value()); - }); - - this._builder.get_object('leave_timeout_spinbutton').set_value(this._settings.get_int('leave-timeout')); - this._builder.get_object('leave_timeout_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('leave-timeout', widget.get_value()); - }); - - this._settings.bind('window-preview-hide-immediate-click', - this._builder.get_object('preview_immediate_click_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('animation_time_spinbutton').set_value(this._settings.get_int('window-preview-animation-time')); - this._builder.get_object('animation_time_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('window-preview-animation-time', widget.get_value()); - }); - - this._builder.get_object('peek_mode_opacity_spinbutton').set_value(this._settings.get_int('peek-mode-opacity')); - this._builder.get_object('peek_mode_opacity_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('peek-mode-opacity', widget.get_value()); - }); - - this._builder.get_object('preview_size_spinbutton').set_value(this._settings.get_int('window-preview-size')); - this._builder.get_object('preview_size_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('window-preview-size', widget.get_value()); - }); - - this._builder.get_object('preview_aspect_ratio_x_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-x').toString()); - this._builder.get_object('preview_aspect_ratio_x_combo').connect('changed', (widget) => { - this._settings.set_int('window-preview-aspect-ratio-x', parseInt(widget.get_active_id(), 10)); - }); - - this._builder.get_object('preview_aspect_ratio_y_combo').set_active_id(this._settings.get_int('window-preview-aspect-ratio-y').toString()); - this._builder.get_object('preview_aspect_ratio_y_combo').connect('changed', (widget) => { - this._settings.set_int('window-preview-aspect-ratio-y', parseInt(widget.get_active_id(), 10)); - }); - - this._builder.get_object('preview_padding_spinbutton').set_value(this._settings.get_int('window-preview-padding')); - this._builder.get_object('preview_padding_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('window-preview-padding', widget.get_value()); - }); - - this._builder.get_object('preview_title_size_spinbutton').set_value(this._settings.get_int('window-preview-title-font-size')); - this._builder.get_object('preview_title_size_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('window-preview-title-font-size', widget.get_value()); - }); - - this._builder.get_object('preview_custom_icon_size_spinbutton').set_value(this._settings.get_int('window-preview-custom-icon-size')); - this._builder.get_object('preview_custom_icon_size_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('window-preview-custom-icon-size', widget.get_value()); - }); - - this._builder.get_object('grid_preview_title_weight_combo').set_active_id(this._settings.get_string('window-preview-title-font-weight')); - this._builder.get_object('grid_preview_title_weight_combo').connect('changed', (widget) => { - this._settings.set_string('window-preview-title-font-weight', widget.get_active_id()); - }); - - (function() { - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('window-preview-title-font-color')); - this._builder.get_object('grid_preview_title_font_color_colorbutton').set_rgba(rgba); - }).apply(this); - - dialog.show(); - - }); - - this._settings.bind('isolate-workspaces', - this._builder.get_object('isolate_workspaces_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('isolate-monitors', - this._builder.get_object('multimon_multi_isolate_monitor_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('overview-click-to-exit', - this._builder.get_object('clicktoexit_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('hide-overview-on-startup', - this._builder.get_object('hide_overview_on_startup_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('group-apps', - this._builder.get_object('group_apps_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); - - this._settings.bind('group-apps', - this._builder.get_object('show_group_apps_options_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN); - - this._settings.bind('progress-show-count', - this._builder.get_object('show_notification_badge_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('group_apps_label_font_color_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('group-apps-label-font-color', hexString); - }); - - this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').connect('color-set', (button) => { - let rgba = button.get_rgba(); - let css = rgba.to_string(); - let hexString = cssHexString(css); - this._settings.set_string('group-apps-label-font-color-minimized', hexString); - }); - - this._settings.bind('group-apps-use-fixed-width', - this._builder.get_object('group_apps_use_fixed_width_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('group-apps-underline-unfocused', - this._builder.get_object('group_apps_underline_unfocused_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('group-apps-use-launchers', - this._builder.get_object('group_apps_use_launchers_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('show_group_apps_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_group_apps_options'); - - let dialog = this._createPreferencesDialog(_('Ungrouped application options'), box, () => - { - // restore default settings - this._settings.set_value('group-apps-label-font-size', this._settings.get_default_value('group-apps-label-font-size')); - this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); - - this._settings.set_value('group-apps-label-font-weight', this._settings.get_default_value('group-apps-label-font-weight')); - this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); - - this._settings.set_value('group-apps-label-font-color', this._settings.get_default_value('group-apps-label-font-color')); - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('group-apps-label-font-color')); - this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); - - this._settings.set_value('group-apps-label-font-color-minimized', this._settings.get_default_value('group-apps-label-font-color-minimized')); - let minimizedFontColor = new Gdk.RGBA(); - minimizedFontColor.parse(this._settings.get_string('group-apps-label-font-color-minimized')); - this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(minimizedFontColor); - - this._settings.set_value('group-apps-label-max-width', this._settings.get_default_value('group-apps-label-max-width')); - this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); - - this._settings.set_value('group-apps-use-fixed-width', this._settings.get_default_value('group-apps-use-fixed-width')); - this._settings.set_value('group-apps-underline-unfocused', this._settings.get_default_value('group-apps-underline-unfocused')); - this._settings.set_value('group-apps-use-launchers', this._settings.get_default_value('group-apps-use-launchers')); - }); - - this._builder.get_object('group_apps_label_font_size_spinbutton').set_value(this._settings.get_int('group-apps-label-font-size')); - this._builder.get_object('group_apps_label_font_size_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('group-apps-label-font-size', widget.get_value()); - }); - - this._builder.get_object('group_apps_label_font_weight_combo').set_active_id(this._settings.get_string('group-apps-label-font-weight')); - this._builder.get_object('group_apps_label_font_weight_combo').connect('changed', (widget) => { - this._settings.set_string('group-apps-label-font-weight', widget.get_active_id()); - }); - - (function() { - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('group-apps-label-font-color')); - this._builder.get_object('group_apps_label_font_color_colorbutton').set_rgba(rgba); - }).apply(this); - - (function() { - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('group-apps-label-font-color-minimized')); - this._builder.get_object('group_apps_label_font_color_minimized_colorbutton').set_rgba(rgba); - }).apply(this); - - this._builder.get_object('group_apps_label_max_width_spinbutton').set_value(this._settings.get_int('group-apps-label-max-width')); - this._builder.get_object('group_apps_label_max_width_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('group-apps-label-max-width', widget.get_value()); - }); - - dialog.show(); - dialog.set_default_size(600, 1); - - }); - - this._builder.get_object('click_action_combo').set_active_id(this._settings.get_string('click-action')); - this._builder.get_object('click_action_combo').connect('changed', (widget) => { - this._settings.set_string('click-action', widget.get_active_id()); - }); - - this._builder.get_object('shift_click_action_combo').connect('changed', (widget) => { - this._settings.set_string('shift-click-action', widget.get_active_id()); - }); - - this._builder.get_object('middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_string('middle-click-action', widget.get_active_id()); - }); - this._builder.get_object('shift_middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_string('shift-middle-click-action', widget.get_active_id()); - }); - - // Create dialog for middle-click options - this._builder.get_object('middle_click_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_middle_click_options'); - - let dialog = this._createPreferencesDialog(_('Customize middle-click behavior'), box, () => - { - // restore default settings for the relevant keys - let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; - keys.forEach(function(val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); - this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); - this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); - }); - - this._builder.get_object('shift_click_action_combo').set_active_id(this._settings.get_string('shift-click-action')); - - this._builder.get_object('middle_click_action_combo').set_active_id(this._settings.get_string('middle-click-action')); - - this._builder.get_object('shift_middle_click_action_combo').set_active_id(this._settings.get_string('shift-middle-click-action')); - - this._settings.bind('shift-click-action', - this._builder.get_object('shift_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('middle-click-action', - this._builder.get_object('middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('shift-middle-click-action', - this._builder.get_object('shift_middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - dialog.show(); - dialog.set_default_size(700, 1); - - }); - - this._builder.get_object('scroll_panel_combo').set_active_id(this._settings.get_string('scroll-panel-action')); - this._builder.get_object('scroll_panel_combo').connect('changed', (widget) => { - this._settings.set_string('scroll-panel-action', widget.get_active_id()); - }); - - this._builder.get_object('scroll_icon_combo').set_active_id(this._settings.get_string('scroll-icon-action')); - this._builder.get_object('scroll_icon_combo').connect('changed', (widget) => { - this._settings.set_string('scroll-icon-action', widget.get_active_id()); - }); - - // Create dialog for panel scroll options - this._builder.get_object('scroll_panel_options_button').connect('clicked', () => { - let box = this._builder.get_object('scroll_panel_options_box'); - - let dialog = this._createPreferencesDialog(_('Customize panel scroll behavior'), box, () => - { - // restore default settings - this._settings.set_value('scroll-panel-delay', this._settings.get_default_value('scroll-panel-delay')); - this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); - - this._settings.set_value('scroll-panel-show-ws-popup', this._settings.get_default_value('scroll-panel-show-ws-popup')); - }); - - this._builder.get_object('scroll_panel_options_delay_spinbutton').set_value(this._settings.get_int('scroll-panel-delay')); - this._builder.get_object('scroll_panel_options_delay_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('scroll-panel-delay', widget.get_value()); - }); - - this._settings.bind('scroll-panel-show-ws-popup', - this._builder.get_object('scroll_panel_options_show_ws_popup_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - dialog.show(); - dialog.set_default_size(640, 1); - - }); - - // Create dialog for icon scroll options - this._builder.get_object('scroll_icon_options_button').connect('clicked', () => { - let box = this._builder.get_object('scroll_icon_options_box'); - - let dialog = this._createPreferencesDialog(_('Customize icon scroll behavior'), box, () => - { - // restore default settings - this._settings.set_value('scroll-icon-delay', this._settings.get_default_value('scroll-icon-delay')); - this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); - }); - - this._builder.get_object('scroll_icon_options_delay_spinbutton').set_value(this._settings.get_int('scroll-icon-delay')); - this._builder.get_object('scroll_icon_options_delay_spinbutton').connect('value-changed', (widget) => { - this._settings.set_int('scroll-icon-delay', widget.get_value()); - }); - - dialog.show(); - dialog.set_default_size(640, 1); - - }); - - this._settings.bind('hot-keys', - this._builder.get_object('hot_keys_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hot-keys', - this._builder.get_object('overlay_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('overlay_combo').connect('changed', (widget) => { - this._settings.set_string('hotkeys-overlay-combo', widget.get_active_id()); - }); - - this._settings.bind('shortcut-previews', - this._builder.get_object('shortcut_preview_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('shortcut_num_keys_combo').set_active_id(this._settings.get_string('shortcut-num-keys')); - this._builder.get_object('shortcut_num_keys_combo').connect('changed', (widget) => { - this._settings.set_string('shortcut-num-keys', widget.get_active_id()); - }); - - this._settings.connect('changed::hotkey-prefix-text', () => {checkHotkeyPrefix(this._settings);}); - - this._builder.get_object('hotkey_prefix_combo').set_active_id(this._settings.get_string('hotkey-prefix-text')); - - this._settings.bind('hotkey-prefix-text', - this._builder.get_object('hotkey_prefix_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('overlay_combo').set_active_id(this._settings.get_string('hotkeys-overlay-combo')); - - this._settings.bind('hotkeys-overlay-combo', - this._builder.get_object('overlay_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('overlay-timeout', - this._builder.get_object('timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') { - this._builder.get_object('timeout_spinbutton').set_sensitive(false); - } - - this._settings.connect('changed::hotkeys-overlay-combo', () => { - if (this._settings.get_string('hotkeys-overlay-combo') !== 'TEMPORARILY') - this._builder.get_object('timeout_spinbutton').set_sensitive(false); - else - this._builder.get_object('timeout_spinbutton').set_sensitive(true); - }); - - this._settings.bind('shortcut-text', - this._builder.get_object('shortcut_entry'), - 'text', - Gio.SettingsBindFlags.DEFAULT); - this._settings.connect('changed::shortcut-text', () => {setShortcut(this._settings, 'shortcut');}); - - // Create dialog for number overlay options - this._builder.get_object('overlay_button').connect('clicked', () => { - let box = this._builder.get_object('box_overlay_shortcut'); - - let dialog = this._createPreferencesDialog(_('Advanced hotkeys options'), box, () => - { - // restore default settings for the relevant keys - let keys = ['hotkey-prefix-text', 'shortcut-text', 'hotkeys-overlay-combo', 'overlay-timeout', 'shortcut-previews']; - keys.forEach(function(val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - }); - - dialog.show(); - dialog.set_default_size(600, 1); - - }); - - // setup dialog for secondary menu options - this._builder.get_object('secondarymenu_options_button').connect('clicked', () => { - let box = this._builder.get_object('box_secondarymenu_options'); - - let dialog = this._createPreferencesDialog(_('Secondary Menu Options'), box, () => - { - // restore default settings - this._settings.set_value('secondarymenu-contains-appmenu', this._settings.get_default_value('secondarymenu-contains-appmenu')); - this._settings.set_value('secondarymenu-contains-showdetails', this._settings.get_default_value('secondarymenu-contains-showdetails')); - }); - - // TODO setting secondarymenu-contains-appmenu is not being used anywhere - this._settings.bind('secondarymenu-contains-appmenu', - this._builder.get_object('secondarymenu_appmenu_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('secondarymenu-contains-showdetails', - this._builder.get_object('secondarymenu_showdetails_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - dialog.show(); - dialog.set_default_size(480, 1); - - }); - - // setup dialog for advanced options - this._builder.get_object('button_advanced_options').connect('clicked', () => { - let box = this._builder.get_object('box_advanced_options'); - - let dialog = this._createPreferencesDialog(_('Advanced Options'), box); - - dialog.show(); - dialog.set_default_size(480, 1); - - }); - - // Fine-tune panel - - let sizeScales = [ - {objectName: 'tray_size_scale', valueName: 'tray-size', range: DEFAULT_FONT_SIZES }, - {objectName: 'leftbox_size_scale', valueName: 'leftbox-size', range: DEFAULT_FONT_SIZES }, - {objectName: 'appicon_margin_scale', valueName: 'appicon-margin', range: DEFAULT_MARGIN_SIZES }, - {objectName: 'appicon_padding_scale', valueName: 'appicon-padding', range: DEFAULT_MARGIN_SIZES }, - {objectName: 'tray_padding_scale', valueName: 'tray-padding', range: DEFAULT_PADDING_SIZES }, - {objectName: 'leftbox_padding_scale', valueName: 'leftbox-padding', range: DEFAULT_PADDING_SIZES }, - {objectName: 'statusicon_padding_scale', valueName: 'status-icon-padding', range: DEFAULT_PADDING_SIZES }, - {objectName: 'panel_length_scale', valueName: '', range: LENGTH_MARKS } - ]; - - for(const idx in sizeScales) { - let size_scale = this._builder.get_object(sizeScales[idx].objectName); - let range = sizeScales[idx].range; - size_scale.set_range(range[range.length - 1], range[0]); - let value; - if (sizeScales[idx].objectName === 'panel_length_scale') { - value = PanelSettings.getPanelLength(this._settings, this._currentMonitorIndex); - } else { - value = this._settings.get_int(sizeScales[idx].valueName); - } - size_scale.set_value(value); - // Add marks from range arrays, omitting the first and last values. - range.slice(1, -1).forEach(function(val) { - size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); - }); - - // Corrent for rtl languages - if (this._rtl) { - // Flip value position: this is not done automatically - size_scale.set_value_pos(Gtk.PositionType.LEFT); - // I suppose due to a bug, having a more than one mark and one above a value of 100 - // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable - // and then manually inverting it - size_scale.set_flippable(false); - size_scale.set_inverted(true); - } - } - - this._settings.bind('animate-app-switch', - this._builder.get_object('animate_app_switch_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('animate-window-launch', - this._builder.get_object('animate_window_launch_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('animate-appicon-hover', - this._builder.get_object('animate_appicon_hover_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('animate-appicon-hover', - this._builder.get_object('animate_appicon_hover_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - { - this._settings.bind('animate-appicon-hover-animation-type', - this._builder.get_object('animate_appicon_hover_options_type_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - let scales = [ - ['animate_appicon_hover_options_duration_scale', 'animate-appicon-hover-animation-duration', 1], - ['animate_appicon_hover_options_rotation_scale', 'animate-appicon-hover-animation-rotation', 1], - ['animate_appicon_hover_options_travel_scale', 'animate-appicon-hover-animation-travel', 100], - ['animate_appicon_hover_options_zoom_scale', 'animate-appicon-hover-animation-zoom', 100], - ['animate_appicon_hover_options_convexity_scale', 'animate-appicon-hover-animation-convexity', 1], - ['animate_appicon_hover_options_extent_scale', 'animate-appicon-hover-animation-extent', 1], - ]; - - let updateScale = scale => { - let [id, key, factor] = scale; - let type = this._settings.get_string('animate-appicon-hover-animation-type'); - let value = this._settings.get_value(key).deep_unpack()[type]; - let defaultValue = this._settings.get_default_value(key).deep_unpack()[type]; - this._builder.get_object(id).sensitive = defaultValue !== undefined; - this._builder.get_object(id).set_value(value * factor || 0); - this._builder.get_object(id).clear_marks(); - this._builder.get_object(id).add_mark(defaultValue * factor, Gtk.PositionType.TOP, - defaultValue !== undefined ? (defaultValue * factor).toString() : ' '); - }; - - scales.forEach(scale => { - let [id, key, factor] = scale; - this._settings.connect('changed::' + key, () => updateScale(scale)); - this._builder.get_object(id).connect('value-changed', widget => { - let type = this._settings.get_string('animate-appicon-hover-animation-type'); - let variant = this._settings.get_value(key); - let unpacked = variant.deep_unpack(); - if (unpacked[type] != widget.get_value() / factor) { - unpacked[type] = widget.get_value() / factor; - this._settings.set_value(key, new GLib.Variant(variant.get_type_string(), unpacked)); - } - }); - }); - - this._settings.connect('changed::animate-appicon-hover-animation-type', () => scales.forEach(updateScale)); - scales.forEach(updateScale); - } - - this._builder.get_object('animate_appicon_hover_button').connect('clicked', () => { - let box = this._builder.get_object('animate_appicon_hover_options'); - - let dialog = this._createPreferencesDialog(_('App icon animation options'), box, () => - { - // restore default settings - this._settings.set_value('animate-appicon-hover-animation-type', this._settings.get_default_value('animate-appicon-hover-animation-type')); - this._settings.set_value('animate-appicon-hover-animation-duration', this._settings.get_default_value('animate-appicon-hover-animation-duration')); - this._settings.set_value('animate-appicon-hover-animation-rotation', this._settings.get_default_value('animate-appicon-hover-animation-rotation')); - this._settings.set_value('animate-appicon-hover-animation-travel', this._settings.get_default_value('animate-appicon-hover-animation-travel')); - this._settings.set_value('animate-appicon-hover-animation-zoom', this._settings.get_default_value('animate-appicon-hover-animation-zoom')); - this._settings.set_value('animate-appicon-hover-animation-convexity', this._settings.get_default_value('animate-appicon-hover-animation-convexity')); - this._settings.set_value('animate-appicon-hover-animation-extent', this._settings.get_default_value('animate-appicon-hover-animation-extent')); - }); - - dialog.show(); - - }); - - this._settings.bind('stockgs-keep-dash', - this._builder.get_object('stockgs_dash_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('stockgs-keep-top-panel', - this._builder.get_object('stockgs_top_panel_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - - - this._settings.connect('changed::stockgs-keep-top-panel', () => this._maybeDisableTopPosition()); - - this._maybeDisableTopPosition(); - - this._settings.bind('stockgs-panelbtn-click-only', - this._builder.get_object('stockgs_panelbtn_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('stockgs-force-hotcorner', - this._builder.get_object('stockgs_hotcorner_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - // About Panel - - this._builder.get_object('extension_version').set_label(this._metadata.version.toString() + (this._metadata.commit ? ' (' + this._metadata.commit + ')' : '')); - - this._builder.get_object('importexport_export_button').connect('clicked', widget => { - this._showFileChooser( - _('Export settings'), - { action: Gtk.FileChooserAction.SAVE }, - "Save", - filename => { - let file = Gio.file_new_for_path(filename); - let raw = file.replace(null, false, Gio.FileCreateFlags.NONE, null); - let out = Gio.BufferedOutputStream.new_sized(raw, 4096); - - out.write_all(GLib.spawn_command_line_sync('dconf dump ' + SCHEMA_PATH)[1], null); - out.close(null); - } - ); - }); - - this._builder.get_object('importexport_import_button').connect('clicked', widget => { - this._showFileChooser( - _('Import settings'), - { action: Gtk.FileChooserAction.OPEN }, - "Open", - filename => { - if (filename && GLib.file_test(filename, GLib.FileTest.EXISTS)) { - let settingsFile = Gio.File.new_for_path(filename); - let [ , pid, stdin, stdout, stderr] = - GLib.spawn_async_with_pipes( - null, - ['dconf', 'load', SCHEMA_PATH], - null, - GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null - ); - - stdin = new Gio.UnixOutputStream({ fd: stdin, close_fd: true }); - GLib.close(stdout); - GLib.close(stderr); - - stdin.splice(settingsFile.read(null), Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | Gio.OutputStreamSpliceFlags.CLOSE_TARGET, null); - } - } - ); - }); - - } - - _setPreviewTitlePosition() { - switch (this._settings.get_string('window-preview-title-position')) { - case 'BOTTOM': - this._builder.get_object('preview_title_position_bottom_button').set_active(true); - break; - case 'TOP': - this._builder.get_object('preview_title_position_top_button').set_active(true); - break; - } - } - - _showFileChooser(title, params, acceptBtn, acceptHandler) { - let dialog = new Gtk.FileChooserDialog(mergeObjects({ title: title, transient_for: this.notebook.get_root() }, params)); - - dialog.add_button("Cancel", Gtk.ResponseType.CANCEL); - dialog.add_button(acceptBtn, Gtk.ResponseType.ACCEPT); - - dialog.show(); - - dialog.connect('response', (dialog, id) => { - if (id == Gtk.ResponseType.ACCEPT) - acceptHandler.call(this, dialog.get_file().get_path()); - - dialog.destroy(); - }); - } -} - - -const BuilderScope = GObject.registerClass({ - Implements: [Gtk.BuilderScope], -}, class BuilderScope extends GObject.Object { - - _init(preferences) { - this._preferences = preferences; - super._init(); - } - - vfunc_create_closure(builder, handlerName, flags, connectObject) { - if (flags & Gtk.BuilderClosureFlags.SWAPPED) - throw new Error('Unsupported template signal flag "swapped"'); - - if (typeof this[handlerName] === 'undefined') - throw new Error(`${handlerName} is undefined`); - - return this[handlerName].bind(connectObject || this); - } - - on_btn_click(connectObject) { - connectObject.set_label("Clicked"); - } - - position_bottom_button_clicked_cb(button) { - if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.BOTTOM); - } - - position_top_button_clicked_cb(button) { - if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.TOP); - } - - position_left_button_clicked_cb(button) { - if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.LEFT); - } - - position_right_button_clicked_cb(button) { - if (!this._preferences._ignorePositionRadios && button.get_active()) this._preferences._setPanelPosition(Pos.RIGHT); - } - - dots_bottom_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('dot-position', "BOTTOM"); - } - - dots_top_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('dot-position', "TOP"); - } - - dots_left_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('dot-position', "LEFT"); - } - - dots_right_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('dot-position', "RIGHT"); - } - - preview_title_position_bottom_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('window-preview-title-position', 'BOTTOM'); - } - - preview_title_position_top_button_toggled_cb(button) { - if (button.get_active()) - this._preferences._settings.set_string('window-preview-title-position', 'TOP'); - } - - panel_size_scale_value_changed_cb(scale) { - // Avoid settings the size continuously - if (this._preferences._panel_size_timeout > 0) - GLib.Source.remove(this._preferences._panel_size_timeout); - - this._preferences._panel_size_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - const value = scale.get_value(); - const monitorSync = this._preferences._settings.get_boolean('panel-element-positions-monitors-sync'); - const monitorsToSetFor = monitorSync ? this._preferences.monitors : [this._preferences._currentMonitorIndex]; - monitorsToSetFor.forEach(monitorIndex => { - PanelSettings.setPanelSize(this._preferences._settings, monitorIndex, value); - }); - - this._preferences._panel_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - tray_size_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._tray_size_timeout > 0) - GLib.Source.remove(this._preferences._tray_size_timeout); - - this._preferences._tray_size_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('tray-size', scale.get_value()); - this._preferences._tray_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - leftbox_size_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._leftbox_size_timeout > 0) - GLib.Source.remove(this._preferences._leftbox_size_timeout); - - this._preferences._leftbox_size_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('leftbox-size', scale.get_value()); - this._preferences._leftbox_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - appicon_margin_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._appicon_margin_timeout > 0) - GLib.Source.remove(this._preferences._appicon_margin_timeout); - - this._preferences._appicon_margin_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('appicon-margin', scale.get_value()); - this._preferences._appicon_margin_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - appicon_padding_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._appicon_padding_timeout > 0) - GLib.Source.remove(this._preferences._appicon_padding_timeout); - - this._preferences._appicon_padding_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('appicon-padding', scale.get_value()); - this._preferences._appicon_padding_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - tray_padding_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._tray_padding_timeout > 0) - GLib.Source.remove(this._preferences._tray_padding_timeout); - - this._preferences._tray_padding_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('tray-padding', scale.get_value()); - this._preferences._tray_padding_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - statusicon_padding_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._statusicon_padding_timeout > 0) - GLib.Source.remove(this._preferences._statusicon_padding_timeout); - - this._preferences._statusicon_padding_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('status-icon-padding', scale.get_value()); - this._preferences._statusicon_padding_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - leftbox_padding_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._preferences._leftbox_padding_timeout > 0) - GLib.Source.remove(this._preferences._leftbox_padding_timeout); - - this._preferences._leftbox_padding_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._preferences._settings.set_int('leftbox-padding', scale.get_value()); - this._preferences._leftbox_padding_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } -}); - - -export default class DashToPanelPreferences extends ExtensionPreferences { - fillPreferencesWindow(window) { - window._settings = this.getSettings('org.gnome.shell.extensions.dash-to-panel'); - - // use default width or window - window.set_default_size(0, 740); - - let preferences = new Preferences(window, window._settings, this.path); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/private_metadata.json deleted file mode 100644 index 913101cd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/private_metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "An icon taskbar for the Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications.\n\nFor a more traditional experience, you may also want to use Tweak Tool to enable Windows > Titlebar Buttons > Minimize & Maximize.\n\nFor the best support, please report any issues on Github. Dash-to-panel is developed and maintained by @jderose9 and @charlesg99.", - "donations": { - "paypal": "charlesg99" - }, - "extension-id": "dash-to-panel", - "gettext-domain": "dash-to-panel", - "name": "Dash to Panel", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/home-sweet-gnome/dash-to-panel", - "uuid": "dash-to-panel@jderose9.github.com", - "version": 63 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/progress.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/progress.js deleted file mode 100644 index 48105ab9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/progress.js +++ /dev/null @@ -1,597 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - */ - -import Cairo from 'cairo'; -import Gio from 'gi://Gio'; -import Clutter from 'gi://Clutter'; -import Pango from 'gi://Pango'; -import St from 'gi://St'; -import * as Utils from './utils.js'; -import {SETTINGS} from './extension.js'; - -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; - - -export const ProgressManager = class extends EventEmitter { - - constructor() { - super(); - - this._entriesByDBusName = {}; - - this._launcher_entry_dbus_signal_id = - Gio.DBus.session.signal_subscribe(null, // sender - 'com.canonical.Unity.LauncherEntry', // iface - null, // member - null, // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - this._onEntrySignalReceived.bind(this)); - - this._dbus_name_owner_changed_signal_id = - Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender - 'org.freedesktop.DBus', // interface - 'NameOwnerChanged', // member - '/org/freedesktop/DBus', // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - this._onDBusNameOwnerChanged.bind(this)); - - this._acquireUnityDBus(); - } - - destroy() { - if (this._launcher_entry_dbus_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); - } - - if (this._dbus_name_owner_changed_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); - } - - this._releaseUnityDBus(); - } - - size() { - return Object.keys(this._entriesByDBusName).length; - } - - lookupByDBusName(dbusName) { - return this._entriesByDBusName.hasOwnProperty(dbusName) ? this._entriesByDBusName[dbusName] : null; - } - - lookupById(appId) { - let ret = []; - for (let dbusName in this._entriesByDBusName) { - let entry = this._entriesByDBusName[dbusName]; - if (entry && entry.appId() == appId) { - ret.push(entry); - } - } - - return ret; - } - - addEntry(entry) { - let existingEntry = this.lookupByDBusName(entry.dbusName()); - if (existingEntry) { - existingEntry.update(entry); - } else { - this._entriesByDBusName[entry.dbusName()] = entry; - this.emit('progress-entry-added', entry); - } - } - - removeEntry(entry) { - delete this._entriesByDBusName[entry.dbusName()] - this.emit('progress-entry-removed', entry); - } - - _acquireUnityDBus() { - if (!this._unity_bus_id) { - Gio.DBus.session.own_name('com.canonical.Unity', - Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT, null, null); - } - } - - _releaseUnityDBus() { - if (this._unity_bus_id) { - Gio.DBus.session.unown_name(this._unity_bus_id); - this._unity_bus_id = 0; - } - } - - _onEntrySignalReceived(connection, sender_name, object_path, - interface_name, signal_name, parameters, user_data) { - if (!parameters || !signal_name) - return; - - if (signal_name == 'Update') { - if (!sender_name) { - return; - } - - this._handleUpdateRequest(sender_name, parameters); - } - } - - _onDBusNameOwnerChanged(connection, sender_name, object_path, - interface_name, signal_name, parameters, user_data) { - if (!parameters || !this.size()) - return; - - let [name, before, after] = parameters.deep_unpack(); - - if (!after) { - if (this._entriesByDBusName.hasOwnProperty(before)) { - this.removeEntry(this._entriesByDBusName[before]); - } - } - } - - _handleUpdateRequest(senderName, parameters) { - if (!senderName || !parameters) { - return; - } - - let [appUri, properties] = parameters.deep_unpack(); - let appId = appUri.replace(/(^\w+:|^)\/\//, ''); - let entry = this.lookupByDBusName(senderName); - - if (entry) { - entry.setDBusName(senderName); - entry.update(properties); - } else { - let entry = new AppProgress(senderName, appId, properties); - this.addEntry(entry); - } - } -}; - -export class AppProgress extends EventEmitter { - - constructor(dbusName, appId, properties) { - super(); - - this._dbusName = dbusName; - this._appId = appId; - this._count = 0; - this._countVisible = false; - this._progress = 0.0; - this._progressVisible = false; - this._urgent = false; - this.update(properties); - } - - appId() { - return this._appId; - } - - dbusName() { - return this._dbusName; - } - - count() { - return this._count; - } - - setCount(count) { - if (this._count != count) { - this._count = count; - this.emit('count-changed', this._count); - } - } - - countVisible() { - return this._countVisible; - } - - setCountVisible(countVisible) { - if (this._countVisible != countVisible) { - this._countVisible = countVisible; - this.emit('count-visible-changed', this._countVisible); - } - } - - progress() { - return this._progress; - } - - setProgress(progress) { - if (this._progress != progress) { - this._progress = progress; - this.emit('progress-changed', this._progress); - } - } - - progressVisible() { - return this._progressVisible; - } - - setProgressVisible(progressVisible) { - if (this._progressVisible != progressVisible) { - this._progressVisible = progressVisible; - this.emit('progress-visible-changed', this._progressVisible); - } - } - - urgent() { - return this._urgent; - } - - setUrgent(urgent) { - if (this._urgent != urgent) { - this._urgent = urgent; - this.emit('urgent-changed', this._urgent); - } - } - - setDBusName(dbusName) { - if (this._dbusName != dbusName) { - let oldName = this._dbusName; - this._dbusName = dbusName; - this.emit('dbus-name-changed', oldName); - } - } - - update(other) { - if (other instanceof AppProgress) { - this.setDBusName(other.dbusName()) - this.setCount(other.count()); - this.setCountVisible(other.countVisible()); - this.setProgress(other.progress()); - this.setProgressVisible(other.progressVisible()) - this.setUrgent(other.urgent()); - } else { - for (let property in other) { - if (other.hasOwnProperty(property)) { - if (property == 'count') { - this.setCount(other[property].get_int64()); - } else if (property == 'count-visible') { - this.setCountVisible(SETTINGS.get_boolean('progress-show-count') && other[property].get_boolean()); - } else if (property == 'progress') { - this.setProgress(other[property].get_double()); - } else if (property == 'progress-visible') { - this.setProgressVisible(SETTINGS.get_boolean('progress-show-bar') && other[property].get_boolean()); - } else if (property == 'urgent') { - this.setUrgent(other[property].get_boolean()); - } else { - // Not implemented yet - } - } - } - } - } -} - - -export const ProgressIndicator = class { - - constructor(source, progressManager) { - this._source = source; - this._progressManager = progressManager; - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._sourceDestroyId = this._source.connect('destroy', () => { - this._signalsHandler.destroy(); - }); - - this._notificationBadgeLabel = new St.Label({ style_class: 'badge' }); - this._notificationBadgeBin = new St.Bin({ - child: this._notificationBadgeLabel, y: 2, x: 2 - }); - this._notificationBadgeLabel.add_style_class_name('notification-badge'); - this._notificationBadgeCount = 0; - this._notificationBadgeBin.hide(); - - this._source._dtpIconContainer.add_child(this._notificationBadgeBin); - this._source._dtpIconContainer.connect('notify::allocation', this.updateNotificationBadge.bind(this)); - - this._progressManagerEntries = []; - this._progressManager.lookupById(this._source.app.id).forEach( - (entry) => { - this.insertEntry(entry); - } - ); - - this._signalsHandler.add([ - this._progressManager, - 'progress-entry-added', - this._onEntryAdded.bind(this) - ], [ - this._progressManager, - 'progress-entry-removed', - this._onEntryRemoved.bind(this) - ]); - } - - destroy() { - this._source.disconnect(this._sourceDestroyId); - this._signalsHandler.destroy(); - } - - _onEntryAdded(appProgress, entry) { - if (!entry || !entry.appId()) - return; - if (this._source && this._source.app && this._source.app.id == entry.appId()) { - this.insertEntry(entry); - } - } - - _onEntryRemoved(appProgress, entry) { - if (!entry || !entry.appId()) - return; - - if (this._source && this._source.app && this._source.app.id == entry.appId()) { - this.removeEntry(entry); - } - } - - updateNotificationBadge() { - this._source.updateNumberOverlay(this._notificationBadgeBin); - this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; - } - - _notificationBadgeCountToText(count) { - if (count <= 9999) { - return count.toString(); - } else if (count < 1e5) { - let thousands = count / 1e3; - return thousands.toFixed(1).toString() + "k"; - } else if (count < 1e6) { - let thousands = count / 1e3; - return thousands.toFixed(0).toString() + "k"; - } else if (count < 1e8) { - let millions = count / 1e6; - return millions.toFixed(1).toString() + "M"; - } else if (count < 1e9) { - let millions = count / 1e6; - return millions.toFixed(0).toString() + "M"; - } else { - let billions = count / 1e9; - return billions.toFixed(1).toString() + "B"; - } - } - - setNotificationBadge(count) { - this._notificationBadgeCount = count; - let text = this._notificationBadgeCountToText(count); - this._notificationBadgeLabel.set_text(text); - } - - toggleNotificationBadge(activate) { - if (activate && this._notificationBadgeCount > 0) { - this.updateNotificationBadge(); - this._notificationBadgeBin.show(); - } - else - this._notificationBadgeBin.hide(); - } - - _showProgressOverlay() { - if (this._progressOverlayArea) { - this._updateProgressOverlay(); - return; - } - - this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); - this._progressOverlayArea.add_style_class_name('progress-bar'); - this._progressOverlayArea.connect('repaint', () => { - this._drawProgressOverlay(this._progressOverlayArea); - }); - - this._source._iconContainer.add_child(this._progressOverlayArea); - let node = this._progressOverlayArea.get_theme_node(); - - let [hasColor, color] = node.lookup_color('-progress-bar-background', false); - if (hasColor) - this._progressbar_background = color - else - this._progressbar_background = new Utils.ColorUtils.Color({red: 204, green: 204, blue: 204, alpha: 255}); - - [hasColor, color] = node.lookup_color('-progress-bar-border', false); - if (hasColor) - this._progressbar_border = color; - else - this._progressbar_border = new Utils.ColorUtils.Color({red: 230, green: 230, blue: 230, alpha: 255}); - - this._updateProgressOverlay(); - } - - _hideProgressOverlay() { - if (this._progressOverlayArea) - this._progressOverlayArea.destroy(); - - this._progressOverlayArea = null; - this._progressbar_background = null; - this._progressbar_border = null; - } - - _updateProgressOverlay() { - - if (this._progressOverlayArea) { - this._progressOverlayArea.queue_repaint(); - } - } - - _drawProgressOverlay(area) { - let scaleFactor = Utils.getScaleFactor(); - let [surfaceWidth, surfaceHeight] = area.get_surface_size(); - let cr = area.get_context(); - - let iconSize = this._source.icon.iconSize * scaleFactor; - - let x = Math.floor((surfaceWidth - iconSize) / 2); - let y = Math.floor((surfaceHeight - iconSize) / 2); - - let lineWidth = Math.floor(1.0 * scaleFactor); - let padding = Math.floor(iconSize * 0.05); - let width = iconSize - 2.0*padding; - let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); - x += padding; - y += iconSize - height - padding; - - cr.setLineWidth(lineWidth); - - // Draw the outer stroke - let stroke = new Cairo.LinearGradient(0, y, 0, y + height); - let fill = null; - stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); - stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the background - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); - fill = new Cairo.LinearGradient(0, y, 0, y + height); - fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); - fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the finished bar - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - let finishedWidth = Math.ceil(this._progress * width); - - let bg = this._progressbar_background; - let bd = this._progressbar_border; - - stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); - fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); - - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) - Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - else - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - - cr.$dispose(); - } - - setProgress(progress) { - this._progress = Math.min(Math.max(progress, 0.0), 1.0); - this._updateProgressOverlay(); - } - - toggleProgressOverlay(activate) { - if (activate) { - this._showProgressOverlay(); - } - else { - this._hideProgressOverlay(); - } - } - - insertEntry(appProgress) { - if (!appProgress || this._progressManagerEntries.indexOf(appProgress) !== -1) - return; - - this._progressManagerEntries.push(appProgress); - this._selectEntry(appProgress); - } - - removeEntry(appProgress) { - if (!appProgress || this._progressManagerEntries.indexOf(appProgress) == -1) - return; - - this._progressManagerEntries.splice(this._progressManagerEntries.indexOf(appProgress), 1); - - if (this._progressManagerEntries.length > 0) { - this._selectEntry(this._progressManagerEntries[this._progressManagerEntries.length-1]); - } else { - this.setNotificationBadge(0); - this.toggleNotificationBadge(false); - this.setProgress(0); - this.toggleProgressOverlay(false); - this.setUrgent(false); - } - } - - _selectEntry(appProgress) { - if (!appProgress) - return; - - this._signalsHandler.removeWithLabel('progress-entry'); - - this._signalsHandler.addWithLabel('progress-entry', - [ - appProgress, - 'count-changed', - (appProgress, value) => { - this.setNotificationBadge(value); - } - ], [ - appProgress, - 'count-visible-changed', - (appProgress, value) => { - this.toggleNotificationBadge(value); - } - ], [ - appProgress, - 'progress-changed', - (appProgress, value) => { - this.setProgress(value); - } - ], [ - appProgress, - 'progress-visible-changed', - (appProgress, value) => { - this.toggleProgressOverlay(value); - } - ], [ - appProgress, - 'urgent-changed', - (appProgress, value) => { - this.setUrgent(value) - } - ]); - - this.setNotificationBadge(appProgress.count()); - this.toggleNotificationBadge(appProgress.countVisible()); - this.setProgress(appProgress.progress()); - this.toggleProgressOverlay(appProgress.progressVisible()); - - this._isUrgent = false; - } - - setUrgent(urgent) { - const icon = this._source.icon._iconBin; - if (urgent) { - if (!this._isUrgent) { - icon.set_pivot_point(0.5, 0.5); - this._source.iconAnimator.addAnimation(icon, 'dance'); - this._isUrgent = true; - } - } else { - if (this._isUrgent) { - this._source.iconAnimator.removeAnimation(icon, 'dance'); - this._isUrgent = false; - } - icon.rotation_angle_z = 0; - } - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/proximity.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/proximity.js deleted file mode 100644 index eff15483..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/proximity.js +++ /dev/null @@ -1,256 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 Meta from 'gi://Meta'; -import Mtk from 'gi://Mtk'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -import * as Utils from './utils.js'; - -//timeout intervals -const MIN_UPDATE_MS = 200; - -//timeout names -const T1 = 'limitUpdateTimeout'; - -export const Mode = { - ALL_WINDOWS: 0, - FOCUSED_WINDOWS: 1, - MAXIMIZED_WINDOWS: 2 -}; - -export class ProximityWatch { - - constructor(actor, monitorIndex, mode, xThreshold, yThreshold, handler) { - this.actor = actor; - this.monitorIndex = monitorIndex - this.overlap = false; - this.mode = mode; - this.threshold = [xThreshold, yThreshold]; - this.handler = handler; - - this._allocationChangedId = actor.connect('notify::allocation', () => this._updateWatchRect()); - - this._updateWatchRect(); - } - - destroy() { - this.actor.disconnect(this._allocationChangedId); - } - - _updateWatchRect() { - let [actorX, actorY] = this.actor.get_position(); - - this.rect = new Mtk.Rectangle({ - x: actorX - this.threshold[0], - y: actorY - this.threshold[1], - width: this.actor.width + this.threshold[0] * 2, - height: this.actor.height + this.threshold[1] * 2 - }); - } -}; - -export const ProximityManager = class { - - constructor() { - this._counter = 1; - this._watches = {}; - this._focusedWindowInfo = null; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._timeoutsHandler = new Utils.TimeoutsHandler(); - - this._bindSignals(); - this._setFocusedWindow(); - } - - createWatch(actor, monitorIndex, mode, xThreshold, yThreshold, handler) { - let watch = new ProximityWatch(actor, monitorIndex, mode, xThreshold, yThreshold, handler); - - this._watches[this._counter] = watch; - this.update(); - - return this._counter++; - } - - removeWatch(id) { - if (this._watches[id]) { - this._watches[id].destroy(); - delete this._watches[id]; - } - } - - update() { - this._queueUpdate(true); - } - - destroy() { - this._signalsHandler.destroy(); - this._timeoutsHandler.destroy(); - this._disconnectFocusedWindow(); - Object.keys(this._watches).forEach(id => this.removeWatch(id)); - } - - _bindSignals() { - this._signalsHandler.add( - [ - global.window_manager, - 'switch-workspace', - () => this._queueUpdate() - ], - [ - Main.overview, - 'hidden', - () => this._queueUpdate() - ], - [ - global.display, - 'notify::focus-window', - () => { - this._setFocusedWindow(); - this._queueUpdate(); - } - ], - [ - global.display, - 'restacked', - () => this._queueUpdate() - ] - ); - } - - _setFocusedWindow() { - this._disconnectFocusedWindow(); - - let focusedWindow = global.display.focus_window; - - if (focusedWindow) { - let focusedWindowInfo = this._getFocusedWindowInfo(focusedWindow); - - if (focusedWindowInfo && this._checkIfHandledWindowType(focusedWindowInfo.metaWindow)) { - focusedWindowInfo.allocationId = focusedWindowInfo.window.connect('notify::allocation', () => this._queueUpdate()); - focusedWindowInfo.destroyId = focusedWindowInfo.window.connect('destroy', () => this._disconnectFocusedWindow(true)); - - this._focusedWindowInfo = focusedWindowInfo; - } - } - } - - _getFocusedWindowInfo(focusedWindow) { - let window = focusedWindow.get_compositor_private(); - let focusedWindowInfo; - - if (window) { - focusedWindowInfo = { window: window }; - focusedWindowInfo.metaWindow = focusedWindow; - - if (focusedWindow.is_attached_dialog()) { - let mainMetaWindow = focusedWindow.get_transient_for(); - - if (focusedWindowInfo.metaWindow.get_frame_rect().height < mainMetaWindow.get_frame_rect().height) { - focusedWindowInfo.window = mainMetaWindow.get_compositor_private(); - focusedWindowInfo.metaWindow = mainMetaWindow; - } - } - } - - return focusedWindowInfo; - } - - _disconnectFocusedWindow(destroy) { - if (this._focusedWindowInfo && !destroy) { - this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.allocationId); - this._focusedWindowInfo.window.disconnect(this._focusedWindowInfo.destroyId); - } - - this._focusedWindowInfo = null; - } - - _getHandledWindows() { - return Utils.getCurrentWorkspace() - .list_windows() - .filter(mw => this._checkIfHandledWindow(mw)); - } - - _checkIfHandledWindow(metaWindow) { - return metaWindow && - !metaWindow.minimized && - !metaWindow.customJS_ding && - this._checkIfHandledWindowType(metaWindow); - } - - _checkIfHandledWindowType(metaWindow) { - let metaWindowType = metaWindow.get_window_type(); - - //https://www.roojs.org/seed/gir-1.2-gtk-3.0/seed/Meta.WindowType.html - return metaWindowType <= Meta.WindowType.SPLASHSCREEN && - metaWindowType != Meta.WindowType.DESKTOP; - } - - _queueUpdate(noDelay) { - if (!noDelay && this._timeoutsHandler.getId(T1)) { - //limit the number of updates - this._pendingUpdate = true; - return; - } - - this._timeoutsHandler.add([T1, MIN_UPDATE_MS, () => this._endLimitUpdate()]); - - let metaWindows = this._getHandledWindows(); - - Object.keys(this._watches).forEach(id => { - let watch = this._watches[id]; - let overlap = !!this._update(watch, metaWindows); - - if (overlap !== watch.overlap) { - watch.handler(overlap); - watch.overlap = overlap; - } - }); - } - - _endLimitUpdate() { - if (this._pendingUpdate) { - this._pendingUpdate = false; - this._queueUpdate(); - } - } - - _update(watch, metaWindows) { - if (watch.mode === Mode.FOCUSED_WINDOWS) - return (this._focusedWindowInfo && - this._checkIfHandledWindow(this._focusedWindowInfo.metaWindow) && - this._checkProximity(this._focusedWindowInfo.metaWindow, watch)); - - if (watch.mode === Mode.MAXIMIZED_WINDOWS) - return metaWindows.some(mw => mw.maximized_vertically && mw.maximized_horizontally && - mw.get_monitor() == watch.monitorIndex); - - //Mode.ALL_WINDOWS - return metaWindows.some(mw => this._checkProximity(mw, watch)); - } - - _checkProximity(metaWindow, watch) { - let windowRect = metaWindow.get_frame_rect(); - - return windowRect.overlap(watch.rect) && - ((!watch.threshold[0] && !watch.threshold[1]) || - metaWindow.get_monitor() == watch.monitorIndex || - windowRect.overlap(global.display.get_monitor_geometry(watch.monitorIndex))); - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/gschemas.compiled deleted file mode 100644 index 4aad826e71f66418c6847054fa8d25bd8fc9a915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17292 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml deleted file mode 100644 index a73a349a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml +++ /dev/null @@ -1,1282 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'BOTTOM' - Panel position (Deprecated) - Panel is shown on the Bottom or Top of the screen. - - - true - Sync element positions - Sync panel element positions on all monitors. - - - '{}' - Panel positions - Panel positions (JSON). - - - '{}' - Panel element positions - Panel element positions (JSON). - - - '{}' - Percentages of screen edge for panel to span - Length of the panels, in percent (JSON). - - - '{}' - Positions along screen edge - Where to show the panels if it is not the full length of the screen edge (JSON). - - - '{}' - Panel sizes - Sizes of panels, in pixels. - - - 48 - Panel size (Deprecated) - Set the size of the panel. - - - false - Override Show Desktop line color - Replace current Show Desktop button line color - - - "rgba(200,200,200,0.2)" - Custom Show Desktop line color - Custom Show Desktop button line color - - - 'BOTTOM' - Dot position - Running indicators are shown on the Bottom or Top of the screen. - - - 'NORMAL' - Style of Appicons - Style of Appicons - - - 'METRO' - Style of the running indicator (focused) - Style of the running indicator for the icon for the currently focused application - - - 'METRO' - Style of the running indicator (unfocused) - Style of the running indicator for the icon for applications which are not currently focused - - - false - Running indicator dominant color - Whether to use the app icon's dominant color for .app-well-running-dot - - - false - Running indicator color override - Whether to override the theme background color for .app-well-running-dot - - - "#5294e2" - Color of running indicator (1 window) - Customize the color of the running indicator when one window is running for that application - - - "#5294e2" - Color of running indicator (2 windows) - Customize the color of the running indicator when two windows are running for that application - - - "#5294e2" - Color of running indicator (3 windows) - Customize the color of the running indicator when three windows are running for that application - - - "#5294e2" - Color of running indicator (4+ windows) - Customize the color of the running indicator when four or more windows are running for that application - - - false - Unfocused color is different than focused - Whether to apply a 2nd color scheme to the indicator when the app is not focused - - - "#5294e2" - Color of unfocused running indicator (1 window) - Customize the color of the unfocused running indicator when one window is running for that application - - - "#5294e2" - Color of unfocused running indicator (2 windows) - Customize the color of the unfocused running indicator when two windows are running for that application - - - "#5294e2" - Color of unfocused running indicator (3 windows) - Customize the color of the unfocused running indicator when three windows are running for that application - - - "#5294e2" - Color of unfocused running indicator (4+ windows) - Customize the color of the unfocused running indicator when four or more windows are running for that application - - - 3 - Running indicator height - Height of the running indicator line/diameter of window indicator dots - - - true - Highlight icon of focused application - Whether to highlight the background of the currently focused application's icon - - - false - Highlight icon dominant color - Base the active window highlight color on that application's icon - - - "#EEEEEE" - Color of highlight of focused application - Customize the color of the highlight of the focused application - - - 25 - Opacity of highlight of focused application - Customize the opacity of the highlight of the focused application - - - false - Keep dash - Whether to keep the stock gnome-shell dash while in overview - - - false - Keep top panel - Whether to keep the stock gnome-shell top panel - - - false - Panel menu buttons require click - Whether to activate the panel menu buttons on hover or on click - - - false - Force hot corner - Wheter to force having an Activities hot corner on the primary monitor - - - false - Lock the taskbar - Specifies if the user can modify the taskbar - - - false - Override theme background color - Replace current theme background color for the panel - - - "#000" - Custom background color - Custom background color for the panel - - - false - Custom background color - Replace current theme background color for the panel - - - false - Dynamic opacity - Enable dynamic opacity - - - 0.4 - Panel opacity - Custom opacity for the panel - - - 'ALL_WINDOWS' - Dynamic opacity behavior - Dictates which window type affects the panel opacity - - - 20 - Distance to change opacity - The distance a window needs to be from the panel to change opacity - - - 0.8 - Modified panel opacity - Modified opacity for the panel when a window is near - - - 300 - Opacity change duration - The duration of the animation when the opacity changes - - - false - Custom gradient - Replace current theme gradient for the panel - - - "#000" - Custom gradient top color - Custom gradient top color for the panel - - - 0 - Custom gradient top opacity - Custom gradient top opacity for the panel - - - "#000" - Custom gradient bottom color - Custom gradient bottom color for the panel - - - 0.2 - Custom gradient bottom opacity - Custom gradient bottom opacity for the panel - - - false - Intellihide - Whether to intelligently hide the panel - - - false - Only hide from windows - Dictates if the dash should only hide when in conflict with windows - - - 'FOCUSED_WINDOWS' - Intellihide behaviour - Dictates how to intelligently hide the panel - - - false - Intellihide pressure - To reveal the panel, pressure needs to be applied to the edege of the screen - - - 100 - Intellihide pressure threshold - The pressure needed to reveal the panel - - - 1000 - Intellihide pressure time - The numer of milliseconds that the pressure needs to be applied to reveal the panel - - - false - Intellihide pressure - Allow the panel to be revealed while an application is in fullscreen mode - - - false - Intellihide only secondary - Whether to only hide secondary panels - - - 200 - Intellihide animation time - The animation time (ms) to hide and reveal the panel - - - 400 - Intellihide close delay - The delay (ms) before hiding the panel - - - "<Super>i" - Keybinding toggle intellihide - Keybinding to reveal the panel while in intellihide mode - - - i']]]> - Keybinding toggle intellihide - Keybinding to reveal the panel while in intellihide mode - - - 2000 - Intellihide enable start delay - The delay before enabling intellihide on start - - - "" - Custom Show Applications icon - Customize the Show Applications icon - - - 8 - Show Applications icon side padding - Customize the Show Applications icon side padding - - - true - Override escape key - Override the escape key to return to the desktop when entering the overview using the Show Applications button - - - [] - Show Apps button context menu commands - Commands to add to the Show Apps button right click menu - - - [] - Show Apps button context menu titles - Titles for commands added to Show Apps button right click menu - - - [] - Panel context menu commands - Commands to add to the panel right click menu - - - [] - Panel context menu titles - Titles for commands added to panel right click menu - - - false - Show activities button - Show activities button on the left hand side of the taskbar - - - 8 - Width of show Desktop button - Customize the width of the show Desktop button - - - false - Show desktop on hover - Show the desktop on mouse hover - - - 1000 - Delay show desktop - Delay before showing the desktop - - - 300 - Show desktop animation time - Window fade animation time when showing the destop - - - true - Show window preview - Show preview of running window on hover of app icon - - - true - Show tooltip - Show tooltip on hover of app icon - - - true - Show running apps - Show or hide running application icons in the dash - - - true - Show favorites apps - Show or hide favorite application icons in the dash - - - 400 - Icon enter display time - Amount of time after entering icon to wait before displaying window preview if icon is not clicked or mouse has not left. - - - true - Enable peek mode - Peek a window upon hover for some time - - - true - Display title in preview - Display window title in preview - - - false - Window previews manual styling - This defines if the default window previews styling should be applied - - - 'TOP' - Title position - Position of the window title, close button and icon in preview. - - - "#dddddd" - Window previews title font color - This defines the window preview titles font color. - - - 14 - Window previews title font size - This defines the window preview titles font size. - - - false - Window previews use custom icon size - Window previews use custom application icon size. - - - 16 - Window previews custom icon size - Window previews custom application icon size. - - - 260 - Window previews animation time - This defines the window previews animation time. - - - 'inherit' - Font weight of window preview titles - This defines the font weight of window preview titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. - - - 240 - Window previews size - Preferred window previews size - - - false - Fixed aspect ratio X - This defines if the window previews use a fixed aspect ratio X. - - - true - Fixed aspect ratio Y - This defines if the window previews use a fixed aspect ratio Y. - - - 8 - Window previews padding - The padding of the window previews - - - 16 - Aspect ratio X - The window previews respected aspect ratio X. - - - 9 - Aspect ratio Y - The window previews respected aspect ratio Y. - - - false - Immediate hide on icon click - The window previews immediately hide when an application icon is clicked. - - - false - Provide workspace isolation - Dash shows only windows from the current workspace - - - false - Close overview by clicking in empty space - Close overview or app grid by clicking in empty space - - - false - Hide overview on startup - Hide overview on startup, which would be shown by default at gnome startup. - - - true - Group applications - Dash groups the application instances under the same icon - - - 14 - Application title font size - When the applications are ungrouped, this defines the application titles font size. - - - 'inherit' - Font weight of application titles - When the applications are ungrouped, this defines font weight of application titles. Supported values: inherit (from theme), normal, lighter, bold and bolder. - - - "#dddddd" - Application title font color - When the applications are ungrouped, this defines the application titles font color. - - - "#dddddd" - Minimized application title font color - When the applications are ungrouped, this defines the titles font color for minimized applications. - - - 160 - Application title max width - When the applications are ungrouped, this defines the application titles maximum width. - - - true - Use a fixed width for the application titles - The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. - - - true - Display running indicators on unfocused applications - When the applications are ungrouped, this defines if running applications should display an indicator. - - - false - Use favorite icons as application launchers - When the applications are ungrouped, this defines if running applications stay separate from the favorite icons. - - - 0 - Primary monitor index - Specifies the index of the primary monitor. - - - true - Display panels on all monitors - Specifies if a panel is shown on every monitors - - - [] - Available monitors - Available gnome-shell (Mutter) monitors, internal use - - - false - Provide monitor isolation - Dash shows only windows from the current monitor - - - true - Display the favorites on all monitors - Specifies if every panel should display the favorite applications. If false, the favorite appplications are only displayed on the primary monitor. - - - true - Customize click behaviour - Customize action on various mouse events - - - true - Minimize on shift+click - - - true - Activate only one window - - - 'CYCLE-MIN' - Action when clicking on a running app - Set the action that is executed when clicking on the icon of a running application - - - 'MINIMIZE' - Action when shift+clicking on a running app - Set the action that is executed when shift+clicking on the icon of a running application - - - 'LAUNCH' - Action when clicking on a running app - Set the action that is executed when middle-clicking on the icon of a running application - - - 'LAUNCH' - Action when clicking on a running app - Set the action that is executed when shift+middle-clicking on the icon of a running application - - - 'SWITCH_WORKSPACE' - Action when scrolling over the panel - Set the action that is executed when scrolling over the panel - - - 0 - Delay between panel mouse scroll events - Set the minimum delay between panel mouse scroll events - - - true - Show the workspace switch head-up when workspace is changed by scrolling on the panel - - - 'CYCLE_WINDOWS' - Action when scrolling over a running app - Set the action that is executed when scrolling over a running application - - - 0 - Delay between icon mouse scroll events - Set the minimum delay between icon mouse scroll events - - - 100 - Icon leave preview timeout - Amount of time to leave preview windows open when the mouse has left the application's icon. - - - 500 - Enter window peeking mode timeout - Amount of time of inactivity to enter the window peeking mode when the mouse has entered a window preview. - - - 40 - Window peeking mode opacity - All windows except for the peeked one have their opacity set to the same value. - - - true - Middle click preview to close window - Middle click on the window preview to close that window - - - true - Window previews use custom opacity - Window previews background use a different opacity from the panel - - - 80 - Window previews background opacity - Window previews use this custom background opacity. - - - 0 - Tray font size - Set the size of the tray font. (0 for default) - - - 0 - Leftbox font size - Set the size of the leftBox font. (0 for default) - - - 8 - App icon margin - Set the margin for application icons in the embedded dash. - - - 4 - App icon padding - Set the padding for application icons in the embedded dash. - - - -1 - Tray item padding - Set the size of the tray padding. (-1 for default) - - - -1 - Leftbox item padding - Set the size of the leftBox padding. (-1 for default) - - - -1 - Status icon padding - Set the size of the aggregate (status) menu icon padding. (-1 for default) - - - true - Animate running indicator when open/closing/switching applications - - - true - Animate when new window launched - - - false - Animate app icon on hover - - - 'SIMPLE' - App icon hover animation type - - - {'RIPPLE':2,'PLANK':1} - App icon hover animation curve convexity (1 is linear, more is convex, less is concave) - - - {'SIMPLE':160,'RIPPLE':130,'PLANK':100} - App icon hover animation duration in milliseconds - - - {'RIPPLE':4,'PLANK':4} - App icon hover animation extent (maximum number of animated icons) - - - {'SIMPLE':0,'RIPPLE':10,'PLANK':0} - App icon hover animation rotation in degrees - - - {'SIMPLE':0.30,'RIPPLE':0.40,'PLANK':0} - App icon hover animation travel translation in relation to the app icon size - - - {'SIMPLE':1,'RIPPLE':1.25,'PLANK':2} - App icon hover animation zoom scale in relation to the app icon size - - - true - Integrate items from the gnome appmenu into the right click menu - - - false - Display Show Details to open Gnome Software from right click menu - - - "<Super>q" - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - q']]]> - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - 2000 - Timeout to hide the dock, in seconds - Sets the time duration before the dock is hidden again. - - - 750 - Timeout to hide the dock, in seconds - Sets the time duration before the dock is hidden again. - - - 'TEMPORARILY' - Transitivity of the number overlay - You can choose between NEVER, TEMPORARILY and ALWAYS. - - - false - Super Hot-Keys - Launch and switch between dash items using Super+(0-9) - - - 'Super' - Prefix to use for hotkeys - You can choose between Super or SuperAlt as the prefix for hotkeys. - - - false - Show window previews - When multiple instances of the application are available, show their window previews - - - 'BOTH' - Hotkeys number keys - Which number keys are used for the hotkeys - - - 1']]]> - Keybinding to launch 1st dash app - - Keybinding to launch 1st app. - - - - 2']]]> - Keybinding to launch 2nd dash app - - Keybinding to launch 2nd app. - - - - 3']]]> - Keybinding to launch 3rd dash app - - Keybinding to launch 3rd app. - - - - 4']]]> - Keybinding to launch 4th dash app - - Keybinding to launch 4th app. - - - - 5']]]> - Keybinding to launch 5th dash app - - Keybinding to launch 5th app. - - - - 6']]]> - Keybinding to launch 6th dash app - - Keybinding to launch 6th app. - - - - 7']]]> - Keybinding to launch 7th dash app - - Keybinding to launch 7th app. - - - - 8']]]> - Keybinding to launch 8th dash app - - Keybinding to launch 8th app. - - - - 9']]]> - Keybinding to launch 9th dash app - - Keybinding to launch 9th app. - - - - 0']]]> - Keybinding to launch 10th dash app - - Keybinding to launch 10th app. - - - - 1']]]> - Keybinding to trigger 1st dash app with shift behavior - - Keybinding to trigger 1st app with shift behavior. - - - - 2']]]> - Keybinding to trigger 2nd dash app with shift behavior - - Keybinding to trigger 2nd app with shift behavior. - - - - 3']]]> - Keybinding to trigger 3rd dash app with shift behavior - - Keybinding to trigger 3rd app with shift behavior. - - - - 4']]]> - Keybinding to trigger 4th dash app with shift behavior - - Keybinding to trigger 4th app with shift behavior. - - - - 5']]]> - Keybinding to trigger 5th dash app with shift behavior - - Keybinding to trigger 5th app with shift behavior. - - - - 6']]]> - Keybinding to trigger 6th dash app with shift behavior - - Keybinding to trigger 6th app with shift behavior. - - - - 7']]]> - Keybinding to trigger 7th dash app with shift behavior - - Keybinding to trigger 7th app with shift behavior. - - - - 8']]]> - Keybinding to trigger 8th dash app with shift behavior - - Keybinding to trigger 8th app with shift behavior. - - - - 9']]]> - Keybinding to trigger 9th dash app with shift behavior - - Keybinding to trigger 9th app with shift behavior. - - - - 0']]]> - Keybinding to trigger 10th dash app with shift behavior - - Keybinding to trigger 10th app with shift behavior. - - - - 1']]]> - Keybinding to trigger 1st dash app - - Keybinding to either show or launch the 1st application in the dash. - - - - 2']]]> - Keybinding to trigger 2nd dash app - - Keybinding to either show or launch the 2nd application in the dash. - - - - 3']]]> - Keybinding to trigger 3rd dash app - - Keybinding to either show or launch the 3rd application in the dash. - - - - 4']]]> - Keybinding to trigger 4th dash app - - Keybinding to either show or launch the 4th application in the dash. - - - - 5']]]> - Keybinding to trigger 5th dash app - - Keybinding to either show or launch the 5th application in the dash. - - - - 6']]]> - Keybinding to trigger 6th dash app - - Keybinding to either show or launch the 6th application in the dash. - - - - 7']]]> - Keybinding to trigger 7th dash app - - Keybinding to either show or launch the 7th application in the dash. - - - - 8']]]> - Keybinding to trigger 8th dash app - - Keybinding to either show or launch the 8th application in the dash. - - - - 9']]]> - Keybinding to trigger 9th dash app - - Keybinding to either show or launch the 9th application in the dash. - - - - 0']]]> - Keybinding to trigger 10th dash app - - Keybinding to either show or launch the 10th application in the dash. - - - - KP_1']]]> - Keybinding to launch 1st dash app - - Keybinding to launch 1st app. - - - - KP_2']]]> - Keybinding to launch 2nd dash app - - Keybinding to launch 2nd app. - - - - KP_3']]]> - Keybinding to launch 3rd dash app - - Keybinding to launch 3rd app. - - - - KP_4']]]> - Keybinding to launch 4th dash app - - Keybinding to launch 4th app. - - - - KP_5']]]> - Keybinding to launch 5th dash app - - Keybinding to launch 5th app. - - - - KP_6']]]> - Keybinding to launch 6th dash app - - Keybinding to launch 6th app. - - - - KP_7']]]> - Keybinding to launch 7th dash app - - Keybinding to launch 7th app. - - - - KP_8']]]> - Keybinding to launch 8th dash app - - Keybinding to launch 8th app. - - - - KP_9']]]> - Keybinding to launch 9th dash app - - Keybinding to launch 9th app. - - - - KP_0']]]> - Keybinding to launch 10th dash app - - Keybinding to launch 10th app. - - - - KP_1']]]> - Keybinding to trigger 1st dash app with shift behavior - - Keybinding to trigger 1st app with shift behavior. - - - - KP_2']]]> - Keybinding to trigger 2nd dash app with shift behavior - - Keybinding to trigger 2nd app with shift behavior. - - - - KP_3']]]> - Keybinding to trigger 3rd dash app with shift behavior - - Keybinding to trigger 3rd app with shift behavior. - - - - KP_4']]]> - Keybinding to trigger 4th dash app with shift behavior - - Keybinding to trigger 4th app with shift behavior. - - - - KP_5']]]> - Keybinding to trigger 5th dash app with shift behavior - - Keybinding to trigger 5th app with shift behavior. - - - - KP_6']]]> - Keybinding to trigger 6th dash app with shift behavior - - Keybinding to trigger 6th app with shift behavior. - - - - KP_7']]]> - Keybinding to trigger 7th dash app with shift behavior - - Keybinding to trigger 7th app with shift behavior. - - - - KP_8']]]> - Keybinding to trigger 8th dash app with shift behavior - - Keybinding to trigger 8th app with shift behavior. - - - - KP_9']]]> - Keybinding to trigger 9th dash app with shift behavior - - Keybinding to trigger 9th app with shift behavior. - - - - KP_0']]]> - Keybinding to trigger 10th dash app with shift behavior - - Keybinding to trigger 10th app with shift behavior. - - - - KP_1']]]> - Keybinding to trigger 1st dash app - - Keybinding to either show or launch the 1st application in the dash. - - - - KP_2']]]> - Keybinding to trigger 2nd dash app - - Keybinding to either show or launch the 2nd application in the dash. - - - - KP_3']]]> - Keybinding to trigger 3rd dash app - - Keybinding to either show or launch the 3rd application in the dash. - - - - KP_4']]]> - Keybinding to trigger 4th dash app - - Keybinding to either show or launch the 4th application in the dash. - - - - KP_5']]]> - Keybinding to trigger 5th dash app - - Keybinding to either show or launch the 5th application in the dash. - - - - KP_6']]]> - Keybinding to trigger 6th dash app - - Keybinding to either show or launch the 6th application in the dash. - - - - KP_7']]]> - Keybinding to trigger 7th dash app - - Keybinding to either show or launch the 7th application in the dash. - - - - KP_8']]]> - Keybinding to trigger 8th dash app - - Keybinding to either show or launch the 8th application in the dash. - - - - KP_9']]]> - Keybinding to trigger 9th dash app - - Keybinding to either show or launch the 9th application in the dash. - - - - KP_0']]]> - Keybinding to trigger 10th dash app - - Keybinding to either show or launch the 10th application in the dash. - - - - true - Show progress bar on app icon - Whether to show progress bar overlay on app icon, for supported applications. - - - true - Show badge count on app icon - Whether to show badge count overlay on app icon, for supported applications. - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/stylesheet.css deleted file mode 100644 index 58d191ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/stylesheet.css +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -#dashtopanelTaskbar .dash-item-container > StWidget, -.dashtopanelMainPanel .dash-item-container .show-apps { - margin: 0; - padding: 0; -} - -#dashtopanelScrollview .overview-tile, -.dashtopanelMainPanel .overview-tile { - background: none; -} - -#dashtopanelScrollview .overview-tile .overview-label { - /* must match TITLE_RIGHT_PADDING in apppicons.js */ - padding-right: 8px; - text-align: left; -} - -#dashtopanelScrollview .overview-tile:hover .dtp-container, -#dashtopanelScrollview .overview-tile:focus .dtp-container, -.dashtopanelMainPanel .dash-item-container .show-apps:hover { - background-color: rgba(238, 238, 238, 0.1); -} - -.dashtopanelMainPanel .dash-item-container .show-apps .overview-icon { - color: #FFF; -} - -#dashtopanelTaskbar .dash-item-container .overview-tile:hover, -#dashtopanelTaskbar .dash-item-container .overview-tile .dtp-container .overview-icon, -#dashtopanelScrollview .overview-tile:hover .dtp-container.animate-appicon-hover, -.dashtopanelMainPanel .dash-item-container .show-apps:hover .overview-icon { - background: none; -} - -#dashtopanelScrollview .overview-tile:active .dtp-container { - background-color: rgba(238, 238, 236, 0.18); -} - -#dashtopanelScrollview .overview-tile .favorite { - background-color: rgba(80, 150, 255, 0.4); -} - -#dashtopanelTaskbar .scrollview-fade { - background-gradient-end: rgba(0, 0, 0, 0); -} - -.dashtopanelSecondaryMenu { - max-width: 400px; -} - -.dashtopanelMainPanel.vertical .panel-button { - text-align: center; -} - -.dashtopanelMainPanel.vertical .panel-button.vertical *, -.dashtopanelMainPanel.vertical .panel-button.clock-display * { - padding: 0; - margin: 0; -} - -.dashtopanelMainPanel.vertical .panel-button > *, -.dashtopanelMainPanel.vertical .panel-button.vertical > *, -.dashtopanelMainPanel.vertical .panel-button.vertical .system-status-icon, -.dashtopanelMainPanel.vertical .panel-button.clock-display > *, -.dashtopanelMainPanel.vertical .panel-button.clock-display .clock { - padding: 8px 0; -} - -.dashtopanelMainPanel.vertical .panel-button.clock-display { - -natural-hpadding: 0; - -minimum-hpadding: 0; -} - -#dashtopanelThumbnailList { - spacing: 0em; - padding: 0 1em; -} - -#dashtopanelThumbnailList .popup-menu-item { - padding: 0; - border-radius: 5px; - spacing: 0; -} - -#dashtopanelThumbnailList .window-box { - padding: 0; - spacing: 0; -} - -#dashtopanelThumbnailList .preview-window-title { - padding-top: 1em; -} - -.popup-menu.panel-menu { - margin-bottom: 0; -} - -#panel #panelLeft, #panel #panelCenter { - spacing: 0px; -} - -.showdesktop-button-dark-hovered { - background-color: rgba(200, 200, 200, .4); -} - -.showdesktop-button-light-hovered { - background-color: rgba(55, 55, 55, .4); -} - -#dashtopanelScrollview .badge { - color: rgba(255, 255, 255, 1); - font-weight: bold; - text-align: center; -} - -#dashtopanelScrollview .number-overlay { - background-color: rgba(0,0,0,0.8); -} - -#dashtopanelScrollview .notification-badge { - background-color: rgba(255,0,0,0.8); -} - -#dashtopanelScrollview .progress-bar { - /* Customization of the progress bar style, e.g.: - -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); - -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); */ -} - -.symbolic-icon-style { - -st-icon-style: symbolic; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/taskbar.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/taskbar.js deleted file mode 100644 index 54da64f1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/taskbar.js +++ /dev/null @@ -1,1556 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ - - -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Graphene from 'gi://Graphene'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; - -import * as AppFavorites from 'resource:///org/gnome/shell/ui/appFavorites.js'; -import * as Dash from 'resource:///org/gnome/shell/ui/dash.js'; -import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; - -import * as AppIcons from './appIcons.js'; -import * as PanelManager from './panelManager.js'; -import * as PanelSettings from './panelSettings.js'; -import * as Pos from './panelPositions.js'; -import * as Utils from './utils.js'; -import * as WindowPreview from './windowPreview.js'; -import {SETTINGS} from './extension.js'; - -const SearchController = Main.overview.searchController; - -export const DASH_ANIMATION_TIME = .2; // Dash.DASH_ANIMATION_TIME is now private -const DASH_ITEM_HOVER_TIMEOUT = .3; // Dash.DASH_ITEM_HOVER_TIMEOUT is now private -export const MIN_ICON_SIZE = 4; - -const T1 = 'ensureAppIconVisibilityTimeout' -const T2 = 'showLabelTimeout' -const T3 = 'resetHoverTimeout' - - -/** - * Extend DashItemContainer - * - * - set label position based on taskbar orientation - * - * I can't subclass the original object because of this: https://bugzilla.gnome.org/show_bug.cgi?id=688973. - * thus use this ugly pattern. - */ - -export function extendDashItemContainer(dashItemContainer) { - dashItemContainer.showLabel = AppIcons.ItemShowLabel; -} - -const iconAnimationSettings = { - _getDictValue(key) { - let type = SETTINGS.get_string('animate-appicon-hover-animation-type'); - return SETTINGS.get_value(key).deep_unpack()[type] || 0; - }, - - get type() { - if (!SETTINGS.get_boolean('animate-appicon-hover')) - return ""; - - return SETTINGS.get_string('animate-appicon-hover-animation-type'); - }, - - get convexity() { - return Math.max(0, this._getDictValue('animate-appicon-hover-animation-convexity')); - }, - - get duration() { - return this._getDictValue('animate-appicon-hover-animation-duration'); - }, - - get extent() { - return Math.max(1, this._getDictValue('animate-appicon-hover-animation-extent')); - }, - - get rotation() { - return this._getDictValue('animate-appicon-hover-animation-rotation'); - }, - - get travel() { - return Math.max(0, this._getDictValue('animate-appicon-hover-animation-travel')); - }, - - get zoom() { - return Math.max(1, this._getDictValue('animate-appicon-hover-animation-zoom')); - }, -}; - -/* This class is a fork of the upstream DashActor class (ui.dash.js) - * - * Summary of changes: - * - modified chldBox calculations for when 'show-apps-at-top' option is checked - * - handle horizontal dash - */ -export const TaskbarActor = GObject.registerClass({ -}, class TaskbarActor extends St.Widget { - _init(delegate) { - this._delegate = delegate; - this._currentBackgroundColor = 0; - super._init({ name: 'dashtopanelTaskbar', - layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation[delegate.dtpPanel.getOrientation().toUpperCase()] }), - clip_to_allocation: true }); - } - - vfunc_allocate(box) { - this.set_allocation(box); - - let panel = this._delegate.dtpPanel; - let availFixedSize = box[panel.fixedCoord.c2] - box[panel.fixedCoord.c1]; - let availVarSize = box[panel.varCoord.c2] - box[panel.varCoord.c1]; - let [dummy, scrollview, leftFade, rightFade] = this.get_children(); - let [, natSize] = this[panel.sizeFunc](availFixedSize); - let childBox = new Clutter.ActorBox(); - let orientation = panel.getOrientation(); - - dummy.allocate(childBox); - - childBox[panel.varCoord.c1] = box[panel.varCoord.c1]; - childBox[panel.varCoord.c2] = Math.min(availVarSize, natSize); - childBox[panel.fixedCoord.c1] = box[panel.fixedCoord.c1]; - childBox[panel.fixedCoord.c2] = box[panel.fixedCoord.c2]; - - scrollview.allocate(childBox); - - let [value, , upper, , , pageSize] = scrollview[orientation[0] + 'adjustment'].get_values(); - upper = Math.floor(upper); - scrollview._dtpFadeSize = upper > pageSize ? this._delegate.iconSize : 0; - - if (this._currentBackgroundColor !== panel.dynamicTransparency.currentBackgroundColor) { - this._currentBackgroundColor = panel.dynamicTransparency.currentBackgroundColor; - let gradientStyle = 'background-gradient-start: ' + this._currentBackgroundColor + - 'background-gradient-direction: ' + orientation; - - leftFade.set_style(gradientStyle); - rightFade.set_style(gradientStyle); - } - - childBox[panel.varCoord.c2] = childBox[panel.varCoord.c1] + (value > 0 ? scrollview._dtpFadeSize : 0); - leftFade.allocate(childBox); - - childBox[panel.varCoord.c1] = box[panel.varCoord.c2] - (value + pageSize < upper ? scrollview._dtpFadeSize : 0); - childBox[panel.varCoord.c2] = box[panel.varCoord.c2]; - rightFade.allocate(childBox); - } - - // We want to request the natural size of all our children - // as our natural width, so we chain up to StWidget (which - // then calls BoxLayout) - vfunc_get_preferred_width(forHeight) { - let [, natWidth] = St.Widget.prototype.vfunc_get_preferred_width.call(this, forHeight); - - return [0, natWidth]; - } - - vfunc_get_preferred_height(forWidth) { - let [, natHeight] = St.Widget.prototype.vfunc_get_preferred_height.call(this, forWidth); - - return [0, natHeight]; - } -}); - -/* This class is a fork of the upstream dash class (ui.dash.js) - * - * Summary of changes: - * - disconnect global signals adding a destroy method; - * - play animations even when not in overview mode - * - set a maximum icon size - * - show running and/or favorite applications - * - emit a custom signal when an app icon is added - * - Add scrollview - * Ensure actor is visible on keyfocus inside the scrollview - * - add 128px icon size, might be useful for hidpi display - * - Sync minimization application target position. - */ - -export const Taskbar = class extends EventEmitter { - - constructor(panel) { - super(); - - this.dtpPanel = panel; - - // start at smallest size due to running indicator drawing area expanding but not shrinking - this.iconSize = 16; - - this._shownInitially = false; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._timeoutsHandler = new Utils.TimeoutsHandler(); - - this._labelShowing = false; - this.fullScrollView = 0; - - let isVertical = panel.checkIfVertical(); - - this._box = new St.BoxLayout({ vertical: isVertical, - clip_to_allocation: false, - x_align: Clutter.ActorAlign.START, - y_align: Clutter.ActorAlign.START }); - - this._container = new TaskbarActor(this); - this._scrollView = new St.ScrollView({ name: 'dashtopanelScrollview', - hscrollbar_policy: St.PolicyType.NEVER, - vscrollbar_policy: St.PolicyType.NEVER, - enable_mouse_scrolling: true }); - - this._scrollView.connect('leave-event', this._onLeaveEvent.bind(this)); - this._scrollView.connect('motion-event', this._onMotionEvent.bind(this)); - this._scrollView.connect('scroll-event', this._onScrollEvent.bind(this)); - this._scrollView.add_child(this._box); - - this._showAppsIconWrapper = panel.showAppsIconWrapper; - this._showAppsIconWrapper.connect('menu-state-changed', (showAppsIconWrapper, opened) => { - this._itemMenuStateChanged(showAppsIconWrapper, opened); - }); - // an instance of the showAppsIcon class is encapsulated in the wrapper - this._showAppsIcon = this._showAppsIconWrapper.realShowAppsIcon; - this.showAppsButton = this._showAppsIcon.toggleButton; - - if (isVertical) { - this.showAppsButton.set_width(panel.geom.w); - } - - this.showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); - - this.showAppsButton.checked = (SearchController._showAppsButton) ? SearchController._showAppsButton.checked : false; - - this._showAppsIcon.childScale = 1; - this._showAppsIcon.childOpacity = 255; - this._showAppsIcon.icon.setIconSize(this.iconSize); - this._hookUpLabel(this._showAppsIcon, this._showAppsIconWrapper); - - this._container.add_child(new St.Widget({ width: 0, reactive: false })); - this._container.add_child(this._scrollView); - - let orientation = panel.getOrientation(); - let fadeStyle = 'background-gradient-direction:' + orientation; - let fade1 = new St.Widget({ style_class: 'scrollview-fade', reactive: false }); - let fade2 = new St.Widget({ style_class: 'scrollview-fade', - reactive: false, - pivot_point: new Graphene.Point({ x: .5, y: .5 }), - rotation_angle_z: 180 }); - - fade1.set_style(fadeStyle); - fade2.set_style(fadeStyle); - - this._container.add_child(fade1); - this._container.add_child(fade2); - - this.previewMenu = new WindowPreview.PreviewMenu(panel); - this.previewMenu.enable(); - - let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; - this.actor = new St.Bin({ - child: this._container, - y_align: Clutter.ActorAlign.START, - x_align: rtl ? Clutter.ActorAlign.END : Clutter.ActorAlign.START - }); - - const adjustment = this._scrollView[orientation[0] + 'adjustment']; - - this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); - - this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' }); - - this._appSystem = Shell.AppSystem.get_default(); - - this.iconAnimator = new PanelManager.IconAnimator(this.dtpPanel.panel); - - this._signalsHandler.add( - [ - this.dtpPanel.panel, - 'notify::height', - () => this._queueRedisplay() - ], - [ - this.dtpPanel.panel, - 'notify::width', - () => this._queueRedisplay() - ], - [ - this._appSystem, - 'installed-changed', - () => { - AppFavorites.getAppFavorites().reload(); - this._queueRedisplay(); - } - ], - [ - this._appSystem, - 'app-state-changed', - this._queueRedisplay.bind(this) - ], - [ - AppFavorites.getAppFavorites(), - 'changed', - this._queueRedisplay.bind(this) - ], - [ - global.window_manager, - 'switch-workspace', - () => this._connectWorkspaceSignals() - ], - [ - Utils.DisplayWrapper.getScreen(), - [ - 'window-entered-monitor', - 'window-left-monitor' - ], - () => { - if (SETTINGS.get_boolean('isolate-monitors')) { - this._queueRedisplay(); - } - } - ], - [ - Main.overview, - 'item-drag-begin', - this._onDragBegin.bind(this) - ], - [ - Main.overview, - 'item-drag-end', - this._onDragEnd.bind(this) - ], - [ - Main.overview, - 'item-drag-cancelled', - this._onDragCancelled.bind(this) - ], - [ - // Ensure the ShowAppsButton status is kept in sync - SearchController._showAppsButton, - 'notify::checked', - this._syncShowAppsButtonToggled.bind(this) - ], - [ - SETTINGS, - [ - 'changed::dot-size', - 'changed::show-favorites', - 'changed::show-running-apps', - 'changed::show-favorites-all-monitors' - ], - () => { - setAttributes() - this._redisplay() - } - ], - [ - SETTINGS, - 'changed::group-apps', - () => { - setAttributes() - this._connectWorkspaceSignals(); - } - ], - [ - SETTINGS, - [ - 'changed::appicon-style', - 'changed::group-apps-use-launchers', - 'changed::taskbar-locked' - ], - () => { - setAttributes() - this.resetAppIcons() - } - ], - [ - adjustment, - [ - 'notify::upper', - 'notify::pageSize' - ], - () => this._onScrollSizeChange(adjustment) - ] - ); - - let setAttributes = () => { - this.isGroupApps = SETTINGS.get_boolean('group-apps'); - this.usingLaunchers = !this.isGroupApps && SETTINGS.get_boolean('group-apps-use-launchers'); - this.showFavorites = SETTINGS.get_boolean('show-favorites') && - (this.dtpPanel.isPrimary || SETTINGS.get_boolean('show-favorites-all-monitors')) - this.showRunningApps = SETTINGS.get_boolean('show-running-apps') - this.allowSplitApps = this.usingLaunchers || (!this.isGroupApps && !this.showFavorites) - } - - setAttributes() - - this._onScrollSizeChange(adjustment); - this._connectWorkspaceSignals(); - } - - destroy() { - if (this._waitIdleId) { - GLib.source_remove(this._waitIdleId); - this._waitIdleId = 0; - } - - this._timeoutsHandler.destroy(); - this.iconAnimator.destroy(); - - this._signalsHandler.destroy(); - this._signalsHandler = 0; - - this._container.destroy(); - - this.previewMenu.disable(); - this.previewMenu.destroy(); - - this._disconnectWorkspaceSignals(); - } - - _dropIconAnimations() { - this._getTaskbarIcons().forEach(item => { - item.raise(0); - item.stretch(0); - }); - } - - _updateIconAnimations(pointerX, pointerY) { - this._iconAnimationTimestamp = Date.now(); - let type = iconAnimationSettings.type; - - if (!pointerX || !pointerY) - [pointerX, pointerY] = global.get_pointer(); - - this._getTaskbarIcons().forEach(item => { - let [x, y] = item.get_transformed_position(); - let [width, height] = item.get_transformed_size(); - let [centerX, centerY] = [x + width / 2, y + height / 2]; - let size = this._box.vertical ? height : width; - let difference = this._box.vertical ? pointerY - centerY : pointerX - centerX; - let distance = Math.abs(difference); - let maxDistance = (iconAnimationSettings.extent / 2) * size; - - if (type == 'PLANK') { - // Make the position stable for items that are far from the pointer. - let translation = distance <= maxDistance ? - distance / (2 + 8 * distance / maxDistance) : - // the previous expression with distance = maxDistance - maxDistance / 10; - - if (difference > 0) - translation *= -1; - - item.stretch(translation); - } - - if (distance <= maxDistance) { - let level = (maxDistance - distance) / maxDistance; - level = Math.pow(level, iconAnimationSettings.convexity); - item.raise(level); - } else { - item.raise(0); - } - }); - } - - _onLeaveEvent(actor) { - let [stageX, stageY] = global.get_pointer(); - let [success, x, y] = actor.transform_stage_point(stageX, stageY); - if (success && !actor.allocation.contains(x, y) && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) - this._dropIconAnimations(); - - return Clutter.EVENT_PROPAGATE; - } - - _onMotionEvent(actor_, event) { - if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { - let timestamp = Date.now(); - if (!this._iconAnimationTimestamp || - (timestamp - this._iconAnimationTimestamp >= iconAnimationSettings.duration / 2)) { - let [pointerX, pointerY] = event.get_coords(); - this._updateIconAnimations(pointerX, pointerY); - } - } - - return Clutter.EVENT_PROPAGATE; - } - - _onScrollEvent(actor, event) { - - let orientation = this.dtpPanel.getOrientation(); - - // reset timeout to avid conflicts with the mousehover event - this._timeoutsHandler.add([T1, 0, - () => this._swiping = false - ]); - - // Skip to avoid double events mouse - if (event.is_pointer_emulated()) - return Clutter.EVENT_STOP; - - let adjustment, delta; - - adjustment = this._scrollView[orientation[0] + 'adjustment']; - - let increment = adjustment.step_increment; - - switch ( event.get_scroll_direction() ) { - case Clutter.ScrollDirection.UP: - case Clutter.ScrollDirection.LEFT: - delta = -increment; - break; - case Clutter.ScrollDirection.DOWN: - case Clutter.ScrollDirection.RIGHT: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - delta = dy*increment; - delta += dx*increment; - break; - - } - - adjustment.set_value(adjustment.get_value() + delta); - - return Clutter.EVENT_STOP; - - } - - _onScrollSizeChange(adjustment) { - // Update minimization animation target position on scrollview change. - this._updateAppIcons(); - - // When applications are ungrouped and there is some empty space on the horizontal taskbar, - // force a fixed label width to prevent the icons from "wiggling" when an animation runs - // (adding or removing an icon). When the taskbar is full, revert to a dynamic label width - // to allow them to resize and make room for new icons. - if (!this.dtpPanel.checkIfVertical() && !this.isGroupApps) { - let initial = this.fullScrollView; - - if (!this.fullScrollView && Math.floor(adjustment.upper) > adjustment.page_size) { - this.fullScrollView = adjustment.page_size; - } else if (adjustment.page_size < this.fullScrollView) { - this.fullScrollView = 0; - } - - if (initial != this.fullScrollView && !this._waitIdleId) { - this._waitIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - this._getAppIcons().forEach(a => a.updateTitleStyle()) - this._waitIdleId = 0; - - return GLib.SOURCE_REMOVE; - }); - } - } - } - - _onDragBegin() { - this._dragCancelled = false; - this._dragMonitor = { - dragMotion: this._onDragMotion.bind(this) - }; - DND.addDragMonitor(this._dragMonitor); - - if (this._box.get_n_children() == 0) { - this._emptyDropTarget = new Dash.EmptyDropTargetItem(); - this._box.insert_child_at_index(this._emptyDropTarget, 0); - this._emptyDropTarget.show(true); - } - - this._toggleFavoriteHighlight(true); - } - - _onDragCancelled() { - this._dragCancelled = true; - - if (this._dragInfo) { - this._box.set_child_at_index(this._dragInfo[1]._dashItemContainer, this._dragInfo[0]); - } - - this._endDrag(); - } - - _onDragEnd() { - if (this._dragCancelled) - return; - - this._endDrag(); - } - - _endDrag() { - if (this._dragInfo && this._dragInfo[1]._dashItemContainer instanceof DragPlaceholderItem) { - this._box.remove_child(this._dragInfo[1]._dashItemContainer); - this._dragInfo[1]._dashItemContainer.destroy(); - delete this._dragInfo[1]._dashItemContainer; - } - - this._dragInfo = null; - this._clearEmptyDropTarget(); - this._showAppsIcon.setDragApp(null); - DND.removeDragMonitor(this._dragMonitor); - - this._dragMonitor = null; - this.emit('end-drag'); - - this._toggleFavoriteHighlight(); - } - - _onDragMotion(dragEvent) { - let app = Dash.Dash.getAppFromSource(dragEvent.source); - if (app == null) - return DND.DragMotionResult.CONTINUE; - - let showAppsHovered = this._showAppsIcon.contains(dragEvent.targetActor); - - if (showAppsHovered) - this._showAppsIcon.setDragApp(app); - else - this._showAppsIcon.setDragApp(null); - - return DND.DragMotionResult.CONTINUE; - } - - _toggleFavoriteHighlight(show) { - let appFavorites = AppFavorites.getAppFavorites(); - let cssFuncName = (show ? 'add' : 'remove') + '_style_class_name'; - - if (this.showFavorites) - this._getAppIcons().filter(appIcon => (this.usingLaunchers && appIcon.isLauncher) || - (!this.usingLaunchers && appFavorites.isFavorite(appIcon.app.get_id()))) - .forEach(fav => fav._container[cssFuncName]('favorite')); - } - - handleIsolatedWorkspaceSwitch() { - this._shownInitially = this.isGroupApps; - this._queueRedisplay(); - } - - _connectWorkspaceSignals() { - this._disconnectWorkspaceSignals(); - - this._lastWorkspace = Utils.DisplayWrapper.getWorkspaceManager().get_active_workspace(); - - this._workspaceWindowAddedId = this._lastWorkspace.connect('window-added', () => this._queueRedisplay()); - this._workspaceWindowRemovedId = this._lastWorkspace.connect('window-removed', () => this._queueRedisplay()); - } - - _disconnectWorkspaceSignals() { - if (this._lastWorkspace) { - this._lastWorkspace.disconnect(this._workspaceWindowAddedId); - this._lastWorkspace.disconnect(this._workspaceWindowRemovedId); - - this._lastWorkspace = null; - } - } - - _queueRedisplay() { - Main.queueDeferredWork(this._workId); - } - - _hookUpLabel(item, syncHandler) { - item.child.connect('notify::hover', () => { - this._syncLabel(item, syncHandler); - }); - - syncHandler.connect('sync-tooltip', () => { - this._syncLabel(item, syncHandler); - }); - } - - _createAppItem(app, window, isLauncher) { - let appIcon = new AppIcons.TaskbarAppIcon( - { - app, - window, - isLauncher - }, - this.dtpPanel, - { - setSizeManually: true, - showLabel: false, - isDraggable: !SETTINGS.get_boolean('taskbar-locked'), - }, - this.previewMenu, - this.iconAnimator - ); - - if (appIcon._draggable) { - appIcon._draggable.connect('drag-begin', - () => { - appIcon.opacity = 0; - appIcon.isDragged = 1; - this._dropIconAnimations(); - }); - appIcon._draggable.connect('drag-end', - () => { - appIcon.opacity = 255; - delete appIcon.isDragged; - this._updateAppIcons(); - }); - } - - appIcon.connect('menu-state-changed', - (appIcon, opened) => { - this._itemMenuStateChanged(item, opened); - }); - - let item = new TaskbarItemContainer(); - - item._dtpPanel = this.dtpPanel - extendDashItemContainer(item); - - item.setChild(appIcon); - appIcon._dashItemContainer = item; - - appIcon.connect('notify::hover', () => { - if (appIcon.hover){ - this._timeoutsHandler.add([T1, 100, - () => Utils.ensureActorVisibleInScrollView(this._scrollView, appIcon, this._scrollView._dtpFadeSize) - ]) - - if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') - appIcon.get_parent().raise(1); - else if (!appIcon.isDragged && (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK')) - this._updateIconAnimations(); - } else { - this._timeoutsHandler.remove(T1) - - if (!appIcon.isDragged && iconAnimationSettings.type == 'SIMPLE') - appIcon.get_parent().raise(0); - } - }); - - appIcon.connect('clicked', - (actor) => { - Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); - }); - - appIcon.connect('key-focus-in', (actor) => { - let [x_shift, y_shift] = Utils.ensureActorVisibleInScrollView(this._scrollView, actor, this._scrollView._dtpFadeSize); - - // This signal is triggered also by mouse click. The popup menu is opened at the original - // coordinates. Thus correct for the shift which is going to be applied to the scrollview. - if (appIcon._menu) { - appIcon._menu._boxPointer.xOffset = -x_shift; - appIcon._menu._boxPointer.yOffset = -y_shift; - } - }); - - // Override default AppIcon label_actor, now the - // accessible_name is set at DashItemContainer.setLabelText - appIcon.label_actor = null; - item.setLabelText(app.get_name()); - - appIcon.icon.setIconSize(this.iconSize); - this._hookUpLabel(item, appIcon); - - return item; - } - - // Return an array with the "proper" appIcons currently in the taskbar - _getAppIcons() { - // Only consider children which are "proper" icons and which are not - // animating out (which means they will be destroyed at the end of - // the animation) - return this._getTaskbarIcons().map(function(actor){ - return actor.child._delegate; - }); - } - - _getTaskbarIcons(includeAnimated) { - return this._box.get_children().filter(function(actor) { - return actor.child && - actor.child._delegate && - actor.child._delegate.icon && - (includeAnimated || !actor.animatingOut); - }); - } - - _updateAppIcons() { - let appIcons = this._getAppIcons(); - - appIcons.filter(icon => icon.constructor === AppIcons.TaskbarAppIcon).forEach(icon => { - icon.updateIcon(); - }); - } - - _itemMenuStateChanged(item, opened) { - // When the menu closes, it calls sync_hover, which means - // that the notify::hover handler does everything we need to. - if (opened) { - this._timeoutsHandler.remove(T2) - - item.hideLabel(); - } else { - // I want to listen from outside when a menu is closed. I used to - // add a custom signal to the appIcon, since gnome 3.8 the signal - // calling this callback was added upstream. - this.emit('menu-closed'); - - // The icon menu grabs the events and, once it is closed, the pointer is maybe - // no longer over the taskbar and the animations are not dropped. - if (iconAnimationSettings.type == 'RIPPLE' || iconAnimationSettings.type == 'PLANK') { - this._scrollView.sync_hover(); - if (!this._scrollView.hover) - this._dropIconAnimations(); - } - } - } - - _syncLabel(item, syncHandler) { - let shouldShow = syncHandler ? syncHandler.shouldShowTooltip() : item.child.get_hover(); - - if (shouldShow) { - if (!this._timeoutsHandler.getId(T2)) { - let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; - - this._timeoutsHandler.add([T2, timeout, - () => { - this._labelShowing = true; - item.showLabel(); - } - ]); - - this._timeoutsHandler.remove(T3) - } - } else { - this._timeoutsHandler.remove(T2) - - item.hideLabel(); - if (this._labelShowing) { - this._timeoutsHandler.add([T3, DASH_ITEM_HOVER_TIMEOUT, - () => this._labelShowing = false - ]); - } - } - } - - _adjustIconSize() { - const thisMonitorIndex = this.dtpPanel.monitor.index; - let panelSize = PanelSettings.getPanelSize(SETTINGS, thisMonitorIndex); - let availSize = panelSize - SETTINGS.get_int('appicon-padding') * 2; - let minIconSize = MIN_ICON_SIZE + panelSize % 2; - - if (availSize == this.iconSize) - return; - - if (availSize < minIconSize) { - availSize = minIconSize; - } - - // For the icon size, we only consider children which are "proper" - // icons and which are not animating out (which means they will be - // destroyed at the end of the animation) - let iconChildren = this._getTaskbarIcons().concat([this._showAppsIcon]); - let scale = this.iconSize / availSize; - - this.iconSize = availSize; - - for (let i = 0; i < iconChildren.length; i++) { - let icon = iconChildren[i].child._delegate.icon; - - // Set the new size immediately, to keep the icons' sizes - // in sync with this.iconSize - icon.setIconSize(this.iconSize); - - // Don't animate the icon size change when the overview - // is transitioning, or when initially filling - // the taskbar - if (Main.overview.animationInProgress || - !this._shownInitially) - continue; - - let [targetWidth, targetHeight] = icon.icon.get_size(); - - // Scale the icon's texture to the previous size and - // tween to the new size - icon.icon.set_size(icon.icon.width * scale, icon.icon.height * scale); - - Utils.animate(icon.icon, - { width: targetWidth, - height: targetHeight, - time: DASH_ANIMATION_TIME, - transition: 'easeOutQuad', - }); - } - } - - sortAppsCompareFunction(appA, appB) { - return getAppStableSequence(appA, this.dtpPanel.monitor) - - getAppStableSequence(appB, this.dtpPanel.monitor); - } - - getAppInfos() { - //get the user's favorite apps - let favoriteApps = this.showFavorites ? AppFavorites.getAppFavorites().getFavorites() : []; - - //find the apps that should be in the taskbar: the favorites first, then add the running apps - // When using isolation, we filter out apps that have no windows in - // the current workspace (this check is done in AppIcons.getInterestingWindows) - let runningApps = this.showRunningApps ? this._getRunningApps().sort(this.sortAppsCompareFunction.bind(this)) : []; - - if (this.allowSplitApps) { - return this._createAppInfos(favoriteApps, [], true) - .concat(this._createAppInfos(runningApps) - .filter(appInfo => appInfo.windows.length)); - } else { - return this._createAppInfos(favoriteApps.concat(runningApps.filter(app => favoriteApps.indexOf(app) < 0))) - .filter(appInfo => appInfo.windows.length || favoriteApps.indexOf(appInfo.app) >= 0); - } - } - - _redisplay() { - if (!this._signalsHandler) { - return; - } - - //get the currently displayed appIcons - let currentAppIcons = this._getTaskbarIcons(); - let expectedAppInfos = this.getAppInfos(); - - //remove the appIcons which are not in the expected apps list - for (let i = currentAppIcons.length - 1; i > -1; --i) { - let appIcon = currentAppIcons[i].child._delegate; - let appIndex = Utils.findIndex(expectedAppInfos, appInfo => appInfo.app == appIcon.app && - (!this.allowSplitApps || this.isGroupApps || appInfo.windows[0] == appIcon.window) && - appInfo.isLauncher == appIcon.isLauncher); - - if (appIndex < 0 || - (appIcon.window && (this.isGroupApps || expectedAppInfos[appIndex].windows.indexOf(appIcon.window) < 0)) || - (!appIcon.window && !appIcon.isLauncher && - !this.isGroupApps && expectedAppInfos[appIndex].windows.length)) { - currentAppIcons[i][this._shownInitially ? 'animateOutAndDestroy' : 'destroy'](); - currentAppIcons.splice(i, 1); - } - } - - //if needed, reorder the existing appIcons and create the missing ones - let currentPosition = 0; - for (let i = 0, l = expectedAppInfos.length; i < l; ++i) { - let neededAppIcons = this.isGroupApps || !expectedAppInfos[i].windows.length ? - [{ app: expectedAppInfos[i].app, window: null, isLauncher: expectedAppInfos[i].isLauncher }] : - expectedAppInfos[i].windows.map(window => ({ app: expectedAppInfos[i].app, window: window, isLauncher: false })); - - for (let j = 0, ll = neededAppIcons.length; j < ll; ++j) { - //check if the icon already exists - let matchingAppIconIndex = Utils.findIndex(currentAppIcons, appIcon => appIcon.child._delegate.app == neededAppIcons[j].app && - appIcon.child._delegate.window == neededAppIcons[j].window); - - if (matchingAppIconIndex > 0 && matchingAppIconIndex != currentPosition) { - //moved icon, reposition it - this._box.remove_child(currentAppIcons[matchingAppIconIndex]); - this._box.insert_child_at_index(currentAppIcons[matchingAppIconIndex], currentPosition); - } else if (matchingAppIconIndex < 0) { - //the icon doesn't exist yet, create a new one - let newAppIcon = this._createAppItem(neededAppIcons[j].app, neededAppIcons[j].window, neededAppIcons[j].isLauncher); - - this._box.insert_child_at_index(newAppIcon, currentPosition); - currentAppIcons.splice(currentPosition, 0, newAppIcon); - - // Skip animations on first run when adding the initial set - // of items, to avoid all items zooming in at once - newAppIcon.show(this._shownInitially); - } - - ++currentPosition; - } - } - - this._adjustIconSize(); - - // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 - // Without it, StBoxLayout may use a stale size cache - this._box.queue_relayout(); - - // This is required for icon reordering when the scrollview is used. - this._updateAppIcons(); - - // This will update the size, and the corresponding number for each icon on the primary panel - if (this.dtpPanel.isPrimary) { - this._updateNumberOverlay(); - } - - this._shownInitially = true; - } - - _getRunningApps() { - let tracker = Shell.WindowTracker.get_default(); - let windows = global.get_window_actors(); - let apps = []; - - for (let i = 0, l = windows.length; i < l; ++i) { - let app = tracker.get_window_app(windows[i].metaWindow); - - if (app && apps.indexOf(app) < 0) { - apps.push(app); - } - } - - return apps; - } - - _createAppInfos(apps, defaultWindows, defaultIsLauncher) { - if (this.allowSplitApps && !defaultIsLauncher) { - let separateApps = [] - - if (apps.length) { - let tracker = Shell.WindowTracker.get_default(); - let windows = AppIcons.getInterestingWindows(null, this.dtpPanel.monitor) - .sort(sortWindowsCompareFunction) - - windows.forEach(w => { - let windowApp = tracker.get_window_app(w) - - if (apps.indexOf(windowApp) >= 0) - separateApps.push({ - app: windowApp, - isLauncher: false, - windows: [w] - }) - }) - } - - return separateApps - } - - return apps.map(app => ({ - app: app, - isLauncher: defaultIsLauncher || false, - windows: defaultWindows || AppIcons.getInterestingWindows(app, this.dtpPanel.monitor) - .sort(sortWindowsCompareFunction) - })); - } - - // Reset the displayed apps icon to mantain the correct order - resetAppIcons (geometryChange) { - let children = this._getTaskbarIcons(true); - - for (let i = 0; i < children.length; i++) { - let item = children[i]; - item.destroy(); - } - - // to avoid ugly animations, just suppress them like when taskbar is first loaded. - this._shownInitially = false; - this._redisplay(); - - if (geometryChange && this.dtpPanel.checkIfVertical()) { - this.previewMenu._updateClip(); - } - } - - _updateNumberOverlay() { - let seenApps = {}; - let counter = 0; - - this._getAppIcons().forEach(icon => { - if (!seenApps[icon.app] || this.allowSplitApps) { - seenApps[icon.app] = 1; - counter++; - } - - if (counter <= 10) { - icon.setNumberOverlay(counter == 10 ? 0 : counter); - } else { - // No overlay after 10 - icon.setNumberOverlay(-1); - } - - icon.updateHotkeyNumberOverlay(); - }); - - if (SETTINGS.get_boolean('hot-keys') && - SETTINGS.get_string('hotkeys-overlay-combo') === 'ALWAYS') - this.toggleNumberOverlay(true); - } - - toggleNumberOverlay(activate) { - let appIcons = this._getAppIcons(); - appIcons.forEach(function(icon) { - icon.toggleNumberOverlay(activate); - }); - } - - _clearEmptyDropTarget() { - if (this._emptyDropTarget) { - this._emptyDropTarget.animateOutAndDestroy(); - this._emptyDropTarget = null; - } - } - - handleDragOver(source, actor, x, y, time) { - if (source == Main.xdndHandler) - return DND.DragMotionResult.CONTINUE; - - // Don't allow favoriting of transient apps - if (source.app == null || source.app.is_window_backed()) - return DND.DragMotionResult.NO_DROP; - - if (!this._settings.is_writable('favorite-apps')) - return DND.DragMotionResult.NO_DROP; - - let isVertical = this.dtpPanel.checkIfVertical(); - - if (!this._box.contains(source) && !source._dashItemContainer) { - //not an appIcon of the taskbar, probably from the applications view - source._dashItemContainer = new DragPlaceholderItem(source, this.iconSize, isVertical); - this._box.insert_child_above(source._dashItemContainer, null); - } - - let sizeProp = isVertical ? 'height' : 'width'; - let posProp = isVertical ? 'y' : 'x'; - let pos = isVertical ? y : x; - - let currentAppIcons = this._getAppIcons(); - let sourceIndex = currentAppIcons.indexOf(source); - let hoveredIndex = Utils.findIndex(currentAppIcons, - appIcon => pos >= appIcon._dashItemContainer[posProp] && - pos <= (appIcon._dashItemContainer[posProp] + appIcon._dashItemContainer[sizeProp])); - - if (!this._dragInfo) { - this._dragInfo = [sourceIndex, source]; - } - - if (hoveredIndex >= 0) { - let isLeft = pos < currentAppIcons[hoveredIndex]._dashItemContainer[posProp] + currentAppIcons[hoveredIndex]._dashItemContainer[sizeProp] * .5; - let prevIcon = currentAppIcons[hoveredIndex - 1] - let nextIcon = currentAppIcons[hoveredIndex + 1] - - // Don't allow positioning before or after self and between icons of same app if ungrouped and showing favorites - if (!(hoveredIndex === sourceIndex || - (isLeft && hoveredIndex - 1 == sourceIndex) || - (!this.allowSplitApps && isLeft && hoveredIndex - 1 >= 0 && source.app != prevIcon.app && - prevIcon.app == currentAppIcons[hoveredIndex].app) || - (!isLeft && hoveredIndex + 1 == sourceIndex) || - (!this.allowSplitApps && !isLeft && hoveredIndex + 1 < currentAppIcons.length && source.app != nextIcon.app && - nextIcon.app == currentAppIcons[hoveredIndex].app))) { - this._box.set_child_at_index(source._dashItemContainer, hoveredIndex); - - // Ensure the next and previous icon are visible when moving the icon - // (I assume there's room for both of them) - if (hoveredIndex > 1) - Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex-1], this._scrollView._dtpFadeSize); - if (hoveredIndex < this._box.get_children().length-1) - Utils.ensureActorVisibleInScrollView(this._scrollView, this._box.get_children()[hoveredIndex+1], this._scrollView._dtpFadeSize); - } - } - - return this._dragInfo[0] !== sourceIndex ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.CONTINUE; - } - - // Draggable target interface - acceptDrop (source, actor, x, y, time) { - // Don't allow favoriting of transient apps - if (!this._dragInfo || !source.app || source.app.is_window_backed() || - !this._settings.is_writable('favorite-apps')) { - return false; - } - - let appIcons = this._getAppIcons(); - let sourceIndex = appIcons.indexOf(source); - let usingLaunchers = !this.isGroupApps && this.usingLaunchers; - - // dragging the icon to its original position - if (this._dragInfo[0] === sourceIndex) { - return true; - } - - let appFavorites = AppFavorites.getAppFavorites(); - let sourceAppId = source.app.get_id(); - let appIsFavorite = this.showFavorites && appFavorites.isFavorite(sourceAppId); - let replacingIndex = sourceIndex + (sourceIndex > this._dragInfo[0] ? -1 : 1); - let favoriteIndex = replacingIndex >= 0 ? appFavorites.getFavorites().indexOf(appIcons[replacingIndex].app) : 0; - let sameApps = this.allowSplitApps ? [] : appIcons.filter(a => a != source && a.app == source.app); - let favoritesCount = 0; - let position = 0; - let interestingWindows = {}; - let getAppWindows = app => { - if (!interestingWindows[app]) { - interestingWindows[app] = AppIcons.getInterestingWindows(app, this.dtpPanel.monitor); - } - - let appWindows = interestingWindows[app]; //prevents "reference to undefined property Symbol.toPrimitive" warning - return appWindows; - }; - - if (sameApps.length && - ((!appIcons[sourceIndex - 1] || appIcons[sourceIndex - 1].app !== source.app) && - (!appIcons[sourceIndex + 1] || appIcons[sourceIndex + 1].app !== source.app))) { - appIcons.splice(appIcons.indexOf(sameApps[0]), sameApps.length); - Array.prototype.splice.apply(appIcons, [sourceIndex + 1, 0].concat(sameApps)); - } - - for (let i = 0, l = appIcons.length; i < l; ++i) { - let windows = []; - - if (!usingLaunchers || (!source.isLauncher && !appIcons[i].isLauncher)) { - windows = appIcons[i].window ? [appIcons[i].window] : getAppWindows(appIcons[i].app); - } - - windows.forEach(w => w._dtpPosition = position++); - - if (this.showFavorites && - ((usingLaunchers && appIcons[i].isLauncher) || - (!usingLaunchers && appFavorites.isFavorite(appIcons[i].app.get_id())))) { - ++favoritesCount; - } - } - - if (sourceIndex < favoritesCount) { - if (appIsFavorite) { - appFavorites.moveFavoriteToPos(sourceAppId, favoriteIndex); - } else { - appFavorites.addFavoriteAtPos(sourceAppId, favoriteIndex); - } - } else if (appIsFavorite && this.showFavorites && (!usingLaunchers || source.isLauncher)) { - appFavorites.removeFavorite(sourceAppId); - } - - appFavorites.emit('changed'); - - return true; - } - - _onShowAppsButtonToggled() { - // Sync the status of the default appButtons. Only if the two statuses are - // different, that means the user interacted with the extension provided - // application button, cutomize the behaviour. Otherwise the shell has changed the - // status (due to the _syncShowAppsButtonToggled function below) and it - // has already performed the desired action. - let selector = SearchController; - - if (selector._showAppsButton && - selector._showAppsButton.checked !== this.showAppsButton.checked) { - // find visible view - - if (this.showAppsButton.checked) { - if (SETTINGS.get_boolean('show-apps-override-escape')) { - //override escape key to return to the desktop when entering the overview using the showapps button - SearchController._onStageKeyPress = function(actor, event) { - if (Main.modalCount == 1 && event.get_key_symbol() === Clutter.KEY_Escape) { - this._searchActive ? this.reset() : Main.overview.hide(); - - return Clutter.EVENT_STOP; - } - - return Object.getPrototypeOf(this)._onStageKeyPress.call(this, actor, event); - }; - - let overviewHiddenId = Main.overview.connect('hidden', () => { - Main.overview.disconnect(overviewHiddenId); - delete SearchController._onStageKeyPress; - }); - } - - // force exiting overview if needed - if (!Main.overview._shown) { - this.forcedOverview = true; - } - - //temporarily use as primary the monitor on which the showapps btn was clicked, this is - //restored by the panel when exiting the overview - this.dtpPanel.panelManager.setFocusedMonitor(this.dtpPanel.monitor); - - // Finally show the overview - selector._showAppsButton.checked = true; - Main.overview.show(2 /*APP_GRID*/); - } - else { - if (this.forcedOverview) { - // force exiting overview if needed - Main.overview.hide(); - } else { - selector._showAppsButton.checked = false; - } - - this.forcedOverview = false; - } - } - } - - _syncShowAppsButtonToggled() { - let status = SearchController._showAppsButton.checked; - if (this.showAppsButton.checked !== status) - this.showAppsButton.checked = status; - } - - showShowAppsButton() { - this.showAppsButton.visible = true; - this.showAppsButton.set_width(-1); - this.showAppsButton.set_height(-1); - } - - popupFocusedAppSecondaryMenu() { - let appIcons = this._getAppIcons(); - let tracker = Shell.WindowTracker.get_default(); - - for(let i in appIcons) { - if(appIcons[i].app == tracker.focus_app) { - let appIcon = appIcons[i]; - if(appIcon._menu && appIcon._menu.isOpen) - appIcon._menu.close(); - else - appIcon.popupMenu(); - - appIcon.sync_hover(); - break; - } - } - } -}; - -export const TaskbarItemContainer = GObject.registerClass({ - -}, class TaskbarItemContainer extends Dash.DashItemContainer { - - _init() { - super._init() - } - - vfunc_allocate(box) { - if (this.child == null) - return; - - this.set_allocation(box); - - let availWidth = box.x2 - box.x1; - let availHeight = box.y2 - box.y1; - let [minChildWidth, minChildHeight, natChildWidth, natChildHeight] = this.child.get_preferred_size(); - let [childScaleX, childScaleY] = this.child.get_scale(); - - let childWidth = Math.min(natChildWidth * childScaleX, availWidth); - let childHeight = Math.min(natChildHeight * childScaleY, availHeight); - let childBox = new Clutter.ActorBox(); - - childBox.x1 = (availWidth - childWidth) / 2; - childBox.y1 = (availHeight - childHeight) / 2; - childBox.x2 = childBox.x1 + childWidth; - childBox.y2 = childBox.y1 + childHeight; - - this.child.allocate(childBox); - } - - // In case appIcon is removed from the taskbar while it is hovered, - // restore opacity before dashItemContainer.animateOutAndDestroy does the destroy animation. - animateOutAndDestroy() { - if (this._raisedClone) { - this._raisedClone.source.opacity = 255; - this._raisedClone.destroy(); - } - - super.animateOutAndDestroy(); - } - - // For ItemShowLabel - _getIconAnimationOffset() { - if (!SETTINGS.get_boolean('animate-appicon-hover')) - return 0; - - let travel = iconAnimationSettings.travel; - let zoom = iconAnimationSettings.zoom; - return this._dtpPanel.dtpSize * (travel + (zoom - 1) / 2); - } - - _updateCloneContainerPosition(cloneContainer) { - let [stageX, stageY] = this.get_transformed_position(); - - cloneContainer.set_position( - stageX - this._dtpPanel.panelBox.translation_x - this.translation_x, - stageY - this._dtpPanel.panelBox.translation_y - this.translation_y - ); - } - - _createRaisedClone() { - let [width, height] = this.get_transformed_size(); - - // "clone" of this child (appIcon actor) - let cloneButton = this.child._delegate.getCloneButton(); - - // "clone" of this (taskbarItemContainer) - let cloneContainer = new St.Bin({ - child: cloneButton, - width: width, height: height, - reactive: false, - }); - - this._updateCloneContainerPosition(cloneContainer); - - // For the stretch animation - let boundProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; - this.bind_property(boundProperty, cloneContainer, boundProperty, GObject.BindingFlags.SYNC_CREATE); - - - // The clone follows its source when the taskbar is scrolled. - let taskbarScrollView = this.get_parent().get_parent(); - let adjustment = this._dtpPanel.checkIfVertical() ? taskbarScrollView.vscroll.get_adjustment() : taskbarScrollView.hscroll.get_adjustment(); - let adjustmentChangedId = adjustment.connect('notify::value', () => this._updateCloneContainerPosition(cloneContainer)); - - // Update clone position when an item is added to / removed from the taskbar. - let taskbarBox = this.get_parent(); - let taskbarBoxAllocationChangedId = taskbarBox.connect('notify::allocation', () => this._updateCloneContainerPosition(cloneContainer)); - - // The clone itself - this._raisedClone = cloneButton.child; - this._raisedClone.connect('destroy', () => { - adjustment.disconnect(adjustmentChangedId); - taskbarBox.disconnect(taskbarBoxAllocationChangedId); - GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - cloneContainer.destroy(); - return GLib.SOURCE_REMOVE; - }); - delete this._raisedClone; - }); - - this._raisedClone.source.opacity = 0; - Main.uiGroup.add_child(cloneContainer); - } - - // Animate the clone. - // AppIcon actors cannot go outside the taskbar so the animation is done with a clone. - // If level is zero, the clone is dropped and destroyed. - raise(level) { - if (this._raisedClone) - Utils.stopAnimations(this._raisedClone); - else if (level) - this._createRaisedClone(); - else - return; - - let panelPosition = this._dtpPanel.getPosition(); - let panelElementPositions = this._dtpPanel.panelManager.panelsElementPositions[this._dtpPanel.monitor.index] || Pos.defaults; - let taskbarPosition = panelElementPositions.filter(pos => pos.element == 'taskbar')[0].position; - - let vertical = panelPosition == St.Side.LEFT || panelPosition == St.Side.RIGHT; - let translationDirection = panelPosition == St.Side.TOP || panelPosition == St.Side.LEFT ? 1 : -1; - let rotationDirection; - if (panelPosition == St.Side.LEFT || taskbarPosition == Pos.STACKED_TL) - rotationDirection = -1; - else if (panelPosition == St.Side.RIGHT || taskbarPosition == Pos.STACKED_BR) - rotationDirection = 1; - else { - let items = this.get_parent().get_children(); - let index = items.indexOf(this); - rotationDirection = (index - (items.length - 1) / 2) / ((items.length - 1) / 2); - } - - let duration = iconAnimationSettings.duration / 1000; - let rotation = iconAnimationSettings.rotation; - let travel = iconAnimationSettings.travel; - let zoom = iconAnimationSettings.zoom; - - // level is about 1 for the icon that is hovered, less for others. - // time depends on the translation to do. - let [width, height] = this._raisedClone.source.get_transformed_size(); - let translationMax = (vertical ? width : height) * (travel + (zoom - 1) / 2); - let translationEnd = translationMax * level; - let translationDone = vertical ? this._raisedClone.translation_x : this._raisedClone.translation_y; - let translationTodo = Math.abs(translationEnd - translationDone); - let scale = 1 + (zoom - 1) * level; - let rotationAngleZ = rotationDirection * rotation * level; - let time = duration * translationTodo / translationMax; - - let options = { - scale_x: scale, scale_y: scale, - rotation_angle_z: rotationAngleZ, - time: time, - transition: 'easeOutQuad', - onComplete: () => { - if (!level) { - this._raisedClone.source.opacity = 255; - this._raisedClone.destroy(); - delete this._raisedClone; - } - } - }; - options[vertical ? 'translation_x' : 'translation_y'] = translationDirection * translationEnd; - - Utils.animate(this._raisedClone, options); - } - - // Animate this and cloneContainer, since cloneContainer translation is bound to this. - stretch(translation) { - let duration = iconAnimationSettings.duration / 1000; - let zoom = iconAnimationSettings.zoom; - let animatedProperty = this._dtpPanel.checkIfVertical() ? 'translation_y' : 'translation_x'; - let isShowing = this.opacity != 255 || this.child.opacity != 255; - - if (isShowing) { - // Do no stop the animation initiated in DashItemContainer.show. - this[animatedProperty] = zoom * translation; - } else { - let options = { - time: duration, - transition: 'easeOutQuad', - }; - options[animatedProperty] = zoom * translation; - - Utils.stopAnimations(this); - Utils.animate(this, options); - } - } -}); - -const DragPlaceholderItem = GObject.registerClass({ -}, class DragPlaceholderItem extends St.Widget { - - _init(appIcon, iconSize, isVertical) { - super._init({ style: AppIcons.getIconContainerStyle(isVertical), layout_manager: new Clutter.BinLayout() }); - - this.child = { _delegate: appIcon }; - - this._clone = new Clutter.Clone({ - source: appIcon.icon._iconBin, - width: iconSize, - height: iconSize - }); - - this.add_child(this._clone); - } - - destroy() { - this._clone.destroy(); - super.destroy(); - } -}); - -export function getAppStableSequence(app, monitor) { - let windows = AppIcons.getInterestingWindows(app, monitor); - - return windows.reduce((prevWindow, window) => { - return Math.min(prevWindow, getWindowStableSequence(window)); - }, Infinity); -} - -export function sortWindowsCompareFunction(windowA, windowB) { - return getWindowStableSequence(windowA) - getWindowStableSequence(windowB); -} - -export function getWindowStableSequence(window) { - return ('_dtpPosition' in window ? window._dtpPosition : window.get_stable_sequence()); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/transparency.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/transparency.js deleted file mode 100644 index 25ff00f1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/transparency.js +++ /dev/null @@ -1,252 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 GdkPixbuf from 'gi://GdkPixbuf'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import St from 'gi://St'; - -import * as Proximity from './proximity.js'; -import * as Utils from './utils.js'; -import {SETTINGS} from './extension.js'; - -export const DynamicTransparency = class { - - constructor(dtpPanel) { - this._dtpPanel = dtpPanel; - this._proximityManager = dtpPanel.panelManager.proximityManager; - this._proximityWatchId = 0; - this.currentBackgroundColor = 0; - - this._initialPanelStyle = dtpPanel.panel.get_style(); - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._bindSignals(); - - this._updateAnimationDuration(); - this._updateAllAndSet(); - this._updateProximityWatch(); - } - - destroy() { - this._signalsHandler.destroy(); - this._proximityManager.removeWatch(this._proximityWatchId); - - this._dtpPanel.panel.set_style(this._initialPanelStyle); - } - - updateExternalStyle() { - this._updateComplementaryStyles(); - this._setBackground(); - } - - _bindSignals() { - this._signalsHandler.add( - [ - Utils.getStageTheme(), - 'changed', - () => this._updateAllAndSet() - ], - [ - Main.overview, - [ - 'showing', - 'hiding' - ], - () => this._updateAlphaAndSet() - ], - [ - SETTINGS, - [ - 'changed::trans-use-custom-bg', - 'changed::trans-bg-color' - ], - () => this._updateColorAndSet() - ], - [ - SETTINGS, - [ - 'changed::trans-use-custom-opacity', - 'changed::trans-panel-opacity', - 'changed::trans-bg-color', - 'changed::trans-dynamic-anim-target', - 'changed::trans-use-dynamic-opacity' - ], - () => this._updateAlphaAndSet() - ], - [ - SETTINGS, - [ - 'changed::trans-use-custom-gradient', - 'changed::trans-gradient-top-color', - 'changed::trans-gradient-bottom-color', - 'changed::trans-gradient-top-opacity', - 'changed::trans-gradient-bottom-opacity' - ], - () => this._updateGradientAndSet() - ], - [ - SETTINGS, - [ - 'changed::trans-dynamic-behavior', - 'changed::trans-use-dynamic-opacity', - 'changed::trans-dynamic-distance' - ], - () => this._updateProximityWatch() - ], - [ - SETTINGS, - 'changed::trans-dynamic-anim-time', - () => this._updateAnimationDuration() - ] - ); - } - - _updateProximityWatch() { - this._proximityManager.removeWatch(this._proximityWatchId); - - if (SETTINGS.get_boolean('trans-use-dynamic-opacity')) { - let isVertical = this._dtpPanel.checkIfVertical(); - let threshold = SETTINGS.get_int('trans-dynamic-distance'); - - this._windowOverlap = false; - this._updateAlphaAndSet() - - this._proximityWatchId = this._proximityManager.createWatch( - this._dtpPanel.panelBox.get_parent(), - this._dtpPanel.monitor.index, - Proximity.Mode[SETTINGS.get_string('trans-dynamic-behavior')], - isVertical ? threshold : 0, - isVertical ? 0 : threshold, - overlap => { - this._windowOverlap = overlap; - this._updateAlphaAndSet(); - } - ); - } - } - - _updateAnimationDuration() { - this.animationDuration = (SETTINGS.get_int('trans-dynamic-anim-time') * 0.001) + 's;'; - } - - _updateAllAndSet() { - let themeBackground = this._getThemeBackground(true); - - this._updateColor(themeBackground); - this._updateAlpha(themeBackground); - this._updateComplementaryStyles(); - this._updateGradient(); - this._setBackground(); - this._setGradient(); - } - - _updateColorAndSet() { - this._updateColor(); - this._setBackground(); - } - - _updateAlphaAndSet() { - this._updateAlpha(); - this._setBackground(); - } - - _updateGradientAndSet() { - this._updateGradient(); - this._setGradient(); - } - - _updateComplementaryStyles() { - let panelThemeNode = this._dtpPanel.panel.get_theme_node(); - - this._complementaryStyles = 'border-radius: ' + panelThemeNode.get_border_radius(0) + 'px;'; - } - - _updateColor(themeBackground) { - this.backgroundColorRgb = SETTINGS.get_boolean('trans-use-custom-bg') ? - SETTINGS.get_string('trans-bg-color') : - (themeBackground || this._getThemeBackground()); - } - - _updateAlpha(themeBackground) { - if (this._windowOverlap && !Main.overview.visibleTarget && SETTINGS.get_boolean('trans-use-dynamic-opacity')) { - this.alpha = SETTINGS.get_double('trans-dynamic-anim-target'); - } else { - this.alpha = SETTINGS.get_boolean('trans-use-custom-opacity') ? - SETTINGS.get_double('trans-panel-opacity') : - (themeBackground || this._getThemeBackground()).alpha * 0.003921569; // 1 / 255 = 0.003921569 - } - } - - _updateGradient() { - this._gradientStyle = ''; - - if (SETTINGS.get_boolean('trans-use-custom-gradient')) { - this._gradientStyle += 'background-gradient-direction: ' + (this._dtpPanel.checkIfVertical() ? 'horizontal;' : 'vertical;') + - 'background-gradient-start: ' + Utils.getrgbaColor(SETTINGS.get_string('trans-gradient-top-color'), - SETTINGS.get_double('trans-gradient-top-opacity')) + - 'background-gradient-end: ' + Utils.getrgbaColor(SETTINGS.get_string('trans-gradient-bottom-color'), - SETTINGS.get_double('trans-gradient-bottom-opacity')); - } - } - - _setBackground() { - this.currentBackgroundColor = Utils.getrgbaColor(this.backgroundColorRgb, this.alpha); - - let transition = 'transition-duration:' + this.animationDuration; - - this._dtpPanel.set_style('background-color: ' + this.currentBackgroundColor + transition + this._complementaryStyles); - } - - _setGradient() { - this._dtpPanel.panel.set_style( - 'background: none; ' + - 'border-image: none; ' + - 'background-image: none; ' + - this._gradientStyle + - 'transition-duration:' + this.animationDuration - ); - } - - _getThemeBackground(reload) { - if (reload || !this._themeBackground) { - let fakePanel = new St.Bin({ name: 'panel' }); - Main.uiGroup.add_child(fakePanel); - let fakeTheme = fakePanel.get_theme_node() - this._themeBackground = this._getBackgroundImageColor(fakeTheme) || fakeTheme.get_background_color(); - Main.uiGroup.remove_child(fakePanel); - } - - return this._themeBackground; - } - - _getBackgroundImageColor(theme) { - let bg = null; - - try { - let imageFile = theme.get_background_image() || theme.get_border_image().get_file(); - - if (imageFile) { - let imageBuf = GdkPixbuf.Pixbuf.new_from_file(imageFile.get_path()); - let pixels = imageBuf.get_pixels(); - - bg = { red: pixels[0], green: pixels[1], blue: pixels[2], alpha: pixels[3] }; - } - } catch (error) {} - - return bg; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAdvancedOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAdvancedOptions.ui deleted file mode 100644 index 3007d952..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAdvancedOptions.ui +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Nothing yet! - For real... - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAnimateAppIconHoverOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAnimateAppIconHoverOptions.ui deleted file mode 100644 index f49e2d72..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxAnimateAppIconHoverOptions.ui +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - 0 - 300 - 1 - 5 - - - - -30 - 30 - 1 - 5 - - - - 0 - 100 - 1 - 5 - - - - 100 - 250 - 1 - 5 - - - - 0 - 3 - 0.1 - 1 - - - - 1 - 10 - 0.1 - 1 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Animation type - - - center - - Simple - Ripple - Plank - - - - - - - - - - - - - - - Duration - - - center - 300 - animate_appicon_hover_options_duration_adjustment - 0 - 0 - right - True - - - - - - - - Rotation - - - end - 300 - animate_appicon_hover_options_rotation_adjustment - 0 - 0 - right - True - - - - - - - - Travel - - - center - 300 - animate_appicon_hover_options_travel_adjustment - 0 - 0 - right - True - - - - - - - - Zoom - - - center - 300 - animate_appicon_hover_options_zoom_adjustment - 0 - 0 - right - True - - - - - - - - Convexity - - - end - 300 - animate_appicon_hover_options_convexity_adjustment - 1 - 1 - right - True - - - - - - - - Extent - - - center - 300 - animate_appicon_hover_options_extent_adjustment - 0 - 0 - right - True - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDotOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDotOptions.ui deleted file mode 100644 index 18c81ecb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDotOptions.ui +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - 5 - 100 - 5 - 5 - - - - 5 - 1 - 5 - - - - 600 - 600 - True - - - - vertical - 24 - 32 - 32 - 32 - 32 - - - - - - - Highlight focused application - - - center - - - - - - - - - - - - - - Icon dominant color - - - center - - - - - - - - Custom color - - - center - - - - - - - - Highlight opacity - - - center - 5 - focus_highlight_opacity_adjustment - 5 - - - - - - - - - - - - - - Indicator size (px) - - - center - 0 - dot_size_adjustment - - - - - - - - Indicator color - Icon Dominant - - - center - - - - - - - - - - - - - - Indicator color - Override Theme - - - center - - - - - - - - - - - - - 1 window open (or ungrouped) - - - center - Apply to all - - - - - center - - - - - - - - 2 windows open - - - center - - - - - - - - 3 windows open - - - center - - - - - - - - 4+ windows open - - - center - - - - - - - - - - - - - - Use different for unfocused - - - center - - - - - - - - - - - - - - 1 window open (or ungrouped) - - - center - Apply to all - - - - - center - - - - - - - - 2 windows open - - - center - - - - - - - - 3 windows open - - - center - - - - - - - - 4+ windows open - - - center - - - - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDynamicOpacityOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDynamicOpacityOptions.ui deleted file mode 100644 index 447f50d3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxDynamicOpacityOptions.ui +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - 200 - 1 - 10 - - - - 100 - 5 - 10 - - - - 2000 - 1 - 10 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - The panel background opacity is affected by - - - center - - All windows - Focused windows - Maximized windows - - - - - - - - - Change opacity when a window gets closer than (px) - - - center - 4 - 50 - trans_distance_adjustment - True - 50 - - - - - - - - Change opacity to (%) - - - 0 - center - trans_opacity_min_adjustment - - - - - - - - Opacity change animation duration (ms) - - - 4 - 50 - center - trans_anim_time_adjustment - True - 50 - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxGroupAppsOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxGroupAppsOptions.ui deleted file mode 100644 index ffc4d903..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxGroupAppsOptions.ui +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - 6 - 24 - 1 - 100 - - - - 1000 - 10 - 100 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Font size (px) of the application titles (default is 14) - - - center - 4 - 0 - group_apps_label_font_size_adjustment - True - - - - - - - - Font weight of application titles - - - center - - inherit from theme - normal - lighter - bold - bolder - - - - - - - - - Font color of the application titles - - - True - center - - - - - - - - Font color of the minimized application titles - - - True - center - - - - - - - - - - - - - - Maximum width (px) of the application titles - (default is 160) - - - center - 4 - 0 - group_apps_label_max_width_adjustment - True - - - - - - - - Use a fixed width for the application titles - The application titles all have the same width, even if their texts are shorter than the maximum width. The maximum width value is used as the fixed width. - - - center - - - - - - - - - - - - - - Display running indicators on unfocused applications - - - center - - - - - - - - Use the favorite icons as application launchers - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxIntellihideOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxIntellihideOptions.ui deleted file mode 100644 index 0da3ec29..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxIntellihideOptions.ui +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - 1 - 9990 - 10 - 100 - - - - 1 - 5000 - 10 - 100 - - - - 10 - 2000 - 10 - 100 - - - - 10 - 4000 - 10 - 100 - - - - 10000 - 10 - 100 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Only hide the panel when it is obstructed by windows - - - center - - - - - - - - The panel hides from - - - center - - All windows - Focused windows - Maximized windows - - - - - - - - - - - - - - - Require pressure at the edge of the screen to reveal the panel - - - center - - - - - - - - Required pressure threshold (px) - - - center - 4 - 0 - intellihide_pressure_threshold_adjustment - True - - - - - - - - Required pressure timeout (ms) - - - center - 4 - 0 - intellihide_pressure_time_adjustment - True - - - - - - - - - - - - - - Allow the panel to be revealed while in fullscreen mode - - - center - - - - - - - - Only hide secondary panels - (requires multi-monitors option) - - - center - - - - - - - - Keyboard shortcut to reveal and hold the panel - Syntax: &lt;Shift&gt;, &lt;Ctrl&gt;, &lt;Alt&gt;, &lt;Super&gt; - - - center - 12 - e.g. <Super>i - - - - - - - - - - - - - - Hide and reveal animation duration (ms) - - - center - 4 - 0 - intellihide_animation_time_adjustment - True - - - - - - - - Delay before hiding the panel (ms) - - - center - 4 - 10 - intellihide_close_delay_adjustment - True - 10 - - - - - - - - Delay before enabling intellihide on start (ms) - - - center - 4 - 10 - intellihide_enable_hide_delay_adjustment - True - 10 - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxMiddleClickOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxMiddleClickOptions.ui deleted file mode 100644 index 023845e6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxMiddleClickOptions.ui +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Shift+Click action - When set to minimize, double clicking minimizes all the windows of the application. - - - center - - Raise windows - Minimize window - Launch new instance - Cycle through windows - Cycle windows + minimize - Toggle single / Preview multiple - Toggle single / Cycle multiple - Quit - - - - - - - - - - - - - - - Middle-Click action - Behavior for Middle-Click. - - - center - - Raise windows - Minimize window - Launch new instance - Cycle through windows - Cycle windows + minimize - Toggle single / Preview multiple - Toggle single / Cycle multiple - Quit - - - - - - - - - - - - - - - Shift+Middle-Click action - Behavior for Shift+Middle-Click. - - - center - - Raise windows - Minimize window - Launch new instance - Cycle through windows - Cycle windows + minimize - Toggle single / Preview multiple - Toggle single / Cycle multiple - Quit - - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxOverlayShortcut.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxOverlayShortcut.ui deleted file mode 100644 index 5f875896..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxOverlayShortcut.ui +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - 10000 - 250 - 1000 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Hotkeys prefix - Hotkeys will either be Super+Number or Super+Alt+Num - - - center - - Super - Super + Alt - - - - - - - - - Number overlay - Temporarily show the application numbers over the icons when using the hotkeys. - - - center - - Never - Show temporarily - Always visible - - - - - - - - - Hide timeout (ms) - - - center - shortcut_time_adjustment - - - - - - - - Shortcut to show the overlay for 2 seconds - Syntax: &lt;Shift&gt;, &lt;Ctrl&gt;, &lt;Alt&gt;, &lt;Super&gt; - - - center - 12 - e.g. <Super>q - - - - - - - - Show window previews on hotkey - Show previews when the application have multiple instances - - - center - - - - - - - - Hotkeys are activated with - Select which keyboard number keys are used to activate the hotkeys - - - center - - Number row - Numeric keypad - Both - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollIconOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollIconOptions.ui deleted file mode 100644 index bb457ff4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollIconOptions.ui +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - 2000 - 10 - 50 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Delay between mouse scroll events (ms) - Use this value to limit the number of captured mouse scroll events. - - - center - 4 - 50 - scroll_icon_options_delay_adjustment - True - 50 - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollPanelOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollPanelOptions.ui deleted file mode 100644 index 2354b76d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxScrollPanelOptions.ui +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - 2000 - 10 - 50 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Delay between mouse scroll events (ms) - Use this value to limit the number of captured mouse scroll events. - - - center - 4 - 50 - scroll_panel_options_delay_adjustment - True - 50 - - - - - - - - Show popup when changing workspace - This affects workspace popup when scrolling on the panel only. - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxSecondaryMenuOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxSecondaryMenuOptions.ui deleted file mode 100644 index 483ddc82..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxSecondaryMenuOptions.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Integrate <i>AppMenu</i> items - - - center - - - - - - - - <i>Show Details</i> menu item - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowApplicationsOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowApplicationsOptions.ui deleted file mode 100644 index ee183a5b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowApplicationsOptions.ui +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - 100 - 1 - 10 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Show Applications icon - - - 32 - 32 - gtk-missing-image - 32 - - - - - - - - - - 8 - 8 - 8 - 8 - 140 - True - - - - - - - - - - - - - - Show Applications icon side padding (px) - - - center - 0 - show_applications_side_padding_adjustment - - - - - - - - Override escape key and return to desktop - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowDesktopOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowDesktopOptions.ui deleted file mode 100644 index be5d21c1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxShowDesktopOptions.ui +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - 1 - 40 - 1 - 10 - - - - 5000 - 10 - 100 - - - - 5000 - 10 - 100 - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - - - center - 4 - 1 - show_showdesktop_width_adjustment - True - 1 - - - - - - - - Override Show Desktop line color - - > - True - center - True - - - - - center - - - - - - - - - - - - - - Reveal the desktop when hovering the Show Desktop button - - - True - end - center - - - - - - - - Delay before revealing the desktop (ms) - - - center - 4 - 1 - show_showdesktop_delay_adjustment - True - 1 - - - - - - - - Fade duration (ms) - - - center - 4 - 1 - show_showdesktop_time_adjustment - True - 1 - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxWindowPreviewOptions.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxWindowPreviewOptions.ui deleted file mode 100644 index 87cecff4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/BoxWindowPreviewOptions.ui +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - 9999 - 25 - 100 - - - - 1000 - 10 - 50 - - - - 9999 - 25 - 100 - - - - 100 - 800 - 10 - 50 - - - - 50 - 1 - 5 - - - - 100 - 5 - 10 - - - - 8 - 48 - 1 - 100 - - - - 6 - 24 - 1 - 100 - - - - 50 - 9999 - 25 - 100 - - - - 255 - 10 - 25 - - - - 800 - 600 - True - - - - vertical - 600 - 24 - 32 - 32 - 32 - 32 - - - - - - - Time (ms) before showing - (400 is default) - - - center - 4 - 0 - preview_timeout_adjustment - True - - - - - - - - Time (ms) before hiding - (100 is default) - - - False - - - 4 - Immediate on application icon click - True - - - - - - - center - 4 - 25 - leave_timeout_adjustment - True - 25 - - - - - - - - Animation time (ms) - - - center - 4 - 0 - preview_animation_time_adjustment - True - - - - - - - - - - - - - - Middle click on the preview to close the window - - - center - - - - - - - - - - - - - - Window previews preferred size (px) - - - center - 4 - 100 - preview_size_adjustment - True - 100 - - - - - - - - Window previews aspect ratio X (width) - - - center - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - - - - - - Fixed - True - center - - - - - - - - Window previews aspect ratio Y (height) - - - center - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - - - - - - Fixed - True - center - - - - - - - - Window previews padding (px) - - - center - 4 - 50 - preview_padding_adjustment - True - 50 - - - - - - - - - - - - - - Use custom opacity for the previews background - If disabled, the previews background have the same opacity as the panel. - - - center - - - - - center - 5 - preview_opacity_adjustment - 5 - - - - - - - - - - - - - - Close button and header position - - - Bottom - False - center - True - - - - - - Top - False - center - preview_title_position_bottom_button - - - - - - - - - - - - - - - Display window preview headers - - > - center - - - - - - - - Icon size (px) of the window preview - If disabled, the previews icon size will be based on headerbar size - - - center - - - - - center - 4 - 6 - preview_custom_icon_size_adjustment - True - 6 - - - - - - - - Font size (px) of the preview titles - - - center - 4 - 6 - preview_title_font_size_adjustment - True - 6 - - - - - - - - Font weight of the preview titles - - - center - - inherit from theme - normal - lighter - bold - bolder - - - - - - - - - Font color of the preview titles - - - True - center - - - - - - - - - - - - - - Enable window peeking - When hovering over a window preview for some time, the window gets distinguished. - - - center - - - - - - - - Enter window peeking mode timeout (ms) - Time of inactivity while hovering over a window preview needed to enter the window peeking mode. - - - center - 4 - 50 - enter_peek_mode_timeout_adjustment - True - 50 - - - - - - - - Window peeking mode opacity - All windows except for the peeked one have their opacity set to the same value. - - - center - 4 - 0 - peek_mode_opacity_adjustment - True - - - - - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAbout.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAbout.ui deleted file mode 100644 index 4ab0476b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAbout.ui +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - About - help-about-symbolic - - - - - Info - - - - Version - - - ... - - - - - - - - Source - - - GitHub - True - center - https://github.com/home-sweet-gnome/dash-to-panel - - - - - - - - - - - - Export and Import - - - - Export and import settings - Use the buttons below to create a settings file from your current preferences that can be imported on a different machine. - - - - - - - - 8 - 8 - 4 - 4 - 8 - end - - - Export to file - True - - - - - Import from file - True - - - - - - - - - - - - - - - - <span size="small">This program comes with ABSOLUTELY NO WARRANTY. See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> - True - center - True - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAction.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAction.ui deleted file mode 100644 index 20cbf9c1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsAction.ui +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - Action - view-pin-symbolic - - - - - Click action - - - - Click action - Behaviour when clicking on the icon of a running application. - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - Cycle windows + minimize - Cycle through windows - Toggle single / Preview multiple - Toggle single / Cycle multiple - Toggle windows - Raise windows - Launch new instance - - - - - - - - - - - - - Scroll action - - - - Scroll panel action - Behavior when mouse scrolling over the panel. - - - True - True - end - center - - - True - emblem-system-symbolic - - - - - - - - True - center - True - - Do nothing - Switch workspace - Cycle windows - Change volume - - - - - - - - - Scroll icon action - Behavior when mouse scrolling over an application icon. - - - True - center - - - True - emblem-system-symbolic - - - - - - - - center - True - - Do nothing - Cycle windows - Same as panel - - - - - - - - - - - - - Hotkey overlay - - - - Use hotkeys to activate apps - Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsBehavior.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsBehavior.ui deleted file mode 100644 index c56b7c71..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsBehavior.ui +++ /dev/null @@ -1,192 +0,0 @@ - - - - - Behavior - preferences-system-symbolic - - - - - Applications - - - - Show favorite applications - - - center - - - - - - - - Show favorite applications on secondary panels - - - center - - - - - - - - Show running applications - - - center - - - - - - - - Ungroup applications - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - Show notification counter badge - - - True - end - center - - - - - - - - - - - - Hover - - - - Show window previews on hover - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - Show tooltip on hover - - - center - - - - - - - - - - - - Isolate - - - - Isolate Workspaces - - - center - - - - - - - - Isolate monitors - - - center - - - - - - - - - - - - Overview - - - - Click empty space to close overview - - - center - - - - - - - - Disable show overview on startup - - - center - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsFineTune.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsFineTune.ui deleted file mode 100644 index c9def52e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsFineTune.ui +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 0.33 - 1 - 0.01 - 0.1 - - - - Fine-Tune - preferences-other-symbolic - - - - - Font size - - - - Tray Font Size - (0 = theme default) - - - 300 - tray_size_adjustment - 0 - 0 - right - True - - - - - - - - - LeftBox Font Size - (0 = theme default) - - - 300 - leftbox_size_adjustment - 0 - 0 - right - True - - - - - - - - - - - - - Padding - - - - Tray Item Padding - (-1 = theme default) - - - 300 - tray_padding_adjustment - 0 - 0 - right - True - - - - - - - - - Status Icon Padding - (-1 = theme default) - - - 300 - statusicon_padding_adjustment - 0 - 0 - right - True - - - - - - - - - LeftBox Padding - (-1 = theme default) - - - 300 - leftbox_padding_adjustment - 0 - 0 - right - True - - - - - - - - - - - - - Animate - - - - Animate switching applications - - - center - - - - - - - - Animate launching new windows - - - center - - - - - - - - - - - - Gnome functionality - - - - Keep original gnome-shell dash - (overview) - - - center - - - - - - - - Keep original gnome-shell top panel - - - center - - - - - - - - Activate panel menu buttons on click only - (e.g. date menu) - - - center - - - - - - - - Force Activities hot corner on primary monitor - - - center - - - - - - - - - - - - - - - App icon secondary menu - (right-click menu) - - - True - center - - - emblem-system-symbolic - - - - - - - - - - - - - - - - - - Advanced Options - False - True - end - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsPosition.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsPosition.ui deleted file mode 100644 index 8130f7f9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsPosition.ui +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 100 - 1 - 10 - - - - Position - find-location-symbolic - - - - - Panel - - - - Display the main panel on - - - center - - - - - - - - Display panels on all monitors - - - center - - - - - - - - - - - - - Panel Intellihide - Hide and reveal the panel according to preferences - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - - - - - Order and Position on monitors - - - - - Monitor - - - 6 - 6 - 6 - 6 - - - Apply changes to all monitors - False - start - True - - - - - end - center - True - - - - - - - - - - - - - - - - - Panel screen position - - - Bottom - False - center - True - - - - - - Top - False - center - position_bottom_button - - - - - - Left - False - center - position_bottom_button - - - - - - Right - False - center - position_bottom_button - - - - - - - - - Panel thickness - (default is 48) - - - 300 - panel_size_adjustment - 0 - 0 - right - True - - - - - - - - - Panel length (%) - (default is 100) - - - 300 - panel_length_adjustment - 0 - 0 - right - True - - - - - - - - Anchor - - - center - - Start - Middle - End - - - - - - - - - - - - - - - - Taskbar Display - - - 6 - 6 - True - none - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsStyle.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsStyle.ui deleted file mode 100644 index abe5c341..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/ui/SettingsStyle.ui +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 0.33 - 1 - 0.01 - 0.1 - - - - 100 - 5 - 10 - - - - 100 - 5 - 10 - - - - 100 - 5 - 10 - - - - Style - applications-graphics-symbolic - - - - - AppIcon style - - - - App Icon Margin - (default is 8) - - - 300 - appicon_margin_adjustment - 0 - 0 - right - True - - - - - - - - - App Icon Padding - (default is 4) - - - 300 - appicon_padding_adjustment - 0 - 0 - right - True - - - - - - - - - Animate hovering app icons - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - Icon style - - - center - - Normal - Symbolic - - - - - - - - - - - - Running indicator - - - - Running indicator position - - - Bottom - center - - - - - - Top - center - dots_bottom_button - - - - - - Left - center - dots_bottom_button - - - - - - Right - center - dots_bottom_button - - - - - - - - - Running indicator style (Focused app) - - - center - - - emblem-system-symbolic - - - - - - - - center - - Dots - Squares - Dashes - Segmented - Solid - Ciliora - Metro - - - - - - - - - Running indicator style (Unfocused apps) - - - center - - Dots - Squares - Dashes - Segmented - Solid - Ciliora - Metro - - - - - - - - - - - - - Panel style - - - - Override panel theme background color - - - center - - - - - center - - - - - - - - - - - - - - Override panel theme background opacity - - - center - - - - - - - - Panel background opacity (%) - - - center - 0 - trans_opacity_adjustment - - - - - - - - Dynamic background opacity - Change opacity when a window gets close to the panel - - - True - center - - - emblem-system-symbolic - - - - - - - - center - - - - - - - - - - - - - - - Override panel theme gradient - - - center - - - - - - - - Gradient top color and opacity (%) - - - True - center - - - - - center - 0 - trans_gradient_opacity1_adjustment - - - - - - - - Gradient bottom color and opacity (%) - - - True - center - - - - - center - 0 - trans_gradient_opacity2_adjustment - - - - - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/utils.js deleted file mode 100644 index df67ad96..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/utils.js +++ /dev/null @@ -1,889 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 . - * - * - * Credits: - * This file is based on code from the Dash to Dock extension by micheleg - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ - -import Clutter from 'gi://Clutter'; -import Cogl from 'gi://Cogl'; -import GdkPixbuf from 'gi://GdkPixbuf'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Graphene from 'gi://Graphene'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -import * as Util from 'resource:///org/gnome/shell/misc/util.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; - -const SCROLL_TIME = Util.SCROLL_TIME / (Util.SCROLL_TIME > 1 ? 1000 : 1); - -// simplify global signals and function injections handling -// abstract class -export const BasicHandler = class { - - constructor() { - this._storage = new Object(); - } - - add(/*unlimited 3-long array arguments*/){ - - // convert arguments object to array, concatenate with generic - let args = [].concat('generic', [].slice.call(arguments)); - // call addWithLabel with ags as if they were passed arguments - this.addWithLabel.apply(this, args); - } - - destroy() { - for( let label in this._storage ) - this.removeWithLabel(label); - } - - addWithLabel( label /* plus unlimited 3-long array arguments*/) { - - if(this._storage[label] == undefined) - this._storage[label] = new Array(); - - // skip first element of the arguments - for( let i = 1; i < arguments.length; i++ ) { - let item = this._storage[label]; - let handlers = this._create(arguments[i]); - - for (let j = 0, l = handlers.length; j < l; ++j) { - item.push(handlers[j]); - } - } - - } - - removeWithLabel(label){ - - if(this._storage[label]) { - for( let i = 0; i < this._storage[label].length; i++ ) { - this._remove(this._storage[label][i]); - } - - delete this._storage[label]; - } - } - - /* Virtual methods to be implemented by subclass */ - // create single element to be stored in the storage structure - _create(item){ - throw new Error('no implementation of _create in ' + this); - } - - // correctly delete single element - _remove(item){ - throw new Error('no implementation of _remove in ' + this); - } -} - -// Manage global signals -export const GlobalSignalsHandler = class extends BasicHandler { - - _create(item) { - let handlers = []; - - item[1] = [].concat(item[1]); - - for (let i = 0, l = item[1].length; i < l; ++i) { - let object = item[0]; - let event = item[1][i]; - let callback = item[2] - try { - let id = object.connect(event, callback); - - handlers.push([object, id]); - } catch (e) - { - - } - } - - return handlers; - } - - _remove(item){ - item[0].disconnect(item[1]); - } -}; - -/** - * Manage function injection: both instances and prototype can be overridden - * and restored - */ -export const InjectionsHandler = class extends BasicHandler { - - _create(item) { - let object = item[0]; - let name = item[1]; - let injectedFunction = item[2]; - let original = object[name]; - - object[name] = injectedFunction; - return [[object, name, injectedFunction, original]]; - } - - _remove(item) { - let object = item[0]; - let name = item[1]; - let original = item[3]; - object[name] = original; - } -}; - -/** - * Manage timeouts: the added timeouts have their id reset on completion - */ -export const TimeoutsHandler = class extends BasicHandler { - - _create(item) { - let name = item[0]; - let delay = item[1]; - let timeoutHandler = item[2]; - - this._remove(item); - - this[name] = GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { - this[name] = 0; - timeoutHandler(); - - return GLib.SOURCE_REMOVE; - }); - - return [[name]]; - } - - remove(name) { - this._remove([name]) - } - - _remove(item) { - let name = item[0]; - - if (this[name]) { - GLib.Source.remove(this[name]); - this[name] = 0; - } - } - - getId(name) { - return this[name] ? this[name] : 0; - } -}; - -// This is wrapper to maintain compatibility with GNOME-Shell 3.30+ as well as -// previous versions. -export const DisplayWrapper = { - getScreen() { - return global.screen || global.display; - }, - - getWorkspaceManager() { - return global.screen || global.workspace_manager; - }, - - getMonitorManager() { - return global.screen || global.backend.get_monitor_manager(); - } -}; - -let unredirectEnabled = true -export const setDisplayUnredirect = (enable) => { - if (enable && !unredirectEnabled) - Meta.enable_unredirect_for_display(global.display); - else if (!enable && unredirectEnabled) - Meta.disable_unredirect_for_display(global.display); - - unredirectEnabled = enable; -}; - -export const getSystemMenuInfo = function() { - return { - name: 'quickSettings', - constructor: Main.panel.statusArea.quickSettings.constructor - }; -} - -export const getCurrentWorkspace = function() { - return DisplayWrapper.getWorkspaceManager().get_active_workspace(); -}; - -export const getWorkspaceByIndex = function(index) { - return DisplayWrapper.getWorkspaceManager().get_workspace_by_index(index); -}; - -export const getWorkspaceCount = function() { - return DisplayWrapper.getWorkspaceManager().n_workspaces; -}; - -export const getStageTheme = function() { - return St.ThemeContext.get_for_stage(global.stage); -}; - -export const getScaleFactor = function() { - return getStageTheme().scale_factor || 1; -}; - -export const findIndex = function(array, predicate) { - if (array) { - if (Array.prototype.findIndex) { - return array.findIndex(predicate); - } - - for (let i = 0, l = array.length; i < l; ++i) { - if (predicate(array[i])) { - return i; - } - } - } - - return -1; -}; - -export const find = function(array, predicate) { - let index = findIndex(array, predicate); - - if (index > -1) { - return array[index]; - } -}; - -export const mergeObjects = function(main, bck) { - for (const prop in bck) { - if (!main.hasOwnProperty(prop) && bck.hasOwnProperty(prop)) { - main[prop] = bck[prop]; - } - } - - return main; -}; - -export const getTrackedActorData = (actor) => { - let trackedIndex = Main.layoutManager._findActor(actor); - - if (trackedIndex >= 0) - return Main.layoutManager._trackedActors[trackedIndex] -} - -export const getTransformedAllocation = function(actor) { - let extents = actor.get_transformed_extents(); - let topLeft = extents.get_top_left(); - let bottomRight = extents.get_bottom_right(); - - return { x1: topLeft.x, x2: bottomRight.x, y1: topLeft.y, y2: bottomRight.y }; -}; - -export const setClip = function(actor, x, y, width, height) { - actor.set_clip(0, 0, width, height); - actor.set_position(x, y); - actor.set_size(width, height); -}; - -export const addKeybinding = function(key, settings, handler, modes) { - if (!Main.wm._allowedKeybindings[key]) { - Main.wm.addKeybinding( - key, - settings, - Meta.KeyBindingFlags.NONE, - modes || (Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW), - handler - ); - } -}; - -export const removeKeybinding = function(key) { - if (Main.wm._allowedKeybindings[key]) { - Main.wm.removeKeybinding(key); - } -}; - -export const getrgbColor = function(color) { - color = typeof color === 'string' ? ColorUtils.color_from_string(color)[1] : color; - - return { red: color.red, green: color.green, blue: color.blue }; -}; - -export const getrgbaColor = function(color, alpha, offset) { - if (alpha <= 0) { - return 'transparent; '; - } - - let rgb = getrgbColor(color); - - if (offset) { - ['red', 'green', 'blue'].forEach(k => { - rgb[k] = Math.min(255, Math.max(0, rgb[k] + offset)); - - if (rgb[k] == color[k]) { - rgb[k] = Math.min(255, Math.max(0, rgb[k] - offset)); - } - }); - } - - return 'rgba(' + rgb.red + ',' + rgb.green + ',' + rgb.blue + ',' + (Math.floor(alpha * 100) * 0.01) + '); ' ; -}; - -export const checkIfColorIsBright = function(color) { - let rgb = getrgbColor(color); - let brightness = 0.2126 * rgb.red + 0.7152 * rgb.green + 0.0722 * rgb.blue; - - return brightness > 128; -}; - -export const getMouseScrollDirection = function(event) { - let direction; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - case Clutter.ScrollDirection.LEFT: - direction = 'up'; - break; - case Clutter.ScrollDirection.DOWN: - case Clutter.ScrollDirection.RIGHT: - direction = 'down'; - break; - } - - return direction; -}; - -export const checkIfWindowHasTransient = function(window) { - let hasTransient; - - window.foreach_transient(t => !(hasTransient = true)); - - return hasTransient; -}; - -export const activateSiblingWindow = function(windows, direction, startWindow) { - let windowIndex = windows.indexOf(global.display.focus_window); - let nextWindowIndex = windowIndex < 0 ? - startWindow ? windows.indexOf(startWindow) : 0 : - windowIndex + (direction == 'up' ? -1 : 1); - - if (nextWindowIndex == windows.length) { - nextWindowIndex = 0; - } else if (nextWindowIndex < 0) { - nextWindowIndex = windows.length - 1; - } - - if (windowIndex != nextWindowIndex) { - Main.activateWindow(windows[nextWindowIndex]); - } -}; - -export const animateWindowOpacity = function(window, tweenOpts) { - //there currently is a mutter bug with the windowactor opacity, starting with 3.34 - //https://gitlab.gnome.org/GNOME/mutter/issues/836 - - //since 3.36, a workaround is to use the windowactor's child for the fade animation - //this leaves a "shadow" on the desktop, so the windowactor needs to be hidden - //when the animation is complete - let visible = tweenOpts.opacity > 0; - let windowActor = window; - let initialOpacity = window.opacity; - - window = windowActor.get_first_child() || windowActor; - - if (!windowActor.visible && visible) { - window.opacity = 0; - windowActor.visible = visible; - tweenOpts.opacity = Math.min(initialOpacity, tweenOpts.opacity); - } - - if (!visible) { - tweenOpts.onComplete = () => { - windowActor.visible = visible; - window.opacity = initialOpacity; - }; - } - - animate(window, tweenOpts); -}; - -export const animate = function(actor, options) { - //the original animations used Tweener instead of Clutter animations, so we - //use "time" and "delay" properties defined in seconds, as opposed to Clutter - //animations "duration" and "delay" which are defined in milliseconds - if (options.delay) { - options.delay = options.delay * 1000; - } - - options.duration = options.time * 1000; - delete options.time; - - if (options.transition) { - //map Tweener easing equations to Clutter animation modes - options.mode = { - 'easeInCubic': Clutter.AnimationMode.EASE_IN_CUBIC, - 'easeInOutCubic': Clutter.AnimationMode.EASE_IN_OUT_CUBIC, - 'easeInOutQuad': Clutter.AnimationMode.EASE_IN_OUT_QUAD, - 'easeOutQuad': Clutter.AnimationMode.EASE_OUT_QUAD - }[options.transition] || Clutter.AnimationMode.LINEAR; - - delete options.transition; - } - - let params = [options]; - - if ('value' in options && actor instanceof St.Adjustment) { - params.unshift(options.value); - delete options.value; - } - - actor.ease.apply(actor, params); -} - -export const isAnimating = function(actor, prop) { - return !!actor.get_transition(prop); -} - -export const stopAnimations = function(actor) { - actor.remove_all_transitions(); -} - -export const getIndicators = function(delegate) { - if (delegate instanceof St.BoxLayout) { - return delegate; - } - - return delegate.indicators; -} - -export const getPoint = function(coords) { - return new Graphene.Point(coords); -} - -export const notify = function(text, iconName, action, isTransient) { - let source = new MessageTray.SystemNotificationSource(); - let notification = new MessageTray.Notification(source, 'Dash to Panel', text); - let notifyFunc = source.showNotification || source.notify; - - if (iconName) { - source.createIcon = function() { - return new St.Icon({ icon_name: iconName }); - }; - } - - if (action) { - if (!(action instanceof Array)) { - action = [action]; - } - - action.forEach(a => notification.addAction(a.text, a.func)); - } - - Main.messageTray.add(source); - - notification.setTransient(isTransient); - notifyFunc.call(source, notification); -}; - -/* - * This is a copy of the same function in utils.js, but also adjust horizontal scrolling - * and perform few further cheks on the current value to avoid changing the values when - * it would be clamp to the current one in any case. - * Return the amount of shift applied -*/ -export const ensureActorVisibleInScrollView = function(scrollView, actor, fadeSize, onComplete) { - const vadjustment = scrollView.vadjustment; - const hadjustment = scrollView.hadjustment; - let [vvalue, vlower, vupper, vstepIncrement, vpageIncrement, vpageSize] = vadjustment.get_values(); - let [hvalue, hlower, hupper, hstepIncrement, hpageIncrement, hpageSize] = hadjustment.get_values(); - - let [hvalue0, vvalue0] = [hvalue, vvalue]; - - let voffset = fadeSize; - let hoffset = fadeSize; - - let box = actor.get_allocation_box(); - let y1 = box.y1, y2 = box.y2, x1 = box.x1, x2 = box.x2; - - let parent = actor.get_parent(); - while (parent != scrollView) { - if (!parent) - throw new Error("actor not in scroll view"); - - let box = parent.get_allocation_box(); - y1 += box.y1; - y2 += box.y1; - x1 += box.x1; - x2 += box.x1; - parent = parent.get_parent(); - } - - if (y1 < vvalue + voffset) - vvalue = Math.max(0, y1 - voffset); - else if (vvalue < vupper - vpageSize && y2 > vvalue + vpageSize - voffset) - vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); - - if (x1 < hvalue + hoffset) - hvalue = Math.max(0, x1 - hoffset); - else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) - hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); - - let tweenOpts = { - time: SCROLL_TIME, - onComplete: onComplete || (() => {}), - transition: 'easeOutQuad' - }; - - if (vvalue !== vvalue0) { - animate(vadjustment, mergeObjects(tweenOpts, { value: vvalue })); - } - - if (hvalue !== hvalue0) { - animate(hadjustment, mergeObjects(tweenOpts, { value: hvalue })); - } - - return [hvalue- hvalue0, vvalue - vvalue0]; -} - -/** - * ColorUtils is adapted from https://github.com/micheleg/dash-to-dock - */ -let colorNs = Clutter.Color ? Clutter : Cogl - -export const ColorUtils = { - color_from_string: colorNs.color_from_string, - Color: colorNs.Color, - - colorLuminance(r, g, b, dlum) { - // Darken or brighten color by a fraction dlum - // Each rgb value is modified by the same fraction. - // Return "#rrggbb" strin - - let rgbString = '#'; - - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); - - return rgbString; - }, - - _decimalToHex(d, padding) { - // Convert decimal to an hexadecimal string adding the desired padding - - let hex = d.toString(16); - while (hex.length < padding) - hex = '0'+ hex; - return hex; - }, - - HSVtoRGB(h, s, v) { - // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. - // Return {r:r, g:g, b:b} object. - - if (arguments.length === 1) { - s = h.s; - v = h.v; - h = h.h; - } - - let r,g,b; - let c = v*s; - let h1 = h*6; - let x = c*(1 - Math.abs(h1 % 2 - 1)); - let m = v - c; - - if (h1 <=1) - r = c + m, g = x + m, b = m; - else if (h1 <=2) - r = x + m, g = c + m, b = m; - else if (h1 <=3) - r = m, g = c + m, b = x + m; - else if (h1 <=4) - r = m, g = x + m, b = c + m; - else if (h1 <=5) - r = x + m, g = m, b = c + m; - else - r = c + m, g = m, b = x + m; - - return { - r: Math.round(r * 255), - g: Math.round(g * 255), - b: Math.round(b * 255) - }; - }, - - RGBtoHSV(r, g, b) { - // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. - // Return {h:h, s:s, v:v} object. - - if (arguments.length === 1) { - r = r.r; - g = r.g; - b = r.b; - } - - let h,s,v; - - let M = Math.max(r, g, b); - let m = Math.min(r, g, b); - let c = M - m; - - if (c == 0) - h = 0; - else if (M == r) - h = ((g-b)/c) % 6; - else if (M == g) - h = (b-r)/c + 2; - else - h = (r-g)/c + 4; - - h = h/6; - v = M/255; - if (M !== 0) - s = c/M; - else - s = 0; - - return {h: h, s: s, v: v}; - } -}; - -/** - * DominantColorExtractor is adapted from https://github.com/micheleg/dash-to-dock - */ -let themeLoader = null; -let iconCacheMap = new Map(); -const MAX_CACHED_ITEMS = 1000; -const BATCH_SIZE_TO_DELETE = 50; -const DOMINANT_COLOR_ICON_SIZE = 64; - -export const DominantColorExtractor = class { - - constructor(app){ - this._app = app; - } - - /** - * Try to get the pixel buffer for the current icon, if not fail gracefully - */ - _getIconPixBuf() { - let iconTexture = this._app.create_icon_texture(16); - - if (themeLoader === null) { - themeLoader = new St.IconTheme(); - } - - // Unable to load the icon texture, use fallback - if (iconTexture instanceof St.Icon === false) { - return null; - } - - iconTexture = iconTexture.get_gicon(); - - // Unable to load the icon texture, use fallback - if (iconTexture === null) { - return null; - } - - if (iconTexture instanceof Gio.FileIcon) { - // Use GdkPixBuf to load the pixel buffer from the provided file path - return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); - } - - // Get the pixel buffer from the icon theme - if (iconTexture instanceof Gio.ThemedIcon) { - let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], - DOMINANT_COLOR_ICON_SIZE, 0); - - if (icon_info !== null) { - return icon_info.load_icon(); - } - } - - return null; - } - - /** - * The backlight color choosing algorithm was mostly ported to javascript from the - * Unity7 C++ source of Canonicals: - * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp - * so it more or less works the same way. - */ - _getColorPalette() { - if (iconCacheMap.get(this._app.get_id())) { - // We already know the answer - return iconCacheMap.get(this._app.get_id()); - } - - let pixBuf = this._getIconPixBuf(); - if (pixBuf == null) - return null; - - let pixels = pixBuf.get_pixels(), - offset = 0; - - let total = 0, - rTotal = 0, - gTotal = 0, - bTotal = 0; - - let resample_y = 1, - resample_x = 1; - - // Resampling of large icons - // We resample icons larger than twice the desired size, as the resampling - // to a size s - // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, - // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally - // a multiple of it. - let width = pixBuf.get_width(); - let height = pixBuf.get_height(); - - // Resample - if (height >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); - - if (width >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); - - if (resample_x !==1 || resample_y !== 1) - pixels = this._resamplePixels(pixels, resample_x, resample_y); - - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length; - for (let offset = 0; offset < limit; offset+=4) { - let r = pixels[offset], - g = pixels[offset + 1], - b = pixels[offset + 2], - a = pixels[offset + 3]; - - let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); - let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; - - rTotal += r * relevance; - gTotal += g * relevance; - bTotal += b * relevance; - - total += relevance; - } - - total = total * 255; - - let r = rTotal / total, - g = gTotal / total, - b = bTotal / total; - - let hsv = ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); - - if (hsv.s > 0.15) - hsv.s = 0.65; - hsv.v = 0.90; - - let rgb = ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); - - // Cache the result. - let backgroundColor = { - lighter: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0.2), - original: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, 0), - darker: ColorUtils.colorLuminance(rgb.r, rgb.g, rgb.b, -0.5) - }; - - if (iconCacheMap.size >= MAX_CACHED_ITEMS) { - //delete oldest cached values (which are in order of insertions) - let ctr=0; - for (let key of iconCacheMap.keys()) { - if (++ctr > BATCH_SIZE_TO_DELETE) - break; - iconCacheMap.delete(key); - } - } - - iconCacheMap.set(this._app.get_id(), backgroundColor); - - return backgroundColor; - } - - /** - * Downsample large icons before scanning for the backlight color to - * improve performance. - * - * @param pixBuf - * @param pixels - * @param resampleX - * @param resampleY - * - * @return []; - */ - _resamplePixels(pixels, resampleX, resampleY) { - let resampledPixels = []; - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length / (resampleX * resampleY) / 4; - for (let i = 0; i < limit; i++) { - let pixel = i * resampleX * resampleY; - - resampledPixels.push(pixels[pixel * 4]); - resampledPixels.push(pixels[pixel * 4 + 1]); - resampledPixels.push(pixels[pixel * 4 + 2]); - resampledPixels.push(pixels[pixel * 4 + 3]); - } - - return resampledPixels; - } - -}; - -export const drawRoundedLine = function(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { - if (height > width) { - y += Math.floor((height - width) / 2.0); - height = width; - } - - height = 2.0 * Math.floor(height / 2.0); - - const leftRadius = isRoundLeft ? height / 2.0 : 0.0; - const rightRadius = isRoundRight ? height / 2.0 : 0.0; - - cr.moveTo(x + width - rightRadius, y); - cr.lineTo(x + leftRadius, y); - if (isRoundLeft) - cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); - else - cr.lineTo(x, y + height); - cr.lineTo(x + width - rightRadius, y + height); - if (isRoundRight) - cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); - else - cr.lineTo(x + width, y); - cr.closePath(); - - if (fill != null) { - cr.setSource(fill); - cr.fillPreserve(); - } - if (stroke != null) - cr.setSource(stroke); - cr.stroke(); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/windowPreview.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/windowPreview.js deleted file mode 100644 index f0a2741a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/dash-to-panel@jderose9.github.com/windowPreview.js +++ /dev/null @@ -1,1152 +0,0 @@ -/* - * This file is part of the Dash-To-Panel extension for Gnome 3 - * - * 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 2 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 Clutter from 'gi://Clutter'; -import GLib from 'gi://GLib'; -import Graphene from 'gi://Graphene'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import Meta from 'gi://Meta'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import St from 'gi://St'; - -import * as Taskbar from './taskbar.js'; -import * as Utils from './utils.js'; -import {SETTINGS, DESKTOPSETTINGS} from './extension.js'; -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -//timeout intervals -const ENSURE_VISIBLE_MS = 200; - -//timeout names -const T1 = 'openMenuTimeout'; -const T2 = 'closeMenuTimeout'; -const T3 = 'peekTimeout'; -const T4 = 'ensureVisibleTimeout'; - -const MAX_TRANSLATION = 40; -const HEADER_HEIGHT = 38; -const MAX_CLOSE_BUTTON_SIZE = 30; -const MIN_DIMENSION = 100; -const FOCUSED_COLOR_OFFSET = 24; -const HEADER_COLOR_OFFSET = -12; -const FADE_SIZE = 36; -const PEEK_INDEX_PROP = '_dtpPeekInitialIndex'; - -let headerHeight = 0; -let alphaBg = 0; -let isLeftButtons = false; -let isTopHeader = true; -let isManualStyling = false; -let scaleFactor = 1; -let animationTime = 0; -let aspectRatio = {}; - -export const PreviewMenu = GObject.registerClass({ - Signals: { 'open-state-changed': {} } -}, class PreviewMenu extends St.Widget { - - _init(panel) { - super._init({ layout_manager: new Clutter.BinLayout() }); - - let geom = panel.geom; - this.panel = panel; - this.currentAppIcon = null; - this._focusedPreview = null; - this._peekedWindow = null; - this.allowCloseWindow = true; - this.peekInitialWorkspaceIndex = -1; - this.opened = false; - this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT; - this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y'); - this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1); - this._translationOffset = Math.min(panel.dtpSize, MAX_TRANSLATION) * this._translationDirection; - - this.menu = new St.Widget({ - name: 'preview-menu', - layout_manager: new Clutter.BinLayout(), - reactive: true, - track_hover: true, - x_expand: true, - y_expand: true, - x_align: Clutter.ActorAlign[geom.position != St.Side.RIGHT ? 'START' : 'END'], - y_align: Clutter.ActorAlign[geom.position != St.Side.BOTTOM ? 'START' : 'END'] - }); - this._box = new St.BoxLayout({ vertical: this.isVertical }); - this._scrollView = new St.ScrollView({ - name: 'dashtopanelPreviewScrollview', - hscrollbar_policy: St.PolicyType.NEVER, - vscrollbar_policy: St.PolicyType.NEVER, - enable_mouse_scrolling: true, - y_expand: !this.isVertical - }); - - this._scrollView.add_child(this._box); - this.menu.add_child(this._scrollView); - this.add_child(this.menu); - } - - enable() { - this._timeoutsHandler = new Utils.TimeoutsHandler(); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - Main.layoutManager.addChrome(this, { affectsInputRegion: false }); - Main.layoutManager.trackChrome(this.menu, { affectsInputRegion: true }); - - this._resetHiddenState(); - this._refreshGlobals(); - this._updateClip(); - this.menu.set_position(1, 1); - - this._signalsHandler.add( - [ - this.menu, - 'notify::hover', - () => this._onHoverChanged() - ], - [ - this._scrollView, - 'scroll-event', - this._onScrollEvent.bind(this) - ], - [ - this.panel.panelBox, - 'style-changed', - () => this._updateClip() - ], - [ - Utils.DisplayWrapper.getScreen(), - 'in-fullscreen-changed', - () => { - if (global.display.focus_window && global.display.focus_window.is_fullscreen()) { - this.close(true); - } - } - ], - [ - SETTINGS, - [ - 'changed::panel-sizes', - 'changed::window-preview-size', - 'changed::window-preview-padding', - 'changed::window-preview-show-title' - ], - () => { - this._refreshGlobals(); - this._updateClip(); - } - ] - ); - } - - disable() { - this._timeoutsHandler.destroy(); - this._signalsHandler.destroy(); - - this.close(true); - - Main.layoutManager.untrackChrome(this.menu); - Main.layoutManager.removeChrome(this); - } - - requestOpen(appIcon) { - let timeout = SETTINGS.get_int('show-window-previews-timeout'); - - if (this.opened) { - timeout = Math.min(100, timeout); - } - - this._endOpenCloseTimeouts(); - this._timeoutsHandler.add([T1, timeout, () => this.open(appIcon)]); - } - - requestClose() { - this._endOpenCloseTimeouts(); - this._addCloseTimeout(); - } - - open(appIcon, preventCloseWindow) { - if (this.currentAppIcon != appIcon) { - this.currentAppIcon = appIcon; - this.allowCloseWindow = !preventCloseWindow; - - if (!this.opened) { - this._refreshGlobals(); - - this.set_height(this.clipHeight); - this.menu.show(); - - setStyle(this.menu, 'background: ' + Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, alphaBg)); - } - - this._mergeWindows(appIcon); - this._updatePosition(); - this._animateOpenOrClose(true); - - this._setReactive(true); - this._setOpenedState(true); - } - } - - close(immediate) { - this._endOpenCloseTimeouts(); - this._removeFocus(); - this._endPeek(); - - if (immediate) { - Utils.stopAnimations(this.menu); - this._resetHiddenState(); - } else { - this._animateOpenOrClose(false, () => this._resetHiddenState()); - } - - this._setReactive(false); - this.currentAppIcon = null; - } - - update(appIcon, windows) { - if (this.currentAppIcon == appIcon) { - if (windows && !windows.length) { - this.close(); - } else { - this._addAndRemoveWindows(windows); - this._updatePosition(); - } - } - } - - updatePosition() { - this._updatePosition(); - } - - focusNext() { - let previews = this._box.get_children(); - let currentIndex = this._focusedPreview ? previews.indexOf(this._focusedPreview) : -1; - let nextIndex = currentIndex + 1; - - nextIndex = previews[nextIndex] ? nextIndex : 0; - - if (previews[nextIndex]) { - this._removeFocus(); - previews[nextIndex].setFocus(true); - this._focusedPreview = previews[nextIndex]; - } - - return nextIndex; - } - - activateFocused() { - if (this.opened && this._focusedPreview) { - this._focusedPreview.activate(); - } - } - - requestPeek(window) { - this._timeoutsHandler.remove(T3); - - if (SETTINGS.get_boolean('peek-mode')) { - if (this.peekInitialWorkspaceIndex < 0) { - this._timeoutsHandler.add([T3, SETTINGS.get_int('enter-peek-mode-timeout'), () => this._peek(window)]); - } else { - this._peek(window); - } - } - } - - endPeekHere() { - this._endPeek(true); - } - - ensureVisible(preview) { - let [ , upper, pageSize] = this._getScrollAdjustmentValues(); - - if (upper > pageSize) { - this._timeoutsHandler.add([ - T4, - ENSURE_VISIBLE_MS, - () => Utils.ensureActorVisibleInScrollView(this._scrollView, preview, MIN_DIMENSION, () => this._updateScrollFade()) - ]); - } - } - - getCurrentAppIcon() { - return this.currentAppIcon; - } - - _setReactive(reactive) { - this._box.get_children().forEach(c => c.reactive = reactive); - this.menu.reactive = reactive; - } - - _setOpenedState(opened) { - this.opened = opened; - this.emit('open-state-changed'); - } - - _resetHiddenState() { - this.menu.hide(); - this.set_height(0); - this._setOpenedState(false); - this.menu.opacity = 0; - this.menu[this._translationProp] = this._translationOffset; - this._box.get_children().forEach(c => c.destroy()); - } - - _removeFocus() { - if (this._focusedPreview) { - this._focusedPreview.setFocus(false); - this._focusedPreview = null; - } - } - - _mergeWindows(appIcon, windows) { - windows = windows || (appIcon.window ? [appIcon.window] : appIcon.getAppIconInterestingWindows()); - windows.sort(Taskbar.sortWindowsCompareFunction); - - let currentPreviews = this._box.get_children(); - let l = Math.max(windows.length, currentPreviews.length); - - for (let i = 0; i < l; ++i) { - if (currentPreviews[i] && windows[i]) { - currentPreviews[i].assignWindow(windows[i], this.opened); - } else if (!currentPreviews[i]) { - this._addNewPreview(windows[i]); - } else if (!windows[i]) { - currentPreviews[i][!this.opened ? 'destroy' : 'animateOut'](); - } - } - } - - _addAndRemoveWindows(windows) { - let currentPreviews = this._box.get_children(); - - windows.sort(Taskbar.sortWindowsCompareFunction); - - for (let i = 0, l = windows.length; i < l; ++i) { - let currentIndex = Utils.findIndex(currentPreviews, c => c.window == windows[i]); - - if (currentIndex < 0) { - this._addNewPreview(windows[i]); - } else { - currentPreviews[currentIndex].assignWindow(windows[i]); - currentPreviews.splice(currentIndex, 1); - - if (this._peekedWindow && this._peekedWindow == windows[i]) { - this.requestPeek(windows[i]); - } - } - } - - currentPreviews.forEach(c => c.animateOut()); - } - - _addNewPreview(window) { - let preview = new Preview(this); - - this._box.add_child(preview); - preview.adjustOnStage(); - preview.assignWindow(window, this.opened); - } - - _addCloseTimeout() { - this._timeoutsHandler.add([T2, SETTINGS.get_int('leave-timeout'), () => this.close()]); - } - - _onHoverChanged() { - this._endOpenCloseTimeouts(); - - if (this.currentAppIcon && !this.menu.hover) { - this._addCloseTimeout(); - this._endPeek(); - } - } - - _onScrollEvent(actor, event) { - if (!event.is_pointer_emulated()) { - let vOrh = this.isVertical ? 'v' : 'h'; - let adjustment = this._scrollView['get_' + vOrh + 'scroll_bar']().get_adjustment(); - let increment = adjustment.step_increment; - let delta = increment; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - delta = -increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - delta = dy * increment; - delta += dx * increment; - break; - } - - adjustment.set_value(adjustment.get_value() + delta); - this._updateScrollFade(); - } - - return Clutter.EVENT_STOP; - } - - _endOpenCloseTimeouts() { - this._timeoutsHandler.remove(T1); - this._timeoutsHandler.remove(T2); - this._timeoutsHandler.remove(T4); - } - - _refreshGlobals() { - isLeftButtons = Meta.prefs_get_button_layout().left_buttons.indexOf(Meta.ButtonFunction.CLOSE) >= 0; - isTopHeader = SETTINGS.get_string('window-preview-title-position') == 'TOP'; - isManualStyling = SETTINGS.get_boolean('window-preview-manual-styling'); - scaleFactor = Utils.getScaleFactor(); - headerHeight = SETTINGS.get_boolean('window-preview-show-title') ? HEADER_HEIGHT * scaleFactor : 0; - animationTime = SETTINGS.get_int('window-preview-animation-time') * .001; - aspectRatio.x = { - size: SETTINGS.get_int('window-preview-aspect-ratio-x'), - fixed: SETTINGS.get_boolean('window-preview-fixed-x') - }; - aspectRatio.y = { - size: SETTINGS.get_int('window-preview-aspect-ratio-y'), - fixed: SETTINGS.get_boolean('window-preview-fixed-y') - }; - - alphaBg = SETTINGS.get_boolean('preview-use-custom-opacity') ? - SETTINGS.get_int('preview-custom-opacity') * .01 : - this.panel.dynamicTransparency.alpha; - } - - _updateClip() { - let x, y, w; - let geom = this.panel.getGeometry(); - let panelBoxTheme = this.panel.panelBox.get_theme_node(); - let previewSize = (SETTINGS.get_int('window-preview-size') + - SETTINGS.get_int('window-preview-padding') * 2) * scaleFactor; - - if (this.isVertical) { - w = previewSize; - this.clipHeight = this.panel.monitor.height; - y = this.panel.monitor.y; - } else { - w = this.panel.monitor.width; - this.clipHeight = (previewSize + headerHeight); - x = this.panel.monitor.x; - } - - if (geom.position == St.Side.LEFT) { - x = this.panel.monitor.x + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.LEFT); - } else if (geom.position == St.Side.RIGHT) { - x = this.panel.monitor.x + this.panel.monitor.width - (this.panel.dtpSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT); - } else if (geom.position == St.Side.TOP) { - y = this.panel.monitor.y + this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.TOP); - } else { //St.Side.BOTTOM - y = this.panel.monitor.y + this.panel.monitor.height - (this.panel.dtpSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight); - } - - Utils.setClip(this, x, y, w, this.clipHeight); - } - - _updatePosition() { - let sourceNode = this.currentAppIcon.get_theme_node(); - let sourceContentBox = sourceNode.get_content_box(this.currentAppIcon.get_allocation_box()); - let sourceAllocation = Utils.getTransformedAllocation(this.currentAppIcon); - let [previewsWidth, previewsHeight] = this._getPreviewsSize(); - let appIconMargin = SETTINGS.get_int('appicon-margin') / scaleFactor; - let x = 0, y = 0; - - previewsWidth = Math.min(previewsWidth, this.panel.monitor.width); - previewsHeight = Math.min(previewsHeight, this.panel.monitor.height); - this._updateScrollFade(previewsWidth < this.panel.monitor.width && previewsHeight < this.panel.monitor.height); - - if (this.isVertical) { - y = sourceAllocation.y1 + appIconMargin - this.panel.monitor.y + (sourceContentBox.y2 - sourceContentBox.y1 - previewsHeight) * .5; - y = Math.max(y, 0); - y = Math.min(y, this.panel.monitor.height - previewsHeight); - } else { - x = sourceAllocation.x1 + appIconMargin - this.panel.monitor.x + (sourceContentBox.x2 - sourceContentBox.x1 - previewsWidth) * .5; - x = Math.max(x, 0); - x = Math.min(x, this.panel.monitor.width - previewsWidth); - } - - if (!this.opened) { - this.menu.set_position(x, y); - this.menu.set_size(previewsWidth, previewsHeight); - } else { - Utils.animate(this.menu, getTweenOpts({ x: x, y: y, width: previewsWidth, height: previewsHeight })); - } - } - - _updateScrollFade(remove) { - let [value, upper, pageSize] = this._getScrollAdjustmentValues(); - let needsFade = Math.round(upper) > Math.round(pageSize); - let fadeWidgets = this.menu.get_children().filter(c => c != this._scrollView); - - if (!remove && needsFade) { - if (!fadeWidgets.length) { - fadeWidgets.push(this._getFadeWidget()); - fadeWidgets.push(this._getFadeWidget(true)); - - this.menu.add_child(fadeWidgets[0]); - this.menu.add_child(fadeWidgets[1]); - } - - fadeWidgets[0].visible = value > 0; - fadeWidgets[1].visible = value + pageSize < upper; - } else if (remove || (!needsFade && fadeWidgets.length)) { - fadeWidgets.forEach(fw => fw.destroy()); - } - } - - _getScrollAdjustmentValues() { - let [value , , upper, , , pageSize] = this._scrollView[(this.isVertical ? 'v' : 'h') + 'adjustment'].get_values(); - - return [value, upper, pageSize]; - } - - _getFadeWidget(end) { - let x = 0, y = 0; - let startBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, Math.min(alphaBg + .1, 1)); - let endBg = Utils.getrgbaColor(this.panel.dynamicTransparency.backgroundColorRgb, 0) - let fadeStyle = 'background-gradient-start:' + startBg + - 'background-gradient-end:' + endBg + - 'background-gradient-direction:' + this.panel.getOrientation(); - - if (this.isVertical) { - y = end ? this.panel.monitor.height - FADE_SIZE : 0; - } else { - x = end ? this.panel.monitor.width - FADE_SIZE : 0; - } - - let fadeWidget = new St.Widget({ - reactive: false, - pivot_point: new Graphene.Point({ x: .5, y: .5 }), - rotation_angle_z: end ? 180 : 0, - style: fadeStyle, - x: x, y: y, - width: this.isVertical ? this.width : FADE_SIZE, - height: this.isVertical ? FADE_SIZE : this.height - }); - - return fadeWidget; - } - - _getPreviewsSize() { - let previewsWidth = 0; - let previewsHeight = 0; - - this._box.get_children().forEach(c => { - if (!c.animatingOut) { - let [width, height] = c.getSize(); - - if (this.isVertical) { - previewsWidth = Math.max(width, previewsWidth); - previewsHeight += height; - } else { - previewsWidth += width; - previewsHeight = Math.max(height, previewsHeight); - } - } - }); - - return [previewsWidth, previewsHeight]; - } - - _animateOpenOrClose(show, onComplete) { - let isTranslationAnimation = this.menu[this._translationProp] != 0; - let tweenOpts = { - opacity: show ? 255 : 0, - transition: show ? 'easeInOutQuad' : 'easeInCubic', - onComplete: () => { - if (isTranslationAnimation) { - Main.layoutManager._queueUpdateRegions(); - } - - (onComplete || (() => {}))(); - } - }; - - tweenOpts[this._translationProp] = show ? this._translationDirection : this._translationOffset; - - Utils.animate(this.menu, getTweenOpts(tweenOpts)); - } - - _peek(window) { - let currentWorkspace = Utils.getCurrentWorkspace(); - let windowWorkspace = window.get_workspace(); - let focusWindow = () => this._focusMetaWindow(SETTINGS.get_int('peek-mode-opacity'), window); - - this._restorePeekedWindowStack(); - - if (this._peekedWindow && windowWorkspace != currentWorkspace) { - currentWorkspace.list_windows().forEach(mw => this.animateWindowOpacity(mw, null, 255)) - } - - this._peekedWindow = window; - - if (currentWorkspace != windowWorkspace) { - this._switchToWorkspaceImmediate(windowWorkspace.index()); - this._timeoutsHandler.add([T3, 100, focusWindow]); - } else { - focusWindow(); - } - - if (this.peekInitialWorkspaceIndex < 0) { - this.peekInitialWorkspaceIndex = currentWorkspace.index(); - } - } - - _endPeek(stayHere) { - this._timeoutsHandler.remove(T3); - - if (this._peekedWindow) { - let immediate = !stayHere && this.peekInitialWorkspaceIndex != Utils.getCurrentWorkspace().index(); - - this._restorePeekedWindowStack(); - this._focusMetaWindow(255, this._peekedWindow, immediate, true); - this._peekedWindow = null; - - if (!stayHere) { - this._switchToWorkspaceImmediate(this.peekInitialWorkspaceIndex); - } - - this.peekInitialWorkspaceIndex = -1; - } - } - - _switchToWorkspaceImmediate(workspaceIndex) { - let workspace = Utils.getWorkspaceByIndex(workspaceIndex); - let shouldAnimate = Main.wm._shouldAnimate; - - if (!workspace || (!workspace.list_windows().length && - workspaceIndex < Utils.getWorkspaceCount() - 1)) { - workspace = Utils.getCurrentWorkspace(); - } - - Main.wm._shouldAnimate = () => false; - workspace.activate(global.display.get_current_time_roundtrip()); - Main.wm._shouldAnimate = shouldAnimate; - } - - _focusMetaWindow(dimOpacity, window, immediate, ignoreFocus) { - window.get_workspace().list_windows().forEach(mw => { - let wa = mw.get_compositor_private(); - let isFocused = !ignoreFocus && mw == window; - - if (wa) { - if (isFocused) { - mw[PEEK_INDEX_PROP] = wa.get_parent().get_children().indexOf(wa); - wa.get_parent().set_child_above_sibling(wa, null); - } - - if (isFocused && mw.minimized) { - wa.show(); - } - - this.animateWindowOpacity(mw, wa, isFocused ? 255 : dimOpacity, immediate) - } - }); - } - - animateWindowOpacity(metaWindow, windowActor, opacity, immediate) { - windowActor = windowActor || metaWindow.get_compositor_private(); - - if (windowActor && !metaWindow.minimized) { - let tweenOpts = getTweenOpts({ opacity }); - - if (immediate && !metaWindow.is_on_all_workspaces()) { - tweenOpts.time = 0; - } - - Utils.animateWindowOpacity(windowActor, tweenOpts); - } - } - - _restorePeekedWindowStack() { - let windowActor = this._peekedWindow ? this._peekedWindow.get_compositor_private() : null; - - if (windowActor) { - if (this._peekedWindow.hasOwnProperty(PEEK_INDEX_PROP)) { - windowActor.get_parent().set_child_at_index(windowActor, this._peekedWindow[PEEK_INDEX_PROP]); - delete this._peekedWindow[PEEK_INDEX_PROP]; - } - - if (this._peekedWindow.minimized) { - windowActor.hide(); - } - } - } -}); - -export const Preview = GObject.registerClass({ -}, class Preview extends St.Widget { - - _init(previewMenu) { - super._init({ - style_class: 'preview-container', - reactive: true, - track_hover: true, - layout_manager: new Clutter.BinLayout() - }); - - this.window = null; - this._waitWindowId = 0; - this._needsCloseButton = true; - this.cloneWidth = this.cloneHeight = 0; - this._previewMenu = previewMenu; - this._padding = SETTINGS.get_int('window-preview-padding') * scaleFactor; - this._previewDimensions = this._getPreviewDimensions(); - this.animatingOut = false; - - let box = new St.Widget({ layout_manager: new Clutter.BoxLayout({ orientation: Clutter.Orientation.VERTICAL }), y_expand: true }); - let [previewBinWidth, previewBinHeight] = this._getBinSize(); - let closeButton = new St.Button({ style_class: 'window-close', accessible_name: 'Close window' }); - - closeButton.add_child(new St.Icon({ icon_name: 'window-close-symbolic' })); - - this._closeButtonBin = new St.Widget({ - style_class: 'preview-close-btn-container', - layout_manager: new Clutter.BinLayout(), - opacity: 0, - x_expand: true, y_expand: true, - x_align: Clutter.ActorAlign[isLeftButtons ? 'START' : 'END'], - y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] - }); - - this._closeButtonBin.add_child(closeButton); - - this._previewBin = new St.Widget({ - layout_manager: new Clutter.BinLayout(), - x_expand: true, y_expand: true, - style: 'padding: ' + this._padding / scaleFactor + 'px;' - }); - - this._previewBin.set_size(previewBinWidth, previewBinHeight); - - box.add_child(this._previewBin); - - if (headerHeight) { - let headerBox = new St.Widget({ - style_class: 'preview-header-box', - layout_manager: new Clutter.BoxLayout(), - x_expand: true, - y_align: Clutter.ActorAlign[isTopHeader ? 'START' : 'END'] - }); - - setStyle(headerBox, this._getBackgroundColor(HEADER_COLOR_OFFSET, 1)); - this._workspaceIndicator = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); - this._windowTitle = new St.Label({ y_align: Clutter.ActorAlign.CENTER, x_expand: true }); - - this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() }); - this._iconBin.set_size(headerHeight, headerHeight); - - headerBox.add_child(this._iconBin); - headerBox.insert_child_at_index(this._workspaceIndicator, isLeftButtons ? 0 : 1); - headerBox.insert_child_at_index(this._windowTitle, isLeftButtons ? 1 : 2); - - box.insert_child_at_index(headerBox, isTopHeader ? 0 : 1); - } - - this.add_child(box); - this.add_child(this._closeButtonBin); - - closeButton.connect('clicked', () => this._onCloseBtnClick()); - this.connect('notify::hover', () => this._onHoverChanged()); - this.connect('button-release-event', (actor, e) => this._onButtonReleaseEvent(e)); - this.connect('destroy', () => this._onDestroy()); - } - - adjustOnStage() { - let closeButton = this._closeButtonBin.get_first_child(); - let closeButtonHeight = closeButton.height; - let maxCloseButtonSize = MAX_CLOSE_BUTTON_SIZE * scaleFactor; - let closeButtonBorderRadius = ''; - - if (closeButtonHeight > maxCloseButtonSize) { - closeButtonHeight = maxCloseButtonSize; - closeButton.set_size(closeButtonHeight, closeButtonHeight); - } - - if (!headerHeight) { - closeButtonBorderRadius = 'border-radius: '; - - if (isTopHeader) { - closeButtonBorderRadius += (isLeftButtons ? '0 0 4px 0;' : '0 0 0 4px;'); - } else { - closeButtonBorderRadius += (isLeftButtons ? '0 4px 0 0;' : '4px 0 0 0;'); - } - } - - setStyle( - this._closeButtonBin, - 'padding: ' + (headerHeight ? Math.round((headerHeight - closeButtonHeight) * .5 / scaleFactor) : 4) + 'px;' + - this._getBackgroundColor(HEADER_COLOR_OFFSET, headerHeight ? 1 : .6) + - closeButtonBorderRadius - ); - } - - assignWindow(window, animateSize) { - if (this.window != window) { - let _assignWindowClone = () => { - if (window.get_compositor_private()) { - let cloneBin = this._getWindowCloneBin(window); - - this._resizeClone(cloneBin, window); - this._addClone(cloneBin, animateSize); - this._previewMenu.updatePosition(); - } else if (!this._waitWindowId) { - this._waitWindowId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - this._waitWindowId = 0; - - if (this._previewMenu.opened) { - _assignWindowClone(); - } - - return GLib.SOURCE_REMOVE; - }); - } - }; - - _assignWindowClone(); - } - - this._cancelAnimateOut(); - this._removeWindowSignals(); - this.window = window; - this._needsCloseButton = this._previewMenu.allowCloseWindow && window.can_close() && !Utils.checkIfWindowHasTransient(window); - this._updateHeader(); - } - - animateOut() { - if (!this.animatingOut) { - let tweenOpts = getTweenOpts({ opacity: 0, width: 0, height: 0, onComplete: () => this.destroy() }); - - this.animatingOut = true; - - Utils.stopAnimations(this); - Utils.animate(this, tweenOpts); - } - } - - getSize() { - let [binWidth, binHeight] = this._getBinSize(); - - binWidth = Math.max(binWidth, this.cloneWidth + this._padding * 2); - binHeight = Math.max(binHeight, this.cloneHeight + this._padding * 2) + headerHeight; - - return [binWidth, binHeight]; - } - - setFocus(focused) { - this._hideOrShowCloseButton(!focused); - setStyle(this, this._getBackgroundColor(FOCUSED_COLOR_OFFSET, focused ? '-' : 0)); - - if (focused) { - this._previewMenu.ensureVisible(this); - this._previewMenu.requestPeek(this.window); - } - } - - activate() { - this._previewMenu.endPeekHere(); - this._previewMenu.close(); - Main.activateWindow(this.window); - } - - _onDestroy() { - if (this._waitWindowId) { - GLib.source_remove(this._waitWindowId); - this._waitWindowId = 0; - } - - this._removeWindowSignals(); - } - - _onHoverChanged() { - this.setFocus(this.hover); - } - - _onCloseBtnClick() { - this._hideOrShowCloseButton(true); - this.reactive = false; - - if (!SETTINGS.get_boolean('group-apps')) { - this._previewMenu.close(); - } else { - this._previewMenu.endPeekHere(); - } - - this.window.delete(global.get_current_time()); - } - - _onButtonReleaseEvent(e) { - switch (e.get_button()) { - case 1: // Left click - this.activate(); - break; - case 2: // Middle click - if (SETTINGS.get_boolean('preview-middle-click-close')) { - this._onCloseBtnClick(); - } - break; - case 3: // Right click - this._showContextMenu(e); - break; - } - - return Clutter.EVENT_STOP; - } - - _cancelAnimateOut() { - if (this.animatingOut) { - this.animatingOut = false; - - Utils.stopAnimations(this); - Utils.animate(this, getTweenOpts({ opacity: 255, width: this.cloneWidth, height: this.cloneHeight })); - } - } - - _showContextMenu(e) { - let coords = e.get_coords(); - let currentWorkspace = this._previewMenu.peekInitialWorkspaceIndex < 0 ? - Utils.getCurrentWorkspace() : - Utils.getWorkspaceByIndex(this._previewMenu.peekInitialWorkspaceIndex); - - Main.wm._showWindowMenu(null, this.window, Meta.WindowMenuType.WM, { - x: coords[0], - y: coords[1], - width: 0, - height: 0 - }); - - let menu = Main.wm._windowMenuManager._manager._menus[0]; - - menu.connect('open-state-changed', () => this._previewMenu.menu.sync_hover()); - this._previewMenu.menu.sync_hover(); - - if (this.window.get_workspace() != currentWorkspace) { - let menuItem = new PopupMenu.PopupMenuItem(_('Move to current Workspace') + ' [' + (currentWorkspace.index() + 1) + ']'); - let menuItems = menu.box.get_children(); - let insertIndex = Utils.findIndex(menuItems, c => c._delegate instanceof PopupMenu.PopupSeparatorMenuItem); - - insertIndex = insertIndex >= 0 ? insertIndex : menuItems.length - 1; - menu.addMenuItem(menuItem, insertIndex); - menuItem.connect('activate', () => this.window.change_workspace(currentWorkspace)); - } - } - - _removeWindowSignals() { - if (this._titleWindowChangeId) { - this.window.disconnect(this._titleWindowChangeId); - this._titleWindowChangeId = 0; - } - } - - _updateHeader() { - if (headerHeight) { - let iconTextureSize = SETTINGS.get_boolean('window-preview-use-custom-icon-size') ? - SETTINGS.get_int('window-preview-custom-icon-size') : - headerHeight / scaleFactor * .6; - let icon = this._previewMenu.getCurrentAppIcon().app.create_icon_texture(iconTextureSize); - let workspaceIndex = ''; - let workspaceStyle = null; - let fontScale = DESKTOPSETTINGS.get_double('text-scaling-factor'); - let commonTitleStyles = 'color: ' + SETTINGS.get_string('window-preview-title-font-color') + ';' + - 'font-size: ' + SETTINGS.get_int('window-preview-title-font-size') * fontScale + 'px;' + - 'font-weight: ' + SETTINGS.get_string('window-preview-title-font-weight') + ';'; - - this._iconBin.destroy_all_children(); - this._iconBin.add_child(icon); - - if (!SETTINGS.get_boolean('isolate-workspaces')) { - workspaceIndex = (this.window.get_workspace().index() + 1).toString(); - workspaceStyle = 'margin: 0 4px 0 ' + (isLeftButtons ? Math.round((headerHeight - icon.width) * .5) + 'px' : '0') + '; padding: 0 4px;' + - 'border: 2px solid ' + this._getRgbaColor(FOCUSED_COLOR_OFFSET, .8) + 'border-radius: 2px;' + commonTitleStyles; - } - - this._workspaceIndicator.text = workspaceIndex; - setStyle(this._workspaceIndicator, workspaceStyle); - - this._titleWindowChangeId = this.window.connect('notify::title', () => this._updateWindowTitle()); - setStyle(this._windowTitle, 'max-width: 0px; padding-right: 4px;' + commonTitleStyles); - this._updateWindowTitle(); - } - } - - _updateWindowTitle() { - this._windowTitle.text = this.window.title; - } - - _hideOrShowCloseButton(hide) { - if (this._needsCloseButton) { - Utils.animate(this._closeButtonBin, getTweenOpts({ opacity: hide ? 0 : 255 })); - } - } - - _getBackgroundColor(offset, alpha) { - return 'background-color: ' + this._getRgbaColor(offset, alpha) + - 'transition-duration:' + this._previewMenu.panel.dynamicTransparency.animationDuration; - } - - _getRgbaColor(offset, alpha) { - alpha = Math.abs(alpha); - - if (isNaN(alpha)) { - alpha = alphaBg; - } - - return Utils.getrgbaColor(this._previewMenu.panel.dynamicTransparency.backgroundColorRgb, alpha, offset); - } - - _addClone(newCloneBin, animateSize) { - let currentClones = this._previewBin.get_children(); - let newCloneOpts = getTweenOpts({ opacity: 255 }); - - this._previewBin.add_child(newCloneBin); - - if (currentClones.length) { - let currentCloneBin = currentClones.pop(); - let currentCloneOpts = getTweenOpts({ opacity: 0, onComplete: () => currentCloneBin.destroy() }); - - if (newCloneBin.width > currentCloneBin.width) { - newCloneOpts.width = newCloneBin.width; - newCloneBin.width = currentCloneBin.width; - } else { - currentCloneOpts.width = newCloneBin.width; - } - - if (newCloneBin.height > currentCloneBin.height) { - newCloneOpts.height = newCloneBin.height; - newCloneBin.height = currentCloneBin.height; - } else { - currentCloneOpts.height = newCloneBin.height; - } - - currentClones.forEach(c => c.destroy()); - Utils.animate(currentCloneBin, currentCloneOpts); - } else if (animateSize) { - newCloneBin.width = 0; - newCloneBin.height = 0; - newCloneOpts.width = this.cloneWidth; - newCloneOpts.height = this.cloneHeight; - } - - Utils.animate(newCloneBin, newCloneOpts); - } - - _getWindowCloneBin(window) { - let frameRect = window.get_frame_rect(); - let bufferRect = window.get_buffer_rect(); - let clone = new Clutter.Clone({ source: window.get_compositor_private() }); - let cloneBin = new St.Widget({ - opacity: 0, - layout_manager: frameRect.width != bufferRect.width || - frameRect.height != bufferRect.height ? - new WindowCloneLayout(frameRect, bufferRect) : - new Clutter.BinLayout() - }); - - cloneBin.add_child(clone); - - return cloneBin; - } - - _getBinSize() { - let [fixedWidth, fixedHeight] = this._previewDimensions; - - return [ - aspectRatio.x.fixed ? fixedWidth + this._padding * 2 : -1, - aspectRatio.y.fixed ? fixedHeight + this._padding * 2 : -1 - ]; - } - - _resizeClone(cloneBin, window) { - let frameRect = cloneBin.layout_manager.frameRect || window.get_frame_rect(); - let [fixedWidth, fixedHeight] = this._previewDimensions; - let ratio = Math.min(fixedWidth / frameRect.width, fixedHeight / frameRect.height, 1); - let cloneWidth = frameRect.width * ratio; - let cloneHeight = frameRect.height * ratio; - - let clonePaddingTB = cloneHeight < MIN_DIMENSION ? MIN_DIMENSION - cloneHeight : 0; - let clonePaddingLR = cloneWidth < MIN_DIMENSION ? MIN_DIMENSION - cloneWidth : 0; - let clonePaddingTop = clonePaddingTB * .5; - let clonePaddingLeft = clonePaddingLR * .5; - - this.cloneWidth = cloneWidth + clonePaddingLR * scaleFactor; - this.cloneHeight = cloneHeight + clonePaddingTB * scaleFactor; - - cloneBin.set_style('padding: ' + clonePaddingTop + 'px ' + clonePaddingLeft + 'px;'); - cloneBin.layout_manager.ratio = ratio; - cloneBin.layout_manager.padding = [clonePaddingLeft * scaleFactor, clonePaddingTop * scaleFactor]; - - cloneBin.get_first_child().set_size(cloneWidth, cloneHeight); - } - - _getPreviewDimensions() { - let size = SETTINGS.get_int('window-preview-size') * scaleFactor; - let w, h; - - if (this._previewMenu.isVertical) { - w = size; - h = w * aspectRatio.y.size / aspectRatio.x.size; - } else { - h = size; - w = h * aspectRatio.x.size / aspectRatio.y.size; - } - - return [w, h]; - } -}); - -export const WindowCloneLayout = GObject.registerClass({ -}, class WindowCloneLayout extends Clutter.BinLayout { - - _init(frameRect, bufferRect) { - super._init(); - - //the buffer_rect contains the transparent padding that must be removed - this.frameRect = frameRect; - this.bufferRect = bufferRect; - } - - vfunc_allocate(actor, box) { - let [width, height] = box.get_size(); - - box.set_origin( - (this.bufferRect.x - this.frameRect.x) * this.ratio + this.padding[0], - (this.bufferRect.y - this.frameRect.y) * this.ratio + this.padding[1] - ); - - box.set_size( - width + (this.bufferRect.width - this.frameRect.width) * this.ratio, - height + (this.bufferRect.height - this.frameRect.height) * this.ratio - ); - - actor.get_first_child().allocate(box); - } -}); - -export function setStyle(actor, style) { - if (!isManualStyling) { - actor.set_style(style); - } -} - -export function getTweenOpts(opts) { - let defaults = { - time: animationTime, - transition: 'easeInOutQuad' - }; - - return Utils.mergeObjects(opts || {}, defaults); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/LICENSE b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/LICENSE deleted file mode 100644 index f288702d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/extension.js deleted file mode 100644 index 8e1a136c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/extension.js +++ /dev/null @@ -1,483 +0,0 @@ -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; -import Clutter from 'gi://Clutter'; -import St from 'gi://St'; -import Cairo from 'gi://cairo'; - -import { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -const Pie = GObject.registerClass({ - Properties: { - 'angle': GObject.ParamSpec.double( - 'angle', 'angle', 'angle', - GObject.ParamFlags.READWRITE, - 0, 2 * Math.PI, 0), - }, -}, class Pie extends St.DrawingArea { - _init() { - this._angle = 0; - this._outerBorder = true; - super._init({ - style_class: 'pie', - visible: false, - }); - } - - get angle() { - return this._angle; - } - - set_angle(angle) { - if (this._angle === angle) - return; - - this._angle = angle; - this.notify('angle'); - this.queue_repaint(); - } - - calculate_styles(width, height, outerBorder) { - let min = Math.min(width, height); - min += 0.5; - this.style = 'width: ' + min + 'em; ' + 'height: ' + min + 'em;'; - this._outerBorder = outerBorder; - } - - vfunc_repaint() { - let node = this.get_theme_node(); - let fillColor = node.get_color('-pie-color'); - let bgColor = node.get_color('-pie-background-color'); - let borderColor = node.get_color('-pie-border-color'); - let borderWidth = node.get_length('-pie-border-width'); - let [width, height] = this.get_surface_size(); - let radius = Math.min(width / 2, height / 2); - - let startAngle = 3 * Math.PI / 2; - let endAngle = startAngle + this._angle; - - let cr = this.get_context(); - cr.setLineCap(Cairo.LineCap.ROUND); - cr.setLineJoin(Cairo.LineJoin.ROUND); - cr.translate(width / 2, height / 2); - - if (this._angle < 2 * Math.PI) - cr.moveTo(0, 0); - - cr.arc(0, 0, radius - borderWidth * (this._outerBorder ? 2.6 : 1), startAngle, endAngle); - - if (this._angle < 2 * Math.PI) - cr.lineTo(0, 0); - - cr.closePath(); - - cr.setLineWidth(0); - cr.setSourceColor(fillColor); - cr.fill(); - - if (!this._outerBorder) { - cr.moveTo(0, 0); - - if (this._angle >= 2 * Math.PI || this._angle >= 0) { - cr.arc(0, 0, radius - borderWidth, startAngle, startAngle - 0.000000000001); - } else { - cr.arc(0, 0, radius - borderWidth, endAngle, startAngle); - } - - cr.lineTo(0, 0); - - cr.closePath(); - - cr.setLineWidth(0); - cr.setSourceColor(bgColor); - cr.fill(); - } - - // Draw outer border - if (this._outerBorder) { - cr.arc(0, 0, radius - borderWidth, startAngle, startAngle + 2 * Math.PI); - - cr.setLineWidth(borderWidth); - cr.setSourceColor(borderColor); - cr.stroke(); - } - - cr.$dispose(); - } -}); - -export default class DayProgress extends Extension { - enable() { - // Uncomment for easier debug - // global.dayprogress = this; - - // Get if using GNOME classic - this.isUsingClassic = GLib.getenv('GNOME_SHELL_SESSION_MODE') == "classic"; - - // Light styles - this.colorSchemeSettings = new Gio.Settings({ - schema_id: 'org.gnome.desktop.interface', - }); - - this.lightColorScheme = this.colorSchemeSettings.get_string('color-scheme') == 'prefer-light'; - - // Create a panel button - this._indicator = new PanelMenu.Button(0.5, this.metadata.name, false); - - // Get settings - this._settings = this.getSettings(); - - // Get show elapsed key - this.showElapsed = this._settings.get_boolean('show-elapsed'); - - // Width - this.width = this._settings.get_int('width') / 5; - - // Height - this.height = this._settings.get_int('height') / 10; - - // Create UI elements - this.box = new St.BoxLayout({ - // style: `border-width: 1px; border-color: rgba(220, 220, 220, 1); height: 20px; border-radius: 10px; background-color: rgb(255, 255, 255); width: 40px;`, // border-width: 1px; border-color: rgba(220, 220, 220, 1); height: 10px; border-radius: 10px; background-color: rgba(255, 255, 255, 0.2) - xAlign: Clutter.ActorAlign.CENTER, - xExpand: false, - yAlign: Clutter.ActorAlign.CENTER, - yExpand: false, - }); - - this.container = new St.Bin({ - reactive: false, - trackHover: false, - canFocus: false, - xExpand: true, - yExpand: true, - xAlign: Clutter.ActorAlign.CENTER, - yAlign: Clutter.ActorAlign.CENTER, - style: ``, // width: 2.5em; height: 0.85em; background-color: rgba(255, 255, 255, 0.0); border-radius: 1em; border-width: 0.1em; overflow: hidden; - styleClass: this.isUsingClassic || this.lightColorScheme ? 'container-classic' : 'container', - }); - - this.pie = new Pie(); - - this.border = new St.Bin({ - reactive: false, - trackHover: false, - canFocus: false, - xExpand: true, - yExpand: true, - xAlign: Clutter.ActorAlign.CENTER, - yAlign: Clutter.ActorAlign.CENTER, - styleClass: 'border', - }); - - this.bar = new St.Bin({ - styleClass: this.isUsingClassic || this.lightColorScheme ? 'bar-classic' : 'bar', - yExpand: true, - yAlign: Clutter.ActorAlign.CENTER, - xAlign: Clutter.ActorAlign.START, - xExpand: true, - }); - - this.box.add_child(this.container); - this.box.add_child(this.pie); - this.container.add_child(this.border); - this.border.add_child(this.bar); - this._indicator.add_child(this.box); - - this.menuElapsedContainer = new PopupMenu.PopupBaseMenuItem({ reactive: false }); - this.elapsedLabel = new St.Label({ - text: 'Elapsed', - xAlign: Clutter.ActorAlign.START, - xExpand: true, - styleClass: 'label', - }); - this.elapsedValue = new St.Label({ - text: '', - }); - this.menuElapsedContainer.add_child(this.elapsedLabel); - this.menuElapsedContainer.add_child(this.elapsedValue); - - this.menuRemainingContainer = new PopupMenu.PopupBaseMenuItem({ reactive: false }); - this.remainingLabel = new St.Label({ - text: 'Remaining', - xAlign: Clutter.ActorAlign.START, - xExpand: true, - styleClass: 'label', - }); - this.remainingValue = new St.Label({ - text: '', - }); - this.menuRemainingContainer.add_child(this.remainingLabel); - this.menuRemainingContainer.add_child(this.remainingValue); - - // Add the indicator to the panel - Main.panel.addToStatusArea(this.uuid, this._indicator); - - // Show elapsed - this.showElapsedHandle = this._settings.connect('changed::show-elapsed', (settings, key) => { - this.showElapsed = settings.get_boolean(key); - this.updateBar(); - }); - - // Width - this.widthHandle = this._settings.connect('changed::width', (settings, key) => { - this.width = settings.get_int(key) / 5; - this.calculateStyles(); - this.updateBar(); - }); - - // Height - this.heightHandle = this._settings.connect('changed::height', (settings, key) => { - this.height = settings.get_int(key) / 10; - this.calculateStyles(); - this.updateBar(); - }); - - // Style - this.style = this._settings.get_int('style'); - this.circular = this.style == 1; - this.styleHandle = this._settings.connect('changed::style', (settings, key) => { - this.style = settings.get_int(key); - this.circular = this.style == 1; - this.calculateStyles(); - }); - - // Start time - this.startHour = this._settings.get_int('start-hour'); - this.startHourHandle = this._settings.connect('changed::start-hour', (settings, key) => { - this.startHour = settings.get_int(key); - this.updateBar(); - }); - - this.startMinute = this._settings.get_int('start-minute'); - this.startMinuteHandle = this._settings.connect('changed::start-minute', (settings, key) => { - this.startMinute = settings.get_int(key); - this.updateBar(); - }); - - // Reset times - this.resetHour = this._settings.get_int('reset-hour'); - this.resetHourHandle = this._settings.connect('changed::reset-hour', (settings, key) => { - this.resetHour = settings.get_int(key); - this.updateBar(); - }); - - this.resetMinute = this._settings.get_int('reset-minute'); - this.resetMinuteHandle = this._settings.connect('changed::reset-minute', (settings, key) => { - this.resetMinute = settings.get_int(key); - this.updateBar(); - }); - - // Panel position - this.panelPosition = this._settings.get_int('panel-position'); - this.panelPositionHandle = this._settings.connect('changed::panel-position', (settings, key) => { - this.panelPosition = settings.get_int(key); - this.applyPosition(); - }); - - this.panelIndex = this._settings.get_int('panel-index'); - this.panelIndexHandle = this._settings.connect('changed::panel-index', (settings, key) => { - this.panelIndex = settings.get_int(key); - this.applyPosition(); - }); - - this.applyPosition(); - this.calculateStyles(); - - // Update bar now to immediately populate it - this.updateBar(); - - // Light styles - this.colorSchemeChanged(); - - this.timerID = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 10, () => { - this.updateBar(); - return GLib.SOURCE_CONTINUE; - }); - - this._indicator.menu.addMenuItem(this.menuElapsedContainer); - this._indicator.menu.addMenuItem(this.menuRemainingContainer); - // Add a menu item to open the preferences window - this._indicator.menu.addAction(_('Preferences'), - () => this.openPreferences()); - } - - // Support for light panel through extensions such as Light Style - colorSchemeChanged() { - this.lightColorScheme = this.colorSchemeSettings.get_string('color-scheme') == 'prefer-light'; - this.container.styleClass = this.isUsingClassic || this.lightColorScheme ? 'container-classic' : 'container'; - this.bar.styleClass = this.isUsingClassic || this.lightColorScheme ? 'bar-classic' : 'bar'; - this.pie.style_class = this.isUsingClassic || this.lightColorScheme ? 'pie-classic' : 'pie'; - this.pie.calculate_styles(this.width, this.height, this.style == 2); - } - - calculateStyles() { - this.container.style = `width: ` + this.width + `em; ` + `height: ` + this.height + `em; ` + 'border-radius: ' + (this.circular ? 1 : 0.3) + 'em;'; - this.border.style = `width: ` + this.width + `em; ` + `height: ` + this.height + `em; ` + 'border-radius: ' + (this.circular ? 1 : 0.3) + 'em;'; - this.pie.calculate_styles(this.width, this.height, this.style == 2); - this.container.visible = (this.style == 0 || this.style == 1); - this.pie.visible = (this.style == 2 || this.style == 3); - this.updateBar(); - } - - // Update the bar - updateBar() { - // TODO: convert this to a listener - this.colorSchemeChanged(); - - const localDateTime = GLib.DateTime.new_now_local(); - // Start time as a fraction of the day - const startTimeFraction = this.startHour / 24 + this.startMinute / (60 * 24); - // End time as a fraction of the day - const endTimeFraction = this.resetHour / 24 + this.resetMinute / (60 * 24); - - const percentElapsedOfPeriod = (() => { - // Current time as a fraction of the day - const currentTimeFraction = (localDateTime.get_hour() + localDateTime.get_minute() / 60 + localDateTime.get_second() / 3600) / 24; - - // No midnight wrap around - if (endTimeFraction > startTimeFraction) { - return mapNumber(clamp(currentTimeFraction, startTimeFraction, endTimeFraction), startTimeFraction, endTimeFraction, 0, 1); - } - - // There is midnight wrap around - if (currentTimeFraction >= endTimeFraction && currentTimeFraction < startTimeFraction) return 1; - const durationFraction = (1 - (startTimeFraction - endTimeFraction)); - const offset = 1 - startTimeFraction; - const offsettedTimeFraction = (currentTimeFraction + 1 + offset) % 1; - return mapNumber(clamp(offsettedTimeFraction, 0, durationFraction), 0, durationFraction, 0, 1); - })(); - const percentRemainingOfPeriod = 1 - percentElapsedOfPeriod; - this.bar.style = `width: ` + mapNumber(this.showElapsed ? percentElapsedOfPeriod : percentRemainingOfPeriod, 0, 1, 0.0, this.width - 0.15) + - `em; ` + `height: ` + this.height + `em; ` + 'border-radius: ' + (this.circular ? 1 : 0.15) + 'em;'; // Needs to be 0.15, half of border curve as it is a smaller corner - this.updatePie((this.showElapsed ? percentElapsedOfPeriod : percentRemainingOfPeriod) * (Math.PI * 2.0)); - - const duration = endTimeFraction > startTimeFraction ? (endTimeFraction - startTimeFraction) : (1 - (startTimeFraction - endTimeFraction)); - const elapsedHours = Math.floor(percentElapsedOfPeriod * duration * 24); - const elapsedMinutes = Math.floor((percentElapsedOfPeriod * duration * 24 * 60) % 60); - const remainingHours = Math.floor(percentRemainingOfPeriod * duration * 24); - const remainingMinutes = Math.floor((percentRemainingOfPeriod * duration * 24 * 60) % 60); - this.elapsedValue.text = elapsedHours + 'h ' + elapsedMinutes + 'm' + ' | ' + Math.round(percentElapsedOfPeriod * 100) + '%'; - this.remainingValue.text = remainingHours + 'h ' + remainingMinutes + 'm' + ' | ' + Math.round(percentRemainingOfPeriod * 100) + '%'; - - this.applyPosition(); - } - - updatePie(angle) { - this.pie.set_angle(angle); - } - - // Mostly copied from Noiseclapper@JordanViknar - applyPosition() { - const boxes = { - left: Main.panel._leftBox, - center: Main.panel._centerBox, - right: Main.panel._rightBox, - }; - const position = this.panelPosition; - const index = this.panelIndex; - Main.panel._addToPanelBox(this.metadata.name, this._indicator, index, boxes[position === 0 ? 'left' : position === 1 ? 'center' : 'right']); - } - - disable() { - // Uncomment for easier debug - // delete global.dayprogress; - - if (this.timerID) { - GLib.Source.remove(this.timerID); - this.timerID = null; - } - - if (this.showElapsedHandle) { - this._settings.disconnect(this.showElapsedHandle); - this.showElapsedHandle = null; - } - if (this.widthHandle) { - this._settings.disconnect(this.widthHandle); - this.widthHandle = null; - } - if (this.heightHandle) { - this._settings.disconnect(this.heightHandle); - this.heightHandle = null; - } - if (this.styleHandle) { - this._settings.disconnect(this.styleHandle); - this.styleHandle = null; - } - if (this.startHourHandle) { - this._settings.disconnect(this.startHourHandle); - this.startHourHandle = null; - } - if (this.startMinuteHandle) { - this._settings.disconnect(this.startMinuteHandle); - this.startMinuteHandle = null; - } - if (this.resetHourHandle) { - this._settings.disconnect(this.resetHourHandle); - this.resetHourHandle = null; - } - if (this.resetMinuteHandle) { - this._settings.disconnect(this.resetMinuteHandle); - this.resetMinuteHandle = null; - } - if (this.panelPositionHandle) { - this._settings.disconnect(this.panelPositionHandle); - this.panelPositionHandle = null; - } - if (this.panelIndexHandle) { - this._settings.disconnect(this.panelIndexHandle); - this.panelIndexHandle = null; - } - - this.remainingValue?.destroy(); - this.remainingValue = null; - this.elapsedValue?.destroy(); - this.elapsedValue = null; - this.remainingLabel?.destroy(); - this.remainingLabel = null; - this.elapsedLabel?.destroy(); - this.elapsedLabel = null; - this.menuRemainingContainer?.destroy(); - this.menuRemainingContainer = null; - this.menuElapsedContainer?.destroy(); - this.menuElapsedContainer = null; - this.bar?.destroy(); - this.bar = null; - this.border?.destroy(); - this.border = null; - this.pie?.destroy(); - this.pie = null; - this.container?.destroy(); - this.container = null; - this.box?.destroy(); - this.box = null; - this._indicator?.destroy(); - this._indicator = null; - - this.showElapsed = null; - this.circular = null; - this.width = null; - this.height = null; - this.style = null; - this.startHour = null; - this.startMinute = null; - this.resetHour = null; - this.resetMinute = null; - this.panelPosition = null; - this.panelIndex = null; - - this._settings = null; - this.colorSchemeSettings = null; - } -} - -function mapNumber(number, inMin, inMax, outMin, outMax) { - return (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; -} - -function clamp(number, min, max) { - return Math.max(min, Math.min(number, max)); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/prefs.js deleted file mode 100644 index 6922dd7c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/prefs.js +++ /dev/null @@ -1,166 +0,0 @@ -import Gio from 'gi://Gio'; -import Adw from 'gi://Adw'; -import Gtk from 'gi://Gtk'; - -import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - - -export default class ExamplePreferences extends ExtensionPreferences { - fillPreferencesWindow(window) { - // Create a preferences page, with a single group - const page = new Adw.PreferencesPage({ - title: _('General'), - icon_name: 'dialog-information-symbolic', - }); - window.add(page); - - const appearance = new Adw.PreferencesGroup({ - title: _('Appearance'), - description: _('Configure the appearance of the extension'), - }); - page.add(appearance); - - const panelPosition = new Adw.PreferencesGroup({ - title: _('Panel position'), - description: _('Where on the panel the indicator will be displayed'), - }); - page.add(panelPosition); - - const startTime = new Adw.PreferencesGroup({ - title: _('Start time'), - description: _('The time at which the indicator starts'), - }); - page.add(startTime); - - const resetTime = new Adw.PreferencesGroup({ - title: _('Reset time'), - description: _('The time at which the indicator resets'), - }); - page.add(resetTime); - - // Elapsed - const elapsed = new Adw.SwitchRow({ - title: _('Time Elapsed'), - subtitle: _('Whether to show time elapsed instead of remaining'), - }); - appearance.add(elapsed); - - // Width - const width = new Adw.SpinRow({ - title: _("Width"), - subtitle: _('Width of the indicator (measured in fifth of an em), scales with font'), - adjustment: new Gtk.Adjustment({ - lower: 1, - upper: 150, - step_increment: 1 - }) - }); - appearance.add(width); - - // Height - const height = new Adw.SpinRow({ - title: _("Height"), - subtitle: _('Height of the indicator (measured in tenth of an em), scales with font'), - adjustment: new Gtk.Adjustment({ - lower: 2, - upper: 50, - step_increment: 1 - }) - }); - appearance.add(height); - - // Style - const styles = [_("Bar"), _("Circular bar (experimental)"), _("Pie"), _("Pie (no border)")]; - let styleOptionsList = new Gtk.StringList(); - styles.forEach((it) => { - styleOptionsList.append(it); - }); - const styleRow = new Adw.ComboRow({ - title: _("Indicator style"), - subtitle: _("How the indicator is displayed"), - model: styleOptionsList - }); - appearance.add(styleRow); - - // Start time - const startHour = new Adw.SpinRow({ - title: _("Hours"), - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 23, - step_increment: 1 - }) - }); - startTime.add(startHour); - const startMinute = new Adw.SpinRow({ - title: _("Minutes"), - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 59, - step_increment: 1 - }) - }); - startTime.add(startMinute); - - // Reset time - const resetHour = new Adw.SpinRow({ - title: _("Hours"), - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 23, - step_increment: 1 - }) - }); - resetTime.add(resetHour); - const resetMinute = new Adw.SpinRow({ - title: _("Minutes"), - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 59, - step_increment: 1 - }) - }); - resetTime.add(resetMinute); - - // Panel position - const positions = [_("Left"), _("Centre"), _("Right")]; - let optionsList = new Gtk.StringList(); - positions.forEach((it) => { - optionsList.append(it); - }); - const positionRow = new Adw.ComboRow({ - title: _("Position"), - subtitle: _("The side of the panel it is on"), - model: optionsList - }); - panelPosition.add(positionRow); - - // Panel index - const panelIndex = new Adw.SpinRow({ - title: _("Index"), - subtitle: _("How far along the panel area it is"), - adjustment: new Gtk.Adjustment({ - lower: -128, - upper: 127, - step_increment: 1 - }) - }); - panelPosition.add(panelIndex); - - // Bind - window._settings = this.getSettings(); - window._settings.bind('show-elapsed', elapsed, 'active', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('width', width, 'value', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('height', height, 'value', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('style', styleRow, 'selected', Gio.SettingsBindFlags.DEFAULT); - - window._settings.bind('start-hour', startHour, 'value', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('start-minute', startMinute, 'value', Gio.SettingsBindFlags.DEFAULT); - - window._settings.bind('reset-hour', resetHour, 'value', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('reset-minute', resetMinute, 'value', Gio.SettingsBindFlags.DEFAULT); - - window._settings.bind('panel-position', positionRow, 'selected', Gio.SettingsBindFlags.DEFAULT); - window._settings.bind('panel-index', panelIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/private_metadata.json deleted file mode 100644 index 4326a079..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/private_metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Displays a (somewhat) customisable progress bar of your day in the top panel to help you track your time.", - "name": "Day Progress", - "settings-schema": "org.gnome.shell.extensions.day-progress", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/ArcaEge/day-progress", - "uuid": "day-progress@arcaege.github.io", - "version": 19 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/schemas/gschemas.compiled deleted file mode 100644 index 95abf38c06e7b9fb32736287210a8f6c5bb7640a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmZ8gzfTlF7#)N|veMfs6vp{<3D z1qCr+VbsJwfW!i0XJf2vY^-c-u)_CtZgh{yy?yWAe)oOz%{O=JPF$)uGorsPf$v)F zopL6)aY2Y2(C(Bo5s1uo{q3jx&X_aR> zY{$KzDDzG!wML}yCi$!_)*kL-6nwgmG4OZ|UyfIn_?$dhRlPYWg$a z7I3h!*<>Ho4fr>~DRBM6{CmbzpM}2-ehJ*@?);%o-Gsjn{s_E!w>w3jnt48fe*hQX z#+6S^|0j4DjXXb^Ib=LF_cH~a1HM1~Iz*p(6#hJTiMW0Ej6U@^{1xy+z|DbLh(+-T zybrYQU-1}EeID@#;LpJ3?$tN+shQ^+_&1=Fd_9n9Txi*5CXC>ok7-B~tg39yNNZNl zvaefYPkB90Dc|?QA~s2cAxG7aqiV>}{~<^9Ax9`##Frymv1K-)qxLt9D!+v|q2IOcX - - - - false - - - 15 - - - - 9 - - - - 0 - - - - 'right' - Panel position - Position in Panel ('left', 'center', 'right') - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 2 - - - - 0 - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/stylesheet.css deleted file mode 100644 index c45649a6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/day-progress@arcaege.github.io/stylesheet.css +++ /dev/null @@ -1,42 +0,0 @@ -.bar { - background: rgba(255, 255, 255, 1); -} - -.bar-classic { - background: rgba(40, 40, 40, 1); -} - -.border { - border-width: 0.1em; - overflow: hidden; -} - -.container { - border-color: rgba(255, 255, 255, 0.7); - background-color: rgba(255, 255, 255, 0.1); - border-width: 0.1em; -} - -.container-classic { - border-color: rgba(40, 40, 40, 0.7); - background-color: rgba(40, 40, 40, 0.1); - border-width: 0.1em; -} - -.label { - font-weight: bold; -} - -.pie { - -pie-border-color: rgba(255, 255, 255, 0.7); - -pie-color: rgba(255, 255, 255, 1); - -pie-background-color: rgba(255, 255, 255, 0.2); - -pie-border-width: 0.1em; -} - -.pie-classic { - -pie-border-color: rgba(40, 40, 40, 0.7); - -pie-color: rgba(40, 40, 40, 1); - -pie-background-color: rgba(40, 40, 40, 0.2); - -pie-border-width: 0.1em; -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js deleted file mode 100644 index 83915c90..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js +++ /dev/null @@ -1,38 +0,0 @@ -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; - -export default class AticonfigUtil extends CommandLineUtil { - - constructor() { - super(); - let path = GLib.find_program_in_path('aticonfig'); - this._argv = path ? [path, '--odgt'] : null; - } - - /* - Default Adapter - AMD Radeon R9 200 Series - Sensor 0: Temperature - 37.00 C - */ - get temp() { - if(!this._output) - return []; - let label = null; - let temp = null; - for (let line of this._output) { - if(!line) - continue; - let r; - if(line.indexOf('Adapter') > 0) - label = (r = /Adapter \- (.*)/.exec(line)) ? r[1] : undefined; - if(line.indexOf('Temperature') > 0) - temp = (r = /Temperature \- (\d{1,3}.\d{1,2})/.exec(line)) ? parseFloat(r[1]) : undefined; - } - - if(!label || !temp) - return []; - - return [{ label : label.trim(), temp : temp}]; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js deleted file mode 100644 index c4f3d91e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js +++ /dev/null @@ -1,110 +0,0 @@ -import GLib from 'gi://GLib'; - - -export default class BatteryUtil { - - constructor(callback) { - this._bat_path = []; // Path to batteries for cat - this._find_batteries(); - } - - get available(){ - return (this._bat_path[0]) ? true : false; - } - - get energy() { - let features = [] - this._bat_path.forEach((bat_path) => { - let energy = parseFloat(this._get_sensor_data(bat_path, "energy_now")); - energy /= 1000000.00; - - let bat_name = bat_path.split('/').pop(); - let feature = { - label: bat_name + " Energy", - ["power"]: energy - }; - features.push(feature); - }); - return features; - } - - get power() { - let features = []; - this._bat_path.forEach((bat_path) => { - let power = parseFloat(this._get_sensor_data(bat_path, "power_now")); - power /= 1000000.00; - - let state = this._get_sensor_data(bat_path, "status"); - if (state.startsWith("Dis")) - power *= -1; - - let bat_name = bat_path.split('/').pop(); - let feature = { - label: bat_name + " Power", - ["power"]: power - }; - features.push(feature); - }) - return features; - } - - get voltage() { - let features = []; - this._bat_path.forEach((bat_path) => { - let voltage = parseFloat(this._get_sensor_data(bat_path, "voltage_now")); - voltage /= 1000000.00; - - let bat_name = bat_path.split('/').pop(); - let feature = { - label: bat_name + " Voltage", - ["volt"]: voltage - }; - features.push(feature); - }) - return features; - } - - - destroy(callback) { - this._bat_path = []; - } - - execute(callback) { - } - - _find_batteries() { - const cmd = `find /sys/class/power_supply/ -type l -name "BAT*"` - let cmd_res = [] - try { - cmd_res = GLib.spawn_command_line_sync(cmd) - } catch (e) { - logError(e, `[FREON] failed to execute "find"`) - } - if (cmd_res[0] == true) { - this._bat_path = new TextDecoder().decode( cmd_res[1] ).split('\n') - let trailing_path = this._bat_path.pop() - if (trailing_path.length > 1) // remove empty trailing Elements - this._bat_path.push(trailing_path) - } - else { - print(`"find" returned an error: ${cmd_res[2]}`) - } - } - - _get_sensor_data(bat_path, sensor) { - const path = `${bat_path}/${sensor}` - const cmd = "cat " + path; - - let cmd_res = [] - try { - cmd_res = GLib.spawn_command_line_sync(cmd) - } catch (e) { - logError(e, `[FREON] failed to execute "cat"`) - } - if (cmd_res[0] == true) - return new TextDecoder().decode(cmd_res[1]) - else - return "" - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js deleted file mode 100644 index 063d3940..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ /dev/null @@ -1,101 +0,0 @@ -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; - -export default class BumblebeeNvidiaUtil extends CommandLineUtil { - - constructor() { - super(); - // optirun nvidia-smi -q -d TEMPERATURE - this._path = GLib.find_program_in_path('optirun'); - this._argv = this._path ? [this._path, 'nvidia-smi', '-q', '-d', 'TEMPERATURE'] : null; - - // original source here: - // https://github.com/meden/gse-bumblebee-indicator - // thank meden! - let virtualDisplay = ':8'; - - let bumblebeeConfPath = '/etc/bumblebee/bumblebee.conf'; - if(GLib.file_test(bumblebeeConfPath, GLib.FileTest.EXISTS)){ - let configFile = Gio.File.new_for_path(bumblebeeConfPath); - let contents = configFile.load_contents(null); - if (contents[0]) { - let pattern = /^VirtualDisplay=.*$/m - let match = new String(pattern.exec(new String(contents))); - virtualDisplay = match.substr(16); - } - } - let lockFilePath = '/tmp/.X' + virtualDisplay + '-lock'; - this._lockMonitor = Gio.File.new_for_path( - lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null - ); - this._lockMonitor.id = this._lockMonitor.connect( - 'changed', this._statusChanged.bind(this) - ); - - // Check if the lock file already exists - // (needed when NVIDIA card is already in use at that point) - if(GLib.file_test(lockFilePath, GLib.FileTest.EXISTS)){ - this._detectLabel(); - this._active = true; - } - } - - _detectLabel() { - // optirun nvidia-smi -L - // GPU 0: GeForce GT 525M (UUID: GPU-...) - for (let line of GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){ - let match = /.*GPU [\d]:([\w\d\ ]+).*/.exec(line); - if(match){ - this._label = match[1]; - if(this._label) - this._label = this._label.trim(); - break; - } - } - } - - _statusChanged(monitor, a_file, other_file, event_type) { - if (event_type == Gio.FileMonitorEvent.CREATED) { - if(this._argv && !this._label) - this._detectLabel(); - this._active = true; - } else if (event_type == Gio.FileMonitorEvent.DELETED) { - this._active = false; - } - } - - execute(callback) { - if(this._active) - super.execute(callback); - else - this._output = []; - } - - get temp() { - let key = 'bumblebee-nvidia' - let label = this._label ? this._label : _('Bumblebee + NVIDIA'); - if(this._active && this._output){ - // GPU Current Temp : 37 C - for (let line of this._output) { - if(!line) - continue; - let r; - if(line.indexOf('GPU Current Temp') > 0) - return [{ - label: key, - temp: (r = /[\s]*GPU Current Temp[\s]*:[\s]*(\d{1,3}).*/.exec(line)) ? parseFloat(r[1]) : null, - displayName: label - }]; - } - } - return [{label: key, temp: null, displayName: label}]; - } - - destroy(){ - super.destroy(); - this._lockMonitor.disconnect(this._lockMonitor.id); - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js deleted file mode 100644 index fc0dcfd7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ /dev/null @@ -1,52 +0,0 @@ -import Gio from 'gi://Gio'; - -export default class CommandLineUtil { - - constructor(){ - this._argv = null; - this._updated = false; - } - - execute(callback) { - try{ - this._callback = callback; - - let proc = Gio.Subprocess.new(this._argv, - Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_PIPE); - - proc.communicate_utf8_async(null, null, (proc, result) => { - try { - let [, stdout, stderr] = proc.communicate_utf8_finish(result); - - this._output = stdout ? stdout.split('\n') : []; - this._error_output = stderr ? stderr.split('\n') : []; - } catch (e) { - logError(e); - } finally { - callback(); - this._updated = true; - } - }); - } catch(e){ - logError(e); - } - } - - get available(){ - return this._argv != null; - } - - get updated (){ - return this._updated; - } - - set updated (updated){ - this._updated = updated; - } - - destroy(){ - this._argv = null; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/extension.js deleted file mode 100644 index 1b248f7c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ /dev/null @@ -1,1053 +0,0 @@ -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Util from 'resource:///org/gnome/shell/misc/util.js'; - -import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import SensorsUtil from './sensorsUtil.js'; -import FreeipmiUtil from './freeipmiUtil.js'; -import LiquidctlUtil from './liquidctlUtil.js'; - -import NvidiaUtil from './nvidiaUtil.js'; -import BumblebeeNvidiaUtil from './bumblebeeNvidiaUtil.js'; -import AticonfigUtil from './aticonfigUtil.js'; - -import Udisks2Util from './udisks2.js'; -import HddtempUtil from './hddtempUtil.js'; -import SmartctlUtil from './smartctlUtil.js'; -import NvmecliUtil from './nvmecliUtil.js'; -import BatteryUtil from './batteryUtil.js'; - -import FreonItem from './freonItem.js'; - -function _makeLogFunction(prefix) { - return msg => { - // Grab the second line of a stack trace, i.e. caller of debug() - let regex = /(?:(?:[^<.]+<\.)?([^@]+))?@(.+):(\d+):\d+/g; - let trace = ((msg.stack) ? msg : new Error()).stack.split('\n')[1]; - let [m, func, file, line] = regex.exec(trace); - file = GLib.path_get_basename(file); - - let hdr = [file, func, line].filter(k => (k)).join(':'); - - GLib.log_structured( - 'freon', - GLib.LogLevelFlags.LEVEL_MESSAGE, - { - MESSAGE: `[${prefix}] [${hdr}]: ${msg}`, - SYSLOG_IDENTIFIER: 'org.gnome.shell.extensions.freon', - CODE_FILE: file, - CODE_FUNC: `${func}`, - CODE_LINE: `${line}` - } - ); - } -} - -class FreonMenuButton extends PanelMenu.Button { - - static { - GObject.registerClass(this); - } - - constructor(uuid, path, settings) { - super(0); - - this._extension_uuid = uuid; - this._settings = settings; - - var _debugFunc = _makeLogFunction('DEBUG'); - this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {}; - - this._settings.connect('changed::debug', () => { - this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {}; - }); - - this._sensorMenuItems = {}; - - this._utils = {}; - - this._initSensorsUtility(); - this._initFreeipmiUtility(); - this._initLiquidctlUtility(); - this._initBatteryUtility(); - - this._initNvidiaUtility(); - this._initBumblebeeNvidiaUtility(); - this._initAticonfigUtility(); - - this._initUdisks2Utility(); - this._initHddtempUtility(); - this._initSmartctlUtility(); - this._initNvmecliUtility(); - - let temperatureIcon = Gio.icon_new_for_string(path + '/icons/material-icons/material-temperature-symbolic.svg'); - let voltageIcon = Gio.icon_new_for_string(path + '/icons/freon-voltage-symbolic.svg'); - let batteryIcon = Gio.icon_new_for_string(path + '/icons/freon-battery-symbolic.svg'); - - this._sensorIcons = { - 'temperature' : temperatureIcon, - 'temperature-average' : temperatureIcon, - 'temperature-maximum' : temperatureIcon, - 'gpu-temperature' : Gio.icon_new_for_string(path + '/icons/material-icons/material-gpu-temperature-symbolic.svg'), - 'drive-temperature' : Gio.icon_new_for_string('drive-harddisk-symbolic'), - 'voltage' : voltageIcon, - 'fan' : Gio.icon_new_for_string(path + '/icons/freon-fan-symbolic.svg'), - 'power' : voltageIcon, - 'battery' : batteryIcon, - } - - this._menuLayout = new St.BoxLayout(); - - this._hotLabels = {}; - this._hotIcons = {}; - - let hotSensors = this._settings.get_strv('hot-sensors'); - let showIcon = this._settings.get_boolean('show-icon-on-panel'); - - for (let s of hotSensors){ - this._createHotItem(s, showIcon); - } - - if(hotSensors.length == 0){ - this._createInitialIcon(); - } - - this.add_child(this._menuLayout); - - this._settingChangedSignals = []; - - this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); - - this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); - this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); - - this._addSettingChangedSignal('show-temperature-unit', this._updateUI.bind(this)); - this._addSettingChangedSignal('unit', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-rotationrate-unit', this._updateUI.bind(this)); - this._addSettingChangedSignal('show-voltage-unit', this._updateUI.bind(this)); - this._addSettingChangedSignal('show-power-unit', this._updateUI.bind(this)); - - this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); - - this._addSettingChangedSignal('use-generic-lmsensors', this._sensorsUtilityChanged.bind(this)); - this._addSettingChangedSignal('freeimpi-selected', this._freeipmiUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-generic-liquidctl', this._liquidctlUtilityChanged.bind(this)); - this._addSettingChangedSignal('show-battery-stats', this._batteryUtilityChanged.bind(this)); - - this._addSettingChangedSignal('use-gpu-nvidia', this._nvidiaUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-gpu-nvidiabumblebee', this._nvidiabumblebeeUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-gpu-aticonfig', this._aticonfigUtilityChanged.bind(this)); - - this._addSettingChangedSignal('use-drive-udisks2', this._udisks2UtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-hddtemp', this._hddtempUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-smartctl', this._smartctlUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-nvmecli', this._nvmecliUtilityChanged.bind(this)); - - this._addSettingChangedSignal('show-temperature', this._rerender.bind(this)); - this._addSettingChangedSignal('show-rotationrate', this._rerender.bind(this)); - this._addSettingChangedSignal('show-voltage', this._rerender.bind(this)); - this._addSettingChangedSignal('show-power', this._rerender.bind(this)); - - - this._addSettingChangedSignal('group-temperature', this._rerender.bind(this)) - this._addSettingChangedSignal('group-rotationrate', this._rerender.bind(this)) - this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) - - this.connect('destroy', this._onButtonDestroy.bind(this)); - - // don't postprone the first call by update-time. - this._querySensors(); - - this._addTimer(); - this._updateUI(true); - this._updateUITimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 250, () => { - this._updateUI(); - // readd to update queue - return true; - }); - } - - _createHotItem(s, showIcon, gicon){ - if(showIcon){ - let i = new St.Icon({ style_class: 'system-status-icon'}); - this._hotIcons[s] = i; - - if(gicon) - i.gicon = gicon; - - this._menuLayout.add_child(i); - } - let l = new St.Label({ - text: '\u26a0', // ⚠, warning - y_expand: true, - y_align: Clutter.ActorAlign.CENTER}); - l.set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); - - this._hotLabels[s] = l; - this._menuLayout.add_child(l); - } - - _createInitialIcon() { - this._initialIcon = new St.Icon({ style_class: 'system-status-icon'}); - this._initialIcon.gicon = this._sensorIcons['gpu-temperature']; - this._menuLayout.add_child(this._initialIcon); - } - - _rerender(){ - this._needRerender = true; - this._querySensors(); - } - - _positionInPanelChanged(){ - this.container.get_parent().remove_child(this.container); - - // small HACK with private boxes :) - let boxes = { - left: Main.panel._leftBox, - center: Main.panel._centerBox, - right: Main.panel._rightBox - }; - - let i = this._settings.get_int('panel-box-index'); - let p = this._settings.get_int('position-in-panel'); - - console.debug(p) - - switch (p) { - case 0: - boxes['left'].insert_child_at_index(this.container, i); break; - case 1: - boxes['center'].insert_child_at_index(this.container, i); break; - case 2: - default: - boxes['right'].insert_child_at_index(this.container, i); break; - } - //boxes[p].insert_child_at_index(this.container, i); - } - - _showIconOnPanelChanged(){ - let showIcon = this._settings.get_boolean('show-icon-on-panel'); - if (showIcon) { - let index = 0; - for(let k in this._hotLabels){ - let i = new St.Icon({ style_class: 'system-status-icon'}); - this._hotIcons[k] = i; - i.gicon = this._sensorMenuItems[k].gicon; - this._menuLayout.insert_child_at_index(i, index); - index += 2; - } - } else { - for(let k in this._hotIcons) - this._hotIcons[k].destroy(); - this._hotIcons = {}; - } - for (let l in this._hotLabels) - this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); - } - - _initSensorsUtility() { - if (this._settings.get_boolean('use-generic-lmsensors')) - this._utils.sensors = new SensorsUtil(); - } - - _destroySensorsUtility() { - if (this._utils.sensors) { - this._utils.sensors.destroy(); - delete this._utils.sensors; - } - } - - _sensorsUtilityChanged() { - this._destroySensorsUtility(); - this._initSensorsUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initFreeipmiUtility() { - let exec_method = this._settings.get_int('freeimpi-selected'); - if (exec_method != 0) { - try { - if (exec_method == 1) - this._utils.freeipmi = new FreeipmiUtil("direct"); - else if (exec_method == 2) - this._utils.freeipmi = new FreeipmiUtil("pkexec"); - } catch (e) { - if (exec_method == 2) { - this._settings.set_int('freeimpi-selected', 1); - this._freeipmiUtilityChanged(); - } - } - } - } - - _destroyFreeipmiUtility() { - if(this._utils.freeipmi) { - this._utils.freeipmi.destroy(); - delete this._utils.freeipmi; - } - } - - _freeipmiUtilityChanged() { - this._destroyFreeipmiUtility(); - this._initFreeipmiUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initLiquidctlUtility() { - if (this._settings.get_boolean('use-generic-liquidctl')) - this._utils.liquidctl = new LiquidctlUtil(); - } - - _destroyLiquidctlUtility() { - if (this._utils.liquidctl) { - this._utils.liquidctl.destroy(); - delete this._utils.liquidctl; - } - } - - _liquidctlUtilityChanged() { - this._destroyLiquidctlUtility(); - this._initLiquidctlUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initBatteryUtility() { - if (this._settings.get_boolean("show-battery-stats")) - this._utils.battery = new BatteryUtil(); - } - - _destroyBatteryUtility() { - if (this._utils.battery) { - this._utils.battery.destroy(); - delete this._utils.battery; - } - } - - _batteryUtilityChanged() { - this._destroyBatteryUtility(); - this._initBatteryUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initNvidiaUtility() { - if (this._settings.get_boolean('use-gpu-nvidia')) - this._utils.nvidia = new NvidiaUtil(); - } - - _destroyNvidiaUtility() { - if (this._utils.nvidia) { - this._utils.nvidia.destroy(); - delete this._utils.nvidia; - } - } - - _nvidiaUtilityChanged() { - this._destroyNvidiaUtility(); - this._initNvidiaUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initBumblebeeNvidiaUtility() { - if (this._settings.get_boolean('use-gpu-bumblebeenvidia')) - this._utils.nvidiabumblebee = new BumblebeeNvidiaUtil(); - } - - _destroyBumblebeeNvidiaUtility() { - if (this._utils.nvidiabumblebee) { - this._utils.nvidiabumblebee.destroy(); - delete this._utils.nvidiabumblebee; - } - } - - _nvidiabumblebeeUtilityChanged() { - this._destroyBumblebeeNvidiaUtility(); - this._initBumblebeeNvidiaUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initAticonfigUtility() { - if (this._settings.get_boolean('use-gpu-aticonfig')) - this._utils.aticonfig = new AticonfigUtil(); - } - - _destroyAticonfigUtility() { - if (this._utils.aticonfig) { - this._utils.aticonfig.destroy(); - delete this._utils.aticonfig; - } - } - - _aticonfigUtilityChanged() { - this._destroyAticonfigUtility(); - this._initAticonfigUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initUdisks2Utility() { - if (this._settings.get_boolean('use-drive-udisks2')) - this._utils.udisks2 = new Udisks2Util(() => { - // this._updateDisplay(); we cannot change actor in background thread #74 - }); - } - - _destroyUdisks2Utility() { - if (this._utils.udisks2) { - this._utils.udisks2.destroy(); - delete this._utils.udisks2; - } - } - - _udisks2UtilityChanged() { - this._destroyUdisks2Utility(); - this._initUdisks2Utility(); - this._querySensors(); - this._updateUI(true); - } - - _initHddtempUtility() { - if (this._settings.get_boolean('use-drive-hddtemp')) - this._utils.hddtemp = new HddtempUtil(); - } - - _destroyHddtempUtility() { - if (this._utils.hddtemp) { - this._utils.hddtemp.destroy(); - delete this._utils.hddtemp; - } - } - - _hddtempUtilityChanged() { - this._destroyHddtempUtility(); - this._initHddtempUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initSmartctlUtility() { - if (this._settings.get_boolean('use-drive-smartctl')) - this._utils.smartctl = new SmartctlUtil(); - } - - _destroySmartctlUtility() { - if (this._utils.smartctl) { - this._utils.smartctl.destroy(); - delete this._utils.smartctl; - } - } - - _smartctlUtilityChanged() { - this._destroySmartctlUtility(); - this._initSmartctlUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initNvmecliUtility() { - if (this._settings.get_boolean('use-drive-nvmecli')) - this._utils.nvmecli = new NvmecliUtil(); - } - - _destroyNvmecliUtility() { - if (this._utils.nvmecli) { - this._utils.nvmecli.destroy(); - delete this._utils.nvmecli; - } - } - - _nvmecliUtilityChanged() { - this._destroyNvmecliUtility(); - this._initNvmecliUtility(); - this._querySensors(); - this._updateUI(true); - } - - _updateTimeChanged(){ - GLib.Source.remove(this._timeoutId); - this._addTimer(); - } - - _addTimer(){ - this._timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, this._settings.get_int('update-time'), () => { - this._querySensors(); - // readd to update queue - return true; - }); - } - - _addSettingChangedSignal(key, callback){ - this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); - } - - _onButtonDestroy(){ - this._destroySensorsUtility(); - this._destroyFreeipmiUtility(); - this._destroyLiquidctlUtility(); - - this._destroyNvidiaUtility(); - this._destroyBumblebeeNvidiaUtility(); - this._destroyAticonfigUtility(); - - this._destroyUdisks2Utility(); - this._destroyHddtempUtility(); - this._destroySmartctlUtility(); - this._destroyNvmecliUtility(); - - this._destroyBatteryUtility(); - - GLib.Source.remove(this._timeoutId); - GLib.Source.remove(this._updateUITimeoutId); - - for (let signal of this._settingChangedSignals){ - this._settings.disconnect(signal); - }; - } - - _querySensors(){ - for (let sensor of Object.values(this._utils)) { - if (sensor.available) { - sensor.execute(() => { - // we cannot change actor in background thread #74 - }); - } - } - } - - _updateUI(needUpdate = false){ - for (let sensor of Object.values(this._utils)) { - if (sensor.available && sensor.updated) { - this.debug(sensor + ' updated'); - sensor.updated = false; - needUpdate = true; - } - } - - if(needUpdate) { - this._updateDisplay(); // #74 - this.debug('update display'); - } - } - - _fixNames(sensors){ - let names = []; - - for (let s of sensors){ - if(s.type == 'separator' || - s.type == 'temperature-group' || - s.type == 'temperature-average' || - s.type == 'temperature-maximum') - continue; - - let name = s.label; - let i = 1; - - while(names.indexOf(name) >= 0){ - name = s.label + '-' + i++; - } - - if(name != s.label){ - s.displayName = s.label; - s.label = name; - } - - names.push(name); - } - } - - _updateDisplay(){ - let sensorsTempInfo = []; - let gpuTempInfo = [] - let driveTempInfo = []; - let fanInfo = []; - let voltageInfo = []; - let powerInfo = []; - - if (this._utils.sensors && this._utils.sensors.available) { - if (this._settings.get_boolean('show-temperature')) { - sensorsTempInfo = sensorsTempInfo.concat(this._utils.sensors.temp); - gpuTempInfo = gpuTempInfo.concat(this._utils.sensors.gpu); - driveTempInfo = driveTempInfo.concat(this._utils.sensors.disks); - } - - if (this._settings.get_boolean('show-rotationrate')) - fanInfo = fanInfo.concat(this._utils.sensors.rpm); - if (this._settings.get_boolean('show-voltage')) - voltageInfo = voltageInfo.concat(this._utils.sensors.volt); - if (this._settings.get_boolean('show-power')) { - powerInfo = powerInfo.concat(this._utils.sensors.power); - } - - } - - if (this._utils.freeipmi && this._utils.freeipmi.available) { - if (this._settings.get_boolean('show-temperature')) - sensorsTempInfo = sensorsTempInfo.concat(this._utils.freeipmi.temp); - if (this._settings.get_boolean('show-rotationrate')) - fanInfo = fanInfo.concat(this._utils.freeipmi.rpm); - if (this._settings.get_boolean('show-voltage')) - voltageInfo = voltageInfo.concat(this._utils.freeipmi.volt); - } - - if (this._utils.liquidctl && this._utils.liquidctl.available) { - if (this._settings.get_boolean('show-temperature')) - sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); - if (this._settings.get_boolean('show-rotationrate')) - fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); - if (this._settings.get_boolean('show-voltage')) - voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); - } - - if (this._utils.battery && this._utils.battery.available) { - if (this._settings.get_boolean('show-battery-stats')) { - powerInfo = powerInfo.concat(this._utils.battery.power) - } - } - - if (this._utils.nvidia && this._utils.nvidia.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); - - if (this._utils.nvidiabumblebee && this._utils.nvidiabumblebee.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.nvidiabumblebee.temp); - - if (this._utils.aticonfig && this._utils.aticonfig.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); - - if (this._utils.udisks2 && this._utils.udisks2.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.udisks2.temp); - - if (this._utils.hddtemp && this._utils.hddtemp.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.hddtemp.temp); - - if (this._utils.smartctl && this._utils.smartctl.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.smartctl.temp); - - if (this._utils.nvmecli && this._utils.nvmecli.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.nvmecli.temp); - - const comparator = (a, b) => a.label.localeCompare(b.label, undefined, {numeric: true}) - sensorsTempInfo.sort(comparator); - driveTempInfo.sort(comparator); - fanInfo.sort(comparator); - voltageInfo.sort(comparator); - powerInfo.sort(comparator); - - let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); - - if (tempInfo.length == 0 - && fanInfo.length == 0 - && voltageInfo.length == 0) { - this._sensorMenuItems = {}; - this.menu.removeAll(); - - let item = new PopupMenu.PopupMenuItem( - this._utils.sensors && this._utils.sensors.available - ? _("Please run sensors-detect as root.") - : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") - ); - - item.connect('activate',function() { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); - }); - - this.menu.addMenuItem(item); - this._appendStaticMenuItems(); - - for (let k in this._hotLabels) - this._hotLabels[k].set_text('\u26a0'); // ⚠, warning - } else { - let tempMean = 0; - let tempMax = 0; - - for (let i of tempInfo) { - let sum = 0; - let total = 0; - - if (i.temp !== null && i.temp >= 0) { - total++; - sum += i.temp; - - if (i.temp > tempMax) - tempMax = i.temp; - } - - if (total != 0) - tempMean = sum / total; - } - - let sensors = []; - - for (let i of gpuTempInfo) { - sensors.push({ - icon: 'gpu-temperature', - type: 'temperature', - label: i.label, - value: this._formatTemp(i.temp), - displayName: i.displayName}); - } - - for (let i of sensorsTempInfo) { - sensors.push({ - icon: 'temperature', - type: 'temperature', - label: i.label, - value: this._formatTemp(i.temp)}); - } - - for (let i of driveTempInfo) { - sensors.push({ - icon: 'drive-temperature', - type: 'temperature', - label: i.label, - value: this._formatTemp(i.temp)}); - } - - if (tempInfo.length > 0) { - sensors.push({type : 'separator'}); - - // Add average and maximum entries - sensors.push({ - icon: 'temperature-average', - type: 'temperature-average', - key: '__average__', - label: _("Average"), - value: this._formatTemp(tempMean)}); - - sensors.push({ - icon: 'temperature-maximum', - type: 'temperature-maximum', - key: '__max__', - label: _("Maximum"), - value: this._formatTemp(tempMax)}); - - if (fanInfo.length > 0 || voltageInfo.length > 0) - sensors.push({type : 'separator'}); - } - - if (tempInfo.length > 0 && this._settings.get_boolean('group-temperature')) { - sensors.push({ - icon: 'temperature-group', - type: 'temperature-group', - label: 'temperature-group', - value: this._formatTemp(tempMean)}); - } - - for (let fan of fanInfo){ - const unit = this._settings.get_boolean('show-rotationrate-unit') ? _(' rpm'): ''; - - sensors.push({ - icon: 'fan', - type: 'fan', - label: fan.label, - value: _("%d%s").format(fan.rpm, unit)}); - } - - if (fanInfo.length > 0 && voltageInfo.length > 0){ - sensors.push({type : 'separator'}); - } - - for (let voltage of voltageInfo){ - const unit = this._settings.get_boolean('show-voltage-unit') ? _('V'): ''; - - sensors.push({ - icon: 'voltage', - type: 'voltage', - label: voltage.label, - value: _("%s%.2f%s").format(((voltage.volt >= 0) ? '+' : ''), - voltage.volt, unit)}); - } - - for (let power of powerInfo){ - const unit = this._settings.get_boolean('show-power-unit') ? _('W'): ''; - let _icon = 'power'; - if (power.label.startsWith("BAT")) { - _icon = 'battery'; - } - sensors.push({ - icon: _icon, - type: 'power', - label: power.label, - value: _("%s%.2f%s").format(((power.power >= 0) ? '+' : ''), - power.power, unit)}); - } - - this._fixNames(sensors); - - for (let k in this._hotLabels) - this._hotLabels[k].set_text('\u26a0'); // ⚠, warning - - for (let s of sensors) - if(s.type != 'separator') { - let l = this._hotLabels[s.key || s.label]; - if(l) - l.set_text(s.value); - } - - if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){ - for (let s of sensors) { - if(s.type != 'separator') { - let item = this._sensorMenuItems[s.key || s.label]; - if(item) { - if(s.type == 'temperature-group') - item.status.text = s.value; - else { - item.value = s.value; - if(s.displayName) - item.display_name = s.displayName; - } - } else { - this._needRerender = true; - } - } - } - } else { - this._needRerender = true; - } - - if(this._needRerender){ - this._needRerender = false; - this.debug('Render all MenuItems'); - this.menu.removeAll(); - this._appendMenuItems(sensors); - } - } - } - - _appendStaticMenuItems(){ - // separator - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - - let wiki = new PopupMenu.PopupBaseMenuItem(); - wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.START, x_expand: true })); - wiki.connect('activate', () => { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); - }); - - this.menu.addMenuItem(wiki); - - let settings = new PopupMenu.PopupBaseMenuItem(); - settings.actor.add_child(new St.Label({ text: _("Sensor Settings"), x_align: Clutter.ActorAlign.START, x_expand: true })); - settings.connect('activate', () => { - Util.spawn(["gnome-extensions", "prefs", this._extension_uuid]); - }); - - this.menu.addMenuItem(settings); - } - - _appendMenuItems(sensors){ - this._lastSensorsCount = sensors.length; - this._sensorMenuItems = {}; - let needGroupTemperature = this._settings.get_boolean('group-temperature'); - let needGroupRotationRate = this._settings.get_boolean('group-rotationrate'); - let needGroupVoltage = this._settings.get_boolean('group-voltage'); - - if (needGroupRotationRate) { - let i = 0; - - for (let s of sensors) - if (s.type == 'fan') - i++; - - if (i < 2) - needGroupRotationRate = false; - } - - if (needGroupVoltage) { - let i = 0; - - for (let s of sensors) - if (s.type == 'voltage') - i++; - - if (i < 2) - needGroupVoltage = false; - } - - let temperatureGroup = null; - let rotationrateGroup = null; - let voltageGroup = null; - - for (let s of sensors){ - if(s.type == 'separator') { - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - } else if (s.type == 'temperature-group') { - if(temperatureGroup) { - temperatureGroup.status.text = s.value; - this._sensorMenuItems['temperature-group'] = temperatureGroup; - } - } else { - let key = s.key || s.label; - let item = new FreonItem(this._sensorIcons[s.icon], key, s.label, s.value, s.displayName || undefined); - - item.connect('activate', (self) => { - let l = this._hotLabels[self.key]; - let hotSensors = this._settings.get_strv('hot-sensors'); - - if (l) { - hotSensors.splice(hotSensors.indexOf(self.key), 1); - delete this._hotLabels[self.key]; - l.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor - let i = this._hotIcons[self.key]; - - if (i) { - i.destroy(); - delete this._hotIcons[self.key]; - } - - self.main = false; - } else { - hotSensors.push(self.key); - - if (Object.keys(this._hotLabels).length == 0) { - this._initialIcon.destroy(); - this._initialIcon = null; - } - - let showIcon = this._settings.get_boolean('show-icon-on-panel'); - this._createHotItem(self.key, showIcon, self.gicon); - self.main = true; - } - - for (let i = hotSensors.length -1; i >= 0 ; i--) { - let k = hotSensors[i]; - - if (!this._sensorMenuItems[k]) { - hotSensors.splice(i, 1); - let ll = this._hotLabels[k] - delete this._hotLabels[k]; - ll.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor - - if (this._hotIcons[k]) { - this._hotIcons[k].destroy(); - delete this._hotIcons[k]; - } - } - } - - if (Object.keys(this._hotLabels).length == 0) - this._createInitialIcon(); - - this._settings.set_strv('hot-sensors', hotSensors.filter( - function(item, pos) { - return hotSensors.indexOf(item) == pos; - })); - }); - - if (this._hotLabels[key]) { - item.main = true; - if(this._hotIcons[key]) - this._hotIcons[key].gicon = item.gicon; - } - - this._sensorMenuItems[key] = item; - - if (needGroupTemperature && s.type == 'temperature') { - if (!temperatureGroup) { - temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature'), true); - temperatureGroup.icon.gicon = this._sensorIcons['temperature']; - - if (!temperatureGroup.status) { // gnome 3.18 and hight - temperatureGroup.status = new St.Label({ - style_class: 'popup-status-menu-item', - y_expand: true, - y_align: Clutter.ActorAlign.CENTER }); - temperatureGroup.actor.insert_child_at_index(temperatureGroup.status, 4); - } - - this.menu.addMenuItem(temperatureGroup); - } - - temperatureGroup.menu.addMenuItem(item); - } else if (needGroupRotationRate && s.type == 'fan') { - if (!rotationrateGroup) { - rotationrateGroup = new PopupMenu.PopupSubMenuMenuItem(_('Rotation Rate'), true); - rotationrateGroup.icon.gicon = this._sensorIcons['fan']; - this.menu.addMenuItem(rotationrateGroup); - } - - rotationrateGroup.menu.addMenuItem(item); - } else if (needGroupVoltage && s.type == 'voltage') { - if (!voltageGroup) { - voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true); - voltageGroup.icon.gicon = this._sensorIcons['voltage']; - this.menu.addMenuItem(voltageGroup); - } - - voltageGroup.menu.addMenuItem(item); - } else { - this.menu.addMenuItem(item); - } - } - } - this._appendStaticMenuItems(); - } - - - _toFahrenheit(c){ - return ((9/5)*c+32); - } - - _formatTemp(value) { - let unit_type = this._settings.get_int('unit'); - let show_unit = this._settings.get_boolean('show-temperature-unit'); - - if(value === null) { - return 'N/A'; - } - - let format = '%.1f'; - if (!this._settings.get_boolean('show-decimal-value')){ - format = '%.0f'; - } - - if (unit_type == 1) { - value = this._toFahrenheit(value); - } - - if (show_unit) { - if (unit_type == 0) { - format += "\u00b0C"; - } else if (unit_type == 1) { - format += "\u00b0F"; - } - } - return format.format(value); - } - -} - -export default class extends Extension { - - enable() { - this._freonMenu = new FreonMenuButton(this.uuid, this.path, this.getSettings()); - Main.panel.addToStatusArea('freonMenu', this._freonMenu); - this._freonMenu._positionInPanelChanged(); - } - - disable() { - this._freonMenu?.destroy(); - this._freonMenu = null; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js deleted file mode 100644 index 4b38c5ac..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js +++ /dev/null @@ -1,100 +0,0 @@ -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; -import PkexecUtil from './pkexecUtil.js'; - -export default class FreeipmiUtil extends CommandLineUtil { - - constructor(exec_method) { - super(); - - const path = GLib.find_program_in_path('ipmi-sensors'); - // --comma-separated-output: pseudo csv output format, splitting on comma may be good enough for the values we read. - this._argv = path ? [path, '--comma-separated-output'] : null; - - if (this._argv && exec_method === 'pkexec') - { - let pkexecUtil = new PkexecUtil('ipmi-sensors'); - if (!pkexecUtil.checkOrInstall()) { - throw 'cannot run ipmi-sensors with pkexec'; - } - const pkexec_path = GLib.find_program_in_path('pkexec'); - this._argv = pkexec_path ? [pkexec_path].concat(this._argv) : null; - } - } - - // Avoid parsing the data more than once. - execute(callback) { - super.execute(() => { - let data = []; - - for (const line of this._output) { - if (!line) - continue; - - const value_list = line.split(','); - - if (value_list.length <= 1) - break; - - const id = value_list[0]; - - if (id === 'ID') - continue; - - const name = value_list[1]; - const value = value_list[3]; - const unit = value_list[4]; - - if (value !== 'N/A' && unit !== 'N/A') { - data[name] = {}; - data[name]["value"] = value; - data[name]["unit"] = unit; - } - } - - this._data = data; - callback(); - }); - } - - get temp() { - return this._parseSensorsOutput(/^(C|C per minute)$/, 'temp'); - } - - get rpm() { - return this._parseSensorsOutput(/^RPM$/, 'rpm'); - } - - get volt() { - return this._parseSensorsOutput(/^V$/, 'volt'); - } - - _parseSensorsOutput(sensorFilter, sensorType) { - if(!this._data) - return []; - - const data = this._data; - - let sensors = []; - for (const name in data) { - if (!data.hasOwnProperty(name)) - continue; - - const value = data[name]["value"] - const unit = data[name]["unit"] - - if (!sensorFilter.test(unit)) - continue; - - const feature = { - label: name, - [sensorType]: parseFloat(value) - }; - - sensors.push(feature); - } - - return sensors; - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freonItem.js deleted file mode 100644 index d087ad8c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ /dev/null @@ -1,53 +0,0 @@ -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -export default class FreonItem extends PopupMenu.PopupBaseMenuItem { - - static { - GObject.registerClass(this); - } - - constructor(gIcon, key, label, value, displayName) { - super(); - this._main = false; - this._key = key; - this._gIcon = gIcon; - - this._labelActor = new St.Label({text: displayName ? displayName : label, x_align: Clutter.ActorAlign.CENTER, x_expand: true}); - this.actor.add_child(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon})); - this.actor.add_child(this._labelActor); - this._valueLabel = new St.Label({text: value}); - this.actor.add_child(this._valueLabel); - } - - set main(main) { - if(main) - this.setOrnament(PopupMenu.Ornament.CHECK); - else - this.setOrnament(PopupMenu.Ornament.NONE); - this._main = main; - } - - get main() { - return this._main; - } - - get key() { - return this._key; - } - - set display_name(text) { - return this._labelActor.text = text; - } - - get gicon() { - return this._gIcon; - } - - set value(value) { - this._valueLabel.text = value; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js deleted file mode 100644 index e52fbc22..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js +++ /dev/null @@ -1,81 +0,0 @@ -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; - -function run_command(argv) { - return new TextDecoder().decode(GLib.spawn_command_line_sync(argv)[1]).trim(); -} - -export default class HddtempUtil extends CommandLineUtil { - - constructor() { - super(); - let hddtempArgv = GLib.find_program_in_path('hddtemp'); - if(hddtempArgv) { - // check if this user can run hddtemp directly. - if(!GLib.spawn_command_line_sync(hddtempArgv)[3]){ - this._argv = [hddtempArgv]; - return; - } - } - - // doesn't seem to be the case… is it running as a daemon? - // Check first for systemd - let systemctl = GLib.find_program_in_path('systemctl'); - let pidof = GLib.find_program_in_path('pidof'); - let nc = GLib.find_program_in_path('nc'); - let pid = undefined; - - if(systemctl) { - let activeState = run_command(systemctl + " show hddtemp.service -p ActiveState"); - if(activeState == "ActiveState=active") { - let output = run_command(systemctl + " show hddtemp.service -p MainPID"); - - if(output.length && output.split("=").length == 2) - pid = Number(output.split("=")[1].trim()); - } - } - - // systemd isn't used on this system, try sysvinit instead - if(!pid && pidof) { - let output = run_command("pidof hddtemp"); - if(output.length) - pid = Number(output.trim()); - } - - if(nc && pid) { - // get daemon command line - let cmdline = GLib.file_get_contents('/proc/'+pid+'/cmdline'); - // get port or assume default - let match = /(-p\W*|--port=)(\d{1,5})/.exec(cmdline) - let port = match ? parseInt(match[2]) : 7634; - // use net cat to get data - this._argv = [nc, 'localhost', port.toString()]; - } - } - - get temp() { - if(!this._output) - return []; - - let sep = /nc$/.exec(this._argv[0]) ? '|' : ': '; - let hddtempOutput = []; - if (this._output.join().indexOf(sep+sep) > 0) { - hddtempOutput = this._output.join().split(sep+sep); - } else { - hddtempOutput = this._output; - } - - let sensors = []; - for (let line of hddtempOutput) { - let fields = line.split(sep).filter(function(e){ return e; }); - let sensor = { label: fields[1], temp: parseFloat(fields[2])}; - //push only if the temp is a Number - if (!isNaN(sensor.temp)) - sensors.push(sensor); - } - - return sensors; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg deleted file mode 100644 index b57789a5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - image/svg+xml - - Gnome Symbolic Icon Theme - - - - - - - - - - - - - Gnome Symbolic Icon Theme - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg deleted file mode 100644 index a584b74d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - image/svg+xml - - Gnome Symbolic Icon Theme - - - - - - - Gnome Symbolic Icon Theme - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg deleted file mode 100644 index e75e10ac..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - image/svg+xml - - Gnome Symbolic Icon Theme - - - - - - - Gnome Symbolic Icon Theme - - - - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg deleted file mode 100644 index ed342e19..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - image/svg+xml - - Gnome Symbolic Icon Theme - - - - - - - Gnome Symbolic Icon Theme - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg deleted file mode 100644 index b2e7effc..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - image/svg+xml - - Gnome Symbolic Icon Theme - - - - - - - Gnome Symbolic Icon Theme - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE deleted file mode 100644 index 4ae316b4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE +++ /dev/null @@ -1,94 +0,0 @@ -Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/), -with Reserved Font Name Material Design Icons. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg deleted file mode 100644 index b01e8035..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg deleted file mode 100644 index 03a1556b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js deleted file mode 100644 index a2f3015a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js +++ /dev/null @@ -1,89 +0,0 @@ -// Provide sensor data from liquidctl. -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; - -export default class LiquidctlUtil extends CommandLineUtil { - - constructor() { - super(); - const path = GLib.find_program_in_path('liquidctl'); - this._argv = path ? [path, 'status', '--json'] : null; - } - - // Avoid processing the data more than once. - execute(callback) { - super.execute(() => { - try { - const output = this._output.join(''); - if (output == '') - throw 'no data (liquidctl probably exited with an error)'; - - let temp = []; - let rpm = []; - let volt = []; - - let dest = null; - let type = null; - - for (const device of JSON.parse(output)) { - // use a shorter device name to reduce visual noise: - // - omit manufacturer name - // - omit details in parenthesis - const shortDevice = device.description.replace(/(^.+? )|( \(.+)/g, ''); - - for (const item of device.status) { - switch (item.unit) { - case '°C': - dest = temp; - type = 'temp'; - break; - case 'rpm': - dest = rpm; - type = 'rpm'; - break; - case 'V': - dest = volt; - type = 'volt'; - break; - default: - continue; - } - - // use a shorter sensor name to reduce visual noise: - // - omit temperature|speed|voltage suffix - const shortKey = item.key.replace(/ (temperature|speed|voltage)/, ''); - - const feature = { - label: shortDevice + ' ' + shortKey, - [type]: item.value, - }; - dest.push(feature); - } - } - - this._temp = temp; - this._rpm = rpm; - this._volt = volt; - callback(); - } catch (e) { - this._temp = null; - this._rpm = null; - this._volt = null; - logError(e, 'failed to process data from liquidctl'); - } - }); - } - - get temp() { - return this._temp || []; - } - - get rpm() { - return this._rpm || []; - } - - get volt() { - return this._volt || []; - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo deleted file mode 100644 index 4611aa1685bd33bede3c389e2ca21b1baf1a3136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2322 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 VxyU#J&6S({Teh0;f8?s{{0HNjp~wIL diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo deleted file mode 100644 index b65723d2f467f464bdd143918092ffc31b8c6a45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2362 zcmb7^OKclO7{>=F1q|g;pgaX%fkGcy*LHzc4ykD4q*##Fs?(HPG~FHBlg#dH=i$^R zBsg&6)&p>=;DSU?oDdQc3PPNCToJ0cbLO84Py52JZ)dF4n(+Phfo&48HGx(qMN#803zE z&w!`EU_S$20f%56{2W}s8Lxohd@sPcux~#Y&eH&c-PvM&5+tn8g2CPe@Okhe805YL z@vv`-_4lC1`X}%JxQI<59tM0A`~Z9w{Ipnq3li49fKP&df)Th2&b$b=z!2YcFv!0L z&VV0+*vh^G4}(8|hrsRkFcwny2xd9%!=E4<&RdS)Q#pd&5aSSkq-Cr(#2}nEj1b=) znD=6aT)_mZU_O8u22wH3N$_(QCPF*T1wt?$a1F(km^@{B?4D|)x5ADMh2ed{j{EeS z66b`V19Wnw-D)3W^W1SYvW}fF+UK+^(j0r8H-g$uq_%j!qLqV&;@umq*1>MKwPp7i zCzW&~w!|;U)TgY_e^O_Hb(G*%kjyNMDN^aG6`9q>Rx9luxq-BlXkoLL91VoZXDC)O zUdMlU;WQbMYvX7`x&e)}H&jTI_Ad8scd6g_to#%u!im@sw`8<-Ro2lk+?`mZ1;k@S zd##A~;e(Y<>I~jdhi5{ua#vS4C$qj~-GSbqmWXA_6|HdP#pKl@�RVkxZ8D7+UZY zT7pnVZwNzOpXX{sMGPmK5f(~hU&6(n!=7ZKo?V}S!jUcS&ScWD6`2T4^V}piO+jhs ztTyYGWG@7b27D+e)ght-`0WM;Wq=G%(_I9W{kPPxD27s^WAqw=9kr8aMHq`0+Bj=>6yd9koS*Uq!nn;*PkdsEWR(%;hSf~$TYVx(~jT9-p=~L+hy=J{x z_v!2XluK2Ob$YbYQQmMBEozh6CT00}Y3CZVH2FKXH>2HiRNpr{Jz$fBU0vu_ZfIG= zG=(ermOXo{Z+y-T2_;g5LZgkY&nag&-7rqynqcFOO?YyH5SEIH4rfc7m(b39+RX@? z&p4XKP>&C_nJJoDY-#GQ#G%l*nI=B+37W=TY ziT~Hyn=@P-|IYO-Y9P3Reu~F=7={anjqeo{&Z5skjF2cvPNI1%rJI)~#b>Z6LlzEn My$ks_NNY zE{Yfb0uqBqJ+O(M^rrDL-ZU|K@?eNJ4<5N06aD_SdstqE#LCosx~uE=sNbWm?A(4) zV7ySyzrjh&-|oU6Ms~Ll_kicX`@q$bAAmdY{xNtzcnN$O{0w{?{04j;{0U^aKf!y! ztKfF$py-X_E|;78zN;HTiD;FloV`3`&-{JDJp9eft=S3&lD2b8kiS3#DW z0bc@7f^6S_2f!g%1HS+>obd|C=Q|1Kc;9l#_dvF*KtA6Z$oemU?8ilr^?wes+z7-^ z{D42!_X~Iq{1s%oZ(|et`yt5Zyj1cl@HxEy2=Y1p014a6t{G zQHu7_iIwJjb5_jBAd__;#4%^{j5;dKus7sRQ8TF2m+LDw3D8iky){3-zulg{VfS*- zi4N;xNv`QMPerN!gf&XE5+%JNZ9I%6l%%JjJInFramtJ1V8g<{`_&uCacXoAIZptAdIHNl(t&P!%l;!|lQFFtr3v^DUKTGFUQjCZwF2-@_$XbR&l!n@wQr+UU8AA(x zr4|-y*;VDJoo89HPGt;>%?Jy1bzj59UcjDipM`=bKB~ut!YA!8oxlyZ5RpzV-%7m!1p21pBYhizuNNo;N zJdn<-aAdi&7)@{ObJF;pa?yf`Z5I{Lpy@L@RNjq_DZ|ZST?3g_T_mqoovuz-j!O^q zES3~sQx|CyP`5}Fy%7d#{C4QToBdSkq#E0FrqW7sCzEK=y3{wwWSg)4Nc}Jsk4N?x znxWd>!>~}CvOzspxv9IC?7A}OvO9Knk?+w)(ceX9^P1rx3uLkHWSZW%i^^WVxvyvQ zI5(nMbTsOBVymeqDs4@%N+g-xk^_)QzuD5~a&?|`tSRFrP850FH!^`VYBQ#xMZ^f# zLeS_9MF>$U4IU=SLYtsnVqtBx5$D`7j=F5z;*jAh2UyqN9vpoyK%+~_i7Bn`Fe z=ZV_-G}N$x8*hlZ)2ImuZhcI4>v;4v`rj8(7+buixXcL2M5j=&*(+ml!X1Zm^m+)@ ztq#nUPICCTx3A@zuZ_{hEzAFr^H{n7=XH0qVMV8`k40-@?pk(SBU!oUw4LWt@FC{l1+sD0V4}c*kv@)gw#ye%ryO@I#tyR zGci%3@gy0sp?m+zV+U# z`g!Y?&ji{io)_`Fa+eUh!STECLi-iG7yJ#pAN;-GpWs&X{{|lbx85Vfec%ZA6u2FH z7TgCu37!B)z&f}Ed=F%QAA&sZ<6`_%@HG0LgWJKsz~{gbOnL&`3$mU?@G)=+d>niS zWIZwXDENNS{{(y<{Vze@-&K(H`~>p6>)=b^4UqM0gY(zGF>nfe8zjW!0*IgZ8e-Y* zJCJo>#f#U?L5{<;016F z`~#c@XRrwCk3mQl=fS7Jj|zTK@LQ1g^#jQ9y9T}hvU6U41T29^LDp3T_kye7!{Ap% z|9fy2{p%pYu&MFBx$!=>;bHv`;oa{W7q_G&YV-wSjsyMi+jBF}#D2r>6 zswqXg=yG;hv}lx0=xh)M;;_+KN-HW(;m2i0QQ4{3 z7UNYNIe0I|j?B;RUS6KxWPQp7QQ+EQNj01}CeHEtzCraf8)C87%t!(nDqn3)&ajHi_J;Z-Vfn1|fZ5*_^7PWO|sF+PUb7|&A2mVc# z3_f|ja;ok~S~6O@2~p8lc)7nSEg)cR+F@0FCqCG~1qeluP(>yx5+{RZ%Za`%rZ^WQ zO6^QRs%Nj=A~0JG(9;z=}qqQruNa){+X#gyU?F3ElKOV6(bWHNv92FF3F^sp*+16 zCF7y~47IY-vGTEnjm4)XCQEY~#~^`^c8W!uI_Gw$kqnXpRBuURm76`avgqyKu;aBF z%6JP&UHd468QNb9Ta8eG*=+^VT&};`G zPGKyL!W@$j^i@o~qbi5anyAE{prza=wN>mqXkqH?4=3U&+_f#!!woj0EyR?skiD zQV{p9?U3ocGiXQ##k77g9Q-Zn3X$j}7?O!u=HZ~KQEK~{Qv*} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo deleted file mode 100644 index 5c03f2f1f0f67f2eb615b250e398f272edb4f702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2639 zcmbuA&u<(x6vs^|zZMFmK>1M$PHEIu?QD}RRm+wj(rgkICG9Gk1SF6uXV#f@>#+yh zv+Z($1LDMw1405$h(7>{6CfctR6<UfI3SK7fq?JZnN2pdP$Wh(^I3cR?62Q@ ze*4|7?Qb(&V|X6Kv;R8Aj)F(F;f3o5@CNWl@Fwu*lD~kv(Eby=8QgU}V>g0(z`MbH z;Jx4p@GkHyxCe~E?chrw&G!mOcCVHFZ-M8~eh1tK{tDg)?t#&r;G-bvnFH?t7r>q1 z^C0O-!P~)?%l4b#{b+vx(*8aJNzb<++5H4Q1pWb%p1qj-I5-YYg3o~lK6xF)&3=bi z8n+EEYF9v7cPB`Gcm$;V906&aW8i*p9wZ-Y@L})`kj8%q;$|P?MRs45?Jq%x_BY@O za2kU-*avrm?}0S_Bar<4Ny)E4^4Is^1K@8U`F-~-g+FT``C|p7c`Qi!Uj<3$yC81% zIbIF$D{vazQDF>j*m98_T?i4|i-+{wiig%G-$MG9i}p=xQhdmFkj9WcgM9&m_>j-& zqF4_vEIqjH!JBewN6}=rfn#_m4`@%MoAyfkrkIjn5Z2-v@3<^w<9@taTVG|X@+@1 z?j&ypnfkJS)#`xR%f6=?jic>$W6S83ptK5owjkF7TNIa6ny0K3aK;+RT3QM(xiTJV zG}q}lFO9d(S1ZkRs8ODGtn}tU;9aS+BRtkBzJTA50=Z6R)&*z{UEa63`FWY{kqiZknhKyAzG+z}um#j@)bHea;CS|8+He<|MBv88XtsK8cLM_N83T<5CM87}mUbr(EW>*Pw_6+OvQ zOMdP`cj!7~4}!mu38kyqwXJ$(o(wHo&YnjIqGl&rmCnP(bzWH-gfd$6iRwhB^TbEX z7TvA0(UR;b8Wc4|kab?0s7*u@$D_#_pPZ~8f9x>Y6O{#Fk{rnxElZKs`O_**`@9{) zEGYi?d1_XD(R?yVh0@j7rcYEBn~SrXA||U7l^IyzL`2K|42uPMDICqTQ05emyTW-H zrdF2cqLZ8BoG^Y}x@gwKwu6MI^OI{TRGy9IrJ++}U7feA>>zZt>M;oQn4FAs@$J7# zZRy+z9nD#n`Z_n+py{V-r+D#m>Y(9cQ+)E!sSRh;IfSsSC1DXt#5D_ovq&1Gzd-z{ z5)?&&Er}#?$WH23<%v?r%aOzo|2D`_93?Bt!sYk>X35JE!rICxADlqR@Lr{Mqhv_$ zb7NVvC>Nw+v|_X&O7qNF)Vfq~WU9wBvM3rcjea3l)QuC}Qv+*(O(aHW@gfQ1bRzWu zsU>2GBet={F*b{Fxxy4>5)aD=vPg1~rln#;o6ad8ES!oeq~f$Xn{4%%O^h0;GR5Mk zFgz0m(3UmizyZxPvnY);U?@hit8^;1h;fcq=?QHef>IQS(GODFSOvJfhXl78?j71F zY#gr0M+9tq!)X{qjkYDUN?}`gYt!6YZ8=J8xhBfppqyTj8B~n0{ALvq|CkCs?#hnf zJ*r%+C{T&AY%VwC3uvV!@z3F{L8O$=;Gi}9+3-wV{&bL68?m}V#{Zb4OyIu&3F*+` diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo deleted file mode 100644 index 89807385af17de996fc7d5ac6cc539cd8e892809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2489 zcmai!&u<(x6vqveUkelnzbU0oMMSD*w%MqNk`hFkUtK9_SKTy46sdA{-tM~Vu}8Ki zX}C}cE=VAdP!VTtocIU0apEsP96(%<;867l5)$xzJF{sbRn(f@&)DPl{QQ3XGIrpG zz!=BxCH!8wM~D;P)V=t__#M0-`~!RtyjAf}a18T*!H2-H`-FG^JOn-s9tEERUk9H8 z&x41+4tN0k0Azh1fh_k)wf+To1@o`Kqu^iQ^WY%}Jqex!*`8(aac~uU0(=i-dou7K zc)gl`2EKs#*C5~TJCN=931qpO;LG4YAlq{o%3lK~zy^33Y{Dm>f_TJ_FqZfI3_cA0 z2J*SLK=#AE_=s2W2*~SW;9+nAWPdDxeBNb{^}P?W+;x!UJ_ccm_#C_h-T>K-n;^&N z2sX1H=0V=y2Kk(KD`wy`m|q9kZ(o9Z|8K!(!5_dE!Cyg^`@7;nT;>So;~>aG1ZQ%Iu-Ep))`Ur_14~`GVh6mqqG-}lg z--~_tST%nXWS?*z@Eu{|Fvs|Q>|@SD_T_L)q(0BYM3|`0bT`EO7J1bpai+*N4Q&$1 zwuxFv~ zw&fyqbf%2lP^KW!=A~t2WjiNI%W1O%-FQmf!yPTROizjlUv^_05edPnixr^(|$*J4>yt1K7K3TFImm<=$^3*jGcpC|7oEy|TE_* z<`N2>Y@e`A_Pis690FCAB$_+Go^{lH!iAsgCP(4>g~>}>#HzM~P}aUuW>owuI6ySZ zswbrL-ol@Ur&1NA)l^n}oRR~h2UxVSud&-@67tfkoXekEkjoKKnW+KUaaf8yRkDrB zz2M4$VwGmvA_~L!$w_Vj$LhN!oRct8hC*2@tSqJe1Ms1fC;$Ke diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo deleted file mode 100644 index 34198090975728663a77c789c64bd8eab342ec6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 zcmbW1O^g&p6vtb|uTlKK?=SLLvk0<1^y~`au#2)Ezz~+5FuRN4AgS%CnW^dSse1#LD#ix~g8i_v*dZ z@5YX8pE?+?=FcDCD4w71!yiU`zvDazeh5Acc5;3M?!f#C_y~9vd;$Cndoh$xl;`}OE?Lcz*tCObUxuSQ93CWDh)C%kx*Un zM809D#lv`v{80D--rXC#&MWY9>ak!!a{Y?6mYR&AX6WxckWI=?#Pz4B`J)v zEb3g*4Ab?0O~KI6S*3%7M8gJ+T5Oe5q-;c6@Y}RB$^aR@lkPmI&b?2q=EX2PQPrxA zV7ryNyUcZhV3w(Hrk^x-K52@&JDoNYcTr)vy0GZZXwGcN-C1UMnZ~`+0k`D2-a#t8 zUG@&R-h}5t&^^Ofh1IqxcgXd|u}xm7JmKy0N{~CnWHUu+x{I7eWvVWms?<)^OgCzO)pDDuP~#e;nKK^Sqx_kzhL&qArta2`7NdsZl;zN zkGY37L@j7xlUi69w;bH>y_EWXYq87yIj0#@mZCC7c=Gd-zWL%20|s3>7kd`Kq(aS<-a;NY5( z8<&T>u}1WQ!F~s&ob}6$4Yx(0n=K#L=t8Oq1lq!lQ^If6R<6-_s(yC`(@PBtReg^zM?j2Vo)6%S;d`M u?-Cn>Km9~DQW^MdCDZoCWgAh++7U8~OzLhnj2`lRr@3YSU&$~^%=sG@p3NQr diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo deleted file mode 100644 index f87069500b0a6bc211b27d493846fc6426ff58c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2383 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 fpaJn+9qbZYpgrC*-aXlK*`A9N zM?#1`zzaeGL=mV`pdf`xsA`0WRACBY9knV@C?J)pQlCHq3DFmLsEP!?@0>a7b+UHa za^&OxnVE0C`R+5buU~iRw-nD2-jDG9$pz{Nwr2`;@vAe9Gd};AOOb0`jMp z_;($+489k9#p3JWHMIW=1`2(~ zz^iHR1owh7pxEIF5LMLo!HcpLZzcn7!THSOI?x%DQiY z{Hg!)PwaFRO5P0)fns+9iu@TU{`eXw{(aJp{}dFx&Vo0BuYic4-T*%U{>P4A2Q!(! z5xfCv!Dx#AD#s-0-poLAHTHi z7r;wszi9C#a4Qr30Lr|p5mNAakkC;#S=<1Me7D%~Z6G0`wu7SQK2YRyL9yF$+x{jv zO#2ildc17M-vIej0|f6DP=n&fS#Shg0Ph5U0B!_d17*G}CUSfXlz18gF@c)3Z5I^# zeZ}H4;AYydf@0^(ah}BG?V!jx3ktso+yg!a=Jo*zS@jY)2EGbD3SRLcrFMZ|07b42 zi0RbdZ2z0KeJ{)G;{H>-;(vKCWp1OL;BMYsyr1EfM{Ff^gz}NwU38ace*yV_vGX|Z6};E* ziXU#_l}BPu9*K?eA$0QR5dSyw&hUOZ?@{VOP~uG%jvcXB z0dKJ10vFrw!=S{O#E9gvJQCO2c<<(woa*;X*-oh`_w!1v$R8cI1GUNBl&DR~rt0`S zANMbq*l8HGJqzZ1GiQvxRX=!Wa_8jzYKI9^6RVwGZ0aeHw0&n$?{BAG6eivFbaX5y zDn@5b(1u}}#imQqUPTc{sUsXTR7MX$tphL2QZwA0P?88mw=?a-c_H#s5x$howskbG z7o6COvP9RTpdE#1g2b`6VDyX$lPK2HakSvMCQj6@&_Q$Unz^i@{ixCK!baatJs(Gb zPMb!X<0)KFLhYG8cs|EHCN!~E?=ukTls`D^jtwR_=CwSvCyuhV-tB}sX&d9}z=WCh zP&ctdlRe)(Rydz9ZN~Ty<$@?SdR{o@%9e~)kC#?19I+l{@1pC`mF8bfQ}*`gH5t0* zxb{Nbc0%Lpx#+kmy0FQ#blK)HFKt3421|@j6k?w46g@Or)AL@Oq$7H)20=Xv-4R`_ zR!4M&4&O=AVYSc9r)tVM?gd$(rcBz5T=7Aih2jGTZu987i7`0Wv0_q}?HZ>%jmO*@KHoSHWEVwAvh`?JV6; z@|U$O@}L{V9)%niHpQNU>sLV6kCakAV0qvXjif)R{iOBI9O~kN!O<;>dGpboa^ef z54v8`O2&(oR*z>1xvBTMu0-V81mQwpD)?q?iX?F2w4VAGrYP)@(+5$QM$x;PlN1ZB zvhh%C9?ht&iS|7{T*T1}W7RvWqmsftwJ#p-Gp$R!-k4rt{&rXf6)V|lo`t!+cHouc zg*D2=Q3oWr)Pb_1ACP)IljmWg=ghoRp^#dsv$k6dNe-K{2SMp`>f-3uIFAIdoweUlUj-3|Yo zEYAUbF!a)b!B>fK@3@Kc4cqsAvsj+PCY$`oit6(S-^4KJh4Nhb-jiM zfisWq*^mkq+L0Gp@yf2;Ud7U`X;8-4=Zv3tS+aTFVG{_O#!JsxhfT2HznXo)rEtIY ztcB93U0Pk#lM3D=c8|8I=ey8z7KdfnlVT)A$ZN!oYX&8v2UkQJ9L^ov-A2XVneQTB zaf%SHON!f*1in?XQhoU=_5vyOrJZ(Ayn2aOxE5ho%pm}sl?^X{w9yA`K{ql9W@(ybigjKEG`E4J)`19_3JOeGD^t!&R4No6*w>4E9}l>=tM6Uxd? zV!fuvN5{8RMsKf-Pw3H!+HDiJj&2zp9oWaFRGE#PFd@OCxTa^Ex!BX4C&c}C``%n^ zoTH51*9aWXuX1|1hdE&*94Tkb9lu2^Iqd1yLRbRdQp)CftZvWAqEJqEYq7ecrkllPw;rcEIqQ@= z$a-`WHI9s_BbmU0QP|gVcj4m;8f*+d$R^7kyWWChxS<`J`D88q#<0BIdDi8F*~=Y! zT{=vkq>H{un#QEnda_1vVEU{$WUMI|mQU(U6FAA{C~j06VHB7uY<<7ltuIN{%3f_0 zwAJH*KcM&R}We8M!~Hh-`P1621YlRPoG#m9WtYLR1djM%WDxG z!&cz^A&UUq?h`hp7VS@O(-gb`M%;D^_}>9anwv_2|I|&veTjl zm2&wc7f^IwKFu7pS1P)+TVh(2SqlBm64nX~$3#z?wB@nT*^{Xkt6lW78@VRrl<|({ zQ5N+BoEA}PElH&66{q%oau!#;!(8=VTv{}G4`&Uz>=ka1OB_0O&NR5+U=vR_;*2`2 zI*%7UdQZ{r`nt9DlqWi;DEVCcPWbF~_WGAcfLw}2dWhlWqD~5j{H)>BuY2~$VpeRjrCy_tGVUP@5FpG{($mt#~mMz7rbBdIe)N2)~ zC)yEkHb?qgPm{7<@Y4dP{8qN!{O)zNJByFEGtu5)`%arFB`AGrg|+utcEZvl)cIV( zwPx50F46D%PMAAP6k3bCyzahT`f@A%f9QKJ#K}8Qt>4-gE0;s9+^sh*x9HA!ErHCfvsXoE{W*~zYCkrokhZw6cbDH&EZdzt z;{^@sryOuZ961VgPU-Eqlpl^)x@~pRa)&QTR~h2`DZTMfPNC`*hpN{3^mfl$bLrxK zUvlc|7Dg>OcJr&BctT^#IVX{_o*St&&WbJE+!o@nLg7*~Je6Ol)AE+@Eb@yR@r_sQ z;la)*mrlEjviGr{w49*J)he$OF>iiiYRgZrD}L`fK-5mUHeE5$%1N-al{$C=8S_mC zZA(k$$5X3}9L{t@a*_~~4LLaHmx6p>SoK>0r{)paHwj#JurAk@&Wgq8A<1KtZZgAak7;0kaMB!3x@?Cj{f4-Vq}5cn8)348#&4Bi8-hB4{c0NxEYf}|q> z-U+6n_d)PMyn7(!H3gE6k3q6q03QLr1xd%RU>o>57zY~=Nv8PYQd4uGdX((?=WBKRk` zAAJ6H#*n_&M0LLdH>B&_sE*WI(oMB}6gOSuhqR$px+VaF8=WUT!}XPGZS+JlQGKEO zdVbb{)IYkY|45VFhnwT3{!^_nYPtsilFNAc9INx|np%bi*p5-*nZttZEaVQ@;(!pm zf$tqib|rVPPE(rpm@iqUaHR0qZkJ2^Wd-l{gzNBw)`-P+du}1m`$R4eKeFHno|Gcz zN8blrTf%$v?dh(r=HA|}t5)|*%eLeg+arb~>oE^mxk8Rb0`|I&U@2RezTlSQLygVt z+@LQU-}U^a+T;+_SU%6V!grpKJS*&cBTw5_dIZmq0=b^ZyPkwrndM_{!Q+uNcMCFK zkn1b{y@FHu$;b#P(vq7#_gq&tv6PFzyv&#HS73AyT9zhg-@U}c2MJ54XMWH%~-o^!nspIbvz zI-WI01<$!u*DQ3)tcPhqv#)eMDlPkGtI=pKDi$fveF-Huk{M$_cs@$n!E5*F))_ti zu$3`(7KVMJ&&B7|vwcRVCrm25(Pc`}!CPYSHX|N0Vw-vV$&Of?5o?Xbu+Z2iMlJHT zxUSuZwHxtvTG!Uvpx5m&eQET0rsLbDbUlRFV>-hH%&pNU%v{xb2QQ2a_V1|eN%rho z6dG@e)pokrA`aY)<)KH4L$Wzo&G5uA^{6!ZUU`X*Yuz>EK%q zSh9A%v0FH_lSoI(6&bX*rKzQ6b{ZQ#Ajsk5k*jQ!8AC- zk7xg-%oDZfra-6|>d~1Y&V4MWOri^EZ!-DE_PkjpKud1>xE!D6{+RG?O8S%>M zb5(>FN&xA>>q6v1*J`4XldU?-^?LZ%w)0r2JA(4SGsT6lailY$?V$)N;EZ}Xt}{i( z>zB#kg0Ax<$ z)KTY;?5S;31j>_Yi8;~(i2P=%dvzMGRQ(f`c#&;&MCxwnA01K`s&whR#)Ff{iX@$* zUi@u%mNpDd=s`P=f=uf=VF+Li+2Kr*N7RXigz~y3ZY2nQS~AV0Y*3BL_y?05b5cS` z+FiO@%LFPT#RV+KJ}w2X(1fF+q&eIz)Yt0#%h+0&A1x2LP3qI4GBelNzGo1o1RC6?Ur|9Sg{Qx504zKDg=GerYYIV7n1)C7onEqD`K2SXZeJyd~?sBx~& gVmh$J(a<8K!pjsIcXWvXUnY(JEdZ*wsJz7f0)9MI(*OVf diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo deleted file mode 100644 index 3b00152f6a00841c7e2c98583c324db88f0db949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178 zcmaizU2GIp6vwZMU#s|mpQtexBN4<|cAEfo5h8RcY(mS*meu%R9d>VbM`q`)Gk04S zO{^7Mi)}##5h&6Eg=(P180mML_~3&t#&<(Z+?m~t4?OUsG133+%oa*eZ}#qQ&Yg45 zIro3&US71|Fu{1rn}2~zF@L!Qe;Cj{|27{n{OlJaj*k?5Ihb(0A2uPo@wwt@Mq8d6^Pt?f9()?y2Fm;fxC(3qgW!2k!x=Aw@_buRob+o1?*`+b%=;!N&u4-6gYSCm z0w0Fm3rhcQK>WxA{!kM69(*1A0elu*g5Xl0dhlNG4N%701o5xs^bYfNR6fbXv?e~vNox& z98%wfnD=1HUdeO&FlAkG$aBk{$a6l532A40A?uR^CE?>rn%N9lYAyBGw8Y7VR%WUx zMmFX$J9V~`F}i{_#v|d#22!UARnJ?3Y&Ll=OPg3G3ty2l8I1^*vAp#-*99VYYg@wM zm9bcOp7#!+>6*xs26eZV$z_NazmXe^M0KWGjB193WIEL|%@#8(Zd!g{q=kyKX3->P zmhqgRX{Kjipb1?|?7}mu5S*GU%S}PsG?Auxo-?VpoAR8<=ERa}d^2ZMUnxl@SVBSeCJ*Yeo`?f}a;fZi@0YX3|(Lo7MBw)6jK>EHtU5G?dsP;FEO2lj|Gc z6*6yahoK1)*OH9WI@L_xv<1~fuX1yjMYR?w8cnOMjApo0G>y7N+Qeso4$rmQ6P5h` zu2%13sP2fG{4I#BM3PFJnHIzhQQ!92rYQ|pN=qsmb16${;#iJuYf|b=rb@|`uqs%H z)&zp9l|YSB6QIEtL&4e=f!aU-j>>k{s>x_K^;@;Z_1mgiLTNHp!_rm3%@7TvXM57z zNYT19Gw4fg*6w_8bDW1kbGZZB>m_4xh8q#MBIms@fsCC*54v=xc~HY`S)o zpg-WN}YjMI@FTb%53_MWtl4wk1svkT)_Cf}E#ixUI0ca@fB4wn17Zn(+FL!6TX z<>6CvyPe?!%Sz`yT}~<|PB|xLic{UCsUb4=x;!*3ZRd;W(wTAl;sNLI#mWbR_D3Ij zOO?|-PG_M!b-vPmlGwe2ZWPb`__Whk@EjqPGk(w&Y+g8d#DhJ>(RQRpbo;^);)*y| zgJ;{_hv6dk+TH#0boQdU3PK&Hx3hd{UwNib9PKQQetknY=g1}dz%cYB|F*%6H<$m~ GhJOHCw%_^y diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo deleted file mode 100644 index c541003961a424b7b04f5bf3098ff049b2321124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4735 zcmbuBUu+b|9ml6BO{iO%mbRg7nq-p3v0c2!*@T9g&@|XU9AR?8##E6iw7#9Y+iw8gF*tvHt=+WME6;s)W@qO2f5smyUviw``61eO(WXDg*el@W&*KMAVF_bj0E^&5;Ed!yz~$)w z7hDQ1$D{|rN5O}|r@$w`dfDFwR-)elego_StH5E||24P*{Xc_W2mb~>3qFWVtHE_3 z>8F9;0(-zm!IL2AaRYn_{2d6D*m5XK`mVqahS(DzjXwkK1XqGjfd@d^Zw&kz_#03G z{{%t>_7IHw4!8__9;^n*J^|7?7bN+Iz^{NKvVRTyHu}Gk{l9>u|3~0s;Ic1(>3zK)pw z93*@G{pD~TTgDi+W=lcRe>n)%SS3iIkAURgddaOIma^ACn%@O}6MO?C`Df+$UCBR4 zdSDda|0!7mC(-&>B{Lx9Lk^_n1)m1vAjP8( zqWKD$;u+Nb9zMYr&N4kANG{zYUT+QiA3`0!G2dB)5VHV-VX~kaB|jMmAEt zC}^wER-(~ExkEKgvdAxRKdVRkJ{sx!EE?qt=}LJ)GAS=fCP#Y&jh+Y4pjz;d{uJvf zG|FXqsAj2-D0fN^QjsCuW}iy=7TAY(%3pfw(Bv@_^yvp~3+jk!j^bYaRHG9?gDYkq z@;TKRJ#^lD4{a6Nb7-aK2lP^@S=kJ$v@0X^iFWp4r?AwdU>n>_M_P0U!B_IF?afWi zFS16}QPbVF!y1L*2#Yo8b~dec^G&M3x5Zj!`w8?d(@`DWGUs*G0926E+=KdB{sG< zEt_N6>>e3mxLhyWXyKxgnV*<=-(412^-@#Qs@B$~c@}JU^tA4Dvt~mRySWa(tAe8JQhRGGSNQ<~5w7EIFI@-V!x@9}HysiNg;-;b1@<=37%M}cyRokgyTSUTP zE$VJP<7Sx5iLHndi=~BX3rMw*AZeb??350QR5T|bQn$Hg3fri1cuJ(RwLG5IZVCz95!uS~ZOaihH*Em zsmSWqz?;&slolHAN||s+r0GrLfNt!_4(?&dPN!^xW5E>JWa zLNvLiCv|u>ff7g61ro!LVNkg)WjJP5TG3Wk1~LY$d~Ca+JFE>xyLf@O$;*1uQZ-S< zVSQCXMO7Iop~K;Ub7l*eeCDP#=oB6`+T;$5rIir$}6UW|>d}Gjvt4Wu}F~aYVym2|Wq%?SZUDlGRog&(gtC%A6ghwF~}E zP^BWbI|W~O&Xs9eDp&UDt4ilwm}EAKS>|h~aHUyO+J!}jc>}N57Mv7Hi=EUpWrLfv zl{OQ@u~(FBqEn|yN)u|bf!9atqe^s*vbv7f)itbHtwf)TMk}`97*pCT)v(j5V_FS- zgW07E-k1^wf4+m><9PkCYeQhfK%t{#A}EHG+Y!Ny^doFwBwbuxN}EtK5M1gv@Yhp2 z+jdm6G`DP=Q@1V>t!OlHRT_}morPKsQg9XSOx;+=<0;ibG}do#+oY_Wn@8Fugr#gW z;--c(p@FaM(4C5(D4T^r*A=N9Glhmis*kL$h^1XiO)HyBD`PisBO7$>^>yob__{v2 z4r{{&$_CXIS=C83;AEd0Z565&PsK2<;1-BfEcl1OyLH_g-tXn6?)xvn^!OE49J!jm zFi|`=>i6&WuMT*9`-+F(D%|cb=FWVUZ$p#b`J-~8ck!3glQ)Xtkazq{{@7@7@Id~= zR3X<}m>T!?PcZM!Y5(YZUT^O`KKEUdcYgll-tgWp^qedX?eizz@g^=6&-Uhr##lHM z%8^6fr9J-XQ~sV&|5ShBMsKm_(DZn}mpc%y^Y@9%3F7^9?27Wv@n+Q1_og`WWXO#j1_x;{c`v5 zD}_rvVPcotz-Fx}j9&4^uqX%&1THc+9P+LWKtS;qqo|8{J2fh!8 { - directory.enumerate_children_async( - 'standard::*', - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, - GLib.PRIORITY_DEFAULT, - null, - (file_, result) => { - try { - resolve(directory.enumerate_children_finish(result)); - } catch (e) { - reject(e); - } - } - ); - }); - const gpus = [] - - while (true) { - const infos = await new Promise((resolve, reject) => { - iter.next_files_async(10, GLib.PRIORITY_DEFAULT, null, (iter_, res) => { - try { - resolve(iter.next_files_finish(res)); - } catch (e) { - reject(e); - } - }); - }); - - if (infos.length === 0) - break; - - for (const info of infos) - gpus.push(info.get_name()); - } - - // For each GPU... - let gpuInfo = {}; - for (const gpu of gpus) { - // ...read /proc/driver/nvidia/gpus//power and check if it supports sleep. - const file = Gio.File.new_for_path(`/proc/driver/nvidia/gpus/${gpu}/power`); - const [, contents, etag] = await new Promise((resolve, reject) => { - file.load_contents_async(null, (file_, result) => { - try { - resolve(file.load_contents_finish(result)); - } catch (e) { - reject(e); - } - }); - }); - - // If the GPU is sleeping, don't poll it. - const decoder = new TextDecoder('utf-8'); - const contentsString = decoder.decode(contents); - const prevGpuInfo = this._gpuInfo[gpu] || {}; - if (contentsString.split('\n')[1].endsWith('Off') && prevGpuInfo.output) { - gpuInfo[gpu] = { output: prevGpuInfo.output.split(',')[0] + ',N/A' }; - continue; - } - - // If the GPU needs time to sleep, then keep showing the old temperature. - // Since even process monitoring prevents sleep, we don't check && sleepEligible :/ - if ((prevGpuInfo.skipUntil || 0) > Date.now()) { - gpuInfo[gpu] = prevGpuInfo; - continue; - } - - // Poll the GPU. - gpuInfo[gpu] = { output: await this.getGpuInfo(gpu) }; - - // If runtime D3 is enabled and the GPU is eligible to sleep... - try { - const sleepEligible = await this.isGpuEligibleToSleep(gpu); - if (contentsString.split('\n')[0].includes('Enabled') && sleepEligible) { - // ...skip polling it for 30 seconds. - gpuInfo[gpu].skipUntil = Date.now() + 30000; - } - } catch (e) { - console.error(e); - } - } - this._gpuInfo = gpuInfo; - this._output = Object.keys(this._gpuInfo) - .sort() - .map(gpu => gpuInfo[gpu].output) - .filter(output => !!output); - } catch (e) { - console.error(e); - } finally { - callback(); - this._updated = true; - } - } - - isGpuEligibleToSleep(id) { - return new Promise((resolve, reject) => { - let proc = Gio.Subprocess.new( - [this._nvidiaSmiPath, 'pmon', '--count=1', `--id=${id}`], - Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_PIPE); - - proc.communicate_utf8_async(null, null, (proc, result) => { - try { - let [, stdout, stderr] = proc.communicate_utf8_finish(result); - const processes = stdout ? stdout.trim().split('\n').slice(2) : []; - if (processes.length === 1) { - const process = processes[0].toLowerCase().split(' ').pop().replace(/-?server/, ''); - resolve(process === 'xorg' || process === 'x' || process === 'x11' || // X11 - process === 'gnome-shell'); // Wayland - } else { - resolve(processes.length === 0); - } - } catch (e) { - reject(e); - } - }); - }); - } - - getGpuInfo(id) { - return new Promise((resolve, reject) => { - let proc = Gio.Subprocess.new( - [this._nvidiaSmiPath, '--query-gpu=name,temperature.gpu', '--format=csv,noheader', `--id=${id}`], - Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_PIPE); - - proc.communicate_utf8_async(null, null, (proc, result) => { - try { - let [, stdout, stderr] = proc.communicate_utf8_finish(result); - resolve(stdout ? stdout.trim() : ''); - } catch (e) { - reject(e); - } - }); - }); - } - - get temp() { - let gpus = []; - - if (this._output) { - for (let line of this._output) { - let values = line.split(','); - if (values.length < 2) - continue; - - let label = values[0].trim(); - let temp = values[1] === 'N/A' ? null : parseFloat(values[1]); - - if(!label || isNaN(temp)) - continue; - - gpus.push({ label: label, temp: temp }); - } - } - - return gpus; - } - - get available() { - return !!this._nvidiaSmiPath; - } - - get updated() { - return this._updated; - } - - set updated(updated) { - this._updated = updated; - } - - destroy(callback) { - this._gpuInfo = {}; - this._output = []; - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js deleted file mode 100644 index 2b12d2d0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ /dev/null @@ -1,58 +0,0 @@ -import GLib from 'gi://GLib'; - -function getNvmeData (argv){ - const nvme = GLib.find_program_in_path('nvme') - return JSON.parse(new TextDecoder().decode(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1])) -} - -export default class NvmecliUtil { - - constructor(callback) { - this._nvmeDevices = []; - try { - this._nvmeDevices = getNvmeData("list")["Devices"] - } catch (e) { - logError(e, '[FREON] Unable to find nvme devices'); - } - this._updated = true; - } - - get available(){ - return this._nvmeDevices.length > 0; - } - - get updated (){ - return this._updated; - } - - set updated (updated){ - this._updated = updated; - } - - get temp() { - let sensors = []; - for (let device of this._nvmeDevices) { - var smart_log = getNvmeData(`smart-log ${device["DevicePath"]}`); - if( smart_log.hasOwnProperty('temperature_sensor_2') ){ - sensors.push({ label: device["ModelNumber"] + " S1", - temp: parseFloat(smart_log.temperature_sensor_1) - 273.15 }); - sensors.push({ label: device["ModelNumber"] + " S2", - temp: parseFloat(smart_log.temperature_sensor_2) - 273.15 }); - } - else{ - sensors.push({ label: device["ModelNumber"], - temp: parseFloat(smart_log.temperature) - 273.15 }); - } - } - return sensors; - } - - destroy(callback) { - this._nvmeDevices = []; - } - - execute(callback) { - this._updated = true; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/pkexecUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/pkexecUtil.js deleted file mode 100644 index 054dfe92..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/pkexecUtil.js +++ /dev/null @@ -1,73 +0,0 @@ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; - -export default class PkexecUtil { - constructor(name) { - this._name = name; - this._policy = 'com.github.UshakovVasilii.freon.' + name + '.policy'; - this._actions = '/usr/share/polkit-1/actions' - this._pkexec = GLib.find_program_in_path('pkexec'); - // Currently hardcoded in policy file. - this._bin = '/usr/sbin/' + name; - this._dir = this.dir(); - } - - dir() { - let uri = (new Error()).stack.split('\n')[1]; - let prefix = this.constructor.name + '@file://' - if (!uri.startsWith(prefix)) { - log('[FREON] failed to guess extension directory'); - return null; - } - return Gio.File.new_for_path(uri.substring(prefix.length)).get_parent().get_path(); - } - - available_pkexec() { - return !!this._pkexec; - } - - available_bin() { - return GLib.find_program_in_path(this._name) == this._bin; - } - - installed() { - return GLib.file_test(this._actions + '/' + this._policy, GLib.FileTest.EXISTS); - } - - run(command) { - return GLib.spawn_command_line_sync(this._pkexec + ' ' + command); - } - - install() { - if (!this._dir) - { - log('[FREON] cannot find ' + this._name + ' pkexec policy file ' + this._policy); - return false; - } - try { - this.run('install "' + this._dir + '/policies/' + this._policy + '" ' + this._actions); - } catch(e) {} - if (!this.installed()) - { - log('[FREON] failed to install ' + this._name + ' pkexec policy'); - return false; - } - return true; - } - - checkOrInstall() { - if (!this.available_pkexec()) { - log('[FREON] pkexec is not available'); - return false; - } - if (!this.available_bin()) { - log('[FREON] ' + this._bin + ' is not available'); - return false; - } - if (!this.installed()) { - log('[FREON] ' + this._name + ' policy is not installed yet'); - return this.install(); - } - return true; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/po/.keep b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/po/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/policies/com.github.UshakovVasilii.freon.ipmi-sensors.policy b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/policies/com.github.UshakovVasilii.freon.ipmi-sensors.policy deleted file mode 100644 index b4934295..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/policies/com.github.UshakovVasilii.freon.ipmi-sensors.policy +++ /dev/null @@ -1,18 +0,0 @@ - - - - Vasilii Ushakov - https://github.com/UshakovVasilii - - - Run ipmi-sensors - No Authorization required to run ipmi-sensors. - - yes - yes - yes - - /usr/sbin/ipmi-sensors - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/prefs.js deleted file mode 100644 index 1941ec92..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ /dev/null @@ -1,188 +0,0 @@ -import Gio from 'gi://Gio' -import Gtk from 'gi://Gtk' -import Adw from 'gi://Adw' - -import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - - -export default class FreonPreferences extends ExtensionPreferences { - - fillPreferencesWindow(window) { - window.set_default_size(1010, 800); - - const grid = new Gtk.Grid({ - column_homogeneous: true, - column_spacing: 10, - row_homogeneous: false, - }); - - this._settings = this.getSettings() - const page = new Adw.PreferencesPage({ - title: _('General'), - icon_name: 'dialog-information-symbolic', - - }); - - const display_options = this._create_display_options(); - const generic_sensor_providers = this._create_generic_sensor_providers(); - const gpu_sensor_providers = this._create_gpu_sensor_providers(); - const drive_sensor_providers = this._create_drive_sensor_providers(); - const show_sensors = this._create_show_sensors(); - const item_group = this._create_item_grouping(); - - grid.attach(display_options, 0, 0, 1, 12); - grid.attach(generic_sensor_providers, 1, 0, 1, 4); - grid.attach(gpu_sensor_providers, 1, 4, 1, 4); - grid.attach(drive_sensor_providers, 1, 8, 1, 4); - grid.attach(show_sensors, 2, 0, 1, 6); - grid.attach(item_group, 2, 6, 1, 4); - - const widget = new Adw.PreferencesGroup({ - hexpand: true, - vexpand: true, - }) - widget.add(grid); - - page.add(widget); - - window.add(page); - } - - - _create_display_options() { - const group = new Adw.PreferencesGroup({ - title: _('Display Options'), - width_request: 320, - }) - - const sensor_poll_intervall = new Adw.SpinRow({ - title: _('Sensor Polling Interval'), - adjustment: new Gtk.Adjustment({ - lower: 1, - upper: 60, - value: 5, - step_increment: 1, - }) - }) - this._settings.bind('update-time', sensor_poll_intervall, 'value', Gio.SettingsBindFlags.DEFAULT) - group.add(sensor_poll_intervall) - - const position_in_panel = new Adw.ComboRow({ - title: _('Panel Position'), - model: new Gtk.StringList({strings: ["Left", "Center", "Right"] }), - }) - this._settings.bind("position-in-panel", position_in_panel, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); - group.add(position_in_panel) - - - const index_on_panel = new Adw.SpinRow({ - title: _('Index on Panel'), - adjustment: new Gtk.Adjustment({ - lower: -1, - upper: 25, - value: 1, - step_increment: 1, - }) - }); - group.add(index_on_panel); - this._settings.bind('panel-box-index', index_on_panel, 'value', Gio.SettingsBindFlags.DEFAULT); - - group.add(this._addSwitch("Show Icon on Panel", "show-icon-on-panel")); - - const unit_setting = new Adw.ComboRow({ - title: _('Temperature Unit'), - model: new Gtk.StringList({strings: ["\u00b0C", "\u00b0F"]}), - }); - this._settings.bind("unit", unit_setting, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); - group.add(unit_setting); - - group.add(this._addSwitch("Show Temperature Unit", "show-temperature-unit")); - group.add(this._addSwitch("Show Rotation Rate Unit", "show-rotationrate-unit")); - group.add(this._addSwitch("Show Voltage Unit", "show-voltage-unit")); - group.add(this._addSwitch("Show Power Unit", "show-power-unit")); - group.add(this._addSwitch("Show Decimal Values", "show-decimal-value", "Show additionnal digits after decimal point")); - return group; - } - - _create_generic_sensor_providers() { - const group = new Adw.PreferencesGroup({ - title: _('Generic Sensor Providers'), - width_request: 320, - }); - - group.add(this._addSwitch("lm-sensors", "use-generic-lmsensors", "Read sensors from lm-sensors")); - group.add(this._addSwitch("liquidctl", "use-generic-liquidctl", "Read sensors from liquidctl (v1.7.0+)")); - - const freeimpi = new Adw.ComboRow({ - title: _('FreeIMPI'), - model: new Gtk.StringList({strings: ["Disabled", "Direct", "pkexec"] }), - selected: this._settings.get_int("freeimpi-selected"), - subtitle: "Read sensors using ipmi-sensors from FreeIPMI" - }); - this._settings.bind("freeimpi-selected", freeimpi, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); - group.add(freeimpi); - - return group; - } - - _create_gpu_sensor_providers() { - const group = new Adw.PreferencesGroup({ - title: _('GPU Sensor Providers'), - width_request: 320, - }); - group.add(this._addSwitch("Nvidia", "use-gpu-nvidia")); - group.add(this._addSwitch("Bumblebee + Nvidia", "use-gpu-bumblebeenvidia")); - group.add(this._addSwitch("Catalyst", "use-gpu-aticonfig")); - - return group; - } - - _create_drive_sensor_providers() { - const group = new Adw.PreferencesGroup({ - title: _('Drive Sensor Providers'), - width_request: 320, - }); - group.add(this._addSwitch("Udisks2", "use-drive-udisks2")); - group.add(this._addSwitch("Hddtemp", "use-drive-hddtemp")); - group.add(this._addSwitch("smartctl", "use-drive-smartctl", "Read drive sensors using smartctl from smartmontools")); - group.add(this._addSwitch("nvme-cli", "use-drive-nvmecli")); - - return group; - } - - _create_show_sensors() { - const group = new Adw.PreferencesGroup({ - title: _('Show Sensors'), - width_request: 320, - }) - - group.add(this._addSwitch("Temperature", "show-temperature")); - group.add(this._addSwitch("Rotation Rate", "show-rotationrate")); - group.add(this._addSwitch("Voltage", "show-voltage")); - group.add(this._addSwitch("Power", "show-power")); - group.add(this._addSwitch("Battery", "show-battery-stats")); - return group - } - - _create_item_grouping() { - const group = new Adw.PreferencesGroup({ - title: _('Group Items'), - width_request: 320, - description: "Group three or more sensor of the same type", - }) - group.add(this._addSwitch("Temperature", "group-temperature")); - group.add(this._addSwitch("Rotation Rate", "group-rotationrate")); - group.add(this._addSwitch("Voltage", "group-voltage")); - return group; - } - - _addSwitch(title, key, help = "") { - const sw = new Adw.SwitchRow({ - title: _(title), - active: this._settings.get_boolean(key), - subtitle: help - }); - this._settings.bind(key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); - return sw; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/private_metadata.json deleted file mode 100644 index c0765cab..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/private_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", - "gettext-domain": "freon", - "name": "Freon", - "settings-schema": "org.gnome.shell.extensions.freon", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon", - "uuid": "freon@UshakovVasilii_Github.yahoo.com", - "version": 57 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled deleted file mode 100644 index 5c0d0a2eb4114839c3b3f83066da2fd95f0ee072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2037 zcmZ8iU1%Le7@ht^W0N*bP21Eo+6uNe>fDP4Y^4eX8(P7KAXxHXxbEGZ-aEK|?(E*& zLh4f~eG&R1QWO+H4AuGr;){rRsTOO%hYER->VqKo7ps*Z)_BhB-ni+KlXG(Bo0)HZ zzRA(!PNJPK6~#9Up2~G)eb)r{Y!_k$U*7hVjd>RS^ee~rGmLtVI3{Mv8--X0j*@1z z8AgGsnwIkYs_LXFG&%}R^+ckg5FwSl_{ER$oNq$`3?Yaf;En>Dz(gO=4{Qdu6c_|= z1CXZ04)D%fz_slvFao|CxCdYkKaZ?D!155D!}0DbBn_{-p%!2GEf`?#;v^n0;j34Ap=^B3c(2jL$E zPXOu<`_uc!=u>Zpe-8XIuyADA=1I-?Iq*ebBKu;7 z@znkB=fRhVU9Zp5r``zvYw#lQ^!K~}p-;_mmcTcF-#`0ukv{ci_`SD*f%`AN{ULqo zKKR4nabW4dg@8Ww0Q_U%Nnr2k1NK~~x59r8tbp-*KX`}n)LY?=pL!Gg zv*4G2_s;+MFMVq6!yNb`&|X>ihCcO9_?N*8fUG>ak3Kc?`40R8aCPOUU+GhGz02U6 zz+=}ZpP)~@1OD*sLW}|*-#7aQed;0j2f-7-l|yH)(WmA(Q{ZXf!tBuJ^r?A&VsHi= za`)MKq-OkC@HxPHsBx0<)ZEWEz;nPy<0BjBQ**uZ;7h>L>1+0$P;>l6@VCHkS1Q*T zPi@Z;d;>78XhwR<)q&&7w&Q0CLH4UO#%!Z@qfp`}c0%Q&j^U#n*V)!uFPJsWx@D~n z09%3G0BevRYyVDwHM<93owA;X0M;L^Pj!klmFF#Gp66HWPuSL;c8U(zAG@A7no&ux7u^HUw&?3J5a8#ZL-Du<$JQ)Ezd`Flq&<3wjxj3vy21V z72S_$;~)o|XvNsW%*W3>ZJsv|m&b27X{wTw(%?FpeB3xPnpYDWSd@+Z-)HYd?BTx3 nR0sJ9_t>Fsxi9*KOnYwXv#opo^7&2RBx&B#-H-D6iu?5+P!6U_ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml deleted file mode 100644 index 83536dc7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - ["__average__", "__max__"] - Sensors to show in panel - Select the sensord whose values has to be shown in the panel - - - - 5 - Seconds before next update - This is the seconds after CPU temperature extension updates the data from the system - - - - 2 - Position in Panel - Position in Panel ('Left', 'Center', 'Right') - - - - 0 - Index in panel box - Index within the selected panel box (0: first, 1: second, ..., -1: last) - - - - true - Show Icon on Panel - Show sensor icon on top panel - - - - 0 - Select centigrade or fahrenheit - Choose wether to display the Number for centigrade or fahrenheit - - - - true - Enable the display of Temperature Unit on Panel - Enable the display of Temperature Unit on Panel - - - - true - Show RPM on Panel - Show RPM on Panel - - - - true - Show RPM on Panel - Show RPM on Panel - - - - true - Show volts on Panel - Show volts on Panel - - - - true - Display Power - Display power - - - - true - Show Watts on Panel - Show Watts on Panel - - - - false - Show decimal value - Show one digit after decimal - - - - true - Read sensors from lm-sensors - Read sensors from lm-sensors - - - - 0 - Selected element number in the FreeIMPI-Dropdown - Selected element number in the FreeIMPI-Dropdown - - - - 'Disabled' - Method to run FreeIPMI utility - Method to run FreeIPMI utility - - - - false - Read sensors from liquidctl - Read sensors from (requires liquidctl v1.7.0 or later) - - - - false - Read GPU sensors from NVIDIA driver - Read GPU sensors from NVIDIA driver - - - - false - Read GPU sensors from Bumblebee + NVIDIA driver - Read GPU sensors from Bumblebee + NVIDIA driver - - - - false - Read GPU sensors from Catalyst driver - Read GPU sensors from Catalyst driver - - - - false - Read drive sensors from Udisks2 - Read drive sensors from Udisks2 - - - - false - Read drive sensors using Hddtemp - Read drive sensors using Hddtemp - - - - false - Read drive sensors using smartctl - Read drive sensors using smartctl from smartmontool - - - - false - Read drive sensors using nvme-cli - Read drive sensors using nvme-cli - - - - true - Display rotationrate - Display rotation rate (per minute) - - - - true - Display voltage - Display voltage of various components - - - - true - Show battery statistics - If a battery is available, battery stats will be retrieved - - - - true - Group temperature menu items - Group three or more temperature sensors - - - - true - Group Fan speed menu items - Group three or more fan sensors - - - - true - Group voltage menu items - Group three or more voltage sensors - - - - false - Enable debug logging - Enable debug logging from the extension - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js deleted file mode 100644 index 90c6ca93..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ /dev/null @@ -1,104 +0,0 @@ -import GLib from 'gi://GLib'; - -import CommandLineUtil from './commandLineUtil.js'; - -export default class SensorsUtil extends CommandLineUtil { - - constructor() { - super(); - let path = GLib.find_program_in_path('sensors'); - // -A: Do not show adapter -j: JSON output - this._argv = path ? [path, '-A', '-j'] : null; - } - - // Avoid parsing the data more than once. - execute(callback) { - super.execute(() => { - let data = []; - try { - data = JSON.parse(this._output.join('')); - } catch (e) { - try { - // fix for wrong lm_sensors output - // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 - let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); - let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); - errorRemoved = errorRemoved.replace(/ERROR.*I\/O error/, ""); - data = JSON.parse(errorRemoved); - } catch (e) { - logError(e); - return []; - } - } - this._data = data; - callback(); - }); - } - - get temp() { - return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'generic'); - } - - get gpu() { - return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'gpu'); - } - - get disks() { - return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'disk'); - } - - get rpm() { - return this._parseSensorsOutput(/^fan\d+_input/, 'rpm', 'generic'); - } - - get volt() { - return this._parseSensorsOutput(/^in\d+_input/, 'volt', 'generic'); - } - - get power() { - return this._parseSensorsOutput(/^power\d+_average/, 'power', 'gpu'); - } - - _parseSensorsOutput(sensorFilter, sensorType, sensorFamily) { - if(!this._data) - return []; - - const data = this._data; - - let sensors = []; - for (var chipset in data) { - let tempType = (sensorType === 'temp') - let powerType = (sensorType === 'power') - - let gpuFilter = /(radeon|amdgpu|nouveau)/; - let gpuFamily = (sensorFamily === 'gpu') - - if (!data.hasOwnProperty(chipset) || (gpuFamily != gpuFilter.test(chipset) && (tempType || powerType))) - continue; - - let diskFilter = /(drivetemp|nvme)/; - let diskFamily = (sensorFamily === 'disk') - if (!data.hasOwnProperty(chipset) || (diskFamily != diskFilter.test(chipset) && tempType)) - continue; - - let chipsetSensors = data[chipset] - for (var sensor in chipsetSensors) { - if (!chipsetSensors.hasOwnProperty(sensor)) - continue; - - let fields = chipsetSensors[sensor]; - for (var key in fields) { - if (fields.hasOwnProperty(key) && sensorFilter.test(key)) { - let feature = { - label: sensor, - [sensorType]: parseFloat(fields[key]) - }; - sensors.push(feature); - break; - } - } - } - } - return sensors; - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js deleted file mode 100644 index dbe05e9b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ /dev/null @@ -1,61 +0,0 @@ -import GLib from 'gi://GLib'; - -function getSmartData (argv){ - const smartctl = GLib.find_program_in_path('smartctl') - return JSON.parse(new TextDecoder().decode( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] )) -} - -export default class SmartctlUtil { - - constructor(callback) { - this._smartDevices = []; - try { - this._smartDevices = getSmartData("--scan")["devices"] - } catch (e) { - logError(e, '[FREON] Unable to find smart devices'); - } - this._updated = true; - } - - get available(){ - return this._smartDevices.length > 0; - } - - get updated (){ - return this._updated; - } - - set updated (updated){ - this._updated = updated; - } - - get temp() { - return this._smartDevices.map(device => { - const info = getSmartData(`--info ${device["name"]}`); - if (info["smartctl"]["exit_status"] != 0) - return null; - - const attributes = getSmartData(`--attributes ${device["name"]}`); - if (attributes["smartctl"]["exit_status"] != 0) - return null; - - if(!attributes.temperature) { - return null; - } - - return { - label: info["model_name"], - temp: parseFloat(attributes.temperature.current) - } - }).filter(entry => entry != null); - } - - destroy(callback) { - this._smartDevices = []; - } - - execute(callback) { - this._updated = true; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css deleted file mode 100644 index 9b101820..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css +++ /dev/null @@ -1,7 +0,0 @@ -.freon-panel-icon-label { - padding: 0 0; -} - -.freon-panel-no-icon-label { - padding: 0 4px; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/udisks2.js deleted file mode 100644 index d61f90d5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ /dev/null @@ -1,117 +0,0 @@ -import Gio from 'gi://Gio'; - -const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( -' \ - \ - \ - \ -'); - -const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( -' \ - \ - \ - \ -'); - -// Poor man's async.js -const Async = { - // mapping will be done in parallel - map(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { - let counter = arr.length; - let result = []; - for (let i = 0; i < arr.length; ++i) { - mapClb(arr[i], (function(i, newVal) { - result[i] = newVal; - if (--counter == 0) resClb(result); - }).bind(null, i)); // i needs to be bound since it will be changed during the next iteration - } - } -} - -// routines for handling of udisks2 -export default class UDisks2 { - - constructor(callback) { - this._udisksProxies = []; - this._get_drive_ata_proxies((proxies) => { - this._udisksProxies = proxies; - callback(); - }); - this._updated = true; - } - - get available(){ - return this._udisksProxies.length > 0; - } - - get updated (){ - return this._updated; - } - - set updated (updated){ - this._updated = updated; - } - - // creates a list of sensor objects from the list of proxies given - get temp() { - return this._udisksProxies.filter(function(proxy) { - // 0K means no data available - return proxy.ata.SmartTemperature > 0; - }).map(function(proxy) { - return { - label: proxy.drive.Model, - temp: proxy.ata.SmartTemperature - 273.15 - }; - }); - } - - // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces - _get_drive_ata_proxies(callback) { - Gio.DBusObjectManagerClient.new(Gio.DBus.system, 0, "org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", null, null, function(src, res) { - try { - let objMgr = Gio.DBusObjectManagerClient.new_finish(res); //might throw - - let objPaths = objMgr.get_objects().filter(function(o) { - return o.get_interface("org.freedesktop.UDisks2.Drive") != null - && o.get_interface("org.freedesktop.UDisks2.Drive.Ata") != null; - }).map(function(o) { return o.get_object_path() }); - - // now create the proxy objects, log and ignore every failure - Async.map(objPaths, function(obj, callback) { - // create the proxies object - let driveProxy = new UDisksDriveProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { - if (error) { //very unlikely - we even checked the interfaces before! - logError(error, '[FREON] Could not create proxy on ' + obj); - callback(null); - return; - } - let ataProxy = new UDisksDriveAtaProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { - if (error) { - logError(error, '[FREON] Could not create proxy on ' + obj); - callback(null); - return; - } - - callback({ drive: driveProxy, ata: ataProxy }); - }); - }); - }, function(proxies) { - // filter out failed attempts == null values - callback(proxies.filter(function(a) { return a != null; })); - }); - } catch (e) { - logError(e, '[FREON] Could not find UDisks2 objects'); - } - }); - } - - destroy(callback) { - this._udisksProxies = []; - } - - execute(callback) { - this._updated = true; - } - -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js deleted file mode 100644 index 17403638..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -export default { - PACKAGE_VERSION: 57, - PACKAGE_URL: 'https://github.com/GSConnect/gnome-shell-extension-gsconnect', - PACKAGE_BUGREPORT: 'https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/new', - PACKAGE_DATADIR: '/usr/local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io', - PACKAGE_LOCALEDIR: '/usr/local/share/locale', - GSETTINGS_SCHEMA_DIR: '/usr/local/share/glib-2.0/schemas', - GNOME_SHELL_LIBDIR: '/usr/local/lib64', - - APP_ID: 'org.gnome.Shell.Extensions.GSConnect', - APP_PATH: '/org/gnome/Shell/Extensions/GSConnect', - - IS_USER: false, - - // External binary paths - OPENSSL_PATH: 'openssl', - SSHADD_PATH: 'ssh-add', - SSHKEYGEN_PATH: 'ssh-keygen', - FFMPEG_PATH: 'ffmpeg', -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/executable_gsconnect-preferences b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/executable_gsconnect-preferences deleted file mode 100644 index b16ddc7d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/executable_gsconnect-preferences +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env -S gjs -m - -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js; -*- - -import Gdk from 'gi://Gdk?version=3.0'; -import 'gi://GdkPixbuf?version=2.0'; -import Gio from 'gi://Gio?version=2.0'; -import GLib from 'gi://GLib?version=2.0'; -import GObject from 'gi://GObject?version=2.0'; -import Gtk from 'gi://Gtk?version=3.0'; - -import system from 'system'; - -import './preferences/init.js'; -import {Window} from './preferences/service.js'; -import Config from './config.js'; - -import('gi://GioUnix?version=2.0').catch(() => {}); // Set version for optional dependency - - -/** - * Class representing the GSConnect service daemon. - */ -const Preferences = GObject.registerClass({ - GTypeName: 'GSConnectPreferences', - Implements: [Gio.ActionGroup], -}, class Preferences extends Gtk.Application { - - _init() { - super._init({ - application_id: 'org.gnome.Shell.Extensions.GSConnect.Preferences', - resource_base_path: '/org/gnome/Shell/Extensions/GSConnect', - }); - - GLib.set_prgname('gsconnect-preferences'); - GLib.set_application_name(_('GSConnect Preferences')); - } - - vfunc_activate() { - if (this._window === undefined) { - this._window = new Window({ - application: this, - }); - } - - this._window.present(); - } - - vfunc_startup() { - super.vfunc_startup(); - - // Init some resources - const provider = new Gtk.CssProvider(); - provider.load_from_resource(`${Config.APP_PATH}/application.css`); - Gtk.StyleContext.add_provider_for_screen( - Gdk.Screen.get_default(), - provider, - Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION - ); - - const actions = [ - ['refresh', null], - ['connect', GLib.VariantType.new('s')], - ]; - - for (const [name, type] of actions) { - const action = new Gio.SimpleAction({ - name: name, - parameter_type: type, - }); - this.add_action(action); - } - } - - vfunc_activate_action(action_name, parameter) { - try { - const paramArray = []; - - if (parameter instanceof GLib.Variant) - paramArray[0] = parameter; - - this.get_dbus_connection().call( - 'org.gnome.Shell.Extensions.GSConnect', - '/org/gnome/Shell/Extensions/GSConnect', - 'org.freedesktop.Application', - 'ActivateAction', - GLib.Variant.new('(sava{sv})', [action_name, paramArray, {}]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - null - ); - } catch (e) { - logError(e); - } - } -}); - -await (new Preferences()).runAsync([system.programInvocationName].concat(ARGV)); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/extension.js deleted file mode 100644 index 9d960ac1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/extension.js +++ /dev/null @@ -1,407 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import * as QuickSettings from 'resource:///org/gnome/shell/ui/quickSettings.js'; - -// Bootstrap -import { - Extension, - gettext as _, - ngettext -} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import Config from './config.js'; -import * as Clipboard from './shell/clipboard.js'; -import * as Device from './shell/device.js'; -import * as Keybindings from './shell/keybindings.js'; -import * as Notification from './shell/notification.js'; -import * as Input from './shell/input.js'; -import * as Utils from './shell/utils.js'; -import * as Remote from './utils/remote.js'; -import setup from './utils/setup.js'; - -const QuickSettingsMenu = Main.panel.statusArea.quickSettings; - - -/** - * A System Indicator used as the hub for spawning device indicators and - * indicating that the extension is active when there are none. - */ -const ServiceToggle = GObject.registerClass({ - GTypeName: 'GSConnectServiceIndicator', -}, class ServiceToggle extends QuickSettings.QuickMenuToggle { - - _init() { - super._init({ - title: 'GSConnect', - toggleMode: true, - }); - - this.set({iconName: 'org.gnome.Shell.Extensions.GSConnect-symbolic'}); - - // Set QuickMenuToggle header. - this.menu.setHeader('org.gnome.Shell.Extensions.GSConnect-symbolic', 'GSConnect', - _('Sync between your devices')); - - this._menus = {}; - - this._keybindings = new Keybindings.Manager(); - - // GSettings - this.settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect', - null - ), - path: '/org/gnome/shell/extensions/gsconnect/', - }); - - // Bind the toggle to enabled key - this.settings.bind('enabled', - this, 'checked', - Gio.SettingsBindFlags.DEFAULT); - - this._enabledId = this.settings.connect( - 'changed::enabled', - this._onEnabledChanged.bind(this) - ); - - this._panelModeId = this.settings.connect( - 'changed::show-indicators', - this._sync.bind(this) - ); - - // Service Proxy - this.service = new Remote.Service(); - - this._deviceAddedId = this.service.connect( - 'device-added', - this._onDeviceAdded.bind(this) - ); - - this._deviceRemovedId = this.service.connect( - 'device-removed', - this._onDeviceRemoved.bind(this) - ); - - this._serviceChangedId = this.service.connect( - 'notify::active', - this._onServiceChanged.bind(this) - ); - - // Service Menu -> Devices Section - this.deviceSection = new PopupMenu.PopupMenuSection(); - this.deviceSection.actor.add_style_class_name('gsconnect-device-section'); - this.settings.bind( - 'show-indicators', - this.deviceSection.actor, - 'visible', - Gio.SettingsBindFlags.INVERT_BOOLEAN - ); - this.menu.addMenuItem(this.deviceSection); - - // Service Menu -> Separator - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - - // Service Menu -> "Mobile Settings" - this.menu.addSettingsAction( - _('Mobile Settings'), - 'org.gnome.Shell.Extensions.GSConnect.Preferences.desktop'); - - // Prime the service - this._initService(); - } - - async _initService() { - try { - if (this.settings.get_boolean('enabled')) - await this.service.start(); - else - await this.service.reload(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - _sync() { - const available = this.service.devices.filter(device => { - return (device.connected && device.paired); - }); - const panelMode = this.settings.get_boolean('show-indicators'); - - // Hide status indicator if in Panel mode or no devices are available - serviceIndicator._indicator.visible = (!panelMode && available.length); - - // Show device indicators in Panel mode if available - for (const device of this.service.devices) { - const isAvailable = available.includes(device); - const indicator = Main.panel.statusArea[device.g_object_path]; - - indicator.visible = panelMode && isAvailable; - - const menu = this._menus[device.g_object_path]; - menu.actor.visible = !panelMode && isAvailable; - menu._title.actor.visible = !panelMode && isAvailable; - } - - // Set subtitle on Quick Settings tile - if (available.length === 1) { - this.subtitle = available[0].name; - } else if (available.length > 1) { - // TRANSLATORS: %d is the number of devices connected - this.subtitle = ngettext( - '%d Connected', - '%d Connected', - available.length - ).format(available.length); - } else { - this.subtitle = null; - } - } - - _onDeviceChanged(device, changed, invalidated) { - try { - const properties = changed.deepUnpack(); - - if (properties.hasOwnProperty('Connected') || - properties.hasOwnProperty('Paired')) - this._sync(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - _onDeviceAdded(service, device) { - try { - // Device Indicator - const indicator = new Device.Indicator({device: device}); - Main.panel.addToStatusArea(device.g_object_path, indicator); - - // Device Menu - const menu = new Device.Menu({ - device: device, - menu_type: 'list', - }); - this._menus[device.g_object_path] = menu; - this.deviceSection.addMenuItem(menu); - - // Device Settings - device.settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect.Device', - true - ), - path: `/org/gnome/shell/extensions/gsconnect/device/${device.id}/`, - }); - - // Keyboard Shortcuts - device.__keybindingsChangedId = device.settings.connect( - 'changed::keybindings', - this._onDeviceKeybindingsChanged.bind(this, device) - ); - this._onDeviceKeybindingsChanged(device); - - // Watch the for status changes - device.__deviceChangedId = device.connect( - 'g-properties-changed', - this._onDeviceChanged.bind(this) - ); - - this._sync(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - _onDeviceRemoved(service, device, sync = true) { - try { - // Stop watching for status changes - if (device.__deviceChangedId) - device.disconnect(device.__deviceChangedId); - - // Release keybindings - if (device.__keybindingsChangedId) { - device.settings.disconnect(device.__keybindingsChangedId); - device._keybindings.map(id => this._keybindings.remove(id)); - } - - // Destroy the indicator - Main.panel.statusArea[device.g_object_path].destroy(); - - // Destroy the menu - this._menus[device.g_object_path].destroy(); - delete this._menus[device.g_object_path]; - - if (sync) - this._sync(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - _onDeviceKeybindingsChanged(device) { - try { - // Reset any existing keybindings - if (device.hasOwnProperty('_keybindings')) - device._keybindings.map(id => this._keybindings.remove(id)); - - device._keybindings = []; - - // Get the keybindings - const keybindings = device.settings.get_value('keybindings').deepUnpack(); - - // Apply the keybindings - for (const [action, accelerator] of Object.entries(keybindings)) { - const [, name, parameter] = Gio.Action.parse_detailed_name(action); - - const actionId = this._keybindings.add( - accelerator, - () => device.action_group.activate_action(name, parameter) - ); - - if (actionId !== 0) - device._keybindings.push(actionId); - } - } catch (e) { - logError(e, 'GSConnect'); - } - } - - async _onEnabledChanged(settings, key) { - try { - if (this.settings.get_boolean('enabled')) - await this.service.start(); - else - await this.service.stop(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - async _onServiceChanged(service, pspec) { - try { - // If it's enabled, we should try to restart now - if (this.settings.get_boolean('enabled')) - await this.service.start(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - destroy() { - // Unhook from Remote.Service - if (this.service) { - this.service.disconnect(this._serviceChangedId); - this.service.disconnect(this._deviceAddedId); - this.service.disconnect(this._deviceRemovedId); - - for (const device of this.service.devices) - this._onDeviceRemoved(this.service, device, false); - - if (!this.settings.get_boolean('keep-alive-when-locked')) - this.service.stop(); - this.service.destroy(); - } - - // Disconnect any keybindings - this._keybindings.destroy(); - - // Disconnect from any GSettings changes - this.settings.disconnect(this._enabledId); - this.settings.disconnect(this._panelModeId); - this.settings.run_dispose(); - - // Destroy the PanelMenu.SystemIndicator actors - this.menu.destroy(); - - super.destroy(); - } -}); - -const ServiceIndicator = GObject.registerClass( -class ServiceIndicator extends QuickSettings.SystemIndicator { - _init() { - super._init(); - - // Create the icon for the indicator - this._indicator = this._addIndicator(); - this._indicator.icon_name = 'org.gnome.Shell.Extensions.GSConnect-symbolic'; - // Hide the indicator by default - this._indicator.visible = false; - - // Create the toggle menu and associate it with the indicator - this.quickSettingsItems.push(new ServiceToggle()); - - // Add the indicator to the panel and the toggle to the menu - QuickSettingsMenu.addExternalIndicator(this); - } - - destroy() { - // Set enabled state to false to kill the service on destroy - this.quickSettingsItems.forEach(item => item.destroy()); - // Destroy the indicator - this._indicator.destroy(); - super.destroy(); - } -}); - -let serviceIndicator = null; - -export default class GSConnectExtension extends Extension { - lockscreenInput = null; - - constructor(metadata) { - super(metadata); - setup(this.path); - - // If installed as a user extension, this checks the permissions - // on certain critical files in the extension directory - // to ensure that they have the executable bit set, - // and makes them executable if not. Some packaging methods - // (particularly GitHub Actions artifacts) automatically remove - // executable bits from all contents, presumably for security. - Utils.ensurePermissions(); - - // If installed as a user extension, this will install the Desktop entry, - // DBus and systemd service files necessary for DBus activation and - // GNotifications. Since there's no uninit()/uninstall() hook for extensions - // and they're only used *by* GSConnect, they should be okay to leave. - Utils.installService(); - - // These modify the notification source for GSConnect's GNotifications and - // need to be active even when the extension is disabled (eg. lock screen). - // Since they *only* affect notifications from GSConnect, it should be okay - // to leave them applied. - Notification.patchGSConnectNotificationSource(); - Notification.patchGtkNotificationDaemon(); - - // This watches for the service to start and exports a custom clipboard - // portal for use on Wayland - Clipboard.watchService(); - } - - enable() { - serviceIndicator = new ServiceIndicator(); - Notification.patchGtkNotificationSources(); - - this.lockscreenInput = new Input.LockscreenRemoteAccess(); - this.lockscreenInput.patchInhibitor(); - } - - disable() { - serviceIndicator.destroy(); - serviceIndicator = null; - Notification.unpatchGtkNotificationSources(); - - if (this.lockscreenInput) { - this.lockscreenInput.unpatchInhibitor(); - this.lockscreenInput = null; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 78e91a6f75e90c3a857590fd6cec7fb914828be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20859 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

bs2T#%pQPa8Q4!*~e6g4QsAF%!BGT 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 3fcc2a5a4de4f97c40e921d8cfa043c1a57847a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12438 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 GzM*$G!KN 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/el/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/el/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index aa446e31be29eec479b56c84576f3e430191ad32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23676 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index a2fa920a288bcfb00583a743bba3f8d9fc862ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18586 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 N^$WPTUA(N*`#%HI{e1uc diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index d792ee91077f5fc0b36d05d1622e2dd7df290d22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21364 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 80b6edbb413fd35af09ac353356372fa6a042684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18747 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 783cc39a64b5048e0a00c81e60677d2a01f96c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18934 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 15e8fa041f12a20e73c8b7917f9b21e8259eddf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11530 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 499500d30cf12030c150222bda68b0f1e41d809a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17949 zcmbW737i~NoyQ9ahv6oIa{53*2xKOZh`?}8CKDW(NyhX<#0zS=YkG?GRJB#zlT6kl z;;QVb2#c&7DtK@y>WViWs3_}wp{pP$0-m_)a>xp+?)UfJtM2Ls{^UQudaqu+ z3UD{@Lm*QQZUqkqZ};`T1T~+B!Ck<=fn(qq3ToYd@wkM+BFf7_efL&S^Laa{ey<0`pO1RH&Eq#ft@B5q z*8eL|^Z6^Ne)eHg_1yuW=Cu@5fBm4^oeYkE>wWzd;3CS``SSZg?b9bg@$swR@!)sB z)4`n(GL1hB9tCa!C3mmp4^4urL5=rGP~&|W)V}@*JOq3K+!1^hg`L2ILGkNwQ1d?4 zmrns%Qg9Y1K1QJUlY%MuYLKlAeh=OU?!qRn27e7|e-D1P>-RWN>pR`!T5vJt5m5b2 zfEvFFieIk)C9m5+&Hoxue7MDzKMjgM-vq_~dqK_PQBdpI!#G?5s^0@Z@ne}UKNr+` z)`04F6cj%zpuVqy>OTfGpKYM#|2k0LT?DHAKY^-$52*GxfEw>pzI+F$c0U5e*I$8} z=Odun?T%7QUJe8$mxqJ8?+a?42Z7S#=YSgj1n>-SEvWup4{DxQ zfv8w;BPjX#5~%O*1;y`QfcpM-pzOw?puYPXD84N@()E7`sCNCJ=6Mpxl!CKC*^4H43ixL5 zXz**k{!vi;-Funq?^&Ss<#15@eLSds&jQ7-O`!HY0kyu1K=Jb$P~UwJlw5wn*MA4x znex59{2-|LJq&98i;i;r?+L2@0B{9(45;@n0zUyxg4&-0mb>*Y2i5*mP~&X?SxWG7 zQ0sj?xC{7hP~Y9;%bx}{pD%*Df?oy2r|*GJ2mb_W-C~m3?FXv=gF&tL7;qe111nLHLq=;)_WnSdEEd?j&Jql?}FmX1EBQa zci>`hx0Oy#_XqXgQ2a=J z{To3=1bmNAX^_? z0*Zg12i4z$;O^iK$2&gn32J^vg4(ZjpzKWuN}eNdKkx!@FK|2f4Db?A>$?t=p4<*< zUEcy5;60%DF!DTn5I70)FF5f8r#C6Mgz_7}oxrO=jdv}m`CaGV-vaJS`3_Kgx(k#% z{Q`U@xaWyZFOLM(UmvJ>4T89s;5<<4z7UlDUIS{p>p|(k&7i)!1JwHN2F35+f@=Q= z_$=@VP~R;%$?d}dpxPbnaWyFYI0f7vdNvf%}11gPQ+GeErwJ!zkb7 z%TIzDf42e0?|nTk10^S?cw7&P|L23^(*?f%RiMUytAGDCQ1bIGQ1kdOsCnH6YF&4N zTF+ge0q^(a9Wf@F=kB2TJHq2~Q0@Cc&GQ6M^EwTbevN}`!Iy*L$9qA^$E~2o{TgV% zdqMT{S5Wf2%PFp(y}%!A4dUGPBgK2Usr5|n)Ggc2SB9tx`c z5UBka0X5D`LABou9t5^Q@%2*hZ15&u|Cq1e=X5vTa!~6y3DkFMLGk%~P<+lnjlUh# z`mO}k{@osL2F0&Wg5t}!L49{WsPFy=O0S-NhMUiRp!nVg9tuu?;%g2b1AY$F``>`# z``&}@`$Is<^>XkK@N`h~co`^uPJ{aHLhvZ?CQ##l9~3_y0yV##*SPf^2<}XI1*mne z2DRTCK=JW>Q1iY3)VQ-CTM@h&6u-X?J_O$7-+yJu@!=<+_T^zv$n`G zX>g6Nf6&)I1TLfgF>nV^a~X&9`vdfk_K9_Sd;$0!NNf9;uPflEJY3)lec-MB`K#b3 zAn|J&`ZV-9=o;u;==IQMNWXuB{sP?x6~E(oc(^Elh*Gd4lRXdo0kjRe5jqhgv!Oen+o114`e|<^hqpj0A?00u0$v6^28GbOpcg{=z1@NR zyMn*}0KFAD9}+{~2s{bh1#N-!dk!R--d_cNFNPj~-U6Kg{S_*HhKKL_!Z*M-LpS;I zI`C>p@_&x6E5pB2*a#)iRnQk9{f>kVhF+-xzdt$%J_I)WvtS5X1WDf)u@>o@bVlxwhI3D8t`KOyaD{Me|{gh8oCzx5p*H+1?b(-4D=i5KW{PlNPpL;nm-sKDxcV{t~<# zItkhV-W&t|4*EFsIP?hgDD)!eo6sC|FLV%eCG<>aN9bkHQfP0e_$}e#Z_pFa-$6S= z#qT2ja3Was&z~w@g0F@Shi->H3%wuu8gv4*2KqAePUueP_s|ERzlR=#^qX|>lz&h5 zwO;{ugMJJB7j!7J6Qtj3pFYLu{m?RBexAp>!F!-L`LZB| zj(|Q7#ZdWoX{nI$d=|9b*A00575EU8`?BC?&~?xh^b+W$&<#-e_YMkwhVF;Ppu-^h zTUs+iX_7?MR#Xe-7iQw5-HKH0o^l?SE;UCjt=)goCzc+&s%ADuGhv*>NqzZ(SDTVn z+%W6fjYjcqIB&%>VT;!HZ@=DG4o!zy-40F1S!bTQ_wK+2x@r`NcYG+?0 zX^WSQbW2n-t<8;sirf{M%0ST*=vUjE}B?%Gf~oFp=n~K(#)K> ze#6*sFgTgETjtD)XLm4Itwzn3g*>M(zNofxlTMk|bYz-goH4&zG#ghV8rjY&(=4mn zZsoROHe~4aX)B(Jt9Gzpu%_LdnF*5`&$D4tg=2$B%`B~%lwPx9n4U^{qsdH~MQlqj z*lad@e|g|p7OaU3EN39`)UKln``I8q3~Lv_M3c|ut!T!~rj7PYWNPh9Tc$t!TbU;H zRAu{BuqLjtIJ=~3-I)S$mCZPO~BW-V}{^jeHJae|;oH_}9}nv-dm)w)k+ zTte7+K{1~$6)ST|m7?avhXW@)WmrGeoI zKFw%r6JE^5(H6VS^wZBM`Q}#I1f>>*Mi)iP`=T%!=dI#-EK1tN^LnJ9c&Zr(+LC6QVMLruRm@mgi-O@=+_Ha6q5P^be)e|3!-Gi1EZ0dx!qS;pWeN7U*%8z8Ai*nn6RVADR$Z#hRxBO6XW5en$0z>1sg%mgW&`_ z%ohn;i$YkFW@j)RCiTdiGI`q4{FIfGrv<}XG0du(^rpM4Cc{?su$0)zXbK6(ninEI zytNr+v9-btdTB*TE@Rx;?{y)r!nzLZP!!Kb=Kk&PSeoCz{heki!yjN_x=r#3E7y4s zr|jFU!8+@1*2TOXn=|9nDN43ZUpvMJa(#2AaBw}PUN!CdgwB(hh{BnmTa1!w+7{bn zfD^OK zjq(d^HGFoCZ=SP5V#}^D%9$g20v9@N&~<3G#8~w8VVe-4ov(mN@XblhI$Xn4x|J!n zqIza6BE|!mEce`kJJyefC2wU1!PK?4t}tsVYgZWDT9(GO6{f;=PsRE43KMUrtYE>_ z4HYY*=dgJ=lJd%348kh$Psqga3*%X zX~vu#44w~LgXgofU}Ri=D5E|YVK0fN>i7zLXtyZm7@Q?vnh;);mphNm9cBh+dlh4D zMPx7bUQ=1-PXU;J?sR4H zsNtexT&oESZqW>j%&N)`*AP4*)ogc9t>sEj&B)r`79)(_QER_1W4nd zcEs*;fN^W3!MN6|KLav>T3W^#V+u_EgK*i zq#Az6Xt%O3$*1s?_;RXj05Cp8Ct}rLqoJscLW}qjw1JW=&_?Z&{+PM6o%N0rY-}e* zkdWI#;W8CsENriR;)G*2#>FBgqlc$(xt$P&8CKR!jN3nEu+8bp>bJO13E`IhxG0@P z1r=iEs`SVjZ#M*P_pb9cyiax2npWNlC3n)>j;_)i@zx*Y)<&YP(6cM{wVjUI zO{B)zrS1sShNclGo5ghm-F~1A(P7kD75v=7EmVui(m9Dn3UE3jxgK1!QN+pRzTKN9 zyzoQX<7{~j-RX#7^CA*v*;-ha**Mw8zm>=pHYHsnMnDu)IQz0K`s?h8d&H4$_O)g9 zF*n=NF3UaXq|3>^TD+Qww)$SpIr5%5ylUfZYqu!zV$;S^#lWpCHVn1_ebIw$w8HKI zj+nNsZkO7a+{F)_@Mr~LG=ZE~6T(G%I?N;{lhz0J`_Zw1ozt@KWWh%IrmC+NCo$_C zV6c4$^TER3^0dYB4fpSl;kGJ6fI|$Zgj1)w$_(=ATvmmEz&elnw_ll?I!4-T$v7eh zI>&WbVztq0gnRQ8)6oYV&t*UFSt8%rQ+aWY_r(|5LwYbFx8DNDz!b-YU?QqcCnNwG zC`60UAg87gY2tJCX*RaY(Iy+ar8To=PHHlt1By2iJjIDxDy~3mi{n!##z5`7Mo*;e z>NI}7fAQKZtar=^(irN?8IDl=kt?dUvpmiE7t6UQ2tx;GP}5fh_BLExv4NAek)!yQ zn9v6W&7~-O&|`r67mr3$EkeV%R%=8nNLQG5Q>}@)rp~xt{e#}39R}0N;)d-BiAgfqTG7l3k0}m^nMo9A zY)Up0EhYsj&QTac+1cGq_TWmPi|PP`_^(U7%;1jUA4OJ*c1C!9dA~x8hGyUi$}w})n`S=j>ku%oNwEtO!{=- z8!#iSun~tzr+NVAf8NN%;<1sj;qFw9>pym}Hk#e)lMD@51G$onK%AUxlbM7Fr*4{9 z*LPyKofp_XPUC3}J`9)>C*#&)!niDK^sOWPM2<9R+G2j{s*}mZ>CLG}CFZbG&2h_5 zUi_lIAq*?u_Idu4nX=$z-^khlvwGDDC#_yx`m$KB7FMcO6gOa2zN8~4{q+PZ*_Z41 z*@vxhC-}b3CcKROj+2$mbY+^=UE_XxR_z}y8t47p-kRzB(d_h&J8`kH+g1kiJS{!P zdbU|_TWgQ^@5U340^7ZZtgrZ7|F_1TF1D!ktIDvnr}Wg zxuq`wVnxK!Il#IRytLJA8jdxvWrfVK|GB0cZ-enA z5hNULM0O=skP+*4Y;y)KXU|yG-t@WziP|jAiD(>eG>*?9Ge_(B)k^!?NwceEteXy$ zA$I!~8&XNOI6~kOc1jgeXT)Zjsq4RJHZ&b`BJD1oc$tVr+T`VG$YQK*ByGz$#eh zCDr=LMy05iX%XUB!JCP5`OP9Pk0Oa}UhFd7*mIxF&4(*ceKKb;uV;}$NwV)c?dIqU zy;z{EHch{vcDSJ&XGyE$KoN+N=N&a)uO#7oX&rH9%kF9E^E4Rgu@MF%hRLXEH^la* zd>dA)X|pLqQc@%_oiQ*_#9mQmUxkQeY;7g;>+~rLkX0oGq@iSff>8;lt7Lpx*V0>_ zCDHAiI&ASWgr7S-k{oszdMPc3!D*r_dn@WEIaWh^T6hQ=5puMhE?EiHOB=Ik+OlvQ zaD7Gbpbe9IUBJshx2#}1$~dAZ-HhUtX5niB$X0ss$6Ly|=y+74zRHV&TYB9>u zhuz#g$2YR(otUWm!o~(xjAa{2L4-mAUBQuK>Ngb^WVp>NEG!Pq-z`v&NAZ^nP8qwl zq?}-vm)C_jr$;2ZGz%1@{r`v|TtB4t@u0deuqmO1cMD2x*qeoZgX-H01lZN#hJ1#* zfpj+tZUqu24Ez7_MjHTMwS>LyEMs-0=a|KUny|5t!poHcdw9Q z2$jsLBN)`yGgSwJF}XEvv2!U5=?^?qYDUHb{8Gq8vbMqycZwlJ9paU6GmFtCmrMRU zqr+4R*ZD6CPKX)gsiU=Wn1y6_G}hla_?h+HvwXw_!g0kMWwowJ67Ug+gbCB@y7b{%P*LK}@ zBbZZ+IO%3X7j@ioupgbsuft%L+Nm5_Yu#G8hPhhX*lFWU7m;~cZrd36d18x=$7v5D zv-XcW{irCv*a=f@1tt^E#fhza_tE9Vpdx%7E3BuN?VgUY<#t|$|F^aFPcLf{$mQtFD&2VMN`Ypy$V2vS7OP3=uL5jjK z!f~RPu(;&$=G~5Tms#>jIw-0*i^V9rrEU`zWf`nZE%_~-meMTI(Pj#BBTGS;s04>@ znz=2p0ZyR;zDmb9e_+M5`8a4}JcIZu)+VnsW-Cm!Gyf8LWza31t&tMRqo`E;Y>m|5XXM9rf*b93XV=rGC#G{pvzZhY6{A-J&E@JJqz+y+|EY^L3wdKi| zUXW7YjKsNVp+&OiDSVVpReayIz^Q~#Sg8^IFwAmWNfc%?D)2?PU~XUZf?ErbYOHyNxuy%4qGk4J= zZKe0_>z=u*!2iQ2{`2GtI^-l&#K9#OfI>;oSWACro(r~Hea+L`f;DQ(D_RiU%U;$Z zk|v#WfNy5`Q_eaO59nZR!GY3LH8)%%`^DyzYMQG_4(_h zasWuVD)kgNZsFL%QkWw#)m+@a|m2y-*fn-4&7j5sVtQU0V(jP;0J5{R9VjFa&^Qx^B zuZ`BXA~}-C$c8$WSnHM%KXtq5COC?NE^13h%1KD8k`yM|X4u?G z`JQWt;ancprE9T;3Tq;lwqZA&iS|jou91>1BR^g^S%A`jvIFu3d93>{vWkdLS!k`B zi(#Y^ma=*?{BIN_5osJCn>3peyN)nPckgxkMZF`~%P$F^k94{{vlqHvu!6Cy;FT4K rV4}DVi{U@A8=Mu-%y4avi6T8}PPstEes)B~GwR&CH2Rs>X~BO3S)*I* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 16bb28ebca6643354acf99015bee95a2e92cbf72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16896 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 Y%ywmO<9}ybnz}UX+s;2eeO?y)e*yvwDgXcg diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 13f9d1c6eec2edc37318742092b9deccef5209a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18231 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/nl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/nl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index e01ae54781c0979cc1ef9baf9297b900d76bdc5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16332 zcma)?37i~NoyQBqAqgO05JXmrg@JI){~*s>2p$0*3Z4u;2i)lD8{j^aF9G)h z-v}N8z6(48ydKo|cZ0`+kATkv4}F&B9SHV;i@^aEKVne+7T->i0R=uICVtt$01)2-pj1{+EJu^*#U|3Elu|-UmR<`?$j=L9J7p zIR;n=Y9Gr%?Q2m!KXdj zj$1I_W&1z;?qf>*1OV`H-Jp#T>$DFwt?cyC13(x z4#Hw@HwM)?9tvul#h~_ay2BOVe9EgqeZL7*zW@|p5>Rrv4HRFl0=3^yy7Kj)`0y=I ze7*ulYW-({8ux5aeA@`>y8zVqQ=rzf4b=KC2KC)# zp!&bb)xR55|M!EM?>blh8mN9h0L90LK&|sJQ2pi~Zsp<-Q1a)42Y@Go`fiOYp9`x0 zR)^a_?dLL3>$(!uy50)vyZ3_P>!(4DcN3_6eIHc+yFs1L{jUBGpw{=KEAQdkehWbD ze}7Q&`)pA9dIYHXPXf;ZSAZJtRiM`SRuC2Nt_3A8H-h^99#HR_eb*p>Igh-rNX zfjaN!fZ9(VsQ#ybgW#E<=Difuc$b5cqql+D*EJv}#rqJbem8+zz&l*~(Fncxay%$` z?+5kW8KBm^64d!@1U2tgQ2e|QLG^z(sPW$qioc%*#iy@*~x{e$2DFI^So48gCIOKAi|^Kf|E- zR{?c?7lPvRrLO);Q2cz4D}NBwdaeVt-fw^!_j|7XKJWy}kGl55j<)A;G^l-^4C?!{ zLCy0*kbho{AMNW3Q0xCVsPntdm2Uy}q zupitVe64GL6R34w4ekZr=I}01e7F~U-EQmy6#rg!tmWI~AY1c33}UjpJ3-C&h{L~u z+UGtT3MSR_LG?Qwl)ZleDE?m#O20k~E(5;~YMeiV^TEB2N9Mo-LCM?MpvHXxsP!e_ z0`L-$DZMvF6o&=r(4uC`8c2MKo2yztO-Jtll z$5QLhj{r6QASn6T1R~nrHgFzzHK=vI4-{WN25R3oy7KLy#``I#et!kE{yh<{mw^X? zn*RzAljeN{)O>ee`-AgNw0g1-l-?Z%YM%q3S<{1vG6{}I%<-t+8udx4toFz}h+B2eQk2i0!~ z)HuVS)_Xpvebroj)78HMd-;S!K0FSJpL?LhlG}yg z0pQ`F*1Hr`ztceVTMueo7r1g2RR0WI2)-H=zupe2-}Rv3k88ix)!z&1y9Yt-=Lv^@ z0oDKS4xfIq<@W)g_|yw-1WyGC4ZPQa;@d|+>FZZOOq+K%sP*rLvC()7K*{GqP~)5h z>YRo_@$EcN{E0xVdpo!uycpE@cY@;2&q4Kj6x4T823)zfKdAjL16$x~Q2Y8aD1O`w zO5T40?gc&ws{e05$*p&)o%cvkd^rx(ewKsU$2qS4B@RUI@5%3!z zuGf23zn#Ayl-zCs&3S=~D8Cw%{rotn{oMv04E_kzypMvCmnT8Z_jgeJ_C3w^I|Nj} zC7|S_9~6H_K=JK75R>9HK<)D?a5;D*sPp(6C_WrZrRF&U)c1p+z8?iOUlmlp1k}DR z1;zIdg3kfJ1?szBfQNvOgF43rI0K#YfuP1a9F#nq2x{HSUHdAKt$Aah_W1@-`*|m* z?>^zmUj=pUKLnS6zW~MmgU_(zo(yXKGeNEAT!&Rq`)GoQj`vbf`t%u4>%1A%I==}% z7yKbO3_bx$j#iv$*R>kd_nSd|_j*v{ycyJaz7NE`d+&qvTxG%7_`mZ0KhOiv?XF(% zb4X);2|5ST^D<~0x>p7FuvKprq#0{DCAbr00C- zM5qb5|rdn@!}Nc`@Dz5@Lg(z6+Q6Lc&z4~if?mq4$8?ool~C(x%L$w&=)5%e4A zxsaZdpii4O8^8UE_rqQJ)!@HD4?}N*ehM7`{RMhD^dFF9OV6!PX5Q?N4-7${hrSBQ z2HXT)1pPbo7U*E;P)Lt-XFYTcv<&(Pgs6Ehg!G(Z!PrvSmGfNrCE(kkYoTvKdR_p% z6nd=+Jb$v_y%Idoy`Ki&0Ih^>gBC#2=XH>t&p_`nZ=Uym;8D=GA?c!?b1isvP4W=0%&hncOm#4_x^5hFX%Dob5IU#flh_q4Cy%x zS`0m|0#6DpH*eNvAJ6;iU3q_puLAFe`k@a%XG7nGif2Ff@=owd=vz<-Jp%m@DxNR$ z(r|_A!FRd${{_!-@4o>5?B1UTejWM|beXIBAh_1O3kIP1(3e%<`2=(VvQGmB=uLX-!L-d4NN4h++RKB zI(h?@O4!T|WEo@eMJ3PtWYW*4L%$hBDeJ3-Gf^d^lNoGmnr&5Dd1fkR0;XP{~G=jLw`%Dm5;MhQ1^?Ry*!l-F6O;;tO(WQ~3A;;nkG@ErdUgkNLc`HI6 zmNSufYW7iq{TvV<2Gy-F(a+|xJZ$(gNxjtw{c0=Kk?Dtji<5XNQQ3Uut%#~@&TJ{D za}yLP0fiUNUQBPe^f$PHc-r_JBnj- zafPDR)Fls27X0BTW_?yL;DeRa0@AGkLdPPC@z znPtILh+wcMtF`rH3jOZ$$Ag+UHs>QI&CEwv)E9Mx)97oOR9h7~_`JcVhK@F-VI~S^ z%`r1hAG2h&JZXYbi$bG|qTzi}7>=^McpnMlR`I?bDJb5@!d!=u6=k%&8fB=WG#O5~ zX{c_+Rv}##Uqp!R`c`8iOnJ{F0rc{j9M_0bQu`UEDNM_ zmG$XTX3u_=?fNr}md|E_QjZhtv@r~|aL$VHP+Uppn#O{yMa~%yJIog`M~gxjlV(;h z9mG?izkK41o^1Kzi8H*RZ5U=%O*qrtsU|~4^{|xK$#4=0$C?)+KD4bFrjfD2b#GOG zUod_GqZ39mq5r@|@9fDQxacZ>GR62~PTF0v5R+E6!xq!J&0A%B%c_XhkvV^KIzgjW z>1)enPkwIBFT7b-saq%84xoJV$HSoEwTod~Nm}BOtZj_!g=|LxX`NZ0KZ>b=$=1!; zV{uv|gB-<`daG)ct%G6o!*(_h8X2U%j`^b4x+s5)mb$k(jIooLnB z(3Iv6hf_gi&L0~YE0*U;(-jRA+Tto^ICcqryE>UIEJpW{3=>DB-pJ^twPW6haYLi% zmTaBdufHOx&XonkH!VssVdJ)?1I0>S)bW;k14gvsYD?S}U+{@8wW_7S^qm z!)5qE!7aLBY1mb#Bk>6ee7m5IaKmz?tKZte?(fzzdsj{7ZE&H06_TQ4WMo4#j6MDM z(l+~sY+7HR+VZU2LRH$Qj$>oP3QTab+U*8~INm6clldVyy|5J`8-_Er$SWX%Bg zWIS6I=0-ycYgk&mJ`bm!g#)c>lyq!jle1CQ;J8wUNh&sDTUd14TD6-dS?9F3Dcs5l z117*K7l1SAX-Cn7VKbrWW1v}|qrk7o0G) zbAKHT!MZsM>sI}g5q9A{N^i>w$5xGxnje3l#YMrWw74)9z%BjQfRjymV}ySdsg4Qy z>=ZbeYiW?8Il%2Xk728|tSk>CYEsowJ?V}_>jzOaL6t3Zor-BT%Td4a#J8rXJp;9Y zUytINxQ=X_4|E{9R~bXHtLuh2vWbq6pHA}Cr0D}uXAkM(u5aoN^>*oTtj;~ zV%QG;mR06E*QF-pGojpAXbYR;w%x++dShJUI2Qd{6JlQpe`~I`lYOks^fcSDZ@RQ` zNv#x3C0=aaG^}tgpEVJkiA{?UOs5mf8QAMm-X2m1llij| zmz&c0pFl)NnBvrg$j4lCQi;igaeIAkcFbOR@pFUhq>HYr>MO;i!Z-vNY}#NxSh!f; zW|0gVTu2gi8yRaLoYp0c;qZ-fc;KS9W&RXK*q=?g+IhNv>}m#6UHBiTsA`V%JNu?>wA`w94PB_*|lOfKG)P$#;Jza zT{PN-+2PVpB!Nw21(}rHbu+y7i#tH-#{ps1=D0@i6c;GBFRxD7+N90qenQdOVsA4p zZYOcDak{4F{PC1@O0h27jU3A@n89`T-V#K*9vOQ^SLvVZ*_JMWm8s=kAG3!_3*niQ zfSF7P`)ZibsNk#Fxy?gV?M03|MbhtW;Y#D3hxrfFYB2ZUtG>v2oyVw(RT*qDnqpw< zG~5YJgj|=c-E_ z07)(Oo5UhQstZtDEs}>tLr%Cyl8GB#H03AFsjwbY!?@@*5pJg%Gle-$!x}f47?E|Y zWp6uIIfZA#A&d%P-c&e|wxXKq8o?Ar4r_wNVCQ+uazv4}vUPL^L!xG)&)h5}*HzTE z>i$)!w76@9lR3X62D!+xr#dYOoDZrot|Vxgg+?`4!I;HY4BW9;8Z>~$bKlU;2vgn= zvlq?gv*|wf^Jpt)NQM~atd%c@4G}3oww_@+YseHERIXC)-me8x zD@NrUtC8f*D^r#Qht!HmTOmnh4P0M14RO=SRc6vHN}m1$F1uS$Kr#~pMf%btGY8_h zRo9>;(}SIACZerv;p>nhZym>G1h^IDoJl$nkic|nVgeGGM9i>MEM8ZSYF3PFf{r@{ zNq57vjy4?#bGck*NK4q5NI2i(1y)Q4l83TFafVf@qADY7m?o|uGY03&jb(L~$(MyB zr7W#pmT17PPmrJKe3K>6>eZB(CYiww!L~=4A<--YtJprpHJp!?52tg*;S`63)aV0A z4pVa9COwgHH$n5y_)C6U37$|aY zqkDW_i?-JMs*?^znn=PLfkB_Ql0QL^LP(XiH`*v8Q5GsXLsw!k^=K=q+}N=+vl_8(7PXBQd4qWzoNEDy>6%PLCWZk_unhHStT7qes>%ke=usZ%vq@ zUHWU1&rx^u>u6vVU2W2tStP+)NR$yP9+)LNwUpCQ+LW>Tye-J*6t}hp*=7_nR4uD2 zL`r;j=UMDcj3Gqdid&)M+7630jO}|Wn`r8tpjaX582TT6IN5^hG78u`d_Btm_U#WA0X{#oSBhSQvwPs1@7RK3Xa67>&TiM(GR;-Q^t zoZI!zm%KNktH+OS+sT1sQXssBFW-PGL4%t zEZ{Ru@DCEQ8{`&INxVNtU8sK+put8_ISJCU{8h!79dAvG^z8UFQbT^WH&A*O(XA2b zG7`sWJ>X7Nuz4%r3ZY_pmz?En6Ee?OJU?q>_^FO{d!%`=eWhv|+omHX zXHuKcjeW$ z(Gg;pav|R|%Q^8+(n@wZQunjIODwG8CVR+>@o<(G* zZQztOqe`AkrEI{}Fun=+x+5Y}HCb!`gK8rotH4N{DcV|CU1T*}KRlVQzm(Ys(Nrq2 zTR0qaiwr=j`x2&_e$kY-t~eh1LgjXu2y1Id@y0SpHcT^8IAJaWc>CxJ8(V zy{bbpz5>=Z$-Ilf=1MkJ@Of6uwm~a#Lt!9EC%d3Yu@uvrdk}YWsT~rA0=k<`=~XZ~ zYAr4TWt2c2ZqT{FbMS;aI!M^{RGUITFl9DwD79O+vtSa|qW{GO(dt6yR5}H-{br>j zEgdK=t*j-<0k%<^EhRNKG&3gSLQ?oqhA=fuMP+eQ)+sQN;c97vP0Sy`Z9?_pnoum* z*07a{kiV3egL0Ou?cEEzt8meskTW11H4=?>I|AV%1G5z6j=1BMlPZhb?roRblko>Z zU1Eqi%-8&t0MB#GR_Y|?Pjw9RcgkTLl@nF=>U;<7NLINtjbAF0`Ad=hB=1zQJ-Jk< z&Fl8pW;-l(hYeEGK7@8}t-I9K;?uGM6|`MjSd^l5kc%g&BlEu;%&U#mJ6!;gt73Xq zIB49OTPG5wI>TH0>P|^Jb~k2Qud{M*E=z8t##W7oHU7?K-v>1!5~kZQE}JXdWCvHM zYo+yLOcY;)nto3DOP!10pxwX7oYR_{IXISL8ia$`mkhenJ!ME&CeRIYuo7hkebS%d z){c1ewSAc#%#839vQpkut&c2c7uz~Rpv~M^f*Imv(&ox4D-+O>J0CKUCHEZ@2@_dM zF$c*XxErz?UG}WJ{u-OS!-dsYyzU_ynM<)4hJ$R{o zO2V4~ihBlmcwJxh7cfO}8{!FxJ%4Lpgm?K~eQH0j(O9N>DWt6sdqyKu8rInh&%= zk@)>*&V5;@h|xatoAWZ~Jm)#jbLP4Goj2|IsNs4Xc^i`NG3I&rw?D~^>uaw!=4asx z@U8GW@aN$Vef47>GK3+2=g@5{Lezo`(?pvZ)VeIxJX74{Z}U*`UWaN=pys&KMJppy@eFkcsUxD(Ue}(GzKT!L(he0&Y4Uj5x zi!UFAvhOO?emwwXpAbs_hoJPlXA7H$nN?+o1aIgIee9zJ39g_JrE! zd!g*{pl|O$#Y+q|?+2muxC}MUqfqvE63XsRLB0PaD82pyYW%N4+4Y-HdVLq_{r`k) zwRr`~K5rzLrSIFJ=G_l9{2V{@t94F6R5W*cz7NX3x1h#*9BSStpyv5F)V@6h zHSXu3*8P`IdcOb3W=2db|ayeLs}l4nnmbff{cfDn3@A#&fQD#~+2divAx9DItM;To?nG`!Wb=CvUGJ<==3&3g z^DT(>pzG_c=MgB|&iHcEQ*rqr|19K)VrdrHkLY?og6T`&Q+XR{=)qqf@NB~x68Z8Z z{8eNFkw5(=avITf61jlj;--(tZ+{!n^&Yx>^;=`<8#c4A1)K-+~`RGUP#D_dd^i zq5SuEkOzF7u+KmL2AucL7vTc(7;*@?4N>f;$O`fv#7wkoFN}-ajh-?dCnoHHiPn`z zo|~9D)Us=?7ld&bw{Lw-(?*Uu8DnIwtrW|G>) zmD9_|&1|#j`Z*};>zyRcn?;_P+16GNH<@F$-;cs(`C4ZDWM(cZT%II($F|&7*mO3? z?F7wfvYolq&bC^$({W~wX^64!4MI!Ti8UTocY$BaQEa^@H_bxY+sF6!Gn zO$w?ry2>Nk=gZH=DnDhA$F%sOMm`cB-WC?$3)mh^f-+_I;_ z7=@|=E2-=_pv@CDN~Jt#Vy$_Xb@QYTOKY$ftuSj=?_k6EFo^6*(QCMr=S*u=B|WyZ zbw8r26J%_(i#1N!-L?wHtTyjB8}Ds3+s+E2+RZfSY0F1lGKbZM?YvXAo;M4OLBEjJYPZQ+j|MIq|8WuU$EnY-9N4)wQL% zS$3^3u&da{r5U9x3)=Fn<)ne09=7gsc^n;*BF=TkP2On-Q&biGpks$#?e+4twm+SVx#@f=YW+m|pw+oEjqMX}c3qzL?K&c~j#$7Tqr{i`qTK}L_ zF8_4j#YQ(PJ6BI(Y<(n})A&njR)es*aVkAjI1Dz}zSSTmKvx5;uQZKW)%3c}XaiTH z0`tHWOWEUDv-FcPtSx8AT+r-h{eT0Y^pVWvrGs_{TQTsiNwZct(3pn|RH$0CyrJ`q znl_oY!^`J5#6TZU88?lu!n%6GlYx|&jUvV8S`ph}2-g?ZSB-ksU8K<}5C+~4>-aB~ zxaqDL%9`pmn${CrdCK@(j1h%#S2n<8fEejaW(JobUwGGN-aCLBXg|};=!z^ zL7Z*6)K+K8s9Z1jNM+e(5t;R!J|7L+E8~{&t719z@K{W3tgzdNyBrI0fbx*0+$)25 zBkn64HuRxdc5z|6t`*AeX%d;UoTKJGV#TGcVCSU|{W-ek(l840B&{`54iZlO)ijZB z)|OheGn^=Vi)ILn_GCNe>0EIC^mI_}=BE z<>RAuPEStlm32ugYTAhzo3p(K`S67CUHY1&#Nv^S^@Z9UqkevqYkZWFR(Z_a(FpUs z95iVV)fV`olhnlhvX~t?beF9jj~s~YJC4}tTkqO?Z*9@VF4Z>7*wsY)U=K}BPfqV0 zf`cwu3D!+$yqR66b2ld+{YK ztW84kV%yoFbI1!zC(y491pN`rRGB|dP zHFl$5D?*+Y5}%XNx7*1abk6!5J>!p~jBgN=W%|dq`)@Vj-9q!RMOBY1Z!6^- zDxHDtQ|?zKe-{+4J!QsMrGHB?2S6LmvAIHA>racWTvfRsNj#ZvP#z+jsrp4i%P1+N zoxL2nCMR#v)+-mtuQ^Q3&VT(^jR&xc{p3fkFYsMbd|Mb=Cc;` zl^p8Cf=Xp*hhMB=Wd(z}L1Iv$O(6Bt{I?MxE!1k+mcE-f^@`3W8T@o$dAKjqLeEAvUK zAKz_nC&0)}O@`Wxl0o;uf c?W!cR;X3lgdya(Q1dterf8mLgQtPRp!jkX_(HJZzF+U~ zj~u=S)Oh@4 z90r~OieG1d8utp9z8GXm-sPb97=q$Y0w&<~Afohs41OCt0wJCQ{sSoap7J}k-Ibu` zcZtIha53poQ0;94)qe>Tzpe$PuN_e1e=jIL{FO`J4~jpJgW~_wpvG|k)O?QeEglD| z-4j9a<5ezwE~xpe1J&+kQ2d+(RlfwP{Rq@}I-tgXGpKsEf-3)ZQ2Fl%RsMsZ`un6y ze-2c+CqeP``=G}8Gf?GT%%YaQoCHcQ&j61BF922Va+lr#s(jU92h@CS1=asMK#l9& zpz7TXimx9B)!xIP=Jj`=%6|ite7^1Se-3JVzjWy%P!^Rt3e^0M1vSo-L9OFgg6jW# z@KSIDRC{|tjq}|gOU(NaDE)Z|RQ;zx@%y`=>i-Co-S}6Re<}%$^Gr~3e>JFitp-(Z z6F35H0agEYQ0?9YN}oOiYTWxlOqKUZQ02Y=ZU>)s-_JYK@@E))0r{h#>WzUK|5i|P zdLyWQ+o1S*11LN7HgFO6F;MM)92B2F3yNP~0wvFekNwWJpfSiWoorMGVcr8g~5 zNC@%QLg+4f!mN-k%BlJ|L_+PxeUzotORJq9(uTS4*jy`buS z6qH_m#^pZ&9!~mcm;Mf@@%2&;p_jb21?)F1k!|eJLrQCg6D$Y0vWn@{Bm>vTm!xatbx+6yFtzOUibY|p!oL# zQ0@K_d?|R$3S0hk@JiA{p!97osQUZB#o+tF2KZ6%Lhy{0mXEIo)$fg<^yQPF`1nPK zUj;S4Z-I2_9ROAC%vE;&t3k=}8c=-ueNg<|2Wp(}b9f&pd3@fbzXNLg&w-NT;&beH zj|Zinr-HJ7XS@9KK~&JY6vSkByTEsWw}BepnJ`uDUkKuIyb17Vu2UYHF z5Etov8kGI`8mRvM1r*;FooCZWfs)6Gp!D=Ca1>kz9t++Eiofp#Uj}{{RJ)%6#fNW# zmx12{UkfgW*;Qy0D1ANp0?XgmfEw?m;O~Kxpyu-g_(SlAp!DKN{%Cy13|l=q8&p4+fYOT% zp!l;HJPDj~SO+Dyw}8@QuQ1ZRW<-gUX z?*?UO?ggc%UjfzL_uTjAK-v8x5TfM$B2au^3Z4vJ0;>Ggp!kx2CxCBq_$Q$B<0GK@ z-w$fOp8;PEehtJ0dp`js@8j3l`JD(ZA$k6I=bu3F?N~Ckz6QVna1_+~OhC2M2DOfE1X(KH?V!f-2&i&@3u-)H1-1Tu z2CCkoORc|sF(^K40VTf>RKIml^1B%n-){pYr+dLa1V0CAUa!Szp8{S9ivJm?dM!}= zzX4SL?*!HFy`b8^AN(EgahLxiQ1Uqds@{?7EMHCoPb2+mP<$8#cY-zW4DidK`2Pz~ z-~IKroe@y{dL5|z>p{u&{h-#<$3XGvQBeGU0u+C~0jmEWfzq4jk63*>4U|3%f#UZj zQ2k#8qI%wS;8O5@umU~{N*?1IY`I%N*@F*);=?CEwf`U}{(K!2-+m5CFMb7{1)i|c zj(;_%{sZt-umegScR2hgcsS{YT>4Q^^Y|vH`5geI58ftQe=&%Pc}qZzYX*D{+zpD~ z*Is7pzYUbU?s0fOI7<3)@O1D55=Vj;fa2d;m)`2|YEbK~46XuGQ2hGQ6n0AG5!)yr!^mAekalzM*v9u9sM)c79(-vT}fJ`WUcCLlfk1pT3TV}1^0 z`=5X`w~xEL9KOlRtV;}npK|YyfS-WW-!ABW=w|4>&{fc0NV3=S73klgZ$tTW9xp%5 z6Cg{`djW&J2K+MAfj$Ji8u}=7EmVe31@9-2p0$wptw;O}A+4j&L4N~%0n&q+GIIJW zQ1)NvF5duehkgzP(4Rq9LVDh1!Tepu-#>uf3cV2$L*ESi68aj{g7mx+l1xref@cTx zEc8dvrO>aS{PB7Dzb^3@cpLN=E{$q>cS4Jy?Jlnf|Bu90D2Cn*eHPMl79`tqof16% z--7p-VAZ_~)ql!z&p%i&d!~QpT{`$eXtT?gt{w&50sXGay8?VZ?OX=_ zKJ+%1-vC)Y=6O4RUkd#l^d{(kL3;iK`WNVLm2l601OK~w9|u3?-tPv_f$oBygl>X9 z1HBKbK|g>_f<6uX4@l2`=>I@pg!Vx9Kz|R(M*TUYH8%-;9$EvP3*84jAJWr=-U)3} zg6Cf7f0{RZ1o#lN0{Y)BZ>huYf$xAWgq{a)&IW%3{WbIp=x5LY=ylNJP#bz0IvLsr zy&QT0^af}EIvUEK<9PWs^c?hi(BV-2-0EH~088%ulle#Rdgu)3Vdw$q!_cG9`OrFO z4*FB*OVE#@k3hFT-+}Z@TR7z3i(KwJ_#)^Zp?`x;gARlA+z5Rano)vhr3LS+;1cNl zP~GKCfkV)%T>3Q*zYabHy~U*k33Mj(AQVBx=Z_1Cl=sV_8(iM7!|#JXgff>Fd<*&j zv=h1-dOh?(sQA2x#J@t%Kx5G9ka-5m{`w@2!%`zGdkYh_C~h`FW!txm*MR|l$w2v; zTR$+K{{i)rr|Vi z%^S%4DD#7A8V2RIKOIuXZ)PfIKEz3bkJY3Vmi?gFE=H2vV(i%l-Ng5&+Z*9F^b?s%IW0|)u^kF$2iKk{BCD@OEs2G%I zVWOY4vqo6+cPG_mE%eLHR3g(K{w+`9nM7$*%Uc(fnVgwYP?gXVCQ=K_QQ+6BL3=tV zRm?!sr0T7!Hp523;2kUcpy3ZNurz69;lZ4;I$(z4%A`JA861x@Z+%b;(*S@iRR{h2 zbIRyX)umPIt!`|VQY#Jdq`s<}v;^TU_STW+?6;^34O`4R- zb}<(?QTQyz`%#RdXl*31KGmm_AT9Ua{0S*x_XEjnS0Opsj!Psprapaey5Mh)V#a3` z13uXGo+DE=Ih$c);b(7mCaBn1>Zq86L%YvB@#b8c$)mD=k*7uOV zEvSfNZ67tMXFe83Wm%4Jn)R9{<<<3>y+gmZw?m&WV|7Y?_rNu*)B#5c7dy#9^bAq!kzu zWm+o!SW*tX4dtj|{`mRgSB~#SZzjAUHacp-bkb*F)H5SDa+USzm#wXp9l9Du%V#n{ zcO56#X=4~FVcV+lhPafr>&AkOqUYX*7&}aj7}2sIj7c*i*cHSxp?~r8nt|-%<4g(QvGJuHqZ^)Wb9~R=7$ljWEt+jJxvQ7~m?5>%b0$ z(eBWH=7#qSWY662r~b|qe}IMQ70E)ZT=zSiGGF(28;!f!81Z$i?N97VSY#Vj+cMsh z>udYDgX>H6FVmh+=)U>e!l35$l3`p*nqr#_aEv;J%uqht`nMr}0_y|ct>?3natlc| zI*LoxX4$U40uL#NIjx~bvQa~Y{-W4=Eq{_P)#3+<8a`Xcx4_w~^s99ib$*3u*@FY_l6_s%HWwakykCzmnd()grN(d`HiM^c=*jX{_t{t3Nk$qX3> z?ncfktR|%jt9?@#<4lG+-0VBg<3{o3FnvDYv@`mU)_|RDTS=?AusWN|U--amKuD!II#uFs+&Op~}$Q zmrQLPUFvPYnHRoh%5c_kBfXcEmibcv=H9za`B_-C(J`*o4{~l%42#UHiVoK&ctWcY zcVDjIN?*?CNPme@dhg50ym1#YStZF+Mn}f$VeILTFB4?nSggSO?XRS!Fvq!wjRbd zmynn=_p`lMn$o8hS3w#2t~sn-L!fnSZ{inxxVn+g($ zHlxO>;O7n&p-M~__DK{{fYa^CwqT=;JWejQZNJpvh3nF6XNzO#4Mz-H5Rov-#=&{1 ziIYwII~m%dtbz&zt*1ER~%`@Rf0FA?WDwusjZt812;{%6W@7TcZZrL?*kRV-A<(KlEnDGuU*nETeVD4{uYZ<=b{@pg*WThx@ zfB}_qYF9T|Ltm}Snj|1F&f}RI_GSJIM%r(sY>_?fLiUYF z%l^8ymdQ44P@IwAEs9lAaRq9dZ=bp`2FuQ^=xs@}vyjqmjhRj0)mVIR?mxI|$l_yluI0w)=!$da}v6PL^?M)Xmc=h+SIS z+I8)5-SYSPlcpO?E0fz`c1R48!Itx4MtS^vbC~+E0*$G-LbMp?s5nPq3~6h3r_9Ec zq@Aue1tSkqdAosA*YJkWfI=x2luh%MY@_nyB_C&KJik*P3#Lb%)NBtTZKjPOr@jo2 z4Ec6N`rVZ(AHyk7%)}69$j$)m)o$C$S^;9NBZeLJ)T(T^{p>)KVQ)JdVDBpYUYM4H z_OmyC8r{2!R<(_xv7ONj4O?&Nv~ijZ1zF;N)-Hw3G_Khi8WtKqTMh7|gC+J?5i#II znkXa~94!yR0V({jKa=n67h7*WIF`*s<-v8$nQU-dGVCv&7$1}yR_VbJ_65WKsuiow z8C-GR;EGlL%2mTF&t1GZ$Qpx2bxeO$+RXm8$&tyRHhjbWL{ep+(#;*_K{)5LQoZ+cLTgs9=v7|1ROMZx=k@Y0?B&xNt-9{$ z&o;Y?X3trA(c;$)uE)|dn?WbAqLdE$I5;{&wN>X|c+NS6nz;bP>O!`{%3*)`)m_aU znu#&ngPHcjgBU-1q%hdkiZ`HuQM|mKEKkxITX@K9o`*K%g|nevYxShDpf@wTl@~15 zaeF^xNH6<)V+HLke}|CiO%^Hu%Qm(C^$q34)&r_hmSH0?8>^O3A4CYU?-6`Z_@Gkp*9U;@p}AFNKR|`hxrHaq3x_q|8s9fl2PU1{jG&XJ2Q+ti}>SDi@&-} z81{oov(_}r(RbY!=F#?Y9T1xAe3f_3*+>iCY+Vj(2$9=)1IwGv)%}j zn%h^`_$%@Wl?EJP4y|ZzFEY@CdYTn@la=)0{SBtui6j=3W^JX>ZZ&636@*IT(!i0V z94L?I+@yB|0aD2%a}GHkx(n5bVorHopS`Rw&uaJbq^7;W{b%{Dh#&+PKDVzF&dRN@ z;5Fkm!_38p{&0kega$EGGe40%lpwoca`Bv!f2&Rl#xQr-x))t$Q^n%nOqqy z<4@Jc2UXUroRe7w45Qp=1*y^c znvbG!1%{7VsGYrQ4tnQGMXuN!Ln6;`ri!kb@!E4)hG-R>f&2z>N=%JPB+E z>z#lzD{g$6)#j`N(@amqmW@u}Vq;-hHxIEMwzsEYfbMQ0qO3Log}YV4#qI4KM+ozYLoFc$Dr>w)sr0K{R z&umma;LS?E`{H+uM)qvBcZFSXZEw;l0yEF`0M)8RJw*_sYD}kFuBei8d!14yt+~B4 zT5HBpCD1C>ZHu+DenzQIP>(WW9>qk~a2Qjv$+2*nWSzNv;ycRAFx>iPLCA7;rswvR z(O0QS(!xTZEBcgkp3qm~H?VQe(I)%B`0uD*b?VSjER>!L5)o6BZo{I(WK%EwvkTzh5R7W5g;u9h~v{)U{(mOgcx>~}lb?X1(5m9A6~ zXwYbKe5?y2v*e9I=R1dYvfWL20HfM1l(mJ3B9xM?5EqQbm7%&Yvt!&AU!J+)&${!njz)EbUq`zG?QZi@Y7&0X@8b z{-)jzP~&gR?X44rX=297Mo5%jc}N?}QuPUW*Q{|HugLZvbnV4-+^yG;-(^_w{-;LBDDTSRw%yq{Kmpx<{l1G{y4PLn!j3G7 zv1T$PJ@LRQyvcMmA)L`NTQDm-LwJ>x+2rs;m%=CGZHk{*H(c@V;v5HOINJT0&3`RO&f{BS zTCxtYgXeC_#-~|N&6&X77u6H_xUzV{Wmh&EEJa~+lZ%O#E0n^a#FeOjmvwMCMVrLn zvEtl(ftpZa!6Gu@e+|}agMmgB0luJElZIm+S8kuSn;7Y$c$@GK|}X*47JVvR6|C~^$D-DkEX_;N*iK{hE0 zXl2>qV~OEAAiJvsq02Kytrk_%1bftEe~72&Rt$HK;Y5W@!ro~vF(I;VZui!uLB*8N z+_%8Kq#Os;5MIWKKmR~LfYa}F_+=0^3L6hqYPDsJ`7Mg+s;!1{@o}9OmF#f3>o8&h zJt+oVp7-aDmN}!5ht}!Rf*PX?zgo{L-1FI$nWG8Ey9vx) zVIROkqqLT-n)aI&q8qeGUUeb=ra8im_bhiMmzXo;BE^)?BpIw;$R;h`Ns0kMEd!ayMZijINUBQ z_vFcc;>e5DezUu$lrc51b-bK*nsaaVb}Zab+MK`+TQL%Wd@=BCDr|@mtYH<~{&p)? zjND}TjF+XJVY$UMz{?FEDUa3dfTl&#M@Rv!)8&N6XA?dKHLn-{lOoVxifCYg0Ob+Bg``OxNX(Js_(#${!vvEzkV zX;ZANa>vXLD_1A<(ze$cyt#dRCzj>p$Zei`E&?@l-xjD!o+~ZM-wj3H~!$T=(W(oL<}a=~~mokLB_@KqDemwrA5b&%&Bnjvbv zSMLyI>;~D|DVDhnW%3U~bGkgS`jVGX`yClaLRez>?)G3AmxwGL&S4cMays01#D<@g^^grD z#Lj~(h5&zt7WP$Srde86rTe$t3oCUva7`PAMcpH;{yF4_xoDY-TxnbXB(gzM?$P+QOi2WhbAkTU2M!@j|S?#OvR_)N~0aZwp3XWhd( z`=Q4x4Y6>%lpEK;+tfYHRR?HZ$Z5U1HiKC4;LEt+8cx1J!exup}X%^ z)Zu>+Y?Iph&91Uw>8+H_UE;Rl4&3=(7I!P6FBy655lMH=)`A_uNU=J8QlS!x#nQoa z>BhUm3DDf$nOFy**bL`alIg6&*|OOwNwgdk`4w|ZZqHJ>_B2boGMcB74uJ3H~M@XAaG{tykEq|IuJw0QHEcS~?*n4sMp1 zJjYPldvIQEl(e`$@)Kuqvj5208z-j8g9~|c<5TALDZ1Ek2z!W&pMQXIvWgs35>sgC zcE6(286!ou1CCu>Yrt&X5pfjKUAr}`Gv{@~-Xsb;|G>2NpWC_rOoLf_!#`#_$>6ZL z;kQPCUr6-KzEufbo_4n(HScm=L}uPKJJ?rqqG}I8breB#;9rrp=WpTW&A*uQ+qe?! zDPKCnEpBy)U&XCi#`XQm^A}IB`$_$gl-1{7TvtNBI9XWkf|&Do%)fv2 zUcK}G{_p?)zyF(W9kKsg1D*r+3xeapktYYii+HaerraQS@aaKt4EP=JDDXGnvEX4x z2f=aR>7epAfro&906rCr!DoWI!DoYi2CCex;OXG!!6U&(!6U#YKO+d1gU5kS11|&* z1YZcA49otr4`NX2e>+Im!7IS$ zfY*ZR_wPXUd$-50f*R*Hz*E4Vf||$CFh%n`9Xt^n0>zh0z=Oe-|9*wXH+Xy}sQG>X z)c8ILYW#PB8t2!*L&0x?YUg49{ZUZ!e$3;MbQY054OG21ff~;>pxV6w6n}2@c!$Tk zK+W?$Q1kyGsPX(3R6B>WsH%4isB!g!YHtu!x%0p=aEs5s7Tllo`+WLlQ0w$DP<;G6 zcqVu+_JH5_kt>aBdGpv^XbomDt8|! zzWxx@IDZbR+#zgg$;+{zm8u#{Us>A zegsr|i=gK9bx`H+2em#A`utyj8sBex`XGcwduJYTcg)YF=wW)!PJ)fLlP- ze>13d-vdgXZUQy#TR~J+a2u#{Ujlc45BTqAp6vKD1U`xUF;Mj;K#hMJsCBv&RKE+L z___y_p88X8fAFtCwf_-NeEu{jeti|xdVbUAKLQSu-oM}RWg{rLy%dz(>;g6Zt9<^O zLGk%!Q0;%xr|$wa-fx2kfZqjG??)aV1y%2HP<%V`xvu>aK$RN=HO_NEh7?=~N?$a= zHQ?*P=Ye1F`HzC)?_sC7_MQo9T}}eE-e-bpcQYt{Z3ngP38?v91&W{V237ACP;&Vx zpMNiSAn6Bu`g@?p_Xw!*?|-Um|EZwzj{%o~r-S-_G5Aq%2Gsf-bDEp~X`srl1=ZhH zkf{VO1~uPTg9m}vfvWd@pZ++g@q8M5GWdB=eEKqYF!)PQ^A?j-?&+Y~KOWS4PX{N# z_2B;CoBj7|L5=%HQ2l<*<2OO^<$K_N>=y+832Oa*L}B&w7$|-oF@OyLmx21e4OG9g z;Gtj})IPfs90cD5s@;3Q)!>7m=6w_&)!qv59B?zJ_O1jqu4_Pw2JZ&Nzk5K*@wa{Y z7ohlX(DEQa)dq)yO0NVD0nY=~&IRD5;3TMiJ`Ae=he65Nfh*knHh?OBF(`gt3W|?0 zcs97lr*8wFM*3cmB?!I^Vse6mSGs+E3dq(Do)4nJf(j^py&4oBKL8#MehO4SUjYvQ z?+5$9?|@p*pMaXr&q3|;$3Tty_*FshM(`Z)aPV`W#`!Ox+W&V@d^!MTD}5X&zODdO ze+1NcF9jt}SAgQz_25&%4}luT9iaOEBB=Jh23`O@4647?XSi{0237C(L9P3xKL2Il z2GXwtC&15w>i4KKonN>L)Vj@pn%^ryjpI5{i==@Xz<{3Sv$~x23!kj-Y*8#&&xet32Gj%1GT>I z^63wOYVR|k*5_WI{|!*`@-t9;_@&1KhFtlhK(%ussClgbHJ=giP;d-Xy&XP13u>KO zpyqousBym+)O_y%RsTz%OT(lgHK)S^u-yV)@2Q-dK*FU^@X77#o!CT z%;(<&s{H++`1O5I{P-0pem)LrJSU%z?+Km-YF;;in#V1m_QB^s>8ray@&BvfiQvPa z#(nVfoje}};?e{Ip!hinYF&4L8gC6$`9B0z|Fz(8;0>Vm?VX_bbl5sq{&et}q}PGs z$0eZFZ4T6Yt^lODcI$r(sBx|Y)y^^0)7xY3w#V*0iMC)ioX%4epB$-;4V<}dpoH4-Udp}7D27&{orzNKa`f{ zvl7(2H-Q@O45)Q!gW}_Bef}FkmA?*DzaInD{-;5;e>VsVgYSWA=j4$f_yKq}sQI5b z>iE41R6AQhtxFXg1Q)$@hz!>}xsP#E^lNg6gLNs-FgU5BM^0KTu$@>cEb3X4hk3Rt43Y`n>2XEwa`~>=2=s%&KLytliLw7?9&;!tM(A%MB zKu>~R1ocCQLB(?&JpjScPgY?We*yrzgKKC==Q=o^T|AtP44uJH$0{T8wQ-WuugW#XRQ=#`l zO`o?N9E48s>9ah31NN^7Bp-zk(iuCZK0S_UW&h4QY}@l~z;@mL?i;(r!h{c5gYa{r%?D{^~<%4RnC4$(iR`<>8_}1TB&I_>uFduvvECQh&k;v(~Jq3Ffmb< zr5Tw+W_{RdMcIOx3soYl%u%4y&Rc22RO~2BJ(`c|J!KihEHhY|N6*2qsici&J!(bf z!jaK}izZfHBT8CKG)>HGnwd>owoZ%&!!v2SWj0NDb_c_iO4Mvw$aC7FMx~XTbk?-y zBGU}xjPX^Y`M45M$Tl`L$FwT#R&F!qL%QCQw&K~iVmk|lt6I%QBTTBi&xc6`jtwVO z(_b|yt!70xJ(;vdkw%(DEK4xlY}S2ydEi+Vtd9&Vrz7#y&Z7eRSs*Hg)yrU_$rtig z)G+gDz1@gRwVi3n^uyosG^wRZ+gic;xXR@0l)}0eJ!K+|s2Yc+Sq~Rx!pcrN&@8P7 z>+9{Pl`?qG3KO}#}*7? z(##DSM`hWLaGL#^rPX$Y0){vE)X>r6*G}m zqhPcex9pE8HotO=AHALMXkum5f$gM6!Ki0OZr4@Xr*~~#t$g3rP+Eq`gq?kyqNlB5 z*cmN2F&<4S*+SE5urcI37){W_)JRxbHiT7ab_8=_Qj5%*ne+SeHOptt4@P&Rn3Xl- zRd;!tjM}Y-rbJIhvq(7Fyb$rx-OVVAtro7+N-IioDdWz1ZwxUN)^wnUqIf44+c7?n>02;`f$K^2 zZqu$!=)9TfC~O4XWRz6Ww%8^GoFI-7GnCDC_HEEiqJ7}IvwUu){6>Ib&p>z=e((bPbwaF&ceK z*v3U@=gVLcd~;H>5z{c6?qn=`LY&hnc~Jev2`-!ZR2To6?ZuQ7x=2n5l`WVt9cxqP(U;tN4t0m?P!T z%}#d}nzdI>$MLtaU}AFH*im{Ywm2QGBo#7w{IIeE!cuF zFMZ9G;kDyNdao)i^(P0+zjvB4c~p1aF{ago1-B@MMrKxJgKKb}kZP8@C)aYNCueM= zx5OB|_vGZkR_`)7At_Q;Mz%JiB+!qM3UY63SmzUEE^XzuDwU*yQ&Zz|;MgIW?N+&h z!6Y80{lSTUX*)tT3e`6mCOAlwp;pAMbAWPdrNN};tDhmMz{z?W-wu@M7oIx9pjI%6 zpcgK%P2^@YuUH*#y)T1TydF0%Z-$t0>jC6Z%c`xyYIH2aV1Vbl8RuNEExL>q2CO4GmNeU)L}xTukN)n_!|DcGVLk$y^#%89 z%B$?N5JSDeCBQLSCU!6T+p-RlL8{@0ly)l%lYACSi7h9~IslU!Xhf_UuGi(Yk!ayR zg4R)z2HK`o(vMk4+gWcv!M1i%I0?B;6ed$H#@^+%PMmP;!Z=^VWVEmkliP7o7~#~$ z=}G%zhTEL3?EV%Prb4)-ALpersbC79xuSh!mAC5xGkgOdwCg-za=cA-*&0^f3MF^i zx1GI8al~6c$gTB6U7}}I>}NY1m77kD(@WhR$PG*&%Wb;FzgF0no7 zDlr_QV2ZOZ%c5VWPuwepbf?cPvyZXal6G3|O($JW_Lbt(bhO*IYIewa>hP+Cx24^r z#Eb3Q#^nRIc3C&rI`l;gw$L)W1{h+>wz^GfVRGj`bljt5xY0Orew*Mf+S6esF`2P8 zaM1UT4(yzkeIt7@9D*EZ;Ey{upkvG6Xn8fl4@as+(#c zug+vm;SgBk@z9>P=ca~|HoG#8$brsr9hTVL=y!zsvX9}YLdSC1>OE7Wo;{Tp=XjsI z$R5&zX_@^NKm?{ZE(Ft2WiBBAP-jE5a1C;D>X8P%VBh9rI~^^uu}fMt>ld_5rgcE^ zN`kjIQAzm~h;4Cv>i8IJJHMl+({^PJJ3rVrl7+R78bKOE)ogHt;zy>a($4ZU8|;&D zkrT!qpg>i%3hXV|H)S0sEh9(qT`{f?8#LEOp+b)W9_$;BW?Q(1akW~HmJzt9&9%%- zyVXjQWmW_+sDuG>{0^M9!C<;j&hDJhO;5Fn>*P66qfVZpAZ}|-FEn+=_1iz_P1h(6C*ERGp!^)UF{GW|-EI%AB;9m_?J#mLk#`3; zbq#ND4JeeMK{+&E#4)M}FBy!XwftUu9M~Qeso4?6I!s$dPJJmJDe@ii^gBCMHijrr z!o*n4h?4=*tJAhyYdMI8j97NKs8!V+`#FK8L%|LXz`-Thy(p`O3*Wu+6Ug2rw5nqa zjm^e28g|ywOXCa&3bMoj?Oh7nX}n}xWLaqKY(2z|4pcZ_#rS}eSt^%cV5~X-2PE)A zrdFKo`wwI#N)L>1E*LVaR;*e*u;R>t6|2n3bB9)) z)i)mItpO`Kwm&M3bG~g8G8xc;Z^+1*YS-|_qRy8g(`>zDa=LF~Y+|%Knw5hq`n1+8 z*nq@n$m+=D1O?*cJR8r%OIW*odgH)3-Ev-L2RM+YRah}(&Y6i@eRy(NSRdF(1d1?e z(zMBZ?W*$#$LY)3Qxo&-wPxjM=k;AYumRml-2u;{GGF%kI50LcWLB>_``p#5OErrr zYhnXTtXoaK+>lxR!j8BM))I8(K(0gR02;@g;|DrR@gi0|PL?;*jeFZX_qKNgoK4dTS%)IX-HnZht;P4_=~Rdc zLKz3LYFLyC4b=#SXKaxo5?+*Xk@TY7V5=O@%NDOw4SqwmPKJ|hhe||f@p@cC;$;Lp z8gZU0*$gxMBG+7|5zIw#mioxJ1g~w{4I4NJd|aGe9uiqaB;vNg%U--iF;4;pv{EA` z#~w(NupVE|6ng5oF?FVAzYQx~V_S4zXS1*p2HP89DK@@%qXz2Z2%)K_J;!@HfwYL5 zSE8(9i*y!}@OKpB{|T#b!+L>IdnpzOlR$7R&Cy2lsfiji7S-p(uHjZ#pHmTZupIz7 z@jS~@*i172HX=?Piiz+Uajpiu%?&Aq)9E|y#L_8;gT>v5!s?PWzO_=063e^QxWkZn z45Sm##)_$Onn}%!i?wSyc0macDb(ut-)Pqn!o~L!dAAY8f@$5LJA&2Ekr+$dzEkOFT5ka{yrET67{afoswGN zB4Y34Xz>+tR~SrjW?Q^DA@WrWKQq7l9Sq9rGb1ISn=PxNdesFBhD0xsW*EZ=#l(_g zQOql8@0GblVaz3Mjwm`EJ4LYc+tzZMUc=+^IBG3eXIEOQN=9*_yL8$tkvOD4 z{2+ll&7Xr$oVP=n4BMu?p9nJ#g*X;TS^1@`ak{xs(KOkeXIZOzYv!>{>ufnNFxSQoYLgoWZk#Ie=X%SbVXw|f@~sF zo$tnKl}bzZGgHVZ`&gkemUBy#%%OctY%8|8?3n+mZ7(myr@L))JR))|e-}a6B1gkE zYS>;-5gEB0(hIb^(tAX?5dE4tyjg5%ky?KjoU^JFLz4@i()v=-@xtgtW)}1V4 z&V0u3Ocryh(Qn7O_Q|B|KD!cr-(gWWoU$C9n;y;DYeunbtBxy}isC55wU1mYe^BiB z68NCj5=?TWMnE=jijZYua80g)!eHaxcR=oxZS9L97oj_+HjM6dJC=Xg2bR2noaACY zwAVp)!xIeR-*IF|+NCQY`w2IX-G-{xw(Rc8-V326bJcZ^tXt=361beUIjKKC$W#WKILIKJfB2#QR)|xsfm%1&Zg2&#m=Jawz0I#A0MW}a@lP4{h zDcrR(>Ii4pZ7n2^U{a^|&Te!9*&S9fN<0|1N9=|ya@8c9?8(EJ*<+UtG2<2}q%zOx zDuv;8US88X`=%T23}rMIc3!%=p_J9(TPd%!U8TN@hAbCLDQ%c1r7Z%r3Q#3p%6pc2@c*PcrR#s_w3=6|!)0 zXXJC0EQ{TZh(AJyn(d6emlf7IeL^WJRdX@2Xz_N*+!IGGI{g$8I{c8_o-Jg7I)+52 zfMWig67m_OfH7Tl8>7>_5DFp*{(X=DiZTzSHg%SJ4WZcOI~qUE)Jmi~x^SCX%^WM+kMxxfI{hU+&pcxGjc7raHXDB`;o=R_g2X!MWUC z_h}U~h0CQ-G|Ro1Rt_Hw_N`BCI4a69cv&^&4ls)O)r~SiFFGa?B002zrGM1Mz8H@9 z;b8a7T!j5_-lqK}i;Dnq;n?7$Lzvp0OFHqvvVTXcl7N-s1!YHmADN7$>6|A7QUBQi zAD!An49Zc5Zj`1tmTO-t$f7V1VmXJ0tOJ%8P))JOwUMHRKJbsN+(Q*B-J8Oz+|GaR z_6lQ}ui_I&!ou}a%=c%XxWg%Lf-BBHw2|OBg2LLq$b-FVwC1aP&!|z_khTiBo9o3r z2$W9ws#sV8#V|MYDmz46ib0Xi0WLmyx1k%Va7oAkpjWj0DF`<6pZa*rCTz^aQj_*b z$Qs+wq2>FK*4af8w^E?tt|2GY8;rDfkP_OZJ4?ZP+gORM7p0ZOo85)vgpEMU+-jxp zSJ*h?#9a}?HFNx{<3g>y@RDY09seRk47xrDkI(O$j>8&Hi+`QxB8X93=Dy_X dnvKCmbbj9jZE`n+*}Q_P43gwdpXwQ9@IU+;h8+L^ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index bc26e36159f6964c53a2f9fe6bb6c0e37159ec67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16871 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index f6831f553eb17e2b32c4ad271a1e442c27d2d150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17143 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 MM@#=7zb^&<7pyz$4*&oF diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index a2a03e40c1671b52827f82a48514c06a4801ce6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8802 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 DSg=&# diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index ddb718ce739b7cb035344465488fc23b50d484b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10784 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index d17330ce0a3c0a882ff322347a41549b188c543d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16752 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 x&6>@aiMb$CPNa;C^dx~i!qNjvH! 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo deleted file mode 100644 index 284c93039d4f22c1f8d92ec7319b9c122efcdc58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14997 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/nautilus-gsconnect.py b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/nautilus-gsconnect.py deleted file mode 100644 index 05a71b0f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/nautilus-gsconnect.py +++ /dev/null @@ -1,212 +0,0 @@ -# SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -# -# SPDX-License-Identifier: GPL-2.0-or-later - -""" -nautilus-gsconnect.py - A Nautilus extension for sending files via GSConnect. - -A great deal of credit and appreciation is owed to the indicator-kdeconnect -developers for the sister Python script 'kdeconnect-send-nautilus.py': - -https://github.com/Bajoja/indicator-kdeconnect/blob/master/data/extensions/kdeconnect-send-nautilus.py -""" - -import gettext -import os.path -import sys - -import gi - -gi.require_version("Gio", "2.0") -gi.require_version("GLib", "2.0") -gi.require_version("GObject", "2.0") -from gi.repository import Gio, GLib, GObject - - -# Host application detection -# -# Nemo seems to reliably identify itself as 'nemo' in argv[0], so we -# can test for that. Nautilus detection is less reliable, so don't try. -# See https://github.com/linuxmint/nemo-extensions/issues/330 -if "nemo" in sys.argv[0].lower(): - # Host runtime is nemo-python - gi.require_version("Nemo", "3.0") - from gi.repository import Nemo as FileManager -else: - # Otherwise, just assume it's nautilus-python - from gi.repository import Nautilus as FileManager - - -SERVICE_NAME = "org.gnome.Shell.Extensions.GSConnect" -SERVICE_PATH = "/org/gnome/Shell/Extensions/GSConnect" - -# Init gettext translations -LOCALE_DIR = os.path.join( - GLib.get_user_data_dir(), - "gnome-shell", - "extensions", - "gsconnect@andyholmes.github.io", - "locale", -) - -if not os.path.exists(LOCALE_DIR): - LOCALE_DIR = None - -try: - i18n = gettext.translation(SERVICE_NAME, localedir=LOCALE_DIR) - _ = i18n.gettext - -except (IOError, OSError) as e: - print("GSConnect: {0}".format(str(e))) - i18n = gettext.translation( - SERVICE_NAME, localedir=LOCALE_DIR, fallback=True - ) - _ = i18n.gettext - - -class GSConnectShareExtension(GObject.Object, FileManager.MenuProvider): - """A context menu for sending files via GSConnect.""" - - def __init__(self): - """Initialize the DBus ObjectManager.""" - GObject.Object.__init__(self) - - self.devices = {} - - Gio.DBusProxy.new_for_bus( - Gio.BusType.SESSION, - Gio.DBusProxyFlags.DO_NOT_AUTO_START, - None, - SERVICE_NAME, - SERVICE_PATH, - "org.freedesktop.DBus.ObjectManager", - None, - self._init_async, - None, - ) - - def _init_async(self, proxy, res, user_data): - proxy = proxy.new_for_bus_finish(res) - proxy.connect("notify::g-name-owner", self._on_name_owner_changed) - proxy.connect("g-signal", self._on_g_signal) - - self._on_name_owner_changed(proxy, None) - - def _on_g_signal(self, proxy, sender_name, signal_name, parameters): - # Wait until the service is ready - if proxy.props.g_name_owner is None: - return - - objects = parameters.unpack() - - if signal_name == "InterfacesAdded": - for object_path, props in objects.items(): - props = props["org.gnome.Shell.Extensions.GSConnect.Device"] - - self.devices[object_path] = ( - props["Name"], - Gio.DBusActionGroup.get( - proxy.get_connection(), SERVICE_NAME, object_path - ), - ) - elif signal_name == "InterfacesRemoved": - for object_path in objects: - try: - del self.devices[object_path] - except KeyError: - pass - - def _on_name_owner_changed(self, proxy, pspec): - # Wait until the service is ready - if proxy.props.g_name_owner is None: - self.devices = {} - else: - proxy.call( - "GetManagedObjects", - None, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - None, - self._get_managed_objects, - None, - ) - - def _get_managed_objects(self, proxy, res, user_data): - objects = proxy.call_finish(res)[0] - - for object_path, props in objects.items(): - props = props["org.gnome.Shell.Extensions.GSConnect.Device"] - if not props: - continue - - self.devices[object_path] = ( - props["Name"], - Gio.DBusActionGroup.get( - proxy.get_connection(), SERVICE_NAME, object_path - ), - ) - - def send_files(self, menu, files, action_group): - """Send *files* to *device_id*.""" - for file in files: - variant = GLib.Variant("(sb)", (file.get_uri(), False)) - action_group.activate_action("shareFile", variant) - - def get_file_items(self, *args): - """Return a list of select files to be sent.""" - # 'args' will depend on the Nautilus API version. - # * Nautilus 4.0: - # `[files: List[Nautilus.FileInfo]]` - # * Nautilus 3.0: - # `[window: Gtk.Widget, files: List[Nautilus.FileInfo]]` - files = args[-1] - - # Only accept regular files - for uri in files: - if uri.get_uri_scheme() != "file" or uri.is_directory(): - return () - - # Enumerate capable devices - devices = [] - - for name, action_group in self.devices.values(): - if action_group.get_action_enabled("shareFile"): - devices.append([name, action_group]) - - # No capable devices; don't show menu entry - if not devices: - return () - - # If there's exactly 1 device, no submenu - if len(devices) == 1: - name, action_group = devices[0] - menu = FileManager.MenuItem( - name="GSConnectShareExtension::Device" + name, - # TRANSLATORS: Send to , for file manager - # context menu - label=_("Send to %s") % name, - ) - menu.connect("activate", self.send_files, files, action_group) - - else: - # Context Menu Item - menu = FileManager.MenuItem( - name="GSConnectShareExtension::Devices", - label=_("Send To Mobile Device"), - ) - - # Context Submenu - submenu = FileManager.Menu() - menu.set_submenu(submenu) - - # Context Submenu Items - for name, action_group in devices: - item = FileManager.MenuItem( - name="GSConnectShareExtension::Device" + name, label=name - ) - - item.connect("activate", self.send_files, files, action_group) - - submenu.append_item(item) - - return (menu,) diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource deleted file mode 100644 index 17fe48519fa929d45ffb39d22bd253d9a46333ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60052 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%0D>QLm-BNKJ`0Z^aY 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

&H~P;H%PR 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 { - if (row.get_name() === 'shortcuts') - row.set_header(new Gtk.Separator({visible: true})); - }); - } - - get menu() { - if (this._menu === undefined) { - this._menu = this.device_menu; - this._menu.prepend_section(null, this.device.menu); - this.insert_action_group('device', this.device.action_group); - } - - return this._menu; - } - - get_incoming_supported(type) { - const incoming = this.settings.get_strv('incoming-capabilities'); - return incoming.includes(`kdeconnect.${type}`); - } - - get_outgoing_supported(type) { - const outgoing = this.settings.get_strv('outgoing-capabilities'); - return outgoing.includes(`kdeconnect.${type}`); - } - - _onKeynavFailed(widget, direction) { - if (direction === Gtk.DirectionType.UP && widget.prev) - widget.prev.child_focus(direction); - - else if (direction === Gtk.DirectionType.DOWN && widget.next) - widget.next.child_focus(direction); - - return true; - } - - _onSwitcherRowSelected(box, row) { - this.stack.set_visible_child_name(row.get_name()); - } - - _onSectionRowActivated(box, row) { - if (row.widget !== undefined) - row.widget.active = !row.widget.active; - } - - _onToggleRowActivated(box, row) { - const widget = row.get_child().get_child_at(1, 0); - widget.active = !widget.active; - } - - _onEncryptionInfo() { - const dialog = new Gtk.MessageDialog({ - buttons: Gtk.ButtonsType.OK, - text: _('Encryption Info'), - secondary_text: this.device.encryption_info, - modal: true, - transient_for: this.get_toplevel(), - }); - dialog.connect('response', (dialog) => dialog.destroy()); - dialog.present(); - } - - _deviceAction(action, parameter) { - this.action_group.activate_action(action.name, parameter); - } - - dispose() { - if (this._commandEditor !== undefined) - this._commandEditor.destroy(); - - // Device signals - this.device.action_group.disconnect(this._actionAddedId); - this.device.action_group.disconnect(this._actionRemovedId); - - // GSettings - for (const settings of Object.values(this._pluginSettings)) - settings.run_dispose(); - - this.settings.disconnect(this._keybindingsId); - this.settings.disconnect(this._disabledPluginsId); - this.settings.disconnect(this._supportedPluginsId); - this.settings.run_dispose(); - } - - pluginSettings(name) { - if (this._pluginSettings === undefined) - this._pluginSettings = {}; - - if (!this._pluginSettings.hasOwnProperty(name)) { - const meta = plugins[name].Metadata; - - this._pluginSettings[name] = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup(meta.id, -1), - path: `${this.settings.path}plugin/${name}/`, - }); - } - - return this._pluginSettings[name]; - } - - _setupActions() { - this.actions = new Gio.SimpleActionGroup(); - this.insert_action_group('settings', this.actions); - - let settings = this.pluginSettings('battery'); - this.actions.add_action(settings.create_action('send-statistics')); - this.actions.add_action(settings.create_action('low-battery-notification')); - this.actions.add_action(settings.create_action('custom-battery-notification')); - this.actions.add_action(settings.create_action('custom-battery-notification-value')); - this.actions.add_action(settings.create_action('full-battery-notification')); - - settings = this.pluginSettings('clipboard'); - this.actions.add_action(settings.create_action('send-content')); - this.actions.add_action(settings.create_action('receive-content')); - - settings = this.pluginSettings('contacts'); - this.actions.add_action(settings.create_action('contacts-source')); - - settings = this.pluginSettings('mousepad'); - this.actions.add_action(settings.create_action('share-control')); - - settings = this.pluginSettings('mpris'); - this.actions.add_action(settings.create_action('share-players')); - - settings = this.pluginSettings('notification'); - this.actions.add_action(settings.create_action('send-notifications')); - this.actions.add_action(settings.create_action('send-active')); - - settings = this.pluginSettings('sftp'); - this.actions.add_action(settings.create_action('automount')); - - settings = this.pluginSettings('share'); - this.actions.add_action(settings.create_action('receive-files')); - - settings = this.pluginSettings('sms'); - this.actions.add_action(settings.create_action('legacy-sms')); - - settings = this.pluginSettings('systemvolume'); - this.actions.add_action(settings.create_action('share-sinks')); - - settings = this.pluginSettings('telephony'); - this.actions.add_action(settings.create_action('ringing-volume')); - this.actions.add_action(settings.create_action('ringing-pause')); - this.actions.add_action(settings.create_action('talking-volume')); - this.actions.add_action(settings.create_action('talking-pause')); - this.actions.add_action(settings.create_action('talking-microphone')); - - // Pair Actions - const encryption_info = new Gio.SimpleAction({name: 'encryption-info'}); - encryption_info.connect('activate', this._onEncryptionInfo.bind(this)); - this.actions.add_action(encryption_info); - - const status_pair = new Gio.SimpleAction({name: 'pair'}); - status_pair.connect('activate', this._deviceAction.bind(this.device)); - this.settings.bind('paired', status_pair, 'enabled', 16); - this.actions.add_action(status_pair); - - const status_unpair = new Gio.SimpleAction({name: 'unpair'}); - status_unpair.connect('activate', this._deviceAction.bind(this.device)); - this.settings.bind('paired', status_unpair, 'enabled', 0); - this.actions.add_action(status_unpair); - } - - /** - * Sharing Settings - */ - _sharingSettings() { - // Share Plugin - const settings = this.pluginSettings('share'); - - settings.connect( - 'changed::receive-directory', - this._onReceiveDirectoryChanged.bind(this) - ); - this._onReceiveDirectoryChanged(settings, 'receive-directory'); - - // Visibility - this.desktop_list.foreach(row => { - const name = row.get_name(); - row.visible = this.get_outgoing_supported(`${name}.request`); - }); - - // Separators & Sorting - this.desktop_list.set_header_func(rowSeparators); - - this.desktop_list.set_sort_func((row1, row2) => { - row1 = row1.get_child().get_child_at(0, 0); - row2 = row2.get_child().get_child_at(0, 0); - return row1.label.localeCompare(row2.label); - }); - this.share_list.set_header_func(rowSeparators); - - // Scroll with keyboard focus - const sharing_box = this.sharing_page.get_child().get_child(); - sharing_box.set_focus_vadjustment(this.sharing_page.vadjustment); - - // Continue focus chain between lists - this.desktop_list.next = this.share_list; - this.share_list.prev = this.desktop_list; - } - - _onReceiveDirectoryChanged(settings, key) { - let receiveDir = settings.get_string(key); - - if (receiveDir.length === 0) { - receiveDir = GLib.get_user_special_dir( - GLib.UserDirectory.DIRECTORY_DOWNLOAD - ); - - // Account for some corner cases with a fallback - const homeDir = GLib.get_home_dir(); - - if (!receiveDir || receiveDir === homeDir) - receiveDir = GLib.build_filenamev([homeDir, 'Downloads']); - - settings.set_string(key, receiveDir); - } - - if (this.receive_directory.get_filename() !== receiveDir) - this.receive_directory.set_filename(receiveDir); - } - - _onReceiveDirectorySet(button) { - const settings = this.pluginSettings('share'); - const receiveDir = settings.get_string('receive-directory'); - const filename = button.get_filename(); - - if (filename !== receiveDir) - settings.set_string('receive-directory', filename); - } - - /** - * Battery Settings - */ - async _batterySettings() { - try { - this.battery_device_list.set_header_func(rowSeparators); - this.battery_system_list.set_header_func(rowSeparators); - const settings = this.pluginSettings('battery'); - const oldLevel = settings.get_uint('custom-battery-notification-value'); - this.battery_custom_notification_value.set_value(oldLevel); - - // If the device can't handle statistics we're done - if (!this.get_incoming_supported('battery')) { - this.battery_system_label.visible = false; - this.battery_system.visible = false; - return; - } - - // Check UPower for a battery - const hasBattery = await new Promise((resolve, reject) => { - Gio.DBus.system.call( - 'org.freedesktop.UPower', - '/org/freedesktop/UPower/devices/DisplayDevice', - 'org.freedesktop.DBus.Properties', - 'Get', - new GLib.Variant('(ss)', [ - 'org.freedesktop.UPower.Device', - 'IsPresent', - ]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (connection, res) => { - try { - const variant = connection.call_finish(res); - const value = variant.deepUnpack()[0]; - const isPresent = value.get_boolean(); - - resolve(isPresent); - } catch (e) { - resolve(false); - } - } - ); - }); - - this.battery_system_label.visible = hasBattery; - this.battery_system.visible = hasBattery; - } catch (e) { - this.battery_system_label.visible = false; - this.battery_system.visible = false; - } - } - - _setCustomChargeLevel(spin) { - const settings = this.pluginSettings('battery'); - settings.set_uint('custom-battery-notification-value', spin.get_value_as_int()); - } - - /** - * RunCommand Page - */ - _runcommandSettings() { - // Scroll with keyboard focus - const runcommand_box = this.runcommand_page.get_child().get_child(); - runcommand_box.set_focus_vadjustment(this.runcommand_page.vadjustment); - - // Local Command List - const settings = this.pluginSettings('runcommand'); - this._commands = settings.get_value('command-list').recursiveUnpack(); - - this.command_list.set_sort_func(this._sortCommands); - this.command_list.set_header_func(rowSeparators); - - for (const uuid of Object.keys(this._commands)) - this._insertCommand(uuid); - } - - _sortCommands(row1, row2) { - if (!row1.title || !row2.title) - return 1; - - return row1.title.localeCompare(row2.title); - } - - _insertCommand(uuid) { - const row = new SectionRow({ - title: this._commands[uuid].name, - subtitle: this._commands[uuid].command, - activatable: false, - }); - row.set_name(uuid); - row.subtitle_label.ellipsize = Pango.EllipsizeMode.MIDDLE; - - const editButton = new Gtk.Button({ - image: new Gtk.Image({ - icon_name: 'document-edit-symbolic', - pixel_size: 16, - visible: true, - }), - tooltip_text: _('Edit'), - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }); - editButton.connect('clicked', this._onEditCommand.bind(this)); - editButton.get_accessible().set_name(_('Edit')); - row.get_child().attach(editButton, 2, 0, 1, 2); - - const deleteButton = new Gtk.Button({ - image: new Gtk.Image({ - icon_name: 'edit-delete-symbolic', - pixel_size: 16, - visible: true, - }), - tooltip_text: _('Remove'), - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }); - deleteButton.connect('clicked', this._onDeleteCommand.bind(this)); - deleteButton.get_accessible().set_name(_('Remove')); - row.get_child().attach(deleteButton, 3, 0, 1, 2); - - this.command_list.add(row); - } - - _onEditCommand(widget) { - if (this._commandEditor === undefined) { - this._commandEditor = new CommandEditor({ - modal: true, - transient_for: this.get_toplevel(), - use_header_bar: true, - }); - - this._commandEditor.connect( - 'response', - this._onSaveCommand.bind(this) - ); - - this._commandEditor.resize(1, 1); - } - - if (widget instanceof Gtk.Button) { - const row = widget.get_ancestor(Gtk.ListBoxRow.$gtype); - const uuid = row.get_name(); - - this._commandEditor.uuid = uuid; - this._commandEditor.command_name = this._commands[uuid].name; - this._commandEditor.command_line = this._commands[uuid].command; - } else { - this._commandEditor.uuid = GLib.uuid_string_random(); - this._commandEditor.command_name = ''; - this._commandEditor.command_line = ''; - } - - this._commandEditor.present(); - } - - _storeCommands() { - const variant = {}; - - for (const [uuid, command] of Object.entries(this._commands)) - variant[uuid] = new GLib.Variant('a{ss}', command); - - this.pluginSettings('runcommand').set_value( - 'command-list', - new GLib.Variant('a{sv}', variant) - ); - } - - _onDeleteCommand(button) { - const row = button.get_ancestor(Gtk.ListBoxRow.$gtype); - delete this._commands[row.get_name()]; - row.destroy(); - - this._storeCommands(); - } - - _onSaveCommand(dialog, response_id) { - if (response_id === Gtk.ResponseType.ACCEPT) { - this._commands[dialog.uuid] = { - name: dialog.command_name, - command: dialog.command_line, - }; - - this._storeCommands(); - - // - let row = null; - - for (const child of this.command_list.get_children()) { - if (child.get_name() === dialog.uuid) { - row = child; - break; - } - } - - if (row === null) { - this._insertCommand(dialog.uuid); - } else { - row.set_name(dialog.uuid); - row.title = dialog.command_name; - row.subtitle = dialog.command_line; - } - } - - dialog.hide(); - } - - /** - * Notification Settings - */ - _notificationSettings() { - const settings = this.pluginSettings('notification'); - - settings.bind( - 'send-notifications', - this.notification_apps, - 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - - // Separators & Sorting - this.notification_list.set_header_func(rowSeparators); - - // Scroll with keyboard focus - const notification_box = this.notification_page.get_child().get_child(); - notification_box.set_focus_vadjustment(this.notification_page.vadjustment); - - // Continue focus chain between lists - this.notification_list.next = this.notification_apps; - this.notification_apps.prev = this.notification_list; - - this.notification_apps.set_sort_func(titleSortFunc); - this.notification_apps.set_header_func(rowSeparators); - - this._populateApplications(settings); - } - - _toggleNotification(widget) { - try { - const row = widget.get_ancestor(Gtk.ListBoxRow.$gtype); - const settings = this.pluginSettings('notification'); - let applications = {}; - - try { - applications = JSON.parse(settings.get_string('applications')); - } catch (e) { - applications = {}; - } - - applications[row.title].enabled = !applications[row.title].enabled; - row.widget.state = applications[row.title].enabled; - settings.set_string('applications', JSON.stringify(applications)); - - } catch (e) { - logError(e); - } - } - - - - _populateApplications(settings) { - const applications = this._queryApplications(settings); - - for (const name in applications) { - const row = new SectionRow({ - gicon: Gio.Icon.new_for_string(applications[name].iconName), - title: name, - height_request: 48, - widget: new Gtk.Switch({ - state: applications[name].enabled, - margin_start: 12, - margin_end: 12, - halign: Gtk.Align.END, - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }), - }); - - row.widget.connect('notify::active', this._toggleNotification.bind(this)); - this.notification_apps.add(row); - } - } - - _queryApplications(settings) { - let applications = {}; - - try { - applications = JSON.parse(settings.get_string('applications')); - } catch (e) { - applications = {}; - } - - // Scan applications that statically declare to show notifications - const ignoreId = 'org.gnome.Shell.Extensions.GSConnect.desktop'; - - for (const appInfo of Gio.AppInfo.get_all()) { - if (appInfo.get_id() === ignoreId) - continue; - - if (!appInfo.get_boolean('X-GNOME-UsesNotifications')) - continue; - - const appName = appInfo.get_name(); - - if (appName === null || applications.hasOwnProperty(appName)) - continue; - - let icon = appInfo.get_icon(); - icon = (icon) ? icon.to_string() : 'application-x-executable'; - - applications[appName] = { - iconName: icon, - enabled: true, - }; - } - - settings.set_string('applications', JSON.stringify(applications)); - - return applications; - } - - /** - * Telephony Settings - */ - _telephonySettings() { - // Continue focus chain between lists - this.ringing_list.next = this.talking_list; - this.talking_list.prev = this.ringing_list; - - this.ringing_list.set_header_func(rowSeparators); - this.talking_list.set_header_func(rowSeparators); - } - - /** - * Keyboard Shortcuts - */ - _keybindingSettings() { - // Scroll with keyboard focus - const shortcuts_box = this.shortcuts_page.get_child().get_child(); - shortcuts_box.set_focus_vadjustment(this.shortcuts_page.vadjustment); - - // Filter & Sort - this.shortcuts_actions_list.set_filter_func(this._filterPluginKeybindings.bind(this)); - this.shortcuts_actions_list.set_header_func(rowSeparators); - this.shortcuts_actions_list.set_sort_func(titleSortFunc); - - // Init - for (const name in DEVICE_SHORTCUTS) - this._addPluginKeybinding(name); - - this._setPluginKeybindings(); - - // Watch for GAction and Keybinding changes - this._actionAddedId = this.device.action_group.connect( - 'action-added', - () => this.shortcuts_actions_list.invalidate_filter() - ); - this._actionRemovedId = this.device.action_group.connect( - 'action-removed', - () => this.shortcuts_actions_list.invalidate_filter() - ); - this._keybindingsId = this.settings.connect( - 'changed::keybindings', - this._setPluginKeybindings.bind(this) - ); - } - - _addPluginKeybinding(name) { - const [icon_name, label] = DEVICE_SHORTCUTS[name]; - - const widget = new Gtk.Label({ - label: _('Disabled'), - visible: true, - }); - widget.get_style_context().add_class('dim-label'); - - const row = new SectionRow({ - height_request: 48, - icon_name: icon_name, - title: label, - widget: widget, - }); - row.icon_image.pixel_size = 16; - row.action = name; - this.shortcuts_actions_list.add(row); - } - - _filterPluginKeybindings(row) { - return this.device.action_group.has_action(row.action); - } - - _setPluginKeybindings() { - const keybindings = this.settings.get_value('keybindings').deepUnpack(); - - this.shortcuts_actions_list.foreach(row => { - if (keybindings[row.action]) { - const accel = Gtk.accelerator_parse(keybindings[row.action]); - row.widget.label = Gtk.accelerator_get_label(...accel); - } else { - row.widget.label = _('Disabled'); - } - }); - } - - _onResetActionShortcuts(button) { - const keybindings = this.settings.get_value('keybindings').deepUnpack(); - - for (const action in keybindings) { - // Don't reset remote command shortcuts - if (!action.includes('::')) - delete keybindings[action]; - } - - this.settings.set_value( - 'keybindings', - new GLib.Variant('a{ss}', keybindings) - ); - } - - async _onShortcutRowActivated(box, row) { - try { - const keybindings = this.settings.get_value('keybindings').deepUnpack(); - let accel = keybindings[row.action] || null; - - accel = await Keybindings.getAccelerator(row.title, accel); - - if (accel) - keybindings[row.action] = accel; - else - delete keybindings[row.action]; - - this.settings.set_value( - 'keybindings', - new GLib.Variant('a{ss}', keybindings) - ); - } catch (e) { - logError(e); - } - } - - /** - * Advanced Page - */ - _advancedSettings() { - // Scroll with keyboard focus - const advanced_box = this.advanced_page.get_child().get_child(); - advanced_box.set_focus_vadjustment(this.advanced_page.vadjustment); - - // Sort & Separate - this.plugin_list.set_header_func(rowSeparators); - this.plugin_list.set_sort_func(titleSortFunc); - this.experimental_list.set_header_func(rowSeparators); - - // Continue focus chain between lists - this.plugin_list.next = this.experimental_list; - this.experimental_list.prev = this.plugin_list; - - this._disabledPluginsId = this.settings.connect( - 'changed::disabled-plugins', - this._onPluginsChanged.bind(this) - ); - this._supportedPluginsId = this.settings.connect( - 'changed::supported-plugins', - this._onPluginsChanged.bind(this) - ); - this._onPluginsChanged(this.settings, null); - - for (const name of DEVICE_PLUGINS) - this._addPlugin(name); - } - - _onPluginsChanged(settings, key) { - if (key === 'disabled-plugins' || this._disabledPlugins === undefined) - this._disabledPlugins = settings.get_strv('disabled-plugins'); - - if (key === 'supported-plugins' || this._supportedPlugins === undefined) - this._supportedPlugins = settings.get_strv('supported-plugins'); - - this._enabledPlugins = this._supportedPlugins.filter(name => { - return !this._disabledPlugins.includes(name); - }); - - if (key !== null) - this._updatePlugins(); - } - - _addPlugin(name) { - const plugin = plugins[name]; - - const row = new SectionRow({ - height_request: 48, - title: plugin.Metadata.label, - subtitle: plugin.Metadata.description || '', - visible: this._supportedPlugins.includes(name), - widget: new Gtk.Switch({ - active: this._enabledPlugins.includes(name), - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }), - }); - row.widget.connect('notify::active', this._togglePlugin.bind(this)); - row.set_name(name); - - if (this.hasOwnProperty(name)) - this[name].visible = row.widget.active; - - this.plugin_list.add(row); - } - - _updatePlugins(settings, key) { - for (const row of this.plugin_list.get_children()) { - const name = row.get_name(); - - row.visible = this._supportedPlugins.includes(name); - row.widget.active = this._enabledPlugins.includes(name); - - if (this.hasOwnProperty(name)) - this[name].visible = row.widget.active; - } - } - - _togglePlugin(widget) { - try { - const name = widget.get_ancestor(Gtk.ListBoxRow.$gtype).get_name(); - const index = this._disabledPlugins.indexOf(name); - - // Either add or remove the plugin from the disabled list - if (index > -1) - this._disabledPlugins.splice(index, 1); - else - this._disabledPlugins.push(name); - - this.settings.set_strv('disabled-plugins', this._disabledPlugins); - } catch (e) { - logError(e); - } - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js deleted file mode 100644 index 038f60e7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/init.js +++ /dev/null @@ -1,12 +0,0 @@ -// 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/keybindings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/keybindings.js deleted file mode 100644 index be80dfea..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/keybindings.js +++ /dev/null @@ -1,314 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - - -/* - * A list of modifier keysyms we ignore - */ -const _MODIFIERS = [ - Gdk.KEY_Alt_L, - Gdk.KEY_Alt_R, - Gdk.KEY_Caps_Lock, - Gdk.KEY_Control_L, - Gdk.KEY_Control_R, - Gdk.KEY_Meta_L, - Gdk.KEY_Meta_R, - Gdk.KEY_Num_Lock, - Gdk.KEY_Shift_L, - Gdk.KEY_Shift_R, - Gdk.KEY_Super_L, - Gdk.KEY_Super_R, -]; - -/** - * Response enum for ShortcutChooserDialog - */ -export const ResponseType = { - CANCEL: Gtk.ResponseType.CANCEL, - SET: Gtk.ResponseType.APPLY, - UNSET: 2, -}; - - -/** - * A simplified version of the shortcut editor from GNOME Control Center - */ -export const ShortcutChooserDialog = GObject.registerClass({ - GTypeName: 'GSConnectPreferencesShortcutEditor', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/preferences-shortcut-editor.ui', - Children: [ - 'cancel-button', 'set-button', - 'stack', 'summary-label', - 'shortcut-label', 'conflict-label', - ], -}, class ShortcutChooserDialog extends Gtk.Dialog { - - _init(params) { - super._init({ - transient_for: Gio.Application.get_default().get_active_window(), - use_header_bar: true, - }); - - this._seat = Gdk.Display.get_default().get_default_seat(); - - // Current accelerator or %null - this.accelerator = params.accelerator; - - // TRANSLATORS: Summary of a keyboard shortcut function - // Example: Enter a new shortcut to change Messaging - this.summary = _('Enter a new shortcut to change %s').format( - params.summary - ); - } - - get accelerator() { - return this.shortcut_label.accelerator; - } - - set accelerator(value) { - this.shortcut_label.accelerator = value; - } - - get summary() { - return this.summary_label.label; - } - - set summary(value) { - this.summary_label.label = value; - } - - vfunc_key_press_event(event) { - let keyvalLower = Gdk.keyval_to_lower(event.keyval); - let realMask = event.state & Gtk.accelerator_get_default_mod_mask(); - - // TODO: Critical: 'WIDGET_REALIZED_FOR_EVENT (widget, event)' failed - if (_MODIFIERS.includes(keyvalLower)) - return true; - - // Normalize Tab - if (keyvalLower === Gdk.KEY_ISO_Left_Tab) - keyvalLower = Gdk.KEY_Tab; - - // Put shift back if it changed the case of the key, not otherwise. - if (keyvalLower !== event.keyval) - realMask |= Gdk.ModifierType.SHIFT_MASK; - - // HACK: we don't want to use SysRq as a keybinding (but we do want - // Alt+Print), so we avoid translation from Alt+Print to SysRq - if (keyvalLower === Gdk.KEY_Sys_Req && (realMask & Gdk.ModifierType.MOD1_MASK) !== 0) - keyvalLower = Gdk.KEY_Print; - - // A single Escape press cancels the editing - if (realMask === 0 && keyvalLower === Gdk.KEY_Escape) { - this.response(ResponseType.CANCEL); - return false; - } - - // Backspace disables the current shortcut - if (realMask === 0 && keyvalLower === Gdk.KEY_BackSpace) { - this.response(ResponseType.UNSET); - return false; - } - - // CapsLock isn't supported as a keybinding modifier, so keep it from - // confusing us - realMask &= ~Gdk.ModifierType.LOCK_MASK; - - if (keyvalLower !== 0 && realMask !== 0) { - this._ungrab(); - - // Set the accelerator property/label - this.accelerator = Gtk.accelerator_name(keyvalLower, realMask); - - // TRANSLATORS: When a keyboard shortcut is unavailable - // Example: [Ctrl]+[S] is already being used - this.conflict_label.label = _('%s is already being used').format( - Gtk.accelerator_get_label(keyvalLower, realMask) - ); - - // Show Cancel button and switch to confirm/conflict page - this.cancel_button.visible = true; - this.stack.visible_child_name = 'confirm'; - - this._check(); - } - - return true; - } - - async _check() { - try { - const available = await checkAccelerator(this.accelerator); - this.set_button.visible = available; - this.conflict_label.visible = !available; - } catch (e) { - logError(e); - this.response(ResponseType.CANCEL); - } - } - - _grab() { - const success = this._seat.grab( - this.get_window(), - Gdk.SeatCapabilities.KEYBOARD, - true, // owner_events - null, // cursor - null, // event - null - ); - - if (success !== Gdk.GrabStatus.SUCCESS) - return this.response(ResponseType.CANCEL); - - if (!this._seat.get_keyboard() && !this._seat.get_pointer()) - return this.response(ResponseType.CANCEL); - - this.grab_add(); - } - - _ungrab() { - this._seat.ungrab(); - this.grab_remove(); - } - - // Override to use our own ungrab process - response(response_id) { - this.hide(); - this._ungrab(); - - return super.response(response_id); - } - - // Override with a non-blocking version of Gtk.Dialog.run() - run() { - this.show(); - - // Wait a bit before attempting grab - GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, () => { - this._grab(); - return GLib.SOURCE_REMOVE; - }); - } -}); - - -/** - * Check the availability of an accelerator using GNOME Shell's DBus interface. - * - * @param {string} accelerator - An accelerator - * @param {number} [modeFlags] - Mode Flags - * @param {number} [grabFlags] - Grab Flags - * @param {boolean} %true if available, %false on error or unavailable - */ -export async function checkAccelerator(accelerator, modeFlags = 0, grabFlags = 0) { - try { - let result = false; - - // Try to grab the accelerator - const action = await new Promise((resolve, reject) => { - Gio.DBus.session.call( - 'org.gnome.Shell', - '/org/gnome/Shell', - 'org.gnome.Shell', - 'GrabAccelerator', - new GLib.Variant('(suu)', [accelerator, modeFlags, grabFlags]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (connection, res) => { - try { - res = connection.call_finish(res); - resolve(res.deepUnpack()[0]); - } catch (e) { - reject(e); - } - } - ); - }); - - // If successful, use the result of ungrabbing as our return - if (action !== 0) { - result = await new Promise((resolve, reject) => { - Gio.DBus.session.call( - 'org.gnome.Shell', - '/org/gnome/Shell', - 'org.gnome.Shell', - 'UngrabAccelerator', - new GLib.Variant('(u)', [action]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (connection, res) => { - try { - res = connection.call_finish(res); - resolve(res.deepUnpack()[0]); - } catch (e) { - reject(e); - } - } - ); - }); - } - - return result; - } catch (e) { - logError(e); - return false; - } -} - - -/** - * Show a dialog to get a keyboard shortcut from a user. - * - * @param {string} summary - A description of the keybinding's function - * @param {string} accelerator - An accelerator as taken by Gtk.ShortcutLabel - * @return {string} An accelerator or %null if it should be unset. - */ -export async function getAccelerator(summary, accelerator = null) { - try { - const dialog = new ShortcutChooserDialog({ - summary: summary, - accelerator: accelerator, - }); - - accelerator = await new Promise((resolve, reject) => { - dialog.connect('response', (dialog, response) => { - switch (response) { - case ResponseType.SET: - accelerator = dialog.accelerator; - break; - - case ResponseType.UNSET: - accelerator = null; - break; - - case ResponseType.CANCEL: - // leave the accelerator as passed in - break; - } - - dialog.destroy(); - - resolve(accelerator); - }); - - dialog.run(); - }); - - return accelerator; - } catch (e) { - logError(e); - return accelerator; - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js deleted file mode 100644 index e258f225..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js +++ /dev/null @@ -1,648 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import GdkPixbuf from 'gi://GdkPixbuf'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import system from 'system'; - -import Config from '../config.js'; -import {Panel, rowSeparators} from './device.js'; -import {Service} from '../utils/remote.js'; - - -/* - * Header for support logs - */ -const LOG_HEADER = new GLib.Bytes(` -GSConnect: ${Config.PACKAGE_VERSION} (${Config.IS_USER ? 'user' : 'system'}) -GJS: ${system.version} -Session: ${GLib.getenv('XDG_SESSION_TYPE')} -OS: ${GLib.get_os_info('PRETTY_NAME')} --------------------------------------------------------------------------------- -`); - - -/** - * Generate a support log. - * - * @param {string} time - Start time as a string (24-hour notation) - */ -async function generateSupportLog(time) { - try { - const [file, stream] = Gio.File.new_tmp('gsconnect.XXXXXX'); - const logFile = stream.get_output_stream(); - - await new Promise((resolve, reject) => { - logFile.write_bytes_async(LOG_HEADER, 0, null, (file, res) => { - try { - resolve(file.write_bytes_finish(res)); - } catch (e) { - reject(e); - } - }); - }); - - // FIXME: BSD??? - const proc = new Gio.Subprocess({ - flags: (Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_MERGE), - argv: ['journalctl', '--no-host', '--since', time], - }); - proc.init(null); - - logFile.splice_async( - proc.get_stdout_pipe(), - Gio.OutputStreamSpliceFlags.CLOSE_TARGET, - GLib.PRIORITY_DEFAULT, - null, - (source, res) => { - try { - source.splice_finish(res); - } catch (e) { - logError(e); - } - } - ); - - await new Promise((resolve, reject) => { - proc.wait_check_async(null, (proc, res) => { - try { - resolve(proc.wait_finish(res)); - } catch (e) { - reject(e); - } - }); - }); - - const uri = file.get_uri(); - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } catch (e) { - logError(e); - } -} - - -/** - * "Connect to..." Dialog - */ -const ConnectDialog = GObject.registerClass({ - GTypeName: 'GSConnectConnectDialog', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/connect-dialog.ui', - Children: [ - 'cancel-button', 'connect-button', - 'lan-grid', 'lan-ip', 'lan-port', - ], -}, class ConnectDialog extends Gtk.Dialog { - - _init(params = {}) { - super._init(Object.assign({ - use_header_bar: true, - }, params)); - } - - vfunc_response(response_id) { - if (response_id === Gtk.ResponseType.OK) { - try { - let address; - - // Lan host/port entered - if (this.lan_ip.text) { - const host = this.lan_ip.text; - const port = this.lan_port.value; - address = GLib.Variant.new_string(`lan://${host}:${port}`); - } else { - return false; - } - - this.application.activate_action('connect', address); - } catch (e) { - logError(e); - } - } - - this.destroy(); - return false; - } -}); - - -export const Window = GObject.registerClass({ - GTypeName: 'GSConnectPreferencesWindow', - Properties: { - 'display-mode': GObject.ParamSpec.string( - 'display-mode', - 'Display Mode', - 'Display devices in either the Panel or User Menu', - GObject.ParamFlags.READWRITE, - null - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/preferences-window.ui', - Children: [ - // HeaderBar - 'headerbar', 'infobar', 'stack', - 'service-menu', 'service-edit', 'refresh-button', - 'device-menu', 'prev-button', - - // Popover - 'rename-popover', 'rename', 'rename-label', 'rename-entry', 'rename-submit', - - // Focus Box - 'service-window', 'service-box', - - // Device List - 'device-list', 'device-list-spinner', 'device-list-placeholder', - ], -}, class PreferencesWindow extends Gtk.ApplicationWindow { - - _init(params = {}) { - super._init(params); - - // Service Settings - this.settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect', - true - ), - }); - - // Service Proxy - this.service = new Service(); - - this._deviceAddedId = this.service.connect( - 'device-added', - this._onDeviceAdded.bind(this) - ); - - this._deviceRemovedId = this.service.connect( - 'device-removed', - this._onDeviceRemoved.bind(this) - ); - - this._serviceChangedId = this.service.connect( - 'notify::active', - this._onServiceChanged.bind(this) - ); - - // HeaderBar (Service Name) - this.headerbar.title = this.settings.get_string('name'); - this.rename_entry.text = this.headerbar.title; - - // Scroll with keyboard focus - this.service_box.set_focus_vadjustment(this.service_window.vadjustment); - - // Device List - this.device_list.set_header_func(rowSeparators); - - // Discoverable InfoBar - this.settings.bind( - 'discoverable', - this.infobar, - 'reveal-child', - Gio.SettingsBindFlags.INVERT_BOOLEAN - ); - this.add_action(this.settings.create_action('discoverable')); - - // Application Menu - this._initMenu(); - - // Setting: Keep Alive When Locked - this.add_action(this.settings.create_action('keep-alive-when-locked')); - - // Broadcast automatically every 5 seconds if there are no devices yet - this._refreshSource = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - 5, - this._refresh.bind(this) - ); - - // Restore window size/maximized/position - this._restoreGeometry(); - - // Prime the service - this._initService(); - } - - get display_mode() { - if (this.settings.get_boolean('show-indicators')) - return 'panel'; - - return 'user-menu'; - } - - set display_mode(mode) { - this.settings.set_boolean('show-indicators', (mode === 'panel')); - } - - vfunc_delete_event(event) { - if (this.service) { - this.service.disconnect(this._deviceAddedId); - this.service.disconnect(this._deviceRemovedId); - this.service.disconnect(this._serviceChangedId); - this.service.destroy(); - this.service = null; - } - - this._saveGeometry(); - GLib.source_remove(this._refreshSource); - - return false; - } - - async _initService() { - try { - this.refresh_button.grab_focus(); - - this._onServiceChanged(this.service, null); - await this.service.reload(); - } catch (e) { - logError(e, 'GSConnect'); - } - } - - _initMenu() { - // Panel/User Menu mode - const displayMode = new Gio.PropertyAction({ - name: 'display-mode', - property_name: 'display-mode', - object: this, - }); - this.add_action(displayMode); - - // About Dialog - const aboutDialog = new Gio.SimpleAction({name: 'about'}); - aboutDialog.connect('activate', this._aboutDialog.bind(this)); - this.add_action(aboutDialog); - - // "Connect to..." Dialog - const connectDialog = new Gio.SimpleAction({name: 'connect'}); - connectDialog.connect('activate', this._connectDialog.bind(this)); - this.add_action(connectDialog); - - // "Generate Support Log" GAction - const generateSupportLog = new Gio.SimpleAction({name: 'support-log'}); - generateSupportLog.connect('activate', this._generateSupportLog.bind(this)); - this.add_action(generateSupportLog); - - // "Help" GAction - const help = new Gio.SimpleAction({name: 'help'}); - help.connect('activate', this._help); - this.add_action(help); - } - - _refresh() { - if (this.service.active && this.device_list.get_children().length < 1) { - this.device_list_spinner.active = true; - this.service.activate_action('refresh', null); - } else { - this.device_list_spinner.active = false; - } - - return GLib.SOURCE_CONTINUE; - } - - /* - * Window State - */ - _restoreGeometry() { - this._windowState = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect.WindowState', - true - ), - path: '/org/gnome/shell/extensions/gsconnect/preferences/', - }); - - // Size - const [width, height] = this._windowState.get_value('window-size').deepUnpack(); - - if (width && height) - this.set_default_size(width, height); - - // Maximized State - if (this._windowState.get_boolean('window-maximized')) - this.maximize(); - } - - _saveGeometry() { - const state = this.get_window().get_state(); - - // Maximized State - const maximized = (state & Gdk.WindowState.MAXIMIZED); - this._windowState.set_boolean('window-maximized', maximized); - - // Leave the size at the value before maximizing - if (maximized || (state & Gdk.WindowState.FULLSCREEN)) - return; - - // Size - const size = this.get_size(); - this._windowState.set_value('window-size', new GLib.Variant('(ii)', size)); - } - - /** - * About Dialog - */ - _aboutDialog() { - if (this._about === undefined) { - this._about = new Gtk.AboutDialog({ - application: Gio.Application.get_default(), - authors: [ - 'Andy Holmes ', - 'Bertrand Lacoste ', - 'Frank Dana ', - ], - comments: _('A complete KDE Connect implementation for GNOME'), - logo: GdkPixbuf.Pixbuf.new_from_resource_at_scale( - '/org/gnome/Shell/Extensions/GSConnect/icons/org.gnome.Shell.Extensions.GSConnect.svg', - 128, - 128, - true - ), - program_name: 'GSConnect', - // TRANSLATORS: eg. 'Translator Name ' - translator_credits: _('translator-credits'), - version: Config.PACKAGE_VERSION.toString(), - website: Config.PACKAGE_URL, - license_type: Gtk.License.GPL_2_0, - modal: true, - transient_for: this, - }); - - // Persist - this._about.connect('response', (dialog) => dialog.hide_on_delete()); - this._about.connect('delete-event', (dialog) => dialog.hide_on_delete()); - } - - this._about.present(); - } - - /** - * Connect to..." Dialog - */ - _connectDialog() { - new ConnectDialog({ - application: Gio.Application.get_default(), - modal: true, - transient_for: this, - }); - } - - /* - * "Generate Support Log" GAction - */ - _generateSupportLog() { - const dialog = new Gtk.MessageDialog({ - text: _('Generate Support Log'), - secondary_text: _('Debug messages are being logged. Take any steps necessary to reproduce a problem then review the log.'), - }); - dialog.add_button(_('Cancel'), Gtk.ResponseType.CANCEL); - dialog.add_button(_('Review Log'), Gtk.ResponseType.OK); - - // Enable debug logging and mark the current time - this.settings.set_boolean('debug', true); - const now = GLib.DateTime.new_now_local().format('%R'); - - dialog.connect('response', (dialog, response_id) => { - // Disable debug logging and destroy the dialog - this.settings.set_boolean('debug', false); - dialog.destroy(); - - // Only generate a log if instructed - if (response_id === Gtk.ResponseType.OK) - generateSupportLog(now); - }); - - dialog.show_all(); - } - - /* - * "Help" GAction - */ - _help(action, parameter) { - const uri = `${Config.PACKAGE_URL}/wiki/Help`; - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } - - /* - * HeaderBar Callbacks - */ - _onPrevious(button, event) { - // HeaderBar (Service) - this.prev_button.visible = false; - this.device_menu.visible = false; - - this.refresh_button.visible = true; - this.service_edit.visible = true; - this.service_menu.visible = true; - - this.headerbar.title = this.settings.get_string('name'); - this.headerbar.subtitle = null; - - // Panel - this.stack.visible_child_name = 'service'; - this._setDeviceMenu(); - } - - _onEditServiceName(button, event) { - this.rename_entry.text = this.headerbar.title; - this.rename_entry.has_focus = true; - } - - _onSetServiceName(widget) { - if (this.rename_entry.text.length) { - this.headerbar.title = this.rename_entry.text; - this.settings.set_string('name', this.rename_entry.text); - } - - this.service_edit.active = false; - this.service_edit.grab_focus(); - } - - /* - * Context Switcher - */ - _getTypeLabel(device) { - switch (device.type) { - case 'laptop': - return _('Laptop'); - case 'phone': - return _('Smartphone'); - case 'tablet': - return _('Tablet'); - case 'tv': - return _('Television'); - default: - return _('Desktop'); - } - } - - _setDeviceMenu(panel = null) { - this.device_menu.insert_action_group('device', null); - this.device_menu.insert_action_group('settings', null); - this.device_menu.set_menu_model(null); - - if (panel === null) - return; - - this.device_menu.insert_action_group('device', panel.device.action_group); - this.device_menu.insert_action_group('settings', panel.actions); - this.device_menu.set_menu_model(panel.menu); - } - - _onDeviceChanged(statusLabel, device, pspec) { - switch (false) { - case device.paired: - statusLabel.label = _('Unpaired'); - break; - - case device.connected: - statusLabel.label = _('Disconnected'); - break; - - default: - statusLabel.label = _('Connected'); - } - } - - _createDeviceRow(device) { - const row = new Gtk.ListBoxRow({ - height_request: 52, - selectable: false, - visible: true, - }); - row.set_name(device.id); - - const grid = new Gtk.Grid({ - column_spacing: 12, - margin_left: 20, - margin_right: 20, - margin_bottom: 8, - margin_top: 8, - visible: true, - }); - row.add(grid); - - const icon = new Gtk.Image({ - gicon: new Gio.ThemedIcon({name: device.icon_name}), - icon_size: Gtk.IconSize.BUTTON, - visible: true, - }); - grid.attach(icon, 0, 0, 1, 1); - - const title = new Gtk.Label({ - halign: Gtk.Align.START, - hexpand: true, - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }); - grid.attach(title, 1, 0, 1, 1); - - const status = new Gtk.Label({ - halign: Gtk.Align.END, - hexpand: true, - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }); - grid.attach(status, 2, 0, 1, 1); - - // Keep name up to date - device.bind_property( - 'name', - title, - 'label', - GObject.BindingFlags.SYNC_CREATE - ); - - // Keep status up to date - device.connect( - 'notify::connected', - this._onDeviceChanged.bind(null, status) - ); - device.connect( - 'notify::paired', - this._onDeviceChanged.bind(null, status) - ); - this._onDeviceChanged(status, device, null); - - return row; - } - - _onDeviceAdded(service, device) { - try { - if (!this.stack.get_child_by_name(device.id)) { - // Add the device preferences - const prefs = new Panel(device); - this.stack.add_titled(prefs, device.id, device.name); - - // Add a row to the device list - prefs.row = this._createDeviceRow(device); - this.device_list.add(prefs.row); - } - } catch (e) { - logError(e); - } - } - - _onDeviceRemoved(service, device) { - try { - const prefs = this.stack.get_child_by_name(device.id); - - if (prefs === null) - return; - - if (prefs === this.stack.get_visible_child()) - this._onPrevious(); - - prefs.row.destroy(); - prefs.row = null; - - prefs.dispose(); - prefs.destroy(); - } catch (e) { - logError(e); - } - } - - _onDeviceSelected(box, row) { - try { - if (row === null) - return this._onPrevious(); - - // Transition the panel - const name = row.get_name(); - const prefs = this.stack.get_child_by_name(name); - - this.stack.visible_child = prefs; - this._setDeviceMenu(prefs); - - // HeaderBar (Device) - this.refresh_button.visible = false; - this.service_edit.visible = false; - this.service_menu.visible = false; - - this.prev_button.visible = true; - this.device_menu.visible = true; - - this.headerbar.title = prefs.device.name; - this.headerbar.subtitle = this._getTypeLabel(prefs.device); - } catch (e) { - logError(e); - } - } - - _onServiceChanged(service, pspec) { - if (this.service.active) - this.device_list_placeholder.label = _('Searching for devices…'); - else - this.device_list_placeholder.label = _('Waiting for service…'); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/prefs.js deleted file mode 100644 index 4a94ca7b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/prefs.js +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Adw from 'gi://Adw'; - -// Bootstrap -import * as Utils from './shell/utils.js'; -import setup from './utils/setup.js'; -import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - -export default class GSConnectExtensionPreferences extends ExtensionPreferences { - constructor(metadata) { - super(metadata); - setup(this.path); - Utils.installService(); - } - - fillPreferencesWindow(window) { - const widget = new Adw.PreferencesPage(); - window.add(widget); - - GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - window.close(); - }); - - Gio.Subprocess.new([`${this.path}/gsconnect-preferences`], 0); - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/private_metadata.json deleted file mode 100644 index a50493f4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/private_metadata.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "GSConnect is a complete implementation of KDE Connect especially for GNOME Shell with Nautilus, Chrome and Firefox integration. It does not rely on the KDE Connect desktop application and will not work with it installed.\n\nKDE Connect allows devices to securely share content like notifications or files and other features like SMS messaging and remote control. The KDE Connect team has applications for Linux, BSD, Android, Sailfish, iOS, macOS and Windows.\n\nPlease report issues on Github!", - "name": "GSConnect", - "shell-version": [ - "46" - ], - "url": "https://github.com/GSConnect/gnome-shell-extension-gsconnect/wiki", - "uuid": "gsconnect@andyholmes.github.io", - "version": 57 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled deleted file mode 100644 index 60e8035b64140a152d4915064f206ccefcf0f2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5316 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 CmX~h; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml deleted file mode 100644 index 4dfaddb3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - true - - - false - - - true - - - true - - - - - "" - - - "" - - - [] - - - false - - - true - - - - - - - (0, 0) - - - false - - - - - - - "" - - - {} - - - ["sms", "ring", "mount", "commands", "share", "keyboard"] - - - "" - - - false - - - "smartphone" - - - [] - - - [] - - - [] - - - [] - - - "" - - - - - - false - - - true - - - false -

Enables custom battery notification - - - - 80 - - - false - - - - - false - - - false - - - - - true - - - - - - true - - - - - true - - - - - true - - - true - - - '{}' - - - - - - - , 'restart': <{'name': 'Restart', 'command': 'systemctl reboot'}>, 'logout': <{'name': 'Log Out', 'command': 'gnome-session-quit --logout --no-prompt'}>, 'poweroff': <{'name': 'Power Off', 'command': 'systemctl poweroff'}>, 'suspend': <{'name': 'Suspend', 'command': 'systemctl suspend'}>}]]> - - - - - true - - - - - true - - - "" - - - - - false - - - - - true - - - - - "lower" - - - false - - - "mute" - - - true - - - true - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js deleted file mode 100644 index 758e24bf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js +++ /dev/null @@ -1,889 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../../config.js'; -import * as Core from '../core.js'; - -// Retain compatibility with GLib < 2.80, which lacks GioUnix -let GioUnix; -try { - GioUnix = (await import('gi://GioUnix')).default; -} catch (e) { - GioUnix = { - InputStream: Gio.UnixInputStream, - OutputStream: Gio.UnixOutputStream, - }; -} - -/** - * TCP Port Constants - */ -const PROTOCOL_PORT_DEFAULT = 1716; -const PROTOCOL_PORT_MIN = 1716; -const PROTOCOL_PORT_MAX = 1764; -const TRANSFER_MIN = 1739; -const TRANSFER_MAX = 1764; - - -/* - * One-time check for Linux/FreeBSD socket options - */ -export let _LINUX_SOCKETS = true; - -try { - // This should throw on FreeBSD - Gio.Socket.new( - Gio.SocketFamily.IPV4, - Gio.SocketType.STREAM, - Gio.SocketProtocol.TCP - ).get_option(6, 5); -} catch (e) { - _LINUX_SOCKETS = false; -} - - -/** - * Configure a socket connection for the KDE Connect protocol. - * - * @param {Gio.SocketConnection} connection - The connection to configure - */ -export function _configureSocket(connection) { - try { - if (_LINUX_SOCKETS) { - connection.socket.set_option(6, 4, 10); // TCP_KEEPIDLE - connection.socket.set_option(6, 5, 5); // TCP_KEEPINTVL - connection.socket.set_option(6, 6, 3); // TCP_KEEPCNT - - // FreeBSD constants - // https://github.com/freebsd/freebsd/blob/master/sys/netinet/tcp.h#L159 - } else { - connection.socket.set_option(6, 256, 10); // TCP_KEEPIDLE - connection.socket.set_option(6, 512, 5); // TCP_KEEPINTVL - connection.socket.set_option(6, 1024, 3); // TCP_KEEPCNT - } - - // Do this last because an error setting the keepalive options would - // result in a socket that never times out - connection.socket.set_keepalive(true); - } catch (e) { - debug(e, 'Configuring Socket'); - } -} - - -/** - * Lan.ChannelService consists of two parts: - * - * The TCP Listener listens on a port and constructs a Channel object from the - * incoming Gio.TcpConnection. - * - * The UDP Listener listens on a port for incoming JSON identity packets which - * include the TCP port, while the IP address is taken from the UDP packet - * itself. We respond by opening a TCP connection to that address. - */ -export const ChannelService = GObject.registerClass({ - GTypeName: 'GSConnectLanChannelService', - Properties: { - 'certificate': GObject.ParamSpec.object( - 'certificate', - 'Certificate', - 'The TLS certificate', - GObject.ParamFlags.READWRITE, - Gio.TlsCertificate.$gtype - ), - 'port': GObject.ParamSpec.uint( - 'port', - 'Port', - 'The port used by the service', - GObject.ParamFlags.READWRITE, - 0, GLib.MAXUINT16, - PROTOCOL_PORT_DEFAULT - ), - }, -}, class LanChannelService extends Core.ChannelService { - - _init(params = {}) { - super._init(params); - - // Track hosts we identify to directly, allowing them to ignore the - // discoverable state of the service. - this._allowed = new Set(); - - // - this._tcp = null; - this._tcpPort = PROTOCOL_PORT_DEFAULT; - this._udp4 = null; - this._udp6 = null; - - // Monitor network status - this._networkMonitor = Gio.NetworkMonitor.get_default(); - this._networkAvailable = false; - this._networkChangedId = 0; - } - - get certificate() { - if (this._certificate === undefined) - this._certificate = null; - - return this._certificate; - } - - set certificate(certificate) { - if (this.certificate === certificate) - return; - - this._certificate = certificate; - this.notify('certificate'); - } - - get channels() { - if (this._channels === undefined) - this._channels = new Map(); - - return this._channels; - } - - get port() { - if (this._port === undefined) - this._port = PROTOCOL_PORT_DEFAULT; - - return this._port; - } - - set port(port) { - if (this.port === port) - return; - - this._port = port; - this.notify('port'); - } - - _onNetworkChanged(monitor, network_available) { - if (this._networkAvailable === network_available) - return; - - this._networkAvailable = network_available; - this.broadcast(); - } - - _initCertificate() { - if (GLib.find_program_in_path(Config.OPENSSL_PATH) === null) { - const error = new Error(); - error.name = _('OpenSSL not found'); - error.url = `${Config.PACKAGE_URL}/wiki/Error#openssl-not-found`; - throw error; - } - - const certPath = GLib.build_filenamev([ - Config.CONFIGDIR, - 'certificate.pem', - ]); - const keyPath = GLib.build_filenamev([ - Config.CONFIGDIR, - 'private.pem', - ]); - - // Ensure a certificate exists with our id as the common name - this._certificate = Gio.TlsCertificate.new_for_paths(certPath, keyPath, - this.id); - - // If the service ID doesn't match the common name, this is probably a - // certificate from an older version and we should amend ours to match - if (this.id !== this._certificate.common_name) - this._id = this._certificate.common_name; - } - - _initTcpListener() { - try { - this._tcp = new Gio.SocketService(); - - let tcpPort = this.port; - const tcpPortMax = tcpPort + - (PROTOCOL_PORT_MAX - PROTOCOL_PORT_MIN); - - while (tcpPort <= tcpPortMax) { - try { - this._tcp.add_inet_port(tcpPort, null); - break; - } catch (e) { - if (tcpPort < tcpPortMax) { - tcpPort++; - continue; - } - - throw e; - } - } - - this._tcpPort = tcpPort; - this._tcp.connect('incoming', this._onIncomingChannel.bind(this)); - } catch (e) { - this._tcp.stop(); - this._tcp.close(); - this._tcp = null; - - throw e; - } - } - - async _onIncomingChannel(listener, connection) { - try { - const host = connection.get_remote_address().address.to_string(); - - // Create a channel - const channel = new Channel({ - backend: this, - certificate: this.certificate, - host: host, - port: this.port, - }); - - // Accept the connection - await channel.accept(connection); - channel.identity.body.tcpHost = channel.host; - channel.identity.body.tcpPort = this._tcpPort; - channel.allowed = this._allowed.has(host); - - this.channel(channel); - } catch (e) { - debug(e); - } - } - - _initUdpListener() { - // Default broadcast address - this._udp_address = Gio.InetSocketAddress.new_from_string( - '255.255.255.255', this.port); - - try { - this._udp6 = Gio.Socket.new(Gio.SocketFamily.IPV6, - Gio.SocketType.DATAGRAM, Gio.SocketProtocol.UDP); - this._udp6.set_broadcast(true); - - // Bind the socket - const inetAddr = Gio.InetAddress.new_any(Gio.SocketFamily.IPV6); - const sockAddr = Gio.InetSocketAddress.new(inetAddr, this.port); - this._udp6.bind(sockAddr, true); - - // Input stream - this._udp6_stream = new Gio.DataInputStream({ - base_stream: new GioUnix.InputStream({ - fd: this._udp6.fd, - close_fd: false, - }), - }); - - // Watch socket for incoming packets - this._udp6_source = this._udp6.create_source(GLib.IOCondition.IN, null); - this._udp6_source.set_callback(this._onIncomingIdentity.bind(this, this._udp6)); - this._udp6_source.attach(null); - } catch (e) { - this._udp6 = null; - } - - // Our IPv6 socket also supports IPv4; we're all done - if (this._udp6 && this._udp6.speaks_ipv4()) { - this._udp4 = null; - return; - } - - try { - this._udp4 = Gio.Socket.new(Gio.SocketFamily.IPV4, - Gio.SocketType.DATAGRAM, Gio.SocketProtocol.UDP); - this._udp4.set_broadcast(true); - - // Bind the socket - const inetAddr = Gio.InetAddress.new_any(Gio.SocketFamily.IPV4); - const sockAddr = Gio.InetSocketAddress.new(inetAddr, this.port); - this._udp4.bind(sockAddr, true); - - // Input stream - this._udp4_stream = new Gio.DataInputStream({ - base_stream: new GioUnix.InputStream({ - fd: this._udp4.fd, - close_fd: false, - }), - }); - - // Watch input socket for incoming packets - this._udp4_source = this._udp4.create_source(GLib.IOCondition.IN, null); - this._udp4_source.set_callback(this._onIncomingIdentity.bind(this, this._udp4)); - this._udp4_source.attach(null); - } catch (e) { - this._udp4 = null; - - // We failed to get either an IPv4 or IPv6 socket to bind - if (this._udp6 === null) - throw e; - } - } - - _onIncomingIdentity(socket) { - let host; - - // Try to peek the remote address - try { - host = socket.receive_message([], Gio.SocketMsgFlags.PEEK, null)[1] - .address.to_string(); - } catch (e) { - logError(e); - } - - // Whether or not we peeked the address, we need to read the packet - try { - let data; - - if (socket === this._udp6) - data = this._udp6_stream.read_line_utf8(null)[0]; - else - data = this._udp4_stream.read_line_utf8(null)[0]; - - // Discard the packet if we failed to peek the address - if (host === undefined) - return GLib.SOURCE_CONTINUE; - - const packet = new Core.Packet(data); - packet.body.tcpHost = host; - this._onIdentity(packet); - } catch (e) { - logError(e); - } - - return GLib.SOURCE_CONTINUE; - } - - async _onIdentity(packet) { - try { - // Bail if the deviceId is missing - if (!packet.body.hasOwnProperty('deviceId')) - return; - - // Silently ignore our own broadcasts - if (packet.body.deviceId === this.identity.body.deviceId) - return; - - debug(packet); - - // Create a new channel - const channel = new Channel({ - backend: this, - certificate: this.certificate, - host: packet.body.tcpHost, - port: packet.body.tcpPort, - identity: packet, - }); - - // Check if channel is already open with this address - if (this.channels.has(channel.address)) - return; - - this._channels.set(channel.address, channel); - - // Open a TCP connection - const address = Gio.InetSocketAddress.new_from_string( - packet.body.tcpHost, packet.body.tcpPort); - - const client = new Gio.SocketClient({enable_proxy: false}); - const connection = await client.connect_async(address, - this.cancellable); - - // Connect the channel and attach it to the device on success - await channel.open(connection); - - this.channel(channel); - } catch (e) { - logError(e); - } - } - - /** - * Broadcast an identity packet - * - * If @address is not %null it may specify an IPv4 or IPv6 address to send - * the identity packet directly to, otherwise it will be broadcast to the - * default address, 255.255.255.255. - * - * @param {string} [address] - An optional target IPv4 or IPv6 address - */ - broadcast(address = null) { - try { - if (!this._networkAvailable) - return; - - // Try to parse strings as : - if (typeof address === 'string') { - const [host, portstr] = address.split(':'); - const port = parseInt(portstr) || this.port; - address = Gio.InetSocketAddress.new_from_string(host, port); - } - - // If we succeed, remember this host - if (address instanceof Gio.InetSocketAddress) { - this._allowed.add(address.address.to_string()); - - // Broadcast to the network if no address is specified - } else { - debug('Broadcasting to LAN'); - address = this._udp_address; - } - - // Broadcast on each open socket - if (this._udp6 !== null) - this._udp6.send_to(address, this.identity.serialize(), null); - - if (this._udp4 !== null) - this._udp4.send_to(address, this.identity.serialize(), null); - } catch (e) { - debug(e, address); - } - } - - buildIdentity() { - // Chain-up, then add the TCP port - super.buildIdentity(); - this.identity.body.tcpPort = this._tcpPort; - } - - start() { - if (this.active) - return; - - // Ensure a certificate exists - if (this.certificate === null) - this._initCertificate(); - - // Start TCP/UDP listeners - try { - if (this._tcp === null) - this._initTcpListener(); - - if (this._udp4 === null && this._udp6 === null) - this._initUdpListener(); - } catch (e) { - // Known case of another application using the protocol defined port - if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.ADDRESS_IN_USE)) { - e.name = _('Port already in use'); - e.url = `${Config.PACKAGE_URL}/wiki/Error#port-already-in-use`; - } - - throw e; - } - - // Monitor network changes - if (this._networkChangedId === 0) { - this._networkAvailable = this._networkMonitor.network_available; - this._networkChangedId = this._networkMonitor.connect( - 'network-changed', this._onNetworkChanged.bind(this)); - } - - this._active = true; - this.notify('active'); - } - - stop() { - if (this._networkChangedId) { - this._networkMonitor.disconnect(this._networkChangedId); - this._networkChangedId = 0; - this._networkAvailable = false; - } - - if (this._tcp !== null) { - this._tcp.stop(); - this._tcp.close(); - this._tcp = null; - } - - if (this._udp6 !== null) { - this._udp6_source.destroy(); - this._udp6_stream.close(null); - this._udp6.close(); - this._udp6 = null; - } - - if (this._udp4 !== null) { - this._udp4_source.destroy(); - this._udp4_stream.close(null); - this._udp4.close(); - this._udp4 = null; - } - - for (const channel of this.channels.values()) - channel.close(); - - this._active = false; - this.notify('active'); - } - - destroy() { - try { - this.stop(); - } catch (e) { - debug(e); - } - } -}); - - -/** - * Lan Channel - * - * This class essentially just extends Core.Channel to set TCP socket options - * and negotiate TLS encrypted connections. - */ -export const Channel = GObject.registerClass({ - GTypeName: 'GSConnectLanChannel', -}, class LanChannel extends Core.Channel { - - _init(params) { - super._init(); - Object.assign(this, params); - } - - get address() { - return `lan://${this.host}:${this.port}`; - } - - get certificate() { - if (this._certificate === undefined) - this._certificate = null; - - return this._certificate; - } - - set certificate(certificate) { - this._certificate = certificate; - } - - get peer_certificate() { - if (this._connection instanceof Gio.TlsConnection) - return this._connection.get_peer_certificate(); - - return null; - } - - get host() { - if (this._host === undefined) - this._host = null; - - return this._host; - } - - set host(host) { - this._host = host; - } - - get port() { - if (this._port === undefined) { - if (this.identity && this.identity.body.tcpPort) - this._port = this.identity.body.tcpPort; - else - return PROTOCOL_PORT_DEFAULT; - } - - return this._port; - } - - set port(port) { - this._port = port; - } - - /** - * Authenticate a TLS connection. - * - * @param {Gio.TlsConnection} connection - A TLS connection - * @return {Promise} A promise for the operation - */ - async _authenticate(connection) { - // Standard TLS Handshake - connection.validation_flags = Gio.TlsCertificateFlags.EXPIRED; - connection.authentication_mode = Gio.TlsAuthenticationMode.REQUIRED; - - await connection.handshake_async(GLib.PRIORITY_DEFAULT, - this.cancellable); - - // Get a settings object for the device - let settings; - - if (this.device) { - settings = this.device.settings; - } else { - const id = this.identity.body.deviceId; - settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect.Device', - true - ), - path: `/org/gnome/shell/extensions/gsconnect/device/${id}/`, - }); - } - - // If we have a certificate for this deviceId, we can verify it - const cert_pem = settings.get_string('certificate-pem'); - - if (cert_pem !== '') { - let certificate = null; - let verified = false; - - try { - certificate = Gio.TlsCertificate.new_from_pem(cert_pem, -1); - verified = certificate.is_same(connection.peer_certificate); - } catch (e) { - logError(e); - } - - /* The certificate is incorrect for one of two reasons, but both - * result in us resetting the certificate and unpairing the device. - * - * If the certificate failed to load, it is probably corrupted or - * otherwise invalid. In this case, if we try to continue we will - * certainly crash the Android app. - * - * If the certificate did not match what we expected the obvious - * thing to do is to notify the user, however experience tells us - * this is a result of the user doing something masochistic like - * nuking the Android app data or copying settings between machines. - */ - if (verified === false) { - if (this.device) { - this.device.unpair(); - } else { - settings.reset('paired'); - settings.reset('certificate-pem'); - } - - const name = this.identity.body.deviceName; - throw new Error(`${name}: Authentication Failure`); - } - } - - return connection; - } - - /** - * Wrap the connection in Gio.TlsClientConnection and initiate handshake - * - * @param {Gio.TcpConnection} connection - The unauthenticated connection - * @return {Gio.TlsClientConnection} The authenticated connection - */ - _encryptClient(connection) { - _configureSocket(connection); - - connection = Gio.TlsClientConnection.new(connection, - connection.socket.remote_address); - connection.set_certificate(this.certificate); - - return this._authenticate(connection); - } - - /** - * Wrap the connection in Gio.TlsServerConnection and initiate handshake - * - * @param {Gio.TcpConnection} connection - The unauthenticated connection - * @return {Gio.TlsServerConnection} The authenticated connection - */ - _encryptServer(connection) { - _configureSocket(connection); - - connection = Gio.TlsServerConnection.new(connection, this.certificate); - - // We're the server so we trust-on-first-use and verify after - const _id = connection.connect('accept-certificate', (connection) => { - connection.disconnect(_id); - return true; - }); - - return this._authenticate(connection); - } - - /** - * Negotiate an incoming connection - * - * @param {Gio.TcpConnection} connection - The incoming connection - */ - async accept(connection) { - debug(`${this.address} (${this.uuid})`); - - try { - this._connection = connection; - this.backend.channels.set(this.address, this); - - // In principle this disposable wrapper could buffer more than the - // identity packet, but in practice the remote device shouldn't send - // any more data until the TLS connection is negotiated. - const stream = new Gio.DataInputStream({ - base_stream: connection.input_stream, - close_base_stream: false, - }); - - const data = await stream.read_line_async(GLib.PRIORITY_DEFAULT, - this.cancellable); - stream.close_async(GLib.PRIORITY_DEFAULT, null, null); - - this.identity = new Core.Packet(data[0]); - - if (!this.identity.body.deviceId) - throw new Error('missing deviceId'); - - this._connection = await this._encryptClient(connection); - } catch (e) { - this.close(); - throw e; - } - } - - /** - * Negotiate an outgoing connection - * - * @param {Gio.SocketConnection} connection - The remote connection - */ - async open(connection) { - debug(`${this.address} (${this.uuid})`); - - try { - this._connection = connection; - this.backend.channels.set(this.address, this); - - await connection.get_output_stream().write_all_async( - this.backend.identity.serialize(), - GLib.PRIORITY_DEFAULT, - this.cancellable); - - this._connection = await this._encryptServer(connection); - } catch (e) { - this.close(); - throw e; - } - } - - /** - * Close all streams associated with this channel, silencing any errors - */ - close() { - if (this.closed) - return; - - debug(`${this.address} (${this.uuid})`); - this._closed = true; - this.notify('closed'); - - this.backend.channels.delete(this.address); - this.cancellable.cancel(); - - if (this._connection) - this._connection.close_async(GLib.PRIORITY_DEFAULT, null, null); - - if (this.input_stream) - this.input_stream.close_async(GLib.PRIORITY_DEFAULT, null, null); - - if (this.output_stream) - this.output_stream.close_async(GLib.PRIORITY_DEFAULT, null, null); - } - - async download(packet, target, cancellable = null) { - const address = Gio.InetSocketAddress.new_from_string(this.host, - packet.payloadTransferInfo.port); - - const client = new Gio.SocketClient({enable_proxy: false}); - const connection = await client.connect_async(address, cancellable) - .then(this._encryptClient.bind(this)); - - // Start the transfer - const transferredSize = await target.splice_async( - connection.input_stream, - (Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | - Gio.OutputStreamSpliceFlags.CLOSE_TARGET), - GLib.PRIORITY_DEFAULT, cancellable); - - // If we get less than expected, we've certainly got corruption - if (transferredSize < packet.payloadSize) { - throw new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.FAILED, - message: `Incomplete: ${transferredSize}/${packet.payloadSize}`, - }); - - // TODO: sometimes kdeconnect-android under-reports a file's size - // https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/1157 - } else if (transferredSize > packet.payloadSize) { - logError(new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.FAILED, - message: `Extra Data: ${transferredSize - packet.payloadSize}`, - })); - } - } - - async upload(packet, source, size, cancellable = null) { - // Start listening on the first available port between 1739-1764 - const listener = new Gio.SocketListener(); - let port = TRANSFER_MIN; - - while (port <= TRANSFER_MAX) { - try { - listener.add_inet_port(port, null); - break; - } catch (e) { - if (port < TRANSFER_MAX) { - port++; - continue; - } else { - throw e; - } - } - } - - // Listen for the incoming connection - const acceptConnection = listener.accept_async(cancellable) - .then(result => this._encryptServer(result[0])); - - // Create an upload request - packet.body.payloadHash = this.checksum; - packet.payloadSize = size; - packet.payloadTransferInfo = {port: port}; - const requestUpload = this.sendPacket(new Core.Packet(packet), - cancellable); - - // Request an upload stream, accept the connection and get the output - const [, connection] = await Promise.all([requestUpload, - acceptConnection]); - - // Start the transfer - const transferredSize = await connection.output_stream.splice_async( - source, - (Gio.OutputStreamSpliceFlags.CLOSE_SOURCE | - Gio.OutputStreamSpliceFlags.CLOSE_TARGET), - GLib.PRIORITY_DEFAULT, cancellable); - - if (transferredSize !== size) { - throw new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.PARTIAL_INPUT, - message: 'Transfer incomplete', - }); - } - } - - async rejectTransfer(packet) { - try { - if (!packet || !packet.hasPayload()) - return; - - if (packet.payloadTransferInfo.port === undefined) - return; - - const address = Gio.InetSocketAddress.new_from_string(this.host, - packet.payloadTransferInfo.port); - - const client = new Gio.SocketClient({enable_proxy: false}); - const connection = await client.connect_async(address, null) - .then(this._encryptClient.bind(this)); - - connection.close_async(GLib.PRIORITY_DEFAULT, null, null); - } catch (e) { - debug(e, this.device.name); - } - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/atspi.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/atspi.js deleted file mode 100644 index 97581d7a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/atspi.js +++ /dev/null @@ -1,312 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Atspi from 'gi://Atspi?version=2.0'; -import Gdk from 'gi://Gdk'; - - -/** - * Printable ASCII range - */ -const _ASCII = /[\x20-\x7E]/; - - -/** - * Modifier Keycode Defaults - */ -const XKeycode = { - Alt_L: 0x40, - Control_L: 0x25, - Shift_L: 0x32, - Super_L: 0x85, -}; - - -/** - * A thin wrapper around Atspi for X11 sessions without Pipewire support. - */ -export default class Controller { - constructor() { - // Atspi.init() return 2 on fail, but still marks itself as inited. We - // uninit before throwing an error otherwise any future call to init() - // will appear successful and other calls will cause GSConnect to exit. - // See: https://gitlab.gnome.org/GNOME/at-spi2-core/blob/master/atspi/atspi-misc.c - if (Atspi.init() === 2) { - this.destroy(); - throw new Error('Failed to start AT-SPI'); - } - - try { - this._display = Gdk.Display.get_default(); - this._seat = this._display.get_default_seat(); - this._pointer = this._seat.get_pointer(); - } catch (e) { - this.destroy(); - throw e; - } - - // Try to read modifier keycodes from Gdk - try { - const keymap = Gdk.Keymap.get_for_display(this._display); - let modifier; - - modifier = keymap.get_entries_for_keyval(Gdk.KEY_Alt_L)[1][0]; - XKeycode.Alt_L = modifier.keycode; - - modifier = keymap.get_entries_for_keyval(Gdk.KEY_Control_L)[1][0]; - XKeycode.Control_L = modifier.keycode; - - modifier = keymap.get_entries_for_keyval(Gdk.KEY_Shift_L)[1][0]; - XKeycode.Shift_L = modifier.keycode; - - modifier = keymap.get_entries_for_keyval(Gdk.KEY_Super_L)[1][0]; - XKeycode.Super_L = modifier.keycode; - } catch (e) { - debug('using default modifier keycodes'); - } - } - - /* - * Pointer events - */ - clickPointer(button) { - try { - const [, x, y] = this._pointer.get_position(); - const monitor = this._display.get_monitor_at_point(x, y); - const scale = monitor.get_scale_factor(); - Atspi.generate_mouse_event(scale * x, scale * y, `b${button}c`); - } catch (e) { - logError(e); - } - } - - doubleclickPointer(button) { - try { - const [, x, y] = this._pointer.get_position(); - const monitor = this._display.get_monitor_at_point(x, y); - const scale = monitor.get_scale_factor(); - Atspi.generate_mouse_event(scale * x, scale * y, `b${button}d`); - } catch (e) { - logError(e); - } - } - - movePointer(dx, dy) { - try { - const [, x, y] = this._pointer.get_position(); - const monitor = this._display.get_monitor_at_point(x, y); - const scale = monitor.get_scale_factor(); - Atspi.generate_mouse_event(scale * dx, scale * dy, 'rel'); - } catch (e) { - logError(e); - } - } - - pressPointer(button) { - try { - const [, x, y] = this._pointer.get_position(); - const monitor = this._display.get_monitor_at_point(x, y); - const scale = monitor.get_scale_factor(); - Atspi.generate_mouse_event(scale * x, scale * y, `b${button}p`); - } catch (e) { - logError(e); - } - } - - releasePointer(button) { - try { - const [, x, y] = this._pointer.get_position(); - const monitor = this._display.get_monitor_at_point(x, y); - const scale = monitor.get_scale_factor(); - Atspi.generate_mouse_event(scale * x, scale * y, `b${button}r`); - } catch (e) { - logError(e); - } - } - - scrollPointer(dx, dy) { - if (dy > 0) - this.clickPointer(4); - else if (dy < 0) - this.clickPointer(5); - } - - /* - * Phony virtual keyboard helpers - */ - _modeLock(keycode) { - Atspi.generate_keyboard_event( - keycode, - null, - Atspi.KeySynthType.PRESS - ); - } - - _modeUnlock(keycode) { - Atspi.generate_keyboard_event( - keycode, - null, - Atspi.KeySynthType.RELEASE - ); - } - - /* - * Simulate a printable-ASCII character. - * - */ - _pressASCII(key, modifiers) { - try { - // Press Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this._modeLock(XKeycode.Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this._modeLock(XKeycode.Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this._modeLock(XKeycode.Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this._modeLock(XKeycode.Super_L); - - Atspi.generate_keyboard_event( - 0, - key, - Atspi.KeySynthType.STRING - ); - - // Release Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this._modeUnlock(XKeycode.Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this._modeUnlock(XKeycode.Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this._modeUnlock(XKeycode.Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this._modeUnlock(XKeycode.Super_L); - } catch (e) { - logError(e); - } - } - - _pressKeysym(keysym, modifiers) { - try { - // Press Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this._modeLock(XKeycode.Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this._modeLock(XKeycode.Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this._modeLock(XKeycode.Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this._modeLock(XKeycode.Super_L); - - Atspi.generate_keyboard_event( - keysym, - null, - Atspi.KeySynthType.PRESSRELEASE | Atspi.KeySynthType.SYM - ); - - // Release Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this._modeUnlock(XKeycode.Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this._modeUnlock(XKeycode.Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this._modeUnlock(XKeycode.Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this._modeUnlock(XKeycode.Super_L); - } catch (e) { - logError(e); - } - } - - /** - * Simulate the composition of a unicode character with: - * Control+Shift+u, [hex], Return - * - * @param {number} key - An XKeycode - * @param {number} modifiers - A modifier mask - */ - _pressUnicode(key, modifiers) { - try { - if (modifiers > 0) - log('GSConnect: ignoring modifiers for unicode keyboard event'); - - // TODO: Using Control and Shift keysym is not working (it triggers - // key release). Probably using LOCKMODIFIERS will not work either - // as unlocking the modifier will not trigger a release - - // Activate compose sequence - this._modeLock(XKeycode.Control_L); - this._modeLock(XKeycode.Shift_L); - - this.pressreleaseKeysym(Gdk.KEY_U); - - this._modeUnlock(XKeycode.Control_L); - this._modeUnlock(XKeycode.Shift_L); - - // Enter the unicode sequence - const ucode = key.charCodeAt(0).toString(16); - let keysym; - - for (let h = 0, len = ucode.length; h < len; h++) { - keysym = Gdk.unicode_to_keyval(ucode.charAt(h).codePointAt(0)); - this.pressreleaseKeysym(keysym); - } - - // Finish the compose sequence - this.pressreleaseKeysym(Gdk.KEY_Return); - } catch (e) { - logError(e); - } - } - - /* - * Keyboard Events - */ - pressKeysym(keysym) { - Atspi.generate_keyboard_event( - keysym, - null, - Atspi.KeySynthType.PRESS | Atspi.KeySynthType.SYM - ); - } - - releaseKeysym(keysym) { - Atspi.generate_keyboard_event( - keysym, - null, - Atspi.KeySynthType.RELEASE | Atspi.KeySynthType.SYM - ); - } - - pressreleaseKeysym(keysym) { - Atspi.generate_keyboard_event( - keysym, - null, - Atspi.KeySynthType.PRESSRELEASE | Atspi.KeySynthType.SYM - ); - } - - pressKey(input, modifiers) { - // We were passed a keysym - if (typeof input === 'number') - this._pressKeysym(input, modifiers); - - // Regular ASCII - else if (_ASCII.test(input)) - this._pressASCII(input, modifiers); - - // Unicode - else - this._pressUnicode(input, modifiers); - } - - destroy() { - try { - Atspi.exit(); - } catch (e) { - // Silence errors - } - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/clipboard.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/clipboard.js deleted file mode 100644 index 2d6170c4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/clipboard.js +++ /dev/null @@ -1,225 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import GLib from 'gi://GLib'; -import Gtk from 'gi://Gtk'; -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; - - -const DBUS_NAME = 'org.gnome.Shell.Extensions.GSConnect.Clipboard'; -const DBUS_PATH = '/org/gnome/Shell/Extensions/GSConnect/Clipboard'; - - -/** - * The service class for this component - */ -const Clipboard = GObject.registerClass({ - GTypeName: 'GSConnectClipboard', - Properties: { - 'text': GObject.ParamSpec.string( - 'text', - 'Text Content', - 'The current text content of the clipboard', - GObject.ParamFlags.READWRITE, - '' - ), - }, -}, class Clipboard extends GObject.Object { - - _init() { - super._init(); - - this._cancellable = new Gio.Cancellable(); - this._clipboard = null; - - this._ownerChangeId = 0; - this._nameWatcherId = Gio.bus_watch_name( - Gio.BusType.SESSION, - DBUS_NAME, - Gio.BusNameWatcherFlags.NONE, - this._onNameAppeared.bind(this), - this._onNameVanished.bind(this) - ); - } - - get text() { - if (this._text === undefined) - this._text = ''; - - return this._text; - } - - set text(content) { - if (this.text === content) - return; - - this._text = content; - this.notify('text'); - - if (typeof content !== 'string') - return; - - if (this._clipboard instanceof Gtk.Clipboard) - this._clipboard.set_text(content, -1); - - if (this._clipboard instanceof Gio.DBusProxy) { - this._clipboard.call('SetText', new GLib.Variant('(s)', [content]), - Gio.DBusCallFlags.NO_AUTO_START, -1, this._cancellable) - .catch(debug); - } - } - - async _onNameAppeared(connection, name, name_owner) { - try { - // Cleanup the GtkClipboard - if (this._clipboard && this._ownerChangeId > 0) { - this._clipboard.disconnect(this._ownerChangeId); - this._ownerChangeId = 0; - } - - // Create a proxy for the remote clipboard - this._clipboard = new Gio.DBusProxy({ - g_bus_type: Gio.BusType.SESSION, - g_name: DBUS_NAME, - g_object_path: DBUS_PATH, - g_interface_name: DBUS_NAME, - g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES, - }); - - await this._clipboard.init_async(GLib.PRIORITY_DEFAULT, - this._cancellable); - - this._ownerChangeId = this._clipboard.connect('g-signal', - this._onOwnerChange.bind(this)); - - this._onOwnerChange(); - if (!globalThis.HAVE_GNOME) { - // Directly subscrible signal - this.signalHandler = Gio.DBus.session.signal_subscribe( - DBUS_NAME, - DBUS_NAME, - 'OwnerChange', - DBUS_PATH, - null, - Gio.DBusSignalFlags.NONE, - this._onOwnerChange.bind(this) - ); - } - - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { - debug(e); - this._onNameVanished(null, null); - } - } - } - - _onNameVanished(connection, name) { - if (this._clipboard && this._ownerChangeId > 0) { - this._clipboard.disconnect(this._ownerChangeId); - this._clipboardChangedId = 0; - } - - const display = Gdk.Display.get_default(); - this._clipboard = Gtk.Clipboard.get_default(display); - - this._ownerChangeId = this._clipboard.connect('owner-change', - this._onOwnerChange.bind(this)); - - this._onOwnerChange(); - } - - async _onOwnerChange() { - try { - if (this._clipboard instanceof Gtk.Clipboard) - await this._gtkUpdateText(); - - else if (this._clipboard instanceof Gio.DBusProxy) - await this._proxyUpdateText(); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - debug(e); - } - } - - _applyUpdate(text) { - if (typeof text !== 'string' || this.text === text) - return; - - this._text = text; - this.notify('text'); - } - - /* - * Proxy Clipboard - */ - async _proxyUpdateText() { - let reply = await this._clipboard.call('GetMimetypes', null, - Gio.DBusCallFlags.NO_AUTO_START, -1, this._cancellable); - const mimetypes = reply.deepUnpack()[0]; - - // Special case for a cleared clipboard - if (mimetypes.length === 0) - return this._applyUpdate(''); - - // Special case to ignore copied files - if (mimetypes.includes('text/uri-list')) - return; - - reply = await this._clipboard.call('GetText', null, - Gio.DBusCallFlags.NO_AUTO_START, -1, this._cancellable); - const text = reply.deepUnpack()[0]; - - this._applyUpdate(text); - } - - /* - * GtkClipboard - */ - async _gtkUpdateText() { - const mimetypes = await new Promise((resolve, reject) => { - this._clipboard.request_targets((clipboard, atoms) => resolve(atoms)); - }); - - // Special case for a cleared clipboard - if (mimetypes.length === 0) - return this._applyUpdate(''); - - // Special case to ignore copied files - if (mimetypes.includes('text/uri-list')) - return; - - const text = await new Promise((resolve, reject) => { - this._clipboard.request_text((clipboard, text) => resolve(text)); - }); - - this._applyUpdate(text); - } - - destroy() { - if (this._cancellable.is_cancelled()) - return; - - this._cancellable.cancel(); - - if (this._clipboard && this._ownerChangeId > 0) { - this._clipboard.disconnect(this._ownerChangeId); - this._ownerChangedId = 0; - } - - if (this._nameWatcherId > 0) { - Gio.bus_unwatch_name(this._nameWatcherId); - this._nameWatcherId = 0; - } - - if (!globalThis.HAVE_GNOME && this.signalHandler) - Gio.DBus.session.signal_unsubscribe(this.signalHandler); - } -}); - -export default Clipboard; - -// vim:tabstop=2:shiftwidth=2:expandtab diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js deleted file mode 100644 index 3070f408..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js +++ /dev/null @@ -1,613 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../../config.js'; - -let HAVE_EDS = true; -let EBook = null; -let EBookContacts = null; -let EDataServer = null; - -try { - EBook = (await import('gi://EBook')).default; - EBookContacts = (await import('gi://EBookContacts')).default; - EDataServer = (await import('gi://EDataServer')).default; -} catch (e) { - HAVE_EDS = false; -} - - -/** - * A store for contacts - */ -const Store = GObject.registerClass({ - GTypeName: 'GSConnectContactsStore', - Properties: { - 'context': GObject.ParamSpec.string( - 'context', - 'Context', - 'Used as the cache directory, relative to Config.CACHEDIR', - GObject.ParamFlags.CONSTRUCT_ONLY | GObject.ParamFlags.READWRITE, - null - ), - }, - Signals: { - 'contact-added': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [GObject.TYPE_STRING], - }, - 'contact-removed': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [GObject.TYPE_STRING], - }, - 'contact-changed': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [GObject.TYPE_STRING], - }, - }, -}, class Store extends GObject.Object { - - _init(context = null) { - super._init({ - context: context, - }); - - this._cacheData = {}; - this._edsPrepared = false; - } - - /** - * Parse an EContact and add it to the store. - * - * @param {EBookContacts.Contact} econtact - an EContact to parse - * @param {string} [origin] - an optional origin string - */ - async _parseEContact(econtact, origin = 'desktop') { - try { - const contact = { - id: econtact.id, - name: _('Unknown Contact'), - numbers: [], - origin: origin, - timestamp: 0, - }; - - // Try to get a contact name - if (econtact.full_name) - contact.name = econtact.full_name; - - // Parse phone numbers - const nums = econtact.get_attributes(EBookContacts.ContactField.TEL); - - for (const attr of nums) { - const number = { - value: attr.get_value(), - type: 'unknown', - }; - - if (attr.has_type('CELL')) - number.type = 'cell'; - else if (attr.has_type('HOME')) - number.type = 'home'; - else if (attr.has_type('WORK')) - number.type = 'work'; - - contact.numbers.push(number); - } - - // Try and get a contact photo - const photo = econtact.photo; - - if (photo) { - if (photo.type === EBookContacts.ContactPhotoType.INLINED) { - const data = photo.get_inlined()[0]; - contact.avatar = await this.storeAvatar(data); - - } else if (photo.type === EBookContacts.ContactPhotoType.URI) { - const uri = econtact.photo.get_uri(); - contact.avatar = uri.replace('file://', ''); - } - } - - this.add(contact, false); - } catch (e) { - logError(e, `Failed to parse VCard contact ${econtact.id}`); - } - } - - /* - * AddressBook DBus callbacks - */ - _onObjectsAdded(connection, sender, path, iface, signal, params) { - try { - const adds = params.get_child_value(0).get_strv(); - - // NOTE: sequential pairs of vcard, id - for (let i = 0, len = adds.length; i < len; i += 2) { - try { - const vcard = adds[i]; - const econtact = EBookContacts.Contact.new_from_vcard(vcard); - this._parseEContact(econtact); - } catch (e) { - debug(e); - } - } - } catch (e) { - debug(e); - } - } - - _onObjectsRemoved(connection, sender, path, iface, signal, params) { - try { - const changes = params.get_child_value(0).get_strv(); - - for (const id of changes) { - try { - this.remove(id, false); - } catch (e) { - debug(e); - } - } - } catch (e) { - debug(e); - } - } - - _onObjectsModified(connection, sender, path, iface, signal, params) { - try { - const changes = params.get_child_value(0).get_strv(); - - // NOTE: sequential pairs of vcard, id - for (let i = 0, len = changes.length; i < len; i += 2) { - try { - const vcard = changes[i]; - const econtact = EBookContacts.Contact.new_from_vcard(vcard); - this._parseEContact(econtact); - } catch (e) { - debug(e); - } - } - } catch (e) { - debug(e); - } - } - - /* - * SourceRegistryWatcher callbacks - */ - async _onAppeared(watcher, source) { - try { - // Get an EBookClient and EBookView - const uid = source.get_uid(); - const client = await EBook.BookClient.connect(source, null); - const [view] = await client.get_view('exists "tel"', null); - - // Watch the view for changes to the address book - const connection = view.get_connection(); - const objectPath = view.get_object_path(); - - view._objectsAddedId = connection.signal_subscribe( - null, - 'org.gnome.evolution.dataserver.AddressBookView', - 'ObjectsAdded', - objectPath, - null, - Gio.DBusSignalFlags.NONE, - this._onObjectsAdded.bind(this) - ); - - view._objectsRemovedId = connection.signal_subscribe( - null, - 'org.gnome.evolution.dataserver.AddressBookView', - 'ObjectsRemoved', - objectPath, - null, - Gio.DBusSignalFlags.NONE, - this._onObjectsRemoved.bind(this) - ); - - view._objectsModifiedId = connection.signal_subscribe( - null, - 'org.gnome.evolution.dataserver.AddressBookView', - 'ObjectsModified', - objectPath, - null, - Gio.DBusSignalFlags.NONE, - this._onObjectsModified.bind(this) - ); - - view.start(); - - // Store the EBook in a map - this._ebooks.set(uid, { - source: source, - client: client, - view: view, - }); - } catch (e) { - debug(e); - } - } - - _onDisappeared(watcher, source) { - try { - const uid = source.get_uid(); - const ebook = this._ebooks.get(uid); - - if (ebook === undefined) - return; - - // Disconnect the EBookView - if (ebook.view) { - const connection = ebook.view.get_connection(); - connection.signal_unsubscribe(ebook.view._objectsAddedId); - connection.signal_unsubscribe(ebook.view._objectsRemovedId); - connection.signal_unsubscribe(ebook.view._objectsModifiedId); - - ebook.view.stop(); - } - - this._ebooks.delete(uid); - } catch (e) { - debug(e); - } - } - - async _initEvolutionDataServer() { - try { - if (this._edsPrepared) - return; - - this._edsPrepared = true; - this._ebooks = new Map(); - - // Get the current EBooks - const registry = await this._getESourceRegistry(); - - for (const source of registry.list_sources('Address Book')) - await this._onAppeared(null, source); - - // Watch for new and removed sources - this._watcher = new EDataServer.SourceRegistryWatcher({ - registry: registry, - extension_name: 'Address Book', - }); - - this._appearedId = this._watcher.connect( - 'appeared', - this._onAppeared.bind(this) - ); - this._disappearedId = this._watcher.connect( - 'disappeared', - this._onDisappeared.bind(this) - ); - } catch (e) { - const service = Gio.Application.get_default(); - - if (service !== null) - service.notify_error(e); - else - logError(e); - } - } - - *[Symbol.iterator]() { - const contacts = Object.values(this._cacheData); - - for (let i = 0, len = contacts.length; i < len; i++) - yield contacts[i]; - } - - get contacts() { - return Object.values(this._cacheData); - } - - get context() { - if (this._context === undefined) - this._context = null; - - return this._context; - } - - set context(context) { - this._context = context; - this._cacheDir = Gio.File.new_for_path(Config.CACHEDIR); - - if (context !== null) - this._cacheDir = this._cacheDir.get_child(context); - - GLib.mkdir_with_parents(this._cacheDir.get_path(), 448); - this._cacheFile = this._cacheDir.get_child('contacts.json'); - } - - /** - * Save a Uint8Array to file and return the path - * - * @param {Uint8Array} contents - An image byte array - * @return {string|undefined} File path or %undefined on failure - */ - async storeAvatar(contents) { - const md5 = GLib.compute_checksum_for_data(GLib.ChecksumType.MD5, - contents); - const file = this._cacheDir.get_child(`${md5}`); - - if (!file.query_exists(null)) { - try { - await file.replace_contents_bytes_async( - new GLib.Bytes(contents), - null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); - } catch (e) { - debug(e, 'Storing avatar'); - return undefined; - } - } - - return file.get_path(); - } - - /** - * Query the Store for a contact by name and/or number. - * - * @param {Object} query - A query object - * @param {string} [query.name] - The contact's name - * @param {string} query.number - The contact's number - * @return {Object} A contact object - */ - query(query) { - // First look for an existing contact by number - const contacts = this.contacts; - const matches = []; - const qnumber = query.number.toPhoneNumber(); - - for (let i = 0, len = contacts.length; i < len; i++) { - const contact = contacts[i]; - - for (const num of contact.numbers) { - const cnumber = num.value.toPhoneNumber(); - - if (qnumber.endsWith(cnumber) || cnumber.endsWith(qnumber)) { - // If no query name or exact match, return immediately - if (!query.name || query.name === contact.name) - return contact; - - // Otherwise we might find an exact name match that shares - // the number with another contact - matches.push(contact); - } - } - } - - // Return the first match (pretty much what Android does) - if (matches.length > 0) - return matches[0]; - - // No match; return a mock contact with a unique ID - let id = GLib.uuid_string_random(); - - while (this._cacheData.hasOwnProperty(id)) - id = GLib.uuid_string_random(); - - return { - id: id, - name: query.name || query.number, - numbers: [{value: query.number, type: 'unknown'}], - origin: 'gsconnect', - }; - } - - get_contact(position) { - if (this._cacheData[position] !== undefined) - return this._cacheData[position]; - - return null; - } - - /** - * Add a contact, checking for validity - * - * @param {Object} contact - A contact object - * @param {boolean} write - Write to disk - */ - add(contact, write = true) { - // Ensure the contact has a unique id - if (!contact.id) { - let id = GLib.uuid_string_random(); - - while (this._cacheData[id]) - id = GLib.uuid_string_random(); - - contact.id = id; - } - - // Ensure the contact has an origin - if (!contact.origin) - contact.origin = 'gsconnect'; - - // This is an updated contact - if (this._cacheData[contact.id]) { - this._cacheData[contact.id] = contact; - this.emit('contact-changed', contact.id); - - // This is a new contact - } else { - this._cacheData[contact.id] = contact; - this.emit('contact-added', contact.id); - } - - // Write if requested - if (write) - this.save(); - } - - /** - * Remove a contact by id - * - * @param {string} id - The id of the contact to delete - * @param {boolean} write - Write to disk - */ - remove(id, write = true) { - // Only remove if the contact actually exists - if (this._cacheData[id]) { - delete this._cacheData[id]; - this.emit('contact-removed', id); - - // Write if requested - if (write) - this.save(); - } - } - - /** - * Lookup a contact for each address object in @addresses and return a - * dictionary of address (eg. phone number) to contact object. - * - * { "555-5555": { "name": "...", "numbers": [], ... } } - * - * @param {Object[]} addresses - A list of address objects - * @return {Object} A dictionary of phone numbers and contacts - */ - lookupAddresses(addresses) { - const contacts = {}; - - // Lookup contacts for each address - for (let i = 0, len = addresses.length; i < len; i++) { - const address = addresses[i].address; - - contacts[address] = this.query({ - number: address, - }); - } - - return contacts; - } - - async clear() { - try { - const contacts = this.contacts; - - for (let i = 0, len = contacts.length; i < len; i++) - await this.remove(contacts[i].id, false); - - await this.save(); - } catch (e) { - debug(e); - } - } - - /** - * Update the contact store from a dictionary of our custom contact objects. - * - * @param {Object} json - an Object of contact Objects - */ - async update(json = {}) { - try { - let contacts = Object.values(json); - - for (let i = 0, len = contacts.length; i < len; i++) { - const new_contact = contacts[i]; - const contact = this._cacheData[new_contact.id]; - - if (!contact || new_contact.timestamp !== contact.timestamp) - await this.add(new_contact, false); - } - - // Prune contacts - contacts = this.contacts; - - for (let i = 0, len = contacts.length; i < len; i++) { - const contact = contacts[i]; - - if (!json[contact.id]) - await this.remove(contact.id, false); - } - - await this.save(); - } catch (e) { - debug(e, 'Updating contacts'); - } - } - - /** - * Fetch and update the contact store from its source. - * - * The default function initializes the EDS server, or logs a debug message - * if EDS is unavailable. Derived classes should request an update from the - * remote source. - */ - async fetch() { - try { - if (this.context === null && HAVE_EDS) - await this._initEvolutionDataServer(); - else - throw new Error('Evolution Data Server not available'); - } catch (e) { - debug(e); - } - } - - /** - * Load the contacts from disk. - */ - async load() { - try { - const [contents] = await this._cacheFile.load_contents_async(null); - this._cacheData = JSON.parse(new TextDecoder().decode(contents)); - } catch (e) { - debug(e); - } finally { - this.notify('context'); - } - } - - /** - * Save the contacts to disk. - */ - async save() { - // EDS is handling storage - if (this.context === null && HAVE_EDS) - return; - - if (this.__cache_lock) { - this.__cache_queue = true; - return; - } - - try { - this.__cache_lock = true; - - const contents = new GLib.Bytes(JSON.stringify(this._cacheData, null, 2)); - await this._cacheFile.replace_contents_bytes_async(contents, null, - false, Gio.FileCreateFlags.REPLACE_DESTINATION, null); - } catch (e) { - debug(e); - } finally { - this.__cache_lock = false; - - if (this.__cache_queue) { - this.__cache_queue = false; - this.save(); - } - } - } - - destroy() { - if (this._watcher !== undefined) { - this._watcher.disconnect(this._appearedId); - this._watcher.disconnect(this._disappearedId); - this._watcher = undefined; - - for (const ebook of this._ebooks.values()) - this._onDisappeared(null, ebook.source); - - this._edsPrepared = false; - } - } -}); - -export default Store; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js deleted file mode 100644 index 249c7ee8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/index.js +++ /dev/null @@ -1,102 +0,0 @@ -// 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/input.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/input.js deleted file mode 100644 index 49fd65f9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/input.js +++ /dev/null @@ -1,514 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import AtspiController from './atspi.js'; - - -const SESSION_TIMEOUT = 15; - - -const RemoteSession = GObject.registerClass({ - GTypeName: 'GSConnectRemoteSession', - Implements: [Gio.DBusInterface], - Signals: { - 'closed': { - flags: GObject.SignalFlags.RUN_FIRST, - }, - }, -}, class RemoteSession extends Gio.DBusProxy { - - _init(objectPath) { - super._init({ - g_bus_type: Gio.BusType.SESSION, - g_name: 'org.gnome.Mutter.RemoteDesktop', - g_object_path: objectPath, - g_interface_name: 'org.gnome.Mutter.RemoteDesktop.Session', - g_flags: Gio.DBusProxyFlags.NONE, - }); - - this._started = false; - } - - vfunc_g_signal(sender_name, signal_name, parameters) { - if (signal_name === 'Closed') - this.emit('closed'); - } - - _call(name, parameters = null) { - if (!this._started) - return; - - // Pass a null callback to allow this call to finish itself - this.call(name, parameters, Gio.DBusCallFlags.NONE, -1, null, null); - } - - get session_id() { - try { - return this.get_cached_property('SessionId').unpack(); - } catch (e) { - return null; - } - } - - async start() { - try { - if (this._started) - return; - - // Initialize the proxy, and start the session - await this.init_async(GLib.PRIORITY_DEFAULT, null); - await this.call('Start', null, Gio.DBusCallFlags.NONE, -1, null); - - this._started = true; - } catch (e) { - this.destroy(); - - Gio.DBusError.strip_remote_error(e); - throw e; - } - } - - stop() { - if (this._started) { - this._started = false; - - // Pass a null callback to allow this call to finish itself - this.call('Stop', null, Gio.DBusCallFlags.NONE, -1, null, null); - } - } - - _translateButton(button) { - switch (button) { - case Gdk.BUTTON_PRIMARY: - return 0x110; - - case Gdk.BUTTON_MIDDLE: - return 0x112; - - case Gdk.BUTTON_SECONDARY: - return 0x111; - - case 4: - return 0; // FIXME - - case 5: - return 0x10F; // up - } - } - - movePointer(dx, dy) { - this._call( - 'NotifyPointerMotionRelative', - GLib.Variant.new('(dd)', [dx, dy]) - ); - } - - pressPointer(button) { - button = this._translateButton(button); - - this._call( - 'NotifyPointerButton', - GLib.Variant.new('(ib)', [button, true]) - ); - } - - releasePointer(button) { - button = this._translateButton(button); - - this._call( - 'NotifyPointerButton', - GLib.Variant.new('(ib)', [button, false]) - ); - } - - clickPointer(button) { - button = this._translateButton(button); - - this._call( - 'NotifyPointerButton', - GLib.Variant.new('(ib)', [button, true]) - ); - - this._call( - 'NotifyPointerButton', - GLib.Variant.new('(ib)', [button, false]) - ); - } - - doubleclickPointer(button) { - this.clickPointer(button); - this.clickPointer(button); - } - - scrollPointer(dx, dy) { - if (dy > 0) { - this._call( - 'NotifyPointerAxisDiscrete', - GLib.Variant.new('(ui)', [Gdk.ScrollDirection.UP, 1]) - ); - } else if (dy < 0) { - this._call( - 'NotifyPointerAxisDiscrete', - GLib.Variant.new('(ui)', [Gdk.ScrollDirection.UP, -1]) - ); - } - } - - /* - * Keyboard Events - */ - pressKeysym(keysym) { - this._call( - 'NotifyKeyboardKeysym', - GLib.Variant.new('(ub)', [keysym, true]) - ); - } - - releaseKeysym(keysym) { - this._call( - 'NotifyKeyboardKeysym', - GLib.Variant.new('(ub)', [keysym, false]) - ); - } - - pressreleaseKeysym(keysym) { - this._call( - 'NotifyKeyboardKeysym', - GLib.Variant.new('(ub)', [keysym, true]) - ); - this._call( - 'NotifyKeyboardKeysym', - GLib.Variant.new('(ub)', [keysym, false]) - ); - } - - /* - * High-level keyboard input - */ - pressKey(input, modifiers) { - // Press Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this.pressKeysym(Gdk.KEY_Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this.pressKeysym(Gdk.KEY_Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this.pressKeysym(Gdk.KEY_Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this.pressKeysym(Gdk.KEY_Super_L); - - if (typeof input === 'string') { - const keysym = Gdk.unicode_to_keyval(input.codePointAt(0)); - this.pressreleaseKeysym(keysym); - } else { - this.pressreleaseKeysym(input); - } - - // Release Modifiers - if (modifiers & Gdk.ModifierType.MOD1_MASK) - this.releaseKeysym(Gdk.KEY_Alt_L); - if (modifiers & Gdk.ModifierType.CONTROL_MASK) - this.releaseKeysym(Gdk.KEY_Control_L); - if (modifiers & Gdk.ModifierType.SHIFT_MASK) - this.releaseKeysym(Gdk.KEY_Shift_L); - if (modifiers & Gdk.ModifierType.SUPER_MASK) - this.releaseKeysym(Gdk.KEY_Super_L); - } - - destroy() { - if (this.__disposed === undefined) { - this.__disposed = true; - GObject.signal_handlers_destroy(this); - } - } -}); - - -export default class Controller { - constructor() { - this._nameAppearedId = 0; - this._session = null; - this._sessionCloseId = 0; - this._sessionExpiry = 0; - this._sessionExpiryId = 0; - this._sessionStarting = false; - - // Watch for the RemoteDesktop portal - this._nameWatcherId = Gio.bus_watch_name( - Gio.BusType.SESSION, - 'org.gnome.Mutter.RemoteDesktop', - Gio.BusNameWatcherFlags.NONE, - this._onNameAppeared.bind(this), - this._onNameVanished.bind(this) - ); - } - - get connection() { - if (this._connection === undefined) - this._connection = null; - - return this._connection; - } - - _onNameAppeared(connection, name, name_owner) { - try { - this._connection = connection; - } catch (e) { - logError(e); - } - } - - _onNameVanished(connection, name) { - try { - if (this._session !== null) - this._onSessionClosed(this._session); - } catch (e) { - logError(e); - } - } - - _onSessionClosed(session) { - // Disconnect from the session - if (this._sessionClosedId > 0) { - session.disconnect(this._sessionClosedId); - this._sessionClosedId = 0; - } - - // Destroy the session - session.destroy(); - this._session = null; - } - - _onSessionExpired() { - // If the session has been used recently, schedule a new expiry - const remainder = Math.floor(this._sessionExpiry - (Date.now() / 1000)); - - if (remainder > 0) { - this._sessionExpiryId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - remainder, - this._onSessionExpired.bind(this) - ); - - return GLib.SOURCE_REMOVE; - } - - // Otherwise if there's an active session, close it - if (this._session !== null) - this._session.stop(); - - // Reset the GSource Id - this._sessionExpiryId = 0; - - return GLib.SOURCE_REMOVE; - } - - async _createRemoteDesktopSession() { - if (this.connection === null) - return Promise.reject(new Error('No DBus connection')); - - const reply = await this.connection.call( - 'org.gnome.Mutter.RemoteDesktop', - '/org/gnome/Mutter/RemoteDesktop', - 'org.gnome.Mutter.RemoteDesktop', - 'CreateSession', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - null); - - return reply.deepUnpack()[0]; - } - - async _ensureAdapter() { - try { - // Update the timestamp of the last event - this._sessionExpiry = Math.floor((Date.now() / 1000) + SESSION_TIMEOUT); - - // Session is active - if (this._session !== null) - return; - - // Mutter's RemoteDesktop is not available, fall back to Atspi - if (this.connection === null) { - debug('Falling back to Atspi'); - - this._session = new AtspiController(); - - // Mutter is available and there isn't another session starting - } else if (this._sessionStarting === false) { - this._sessionStarting = true; - - debug('Creating Mutter RemoteDesktop session'); - - // This takes three steps: creating the remote desktop session, - // starting the session, and creating a screencast session for - // the remote desktop session. - const objectPath = await this._createRemoteDesktopSession(); - - this._session = new RemoteSession(objectPath); - await this._session.start(); - - // Watch for the session ending - this._sessionClosedId = this._session.connect( - 'closed', - this._onSessionClosed.bind(this) - ); - - if (this._sessionExpiryId === 0) { - this._sessionExpiryId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - SESSION_TIMEOUT, - this._onSessionExpired.bind(this) - ); - } - - this._sessionStarting = false; - } - } catch (e) { - logError(e); - - if (this._session !== null) { - this._session.destroy(); - this._session = null; - } - - this._sessionStarting = false; - } - } - - /* - * Pointer Events - */ - movePointer(dx, dy) { - try { - if (dx === 0 && dy === 0) - return; - - this._ensureAdapter(); - this._session.movePointer(dx, dy); - } catch (e) { - debug(e); - } - } - - pressPointer(button) { - try { - this._ensureAdapter(); - this._session.pressPointer(button); - } catch (e) { - debug(e); - } - } - - releasePointer(button) { - try { - this._ensureAdapter(); - this._session.releasePointer(button); - } catch (e) { - debug(e); - } - } - - clickPointer(button) { - try { - this._ensureAdapter(); - this._session.clickPointer(button); - } catch (e) { - debug(e); - } - } - - doubleclickPointer(button) { - try { - this._ensureAdapter(); - this._session.doubleclickPointer(button); - } catch (e) { - debug(e); - } - } - - scrollPointer(dx, dy) { - if (dx === 0 && dy === 0) - return; - - try { - this._ensureAdapter(); - this._session.scrollPointer(dx, dy); - } catch (e) { - debug(e); - } - } - - /* - * Keyboard Events - */ - pressKeysym(keysym) { - try { - this._ensureAdapter(); - this._session.pressKeysym(keysym); - } catch (e) { - debug(e); - } - } - - releaseKeysym(keysym) { - try { - this._ensureAdapter(); - this._session.releaseKeysym(keysym); - } catch (e) { - debug(e); - } - } - - pressreleaseKeysym(keysym) { - try { - this._ensureAdapter(); - this._session.pressreleaseKeysym(keysym); - } catch (e) { - debug(e); - } - } - - /* - * High-level keyboard input - */ - pressKeys(input, modifiers) { - try { - this._ensureAdapter(); - - if (typeof input === 'string') { - for (let i = 0; i < input.length; i++) - this._session.pressKey(input[i], modifiers); - } else { - this._session.pressKey(input, modifiers); - } - } catch (e) { - debug(e); - } - } - - destroy() { - if (this._session !== null) { - // Disconnect from the session - if (this._sessionClosedId > 0) { - this._session.disconnect(this._sessionClosedId); - this._sessionClosedId = 0; - } - - this._session.destroy(); - this._session = null; - } - - if (this._nameWatcherId > 0) { - Gio.bus_unwatch_name(this._nameWatcherId); - this._nameWatcherId = 0; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/mpris.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/mpris.js deleted file mode 100644 index 70c42255..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/mpris.js +++ /dev/null @@ -1,1003 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - - -export const Player = GObject.registerClass({ - GTypeName: 'GSConnectMediaPlayerInterface', - Properties: { - // Application Properties - 'CanQuit': GObject.ParamSpec.boolean( - 'CanQuit', - 'Can Quit', - 'Whether the client can call the Quit method.', - GObject.ParamFlags.READABLE, - false - ), - 'Fullscreen': GObject.ParamSpec.boolean( - 'Fullscreen', - 'Fullscreen', - 'Whether the player is in fullscreen mode.', - GObject.ParamFlags.READWRITE, - false - ), - 'CanSetFullscreen': GObject.ParamSpec.boolean( - 'CanSetFullscreen', - 'Can Set Fullscreen', - 'Whether the client can set the Fullscreen property.', - GObject.ParamFlags.READABLE, - false - ), - 'CanRaise': GObject.ParamSpec.boolean( - 'CanRaise', - 'Can Raise', - 'Whether the client can call the Raise method.', - GObject.ParamFlags.READABLE, - false - ), - 'HasTrackList': GObject.ParamSpec.boolean( - 'HasTrackList', - 'Has Track List', - 'Whether the player has a track list.', - GObject.ParamFlags.READABLE, - false - ), - 'Identity': GObject.ParamSpec.string( - 'Identity', - 'Identity', - 'The application name.', - GObject.ParamFlags.READABLE, - null - ), - 'DesktopEntry': GObject.ParamSpec.string( - 'DesktopEntry', - 'DesktopEntry', - 'The basename of an installed .desktop file.', - GObject.ParamFlags.READABLE, - null - ), - 'SupportedUriSchemes': GObject.param_spec_variant( - 'SupportedUriSchemes', - 'Supported URI Schemes', - 'The URI schemes supported by the media player.', - new GLib.VariantType('as'), - null, - GObject.ParamFlags.READABLE - ), - 'SupportedMimeTypes': GObject.param_spec_variant( - 'SupportedMimeTypes', - 'Supported MIME Types', - 'The mime-types supported by the media player.', - new GLib.VariantType('as'), - null, - GObject.ParamFlags.READABLE - ), - - // Player Properties - 'PlaybackStatus': GObject.ParamSpec.string( - 'PlaybackStatus', - 'Playback Status', - 'The current playback status.', - GObject.ParamFlags.READABLE, - null - ), - 'LoopStatus': GObject.ParamSpec.string( - 'LoopStatus', - 'Loop Status', - 'The current loop status.', - GObject.ParamFlags.READWRITE, - null - ), - 'Rate': GObject.ParamSpec.double( - 'Rate', - 'Rate', - 'The current playback rate.', - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 1.0 - ), - 'MinimumRate': GObject.ParamSpec.double( - 'MinimumRate', - 'Minimum Rate', - 'The minimum playback rate.', - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 1.0 - ), - 'MaximimRate': GObject.ParamSpec.double( - 'MaximumRate', - 'Maximum Rate', - 'The maximum playback rate.', - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 1.0 - ), - 'Shuffle': GObject.ParamSpec.boolean( - 'Shuffle', - 'Shuffle', - 'Whether track changes are linear.', - GObject.ParamFlags.READWRITE, - null - ), - 'Metadata': GObject.param_spec_variant( - 'Metadata', - 'Metadata', - 'The metadata of the current element.', - new GLib.VariantType('a{sv}'), - null, - GObject.ParamFlags.READABLE - ), - 'Volume': GObject.ParamSpec.double( - 'Volume', - 'Volume', - 'The volume level.', - GObject.ParamFlags.READWRITE, - 0.0, 1.0, - 1.0 - ), - 'Position': GObject.ParamSpec.int64( - 'Position', - 'Position', - 'The current track position in microseconds.', - GObject.ParamFlags.READABLE, - 0, Number.MAX_SAFE_INTEGER, - 0 - ), - 'CanGoNext': GObject.ParamSpec.boolean( - 'CanGoNext', - 'Can Go Next', - 'Whether the client can call the Next method.', - GObject.ParamFlags.READABLE, - false - ), - 'CanGoPrevious': GObject.ParamSpec.boolean( - 'CanGoPrevious', - 'Can Go Previous', - 'Whether the client can call the Previous method.', - GObject.ParamFlags.READABLE, - false - ), - 'CanPlay': GObject.ParamSpec.boolean( - 'CanPlay', - 'Can Play', - 'Whether playback can be started using Play or PlayPause.', - GObject.ParamFlags.READABLE, - false - ), - 'CanPause': GObject.ParamSpec.boolean( - 'CanPause', - 'Can Pause', - 'Whether playback can be paused using Play or PlayPause.', - GObject.ParamFlags.READABLE, - false - ), - 'CanSeek': GObject.ParamSpec.boolean( - 'CanSeek', - 'Can Seek', - 'Whether the client can control the playback position using Seek and SetPosition.', - GObject.ParamFlags.READABLE, - false - ), - 'CanControl': GObject.ParamSpec.boolean( - 'CanControl', - 'Can Control', - 'Whether the media player may be controlled over this interface.', - GObject.ParamFlags.READABLE, - false - ), - }, - Signals: { - 'Seeked': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [GObject.TYPE_INT64], - }, - }, -}, class Player extends GObject.Object { - - /* - * The org.mpris.MediaPlayer2 Interface - */ - get CanQuit() { - if (this._CanQuit === undefined) - this._CanQuit = false; - - return this._CanQuit; - } - - get CanRaise() { - if (this._CanRaise === undefined) - this._CanRaise = false; - - return this._CanRaise; - } - - get CanSetFullscreen() { - if (this._CanFullscreen === undefined) - this._CanFullscreen = false; - - return this._CanFullscreen; - } - - get DesktopEntry() { - if (this._DesktopEntry === undefined) - return 'org.gnome.Shell.Extensions.GSConnect'; - - return this._DesktopEntry; - } - - get Fullscreen() { - if (this._Fullscreen === undefined) - this._Fullscreen = false; - - return this._Fullscreen; - } - - set Fullscreen(mode) { - if (this.Fullscreen === mode) - return; - - this._Fullscreen = mode; - this.notify('Fullscreen'); - } - - get HasTrackList() { - if (this._HasTrackList === undefined) - this._HasTrackList = false; - - return this._HasTrackList; - } - - get Identity() { - if (this._Identity === undefined) - this._Identity = ''; - - return this._Identity; - } - - get SupportedMimeTypes() { - if (this._SupportedMimeTypes === undefined) - this._SupportedMimeTypes = []; - - return this._SupportedMimeTypes; - } - - get SupportedUriSchemes() { - if (this._SupportedUriSchemes === undefined) - this._SupportedUriSchemes = []; - - return this._SupportedUriSchemes; - } - - Quit() { - throw new GObject.NotImplementedError(); - } - - Raise() { - throw new GObject.NotImplementedError(); - } - - /* - * The org.mpris.MediaPlayer2.Player Interface - */ - get CanControl() { - if (this._CanControl === undefined) - this._CanControl = false; - - return this._CanControl; - } - - get CanGoNext() { - if (this._CanGoNext === undefined) - this._CanGoNext = false; - - return this._CanGoNext; - } - - get CanGoPrevious() { - if (this._CanGoPrevious === undefined) - this._CanGoPrevious = false; - - return this._CanGoPrevious; - } - - get CanPause() { - if (this._CanPause === undefined) - this._CanPause = false; - - return this._CanPause; - } - - get CanPlay() { - if (this._CanPlay === undefined) - this._CanPlay = false; - - return this._CanPlay; - } - - get CanSeek() { - if (this._CanSeek === undefined) - this._CanSeek = false; - - return this._CanSeek; - } - - get LoopStatus() { - if (this._LoopStatus === undefined) - this._LoopStatus = 'None'; - - return this._LoopStatus; - } - - set LoopStatus(status) { - if (this.LoopStatus === status) - return; - - this._LoopStatus = status; - this.notify('LoopStatus'); - } - - get MaximumRate() { - if (this._MaximumRate === undefined) - this._MaximumRate = 1.0; - - return this._MaximumRate; - } - - get Metadata() { - if (this._Metadata === undefined) { - this._Metadata = { - 'xesam:artist': [_('Unknown')], - 'xesam:album': _('Unknown'), - 'xesam:title': _('Unknown'), - 'mpris:length': 0, - }; - } - - return this._Metadata; - } - - get MinimumRate() { - if (this._MinimumRate === undefined) - this._MinimumRate = 1.0; - - return this._MinimumRate; - } - - get PlaybackStatus() { - if (this._PlaybackStatus === undefined) - this._PlaybackStatus = 'Stopped'; - - return this._PlaybackStatus; - } - - get Position() { - if (this._Position === undefined) - this._Position = 0; - - return this._Position; - } - - get Rate() { - if (this._Rate === undefined) - this._Rate = 1.0; - - return this._Rate; - } - - set Rate(rate) { - if (this.Rate === rate) - return; - - this._Rate = rate; - this.notify('Rate'); - } - - get Shuffle() { - if (this._Shuffle === undefined) - this._Shuffle = false; - - return this._Shuffle; - } - - set Shuffle(mode) { - if (this.Shuffle === mode) - return; - - this._Shuffle = mode; - this.notify('Shuffle'); - } - - get Volume() { - if (this._Volume === undefined) - this._Volume = 1.0; - - return this._Volume; - } - - set Volume(level) { - if (this.Volume === level) - return; - - this._Volume = level; - this.notify('Volume'); - } - - Next() { - throw new GObject.NotImplementedError(); - } - - OpenUri(uri) { - throw new GObject.NotImplementedError(); - } - - Previous() { - throw new GObject.NotImplementedError(); - } - - Pause() { - throw new GObject.NotImplementedError(); - } - - Play() { - throw new GObject.NotImplementedError(); - } - - PlayPause() { - throw new GObject.NotImplementedError(); - } - - Seek(offset) { - throw new GObject.NotImplementedError(); - } - - SetPosition(trackId, position) { - throw new GObject.NotImplementedError(); - } - - Stop() { - throw new GObject.NotImplementedError(); - } -}); - - -/** - * An aggregate of the org.mpris.MediaPlayer2 and org.mpris.MediaPlayer2.Player - * interfaces. - */ -const PlayerProxy = GObject.registerClass({ - GTypeName: 'GSConnectMPRISPlayer', -}, class PlayerProxy extends Player { - - _init(name) { - super._init(); - - this._application = new Gio.DBusProxy({ - g_bus_type: Gio.BusType.SESSION, - g_name: name, - g_object_path: '/org/mpris/MediaPlayer2', - g_interface_name: 'org.mpris.MediaPlayer2', - }); - - this._applicationChangedId = this._application.connect( - 'g-properties-changed', - this._onPropertiesChanged.bind(this) - ); - - this._player = new Gio.DBusProxy({ - g_bus_type: Gio.BusType.SESSION, - g_name: name, - g_object_path: '/org/mpris/MediaPlayer2', - g_interface_name: 'org.mpris.MediaPlayer2.Player', - }); - - this._playerChangedId = this._player.connect( - 'g-properties-changed', - this._onPropertiesChanged.bind(this) - ); - - this._playerSignalId = this._player.connect( - 'g-signal', - this._onSignal.bind(this) - ); - - this._cancellable = new Gio.Cancellable(); - } - - _onSignal(proxy, sender_name, signal_name, parameters) { - try { - if (signal_name !== 'Seeked') - return; - - this.emit('Seeked', parameters.deepUnpack()[0]); - } catch (e) { - debug(e, proxy.g_name); - } - } - - _call(proxy, name, parameters = null) { - proxy.call( - name, - parameters, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - this._cancellable, - (proxy, result) => { - try { - proxy.call_finish(result); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - debug(e, proxy.g_name); - } - } - ); - } - - _get(proxy, name, fallback = null) { - try { - return proxy.get_cached_property(name).recursiveUnpack(); - } catch (e) { - return fallback; - } - } - - _set(proxy, name, value) { - try { - proxy.set_cached_property(name, value); - - proxy.call( - 'org.freedesktop.DBus.Properties.Set', - new GLib.Variant('(ssv)', [proxy.g_interface_name, name, value]), - Gio.DBusCallFlags.NO_AUTO_START, - -1, - this._cancellable, - (proxy, result) => { - try { - proxy.call_finish(result); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - debug(e, proxy.g_name); - } - } - ); - } catch (e) { - debug(e, proxy.g_name); - } - } - - _onPropertiesChanged(proxy, changed, invalidated) { - try { - this.freeze_notify(); - - for (const name in changed.deepUnpack()) - this.notify(name); - - this.thaw_notify(); - } catch (e) { - debug(e, proxy.g_name); - } - } - - /* - * The org.mpris.MediaPlayer2 Interface - */ - get CanQuit() { - return this._get(this._application, 'CanQuit', false); - } - - get CanRaise() { - return this._get(this._application, 'CanRaise', false); - } - - get CanSetFullscreen() { - return this._get(this._application, 'CanSetFullscreen', false); - } - - get DesktopEntry() { - return this._get(this._application, 'DesktopEntry', null); - } - - get Fullscreen() { - return this._get(this._application, 'Fullscreen', false); - } - - set Fullscreen(mode) { - this._set(this._application, 'Fullscreen', new GLib.Variant('b', mode)); - } - - get HasTrackList() { - return this._get(this._application, 'HasTrackList', false); - } - - get Identity() { - return this._get(this._application, 'Identity', _('Unknown')); - } - - get SupportedMimeTypes() { - return this._get(this._application, 'SupportedMimeTypes', []); - } - - get SupportedUriSchemes() { - return this._get(this._application, 'SupportedUriSchemes', []); - } - - Quit() { - this._call(this._application, 'Quit'); - } - - Raise() { - this._call(this._application, 'Raise'); - } - - /* - * The org.mpris.MediaPlayer2.Player Interface - */ - get CanControl() { - return this._get(this._player, 'CanControl', false); - } - - get CanGoNext() { - return this._get(this._player, 'CanGoNext', false); - } - - get CanGoPrevious() { - return this._get(this._player, 'CanGoPrevious', false); - } - - get CanPause() { - return this._get(this._player, 'CanPause', false); - } - - get CanPlay() { - return this._get(this._player, 'CanPlay', false); - } - - get CanSeek() { - return this._get(this._player, 'CanSeek', false); - } - - get LoopStatus() { - return this._get(this._player, 'LoopStatus', 'None'); - } - - set LoopStatus(status) { - this._set(this._player, 'LoopStatus', new GLib.Variant('s', status)); - } - - get MaximumRate() { - return this._get(this._player, 'MaximumRate', 1.0); - } - - get Metadata() { - if (this._metadata === undefined) { - this._metadata = { - 'xesam:artist': [_('Unknown')], - 'xesam:album': _('Unknown'), - 'xesam:title': _('Unknown'), - 'mpris:length': 0, - }; - } - - return this._get(this._player, 'Metadata', this._metadata); - } - - get MinimumRate() { - return this._get(this._player, 'MinimumRate', 1.0); - } - - get PlaybackStatus() { - return this._get(this._player, 'PlaybackStatus', 'Stopped'); - } - - // g-properties-changed is not emitted for this property - get Position() { - try { - const reply = this._player.call_sync( - 'org.freedesktop.DBus.Properties.Get', - new GLib.Variant('(ss)', [ - 'org.mpris.MediaPlayer2.Player', - 'Position', - ]), - Gio.DBusCallFlags.NONE, - -1, - null - ); - - return reply.recursiveUnpack()[0]; - } catch (e) { - return 0; - } - } - - get Rate() { - return this._get(this._player, 'Rate', 1.0); - } - - set Rate(rate) { - this._set(this._player, 'Rate', new GLib.Variant('d', rate)); - } - - get Shuffle() { - return this._get(this._player, 'Shuffle', false); - } - - set Shuffle(mode) { - this._set(this._player, 'Shuffle', new GLib.Variant('b', mode)); - } - - get Volume() { - return this._get(this._player, 'Volume', 1.0); - } - - set Volume(level) { - this._set(this._player, 'Volume', new GLib.Variant('d', level)); - } - - Next() { - this._call(this._player, 'Next'); - } - - OpenUri(uri) { - this._call(this._player, 'OpenUri', new GLib.Variant('(s)', [uri])); - } - - Previous() { - this._call(this._player, 'Previous'); - } - - Pause() { - this._call(this._player, 'Pause'); - } - - Play() { - this._call(this._player, 'Play'); - } - - PlayPause() { - this._call(this._player, 'PlayPause'); - } - - Seek(offset) { - this._call(this._player, 'Seek', new GLib.Variant('(x)', [offset])); - } - - SetPosition(trackId, position) { - this._call(this._player, 'SetPosition', - new GLib.Variant('(ox)', [trackId, position])); - } - - Stop() { - this._call(this._player, 'Stop'); - } - - destroy() { - if (this._cancellable.is_cancelled()) - return; - - this._cancellable.cancel(); - this._application.disconnect(this._applicationChangedId); - this._player.disconnect(this._playerChangedId); - this._player.disconnect(this._playerSignalId); - } -}); - - -/** - * A manager for media players - */ -const Manager = GObject.registerClass({ - GTypeName: 'GSConnectMPRISManager', - Signals: { - 'player-added': { - param_types: [GObject.TYPE_OBJECT], - }, - 'player-removed': { - param_types: [GObject.TYPE_OBJECT], - }, - 'player-changed': { - param_types: [GObject.TYPE_OBJECT], - }, - 'player-seeked': { - param_types: [GObject.TYPE_OBJECT, GObject.TYPE_INT64], - }, - }, -}, class Manager extends GObject.Object { - - _init() { - super._init(); - - // Asynchronous setup - this._cancellable = new Gio.Cancellable(); - this._connection = Gio.DBus.session; - this._players = new Map(); - this._paused = new Map(); - - this._nameOwnerChangedId = Gio.DBus.session.signal_subscribe( - 'org.freedesktop.DBus', - 'org.freedesktop.DBus', - 'NameOwnerChanged', - '/org/freedesktop/DBus', - 'org.mpris.MediaPlayer2', - Gio.DBusSignalFlags.MATCH_ARG0_NAMESPACE, - this._onNameOwnerChanged.bind(this) - ); - - this._loadPlayers(); - } - - async _loadPlayers() { - try { - const reply = await this._connection.call( - 'org.freedesktop.DBus', - '/org/freedesktop/DBus', - 'org.freedesktop.DBus', - 'ListNames', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - this._cancellable); - - const names = reply.deepUnpack()[0]; - - for (let i = 0, len = names.length; i < len; i++) { - const name = names[i]; - - if (!name.startsWith('org.mpris.MediaPlayer2')) - continue; - - if (!name.includes('GSConnect')) - this._addPlayer(name); - } - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - logError(e); - } - } - - _onNameOwnerChanged(connection, sender, object, iface, signal, parameters) { - const [name, oldOwner, newOwner] = parameters.deepUnpack(); - - if (name.includes('GSConnect')) - return; - - if (newOwner.length) - this._addPlayer(name); - else if (oldOwner.length) - this._removePlayer(name); - } - - async _addPlayer(name) { - try { - if (!this._players.has(name)) { - const player = new PlayerProxy(name); - await Promise.all([ - player._application.init_async(GLib.PRIORITY_DEFAULT, - this._cancellable), - player._player.init_async(GLib.PRIORITY_DEFAULT, - this._cancellable), - ]); - - player.connect('notify', - (player) => this.emit('player-changed', player)); - - player.connect('Seeked', this.emit.bind(this, 'player-seeked')); - - this._players.set(name, player); - this.emit('player-added', player); - } - } catch (e) { - debug(e, name); - } - } - - _removePlayer(name) { - try { - const player = this._players.get(name); - - if (player !== undefined) { - this._paused.delete(name); - this._players.delete(name); - this.emit('player-removed', player); - - player.destroy(); - } - } catch (e) { - debug(e, name); - } - } - - /** - * Check for a player by its Identity. - * - * @param {string} identity - A player name - * @return {boolean} %true if the player was found - */ - hasPlayer(identity) { - for (const player of this._players.values()) { - if (player.Identity === identity) - return true; - } - - return false; - } - - /** - * Get a player by its Identity. - * - * @param {string} identity - A player name - * @return {GSConnectMPRISPlayer|null} A player or %null - */ - getPlayer(identity) { - for (const player of this._players.values()) { - if (player.Identity === identity) - return player; - } - - return null; - } - - /** - * Get a list of player identities. - * - * @return {string[]} A list of player identities - */ - getIdentities() { - const identities = []; - - for (const player of this._players.values()) { - const identity = player.Identity; - - if (identity) - identities.push(identity); - } - - return identities; - } - - /** - * A convenience function for pausing all players currently playing. - */ - pauseAll() { - for (const [name, player] of this._players) { - if (player.PlaybackStatus === 'Playing' && player.CanPause) { - player.Pause(); - this._paused.set(name, player); - } - } - } - - /** - * A convenience function for restarting all players paused with pauseAll(). - */ - unpauseAll() { - for (const player of this._paused.values()) { - if (player.PlaybackStatus === 'Paused' && player.CanPlay) - player.Play(); - } - - this._paused.clear(); - } - - destroy() { - if (this._cancellable.is_cancelled()) - return; - - this._cancellable.cancel(); - this._connection.signal_unsubscribe(this._nameOwnerChangedId); - - this._paused.clear(); - this._players.forEach(player => player.destroy()); - this._players.clear(); - } -}); - - -/** - * The service class for this component - */ -export default Manager; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/notification.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/notification.js deleted file mode 100644 index 0566a257..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/notification.js +++ /dev/null @@ -1,409 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GjsPrivate from 'gi://GjsPrivate'; -import GObject from 'gi://GObject'; - -import * as DBus from '../utils/dbus.js'; - - -const _nodeInfo = Gio.DBusNodeInfo.new_for_xml(` - - - - - - - - - - - - - - - - - - - - - - - - - -`); - - -const FDO_IFACE = _nodeInfo.lookup_interface('org.freedesktop.Notifications'); -const FDO_MATCH = "interface='org.freedesktop.Notifications',member='Notify',type='method_call'"; - -const GTK_IFACE = _nodeInfo.lookup_interface('org.gtk.Notifications'); -const GTK_MATCH = "interface='org.gtk.Notifications',member='AddNotification',type='method_call'"; - - -/** - * A class for snooping Freedesktop (libnotify) and Gtk (GNotification) - * notifications and forwarding them to supporting devices. - */ -const Listener = GObject.registerClass({ - GTypeName: 'GSConnectNotificationListener', - Signals: { - 'notification-added': { - flags: GObject.SignalFlags.RUN_LAST, - param_types: [GLib.Variant.$gtype], - }, - }, -}, class Listener extends GObject.Object { - - _init() { - super._init(); - - // Respect desktop notification settings - this._settings = new Gio.Settings({ - schema_id: 'org.gnome.desktop.notifications', - }); - - // Watch for new application policies - this._settingsId = this._settings.connect( - 'changed::application-children', - this._onSettingsChanged.bind(this) - ); - - // Cache for appName->desktop-id lookups - this._names = {}; - - // Asynchronous setup - this._init_async(); - } - - get applications() { - if (this._applications === undefined) - this._onSettingsChanged(); - - return this._applications; - } - - /** - * Update application notification settings - */ - _onSettingsChanged() { - this._applications = {}; - - for (const app of this._settings.get_strv('application-children')) { - const appSettings = new Gio.Settings({ - schema_id: 'org.gnome.desktop.notifications.application', - path: `/org/gnome/desktop/notifications/application/${app}/`, - }); - - const appInfo = Gio.DesktopAppInfo.new( - appSettings.get_string('application-id') - ); - - if (appInfo !== null) - this._applications[appInfo.get_name()] = appSettings; - } - } - - async _listNames() { - const reply = await this._session.call( - 'org.freedesktop.DBus', - '/org/freedesktop/DBus', - 'org.freedesktop.DBus', - 'ListNames', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - null); - - return reply.deepUnpack()[0]; - } - - async _getNameOwner(name) { - const reply = await this._session.call( - 'org.freedesktop.DBus', - '/org/freedesktop/DBus', - 'org.freedesktop.DBus', - 'GetNameOwner', - new GLib.Variant('(s)', [name]), - null, - Gio.DBusCallFlags.NONE, - -1, - null); - - return reply.deepUnpack()[0]; - } - - /** - * Try and find a well-known name for @sender on the session bus - * - * @param {string} sender - A DBus unique name (eg. :1.2282) - * @param {string} appName - @appName passed to Notify() (Optional) - * @return {string} A well-known name or %null - */ - async _getAppId(sender, appName) { - try { - // Get a list of well-known names, ignoring @sender - const names = await this._listNames(); - names.splice(names.indexOf(sender), 1); - - // Make a short list for substring matches (fractal/org.gnome.Fractal) - const appLower = appName.toLowerCase(); - - const shortList = names.filter(name => { - return name.toLowerCase().includes(appLower); - }); - - // Run the short list first - for (const name of shortList) { - const nameOwner = await this._getNameOwner(name); - - if (nameOwner === sender) - return name; - - names.splice(names.indexOf(name), 1); - } - - // Run the full list - for (const name of names) { - const nameOwner = await this._getNameOwner(name); - - if (nameOwner === sender) - return name; - } - - return null; - } catch (e) { - debug(e); - return null; - } - } - - /** - * Try and find the application name for @sender - * - * @param {string} sender - A DBus unique name - * @param {string} [appName] - `appName` supplied by Notify() - * @return {string} A well-known name or %null - */ - async _getAppName(sender, appName = null) { - // Check the cache first - if (appName && this._names.hasOwnProperty(appName)) - return this._names[appName]; - - try { - const appId = await this._getAppId(sender, appName); - const appInfo = Gio.DesktopAppInfo.new(`${appId}.desktop`); - this._names[appName] = appInfo.get_name(); - appName = appInfo.get_name(); - } catch (e) { - // Silence errors - } - - return appName; - } - - /** - * Callback for AddNotification()/Notify() - * - * @param {DBus.Interface} iface - The DBus interface - * @param {string} name - The DBus method name - * @param {GLib.Variant} parameters - The method parameters - * @param {Gio.DBusMethodInvocation} invocation - The method invocation info - */ - async _onHandleMethodCall(iface, name, parameters, invocation) { - try { - // Check if notifications are disabled in desktop settings - if (!this._settings.get_boolean('show-banners')) - return; - - parameters = parameters.full_unpack(); - - // GNotification - if (name === 'AddNotification') { - this.AddNotification(...parameters); - - // libnotify - } else if (name === 'Notify') { - const message = invocation.get_message(); - const destination = message.get_destination(); - - // Deduplicate notifications; only accept messages - // directed to the notification bus, or its owner. - if (destination !== 'org.freedesktop.Notifications') { - if (this._fdoNameOwner === undefined) { - this._fdoNameOwner = await this._getNameOwner( - 'org.freedesktop.Notifications'); - } - - if (this._fdoNameOwner !== destination) - return; - } - - // Try to brute-force an application name using DBus - if (!this.applications.hasOwnProperty(parameters[0])) { - const sender = message.get_sender(); - parameters[0] = await this._getAppName(sender, parameters[0]); - } - - this.Notify(...parameters); - } - } catch (e) { - debug(e); - } - } - - /** - * Export interfaces for proxying notifications and become a monitor - * - * @return {Promise} A promise for the operation - */ - _monitorConnection() { - // libnotify Interface - this._fdoNotifications = new GjsPrivate.DBusImplementation({ - g_interface_info: FDO_IFACE, - }); - this._fdoMethodCallId = this._fdoNotifications.connect( - 'handle-method-call', this._onHandleMethodCall.bind(this)); - this._fdoNotifications.export(this._monitor, - '/org/freedesktop/Notifications'); - - this._fdoNameOwnerChangedId = this._session.signal_subscribe( - 'org.freedesktop.DBus', - 'org.freedesktop.DBus', - 'NameOwnerChanged', - '/org/freedesktop/DBus', - 'org.freedesktop.Notifications', - Gio.DBusSignalFlags.MATCH_ARG0_NAMESPACE, - this._onFdoNameOwnerChanged.bind(this) - ); - - // GNotification Interface - this._gtkNotifications = new GjsPrivate.DBusImplementation({ - g_interface_info: GTK_IFACE, - }); - this._gtkMethodCallId = this._gtkNotifications.connect( - 'handle-method-call', this._onHandleMethodCall.bind(this)); - this._gtkNotifications.export(this._monitor, '/org/gtk/Notifications'); - - // Become a monitor for Fdo & Gtk notifications - return this._monitor.call( - 'org.freedesktop.DBus', - '/org/freedesktop/DBus', - 'org.freedesktop.DBus.Monitoring', - 'BecomeMonitor', - new GLib.Variant('(asu)', [[FDO_MATCH, GTK_MATCH], 0]), - null, - Gio.DBusCallFlags.NONE, - -1, - null); - } - - async _init_async() { - try { - this._session = Gio.DBus.session; - this._monitor = await DBus.newConnection(); - await this._monitorConnection(); - } catch (e) { - const service = Gio.Application.get_default(); - - if (service !== null) - service.notify_error(e); - else - logError(e); - } - } - - _onFdoNameOwnerChanged(connection, sender, object, iface, signal, parameters) { - this._fdoNameOwner = parameters.deepUnpack()[2]; - } - - _sendNotification(notif) { - // Check if this application is disabled in desktop settings - const appSettings = this.applications[notif.appName]; - - if (appSettings && !appSettings.get_boolean('enable')) - return; - - // Send the notification to each supporting device - // TODO: avoid the overhead of the GAction framework with a signal? - const variant = GLib.Variant.full_pack(notif); - this.emit('notification-added', variant); - } - - Notify(appName, replacesId, iconName, summary, body, actions, hints, timeout) { - // Ignore notifications without an appName - if (!appName) - return; - - this._sendNotification({ - appName: appName, - id: `fdo|null|${replacesId}`, - title: summary, - text: body, - ticker: `${summary}: ${body}`, - isClearable: (replacesId !== 0), - icon: iconName, - }); - } - - AddNotification(application, id, notification) { - // Ignore our own notifications or we'll cause a notification loop - if (application === 'org.gnome.Shell.Extensions.GSConnect') - return; - - const appInfo = Gio.DesktopAppInfo.new(`${application}.desktop`); - - // Try to get an icon for the notification - if (!notification.hasOwnProperty('icon')) - notification.icon = appInfo.get_icon() || undefined; - - this._sendNotification({ - appName: appInfo.get_name(), - id: `gtk|${application}|${id}`, - title: notification.title, - text: notification.body, - ticker: `${notification.title}: ${notification.body}`, - isClearable: true, - icon: notification.icon, - }); - } - - destroy() { - try { - if (this._fdoNotifications) { - this._fdoNotifications.disconnect(this._fdoMethodCallId); - this._fdoNotifications.unexport(); - this._session.signal_unsubscribe(this._fdoNameOwnerChangedId); - } - - if (this._gtkNotifications) { - this._gtkNotifications.disconnect(this._gtkMethodCallId); - this._gtkNotifications.unexport(); - } - - if (this._settings) { - this._settings.disconnect(this._settingsId); - this._settings.run_dispose(); - } - - // TODO: Gio.IOErrorEnum: The connection is closed - // this._monitor.close_sync(null); - - GObject.signal_handlers_destroy(this); - } catch (e) { - debug(e); - } - } -}); - - -/** - * The service class for this component - */ -export default Listener; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js deleted file mode 100644 index 1165fc02..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js +++ /dev/null @@ -1,271 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GIRepository from 'gi://GIRepository'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../../config.js'; - -const Tweener = imports.tweener.tweener; - - -let Gvc = null; -try { - // Add gnome-shell's typelib dir to the search path - const typelibDir = GLib.build_filenamev([Config.GNOME_SHELL_LIBDIR, 'gnome-shell']); - GIRepository.Repository.prepend_search_path(typelibDir); - GIRepository.Repository.prepend_library_path(typelibDir); - - Gvc = (await import('gi://Gvc')).default; -} catch (e) {} - - -/** - * Extend Gvc.MixerStream with a property for returning a user-visible name - */ -if (Gvc) { - Object.defineProperty(Gvc.MixerStream.prototype, 'display_name', { - get: function () { - try { - if (!this.get_ports().length) - return this.description; - - return `${this.get_port().human_port} (${this.description})`; - } catch (e) { - return this.description; - } - }, - }); -} - - -/** - * A convenience wrapper for Gvc.MixerStream - */ -class Stream { - constructor(mixer, stream) { - this._mixer = mixer; - this._stream = stream; - - this._max = mixer.get_vol_max_norm(); - } - - get muted() { - return this._stream.is_muted; - } - - set muted(bool) { - this._stream.change_is_muted(bool); - } - - // Volume is a double in the range 0-1 - get volume() { - return Math.floor(100 * this._stream.volume / this._max) / 100; - } - - set volume(num) { - this._stream.volume = Math.floor(num * this._max); - this._stream.push_volume(); - } - - /** - * Gradually raise or lower the stream volume to @value - * - * @param {number} value - A number in the range 0-1 - * @param {number} [duration] - Duration to fade in seconds - */ - fade(value, duration = 1) { - Tweener.removeTweens(this); - - if (this._stream.volume > value) { - this._mixer.fading = true; - - Tweener.addTween(this, { - volume: value, - time: duration, - transition: 'easeOutCubic', - onComplete: () => { - this._mixer.fading = false; - }, - }); - } else if (this._stream.volume < value) { - this._mixer.fading = true; - - Tweener.addTween(this, { - volume: value, - time: duration, - transition: 'easeInCubic', - onComplete: () => { - this._mixer.fading = false; - }, - }); - } - } -} - - -/** - * A subclass of Gvc.MixerControl with convenience functions for controlling the - * default input/output volumes. - * - * The Mixer class uses GNOME Shell's Gvc library to control the system volume - * and offers a few convenience functions. - */ -const Mixer = !Gvc ? null : GObject.registerClass({ - GTypeName: 'GSConnectAudioMixer', -}, class Mixer extends Gvc.MixerControl { - _init(params) { - super._init({name: 'GSConnect'}); - - this._previousVolume = undefined; - this._volumeMuted = false; - this._microphoneMuted = false; - - this.open(); - } - - get fading() { - if (this._fading === undefined) - this._fading = false; - - return this._fading; - } - - set fading(bool) { - if (this.fading === bool) - return; - - this._fading = bool; - - if (this.fading) - this.emit('stream-changed', this._output._stream.id); - } - - get input() { - if (this._input === undefined) - this.vfunc_default_source_changed(); - - return this._input; - } - - get output() { - if (this._output === undefined) - this.vfunc_default_sink_changed(); - - return this._output; - } - - vfunc_default_sink_changed(id) { - try { - const sink = this.get_default_sink(); - this._output = (sink) ? new Stream(this, sink) : null; - } catch (e) { - logError(e); - } - } - - vfunc_default_source_changed(id) { - try { - const source = this.get_default_source(); - this._input = (source) ? new Stream(this, source) : null; - } catch (e) { - logError(e); - } - } - - vfunc_state_changed(new_state) { - try { - if (new_state === Gvc.MixerControlState.READY) { - this.vfunc_default_sink_changed(null); - this.vfunc_default_source_changed(null); - } - } catch (e) { - logError(e); - } - } - - /** - * Store the current output volume then lower it to %15 - * - * @param {number} duration - Duration in seconds to fade - */ - lowerVolume(duration = 1) { - try { - if (this.output && this.output.volume > 0.15) { - this._previousVolume = Number(this.output.volume); - this.output.fade(0.15, duration); - } - } catch (e) { - logError(e); - } - } - - /** - * Mute the output volume (speakers) - */ - muteVolume() { - try { - if (!this.output || this.output.muted) - return; - - this.output.muted = true; - this._volumeMuted = true; - } catch (e) { - logError(e); - } - } - - /** - * Mute the input volume (microphone) - */ - muteMicrophone() { - try { - if (!this.input || this.input.muted) - return; - - this.input.muted = true; - this._microphoneMuted = true; - } catch (e) { - logError(e); - } - } - - /** - * Restore all mixer levels to their previous state - */ - restore() { - try { - // If we muted the microphone, unmute it before restoring the volume - if (this._microphoneMuted) { - this.input.muted = false; - this._microphoneMuted = false; - } - - // If we muted the volume, unmute it before restoring the volume - if (this._volumeMuted) { - this.output.muted = false; - this._volumeMuted = false; - } - - // If a previous volume is defined, raise it back up to that level - if (this._previousVolume !== undefined) { - this.output.fade(this._previousVolume); - this._previousVolume = undefined; - } - } catch (e) { - logError(e); - } - } - - destroy() { - this.close(); - } -}); - - -/** - * The service class for this component - */ -export default Mixer; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/session.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/session.js deleted file mode 100644 index 5d574502..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/session.js +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; - - -const Session = class { - constructor() { - this._connection = Gio.DBus.system; - this._session = null; - - this._initAsync(); - } - - async _initAsync() { - try { - const reply = await this._connection.call( - 'org.freedesktop.login1', - '/org/freedesktop/login1', - 'org.freedesktop.login1.Manager', - 'ListSessions', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - null); - - const sessions = reply.deepUnpack()[0]; - const userName = GLib.get_user_name(); - let sessionPath = '/org/freedesktop/login1/session/auto'; - - // eslint-disable-next-line no-unused-vars - for (const [num, uid, name, seat, objectPath] of sessions) { - if (name === userName) { - sessionPath = objectPath; - break; - } - } - - this._session = new Gio.DBusProxy({ - g_connection: this._connection, - g_name: 'org.freedesktop.login1', - g_object_path: sessionPath, - g_interface_name: 'org.freedesktop.login1.Session', - }); - await this._session.init_async(GLib.PRIORITY_DEFAULT, null); - } catch (e) { - this._session = null; - logError(e); - } - } - - get idle() { - if (this._session === null) - return false; - - return this._session.get_cached_property('IdleHint').unpack(); - } - - get locked() { - if (this._session === null) - return false; - - return this._session.get_cached_property('LockedHint').unpack(); - } - - get active() { - // Active if not idle and not locked - return !(this.idle || this.locked); - } - - destroy() { - this._session = null; - } -}; - - -/** - * The service class for this component - */ -export default Session; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/sound.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/sound.js deleted file mode 100644 index 0845acfb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/sound.js +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; - -let GSound = null; -try { - GSound = (await import('gi://GSound')).default; -} catch (e) {} - - -const Player = class Player { - - constructor() { - this._playing = new Set(); - } - - get backend() { - if (this._backend === undefined) { - // Prefer GSound - if (GSound !== null) { - this._gsound = new GSound.Context(); - this._gsound.init(null); - this._backend = 'gsound'; - - // Try falling back to libcanberra, otherwise just re-run the test - // in case one or the other is installed later - } else if (GLib.find_program_in_path('canberra-gtk-play') !== null) { - this._canberra = new Gio.SubprocessLauncher({ - flags: Gio.SubprocessFlags.NONE, - }); - this._backend = 'libcanberra'; - } else { - return null; - } - } - - return this._backend; - } - - _canberraPlaySound(name, cancellable) { - const proc = this._canberra.spawnv(['canberra-gtk-play', '-i', name]); - return proc.wait_check_async(cancellable); - } - - async _canberraLoopSound(name, cancellable) { - while (!cancellable.is_cancelled()) - await this._canberraPlaySound(name, cancellable); - } - - _gsoundPlaySound(name, cancellable) { - return new Promise((resolve, reject) => { - this._gsound.play_full( - {'event.id': name}, - cancellable, - (source, res) => { - try { - resolve(source.play_full_finish(res)); - } catch (e) { - reject(e); - } - } - ); - }); - } - - async _gsoundLoopSound(name, cancellable) { - while (!cancellable.is_cancelled()) - await this._gsoundPlaySound(name, cancellable); - } - - _gdkPlaySound(name, cancellable) { - if (this._display === undefined) - this._display = Gdk.Display.get_default(); - - let count = 0; - - GLib.timeout_add(GLib.PRIORITY_DEFAULT, 200, () => { - try { - if (count++ < 4 && !cancellable.is_cancelled()) { - this._display.beep(); - return GLib.SOURCE_CONTINUE; - } - - return GLib.SOURCE_REMOVE; - } catch (e) { - logError(e); - return GLib.SOURCE_REMOVE; - } - }); - - return !cancellable.is_cancelled(); - } - - _gdkLoopSound(name, cancellable) { - this._gdkPlaySound(name, cancellable); - GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - 1500, - this._gdkPlaySound.bind(this, name, cancellable) - ); - } - - async playSound(name, cancellable) { - try { - if (!(cancellable instanceof Gio.Cancellable)) - cancellable = new Gio.Cancellable(); - - this._playing.add(cancellable); - - switch (this.backend) { - case 'gsound': - await this._gsoundPlaySound(name, cancellable); - break; - - case 'canberra': - await this._canberraPlaySound(name, cancellable); - break; - - default: - await this._gdkPlaySound(name, cancellable); - } - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - logError(e); - } finally { - this._playing.delete(cancellable); - } - } - - async loopSound(name, cancellable) { - try { - if (!(cancellable instanceof Gio.Cancellable)) - cancellable = new Gio.Cancellable(); - - this._playing.add(cancellable); - - switch (this.backend) { - case 'gsound': - await this._gsoundLoopSound(name, cancellable); - break; - - case 'canberra': - await this._canberraLoopSound(name, cancellable); - break; - - default: - await this._gdkLoopSound(name, cancellable); - } - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - logError(e); - } finally { - this._playing.delete(cancellable); - } - } - - destroy() { - for (const cancellable of this._playing) - cancellable.cancel(); - } -}; - - -/** - * The service class for this component - */ -export default Player; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/upower.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/upower.js deleted file mode 100644 index 722387b8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/upower.js +++ /dev/null @@ -1,215 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - - -/** - * The warning level of a battery. - * - * @readonly - * @enum {number} - */ -const DeviceLevel = { - UNKNOWN: 0, - NONE: 1, - DISCHARGING: 2, - LOW: 3, - CRITICAL: 4, - ACTION: 5, - NORMAL: 6, - HIGH: 7, - FULL: 8, - LAST: 9, -}; - -/** - * The device state. - * - * @readonly - * @enum {number} - */ -const DeviceState = { - UNKNOWN: 0, - CHARGING: 1, - DISCHARGING: 2, - EMPTY: 3, - FULLY_CHARGED: 4, - PENDING_CHARGE: 5, - PENDING_DISCHARGE: 6, - LAST: 7, -}; - - -/** - * A class representing the system battery. - */ -const Battery = GObject.registerClass({ - GTypeName: 'GSConnectSystemBattery', - Signals: { - 'changed': { - flags: GObject.SignalFlags.RUN_FIRST, - }, - }, - Properties: { - 'charging': GObject.ParamSpec.boolean( - 'charging', - 'Charging', - 'The current charging state.', - GObject.ParamFlags.READABLE, - false - ), - 'level': GObject.ParamSpec.int( - 'level', - 'Level', - 'The current power level.', - GObject.ParamFlags.READABLE, - -1, 100, - -1 - ), - 'threshold': GObject.ParamSpec.uint( - 'threshold', - 'Threshold', - 'The current threshold state.', - GObject.ParamFlags.READABLE, - 0, 1, - 0 - ), - }, -}, class Battery extends GObject.Object { - - _init() { - super._init(); - - this._cancellable = new Gio.Cancellable(); - this._proxy = null; - this._propertiesChangedId = 0; - - this._loadUPower(); - } - - async _loadUPower() { - try { - this._proxy = new Gio.DBusProxy({ - g_bus_type: Gio.BusType.SYSTEM, - g_name: 'org.freedesktop.UPower', - g_object_path: '/org/freedesktop/UPower/devices/DisplayDevice', - g_interface_name: 'org.freedesktop.UPower.Device', - g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START, - }); - - await this._proxy.init_async(GLib.PRIORITY_DEFAULT, - this._cancellable); - - this._propertiesChangedId = this._proxy.connect( - 'g-properties-changed', this._onPropertiesChanged.bind(this)); - - this._initProperties(this._proxy); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { - const service = Gio.Application.get_default(); - - if (service !== null) - service.notify_error(e); - else - logError(e); - } - - this._proxy = null; - } - } - - _initProperties(proxy) { - if (proxy.g_name_owner === null) - return; - - const percentage = proxy.get_cached_property('Percentage').unpack(); - const state = proxy.get_cached_property('State').unpack(); - const level = proxy.get_cached_property('WarningLevel').unpack(); - - this._level = Math.floor(percentage); - this._charging = (state !== DeviceState.DISCHARGING); - this._threshold = (!this.charging && level >= DeviceLevel.LOW); - - this.emit('changed'); - } - - _onPropertiesChanged(proxy, changed, invalidated) { - let emitChanged = false; - const properties = changed.deepUnpack(); - - if (properties.hasOwnProperty('Percentage')) { - emitChanged = true; - - const value = proxy.get_cached_property('Percentage').unpack(); - this._level = Math.floor(value); - this.notify('level'); - } - - if (properties.hasOwnProperty('State')) { - emitChanged = true; - - const value = proxy.get_cached_property('State').unpack(); - this._charging = (value !== DeviceState.DISCHARGING); - this.notify('charging'); - } - - if (properties.hasOwnProperty('WarningLevel')) { - emitChanged = true; - - const value = proxy.get_cached_property('WarningLevel').unpack(); - this._threshold = (!this.charging && value >= DeviceLevel.LOW); - this.notify('threshold'); - } - - if (emitChanged) - this.emit('changed'); - } - - get charging() { - if (this._charging === undefined) - this._charging = false; - - return this._charging; - } - - get is_present() { - return (this._proxy && this._proxy.g_name_owner); - } - - get level() { - if (this._level === undefined) - this._level = -1; - - return this._level; - } - - get threshold() { - if (this._threshold === undefined) - this._threshold = 0; - - return this._threshold; - } - - destroy() { - if (this._cancellable.is_cancelled()) - return; - - this._cancellable.cancel(); - - if (this._proxy && this._propertiesChangedId > 0) { - this._proxy.disconnect(this._propertiesChangedId); - this._propertiesChangedId = 0; - } - } -}); - - -/** - * The service class for this component - */ -export default Battery; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/ydotool.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/ydotool.js deleted file mode 100644 index de044185..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/ydotool.js +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-FileCopyrightText: JingMatrix https://github.com/JingMatrix -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import Gdk from 'gi://Gdk'; - -const keyCodes = new Map([ - ['1', 2], - ['2', 3], - ['3', 4], - ['4', 5], - ['5', 6], - ['6', 7], - ['7', 8], - ['8', 9], - ['9', 10], - ['0', 11], - ['-', 12], - ['=', 13], - ['Q', 16], - ['W', 17], - ['E', 18], - ['R', 19], - ['T', 20], - ['Y', 21], - ['U', 22], - ['I', 23], - ['O', 24], - ['P', 25], - ['[', 26], - [']', 27], - ['A', 30], - ['S', 31], - ['D', 32], - ['F', 33], - ['G', 34], - ['H', 35], - ['J', 36], - ['K', 37], - ['L', 38], - [';', 39], - ["'", 40], - ['Z', 44], - ['X', 45], - ['C', 46], - ['V', 47], - ['B', 48], - ['N', 49], - ['M', 50], - [',', 51], - ['.', 52], - ['/', 53], - ['\\', 43], -]); -export default class Controller { - constructor() { - // laucher for wl-clipboard - this._launcher = new Gio.SubprocessLauncher({ - flags: - Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_MERGE, - }); - this._args = []; - this.buttonMap = new Map([ - [Gdk.BUTTON_PRIMARY, '0'], - [Gdk.BUTTON_MIDDLE, '2'], - [Gdk.BUTTON_SECONDARY, '1'], - ]); - } - - get args() { - return this._args; - } - - set args(opts) { - this._args = ['ydotool'].concat(opts); - try { - this._launcher.spawnv(this._args); - } catch (e) { - debug(e, this._args); - } - } - - /* - * Pointer Events - */ - movePointer(dx, dy) { - if (dx === 0 && dy === 0) - return; - this.args = ['mousemove', '--', dx.toString(), dy.toString()]; - } - - pressPointer(button) { - this.args = ['click', '0x4' + this.buttonMap.get(button)]; - } - - releasePointer(button) { - this.args = ['click', '0x8' + this.buttonMap.get(button)]; - } - - clickPointer(button) { - this.args = ['click', '0xC' + this.buttonMap.get(button)]; - } - - doubleclickPointer(button) { - this.args = [ - 'click', - '0xC' + this.buttonMap.get(button), - 'click', - '0xC' + this.buttonMap.get(button), - ]; - } - - scrollPointer(dx, dy) { - if (dx === 0 && dy === 0) - return; - this.args = ['mousemove', '-w', '--', dx.toString(), dy.toString()]; - } - - /* - * Keyboard Events - */ - - pressKeys(input, modifiers_codes) { - if (typeof input === 'string' && modifiers_codes.length === 0) { - try { - this._launcher.spawnv(['wtype', input]); - } catch (e) { - debug(e); - this.arg = ['type', '--', input]; - } - } else { - if (typeof input === 'number') { - modifiers_codes.push(input); - } else if (typeof input === 'string') { - input = input.toUpperCase(); - for (let i = 0; i < input.length; i++) { - if (keyCodes.get(input[i])) { - modifiers_codes.push(keyCodes.get(input[i])); - } else { - debug('Keycode for ' + input[i] + ' not found'); - return; - } - } - - } - this._args = ['key']; - modifiers_codes.forEach((code) => this._args.push(code + ':1')); - modifiers_codes - .reverse() - .forEach((code) => this._args.push(code + ':0')); - this.args = this._args; - } - } - - destroy() { - this._args = []; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/core.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/core.js deleted file mode 100644 index 02b89bb6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/core.js +++ /dev/null @@ -1,694 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import plugins from './plugins/index.js'; - - -/** - * Get the local device type. - * - * @return {string} A device type string - */ -export function _getDeviceType() { - try { - let type = GLib.file_get_contents('/sys/class/dmi/id/chassis_type')[1]; - - type = Number(new TextDecoder().decode(type)); - - if ([8, 9, 10, 14].includes(type)) - return 'laptop'; - - return 'desktop'; - } catch (e) { - return 'desktop'; - } -} - - -/** - * The packet class is a simple Object-derived class, offering some conveniences - * for working with KDE Connect packets. - */ -export class Packet { - - constructor(data = null) { - this.id = 0; - this.type = undefined; - this.body = {}; - - if (typeof data === 'string') - Object.assign(this, JSON.parse(data)); - else if (data !== null) - Object.assign(this, data); - } - - [Symbol.toPrimitive](hint) { - this.id = Date.now(); - - if (hint === 'string') - return `${JSON.stringify(this)}\n`; - - if (hint === 'number') - return `${JSON.stringify(this)}\n`.length; - - return true; - } - - get [Symbol.toStringTag]() { - return `Packet:${this.type}`; - } - - /** - * Deserialize and return a new Packet from an Object or string. - * - * @param {Object|string} data - A string or dictionary to deserialize - * @return {Core.Packet} A new packet object - */ - static deserialize(data) { - return new Packet(data); - } - - /** - * Serialize the packet as a single line with a terminating new-line (`\n`) - * character, ready to be written to a channel. - * - * @return {string} A serialized packet - */ - serialize() { - this.id = Date.now(); - return `${JSON.stringify(this)}\n`; - } - - /** - * Update the packet from a dictionary or string of JSON - * - * @param {Object|string} data - Source data - */ - update(data) { - try { - if (typeof data === 'string') - Object.assign(this, JSON.parse(data)); - else - Object.assign(this, data); - } catch (e) { - throw Error(`Malformed data: ${e.message}`); - } - } - - /** - * Check if the packet has a payload. - * - * @return {boolean} %true if @packet has a payload - */ - hasPayload() { - if (!this.hasOwnProperty('payloadSize')) - return false; - - if (!this.hasOwnProperty('payloadTransferInfo')) - return false; - - return (Object.keys(this.payloadTransferInfo).length > 0); - } -} - - -/** - * Channel objects handle KDE Connect packet exchange and data transfers for - * devices. The implementation is responsible for all negotiation of the - * underlying protocol. - */ -export const Channel = GObject.registerClass({ - GTypeName: 'GSConnectChannel', - Properties: { - 'closed': GObject.ParamSpec.boolean( - 'closed', - 'Closed', - 'Whether the channel has been closed', - GObject.ParamFlags.READABLE, - false - ), - }, -}, class Channel extends GObject.Object { - - get address() { - throw new GObject.NotImplementedError(); - } - - get backend() { - if (this._backend === undefined) - this._backend = null; - - return this._backend; - } - - set backend(backend) { - this._backend = backend; - } - - get cancellable() { - if (this._cancellable === undefined) - this._cancellable = new Gio.Cancellable(); - - return this._cancellable; - } - - get closed() { - if (this._closed === undefined) - this._closed = false; - - return this._closed; - } - - get input_stream() { - if (this._input_stream === undefined) { - if (this._connection instanceof Gio.IOStream) - return this._connection.get_input_stream(); - - return null; - } - - return this._input_stream; - } - - set input_stream(stream) { - this._input_stream = stream; - } - - get output_stream() { - if (this._output_stream === undefined) { - if (this._connection instanceof Gio.IOStream) - return this._connection.get_output_stream(); - - return null; - } - - return this._output_stream; - } - - set output_stream(stream) { - this._output_stream = stream; - } - - get uuid() { - if (this._uuid === undefined) - this._uuid = GLib.uuid_string_random(); - - return this._uuid; - } - - set uuid(uuid) { - this._uuid = uuid; - } - - /** - * Close the channel. - */ - close() { - throw new GObject.NotImplementedError(); - } - - /** - * Read a packet. - * - * @param {Gio.Cancellable} [cancellable] - A cancellable - * @return {Promise} The packet - */ - async readPacket(cancellable = null) { - if (cancellable === null) - cancellable = this.cancellable; - - if (!(this.input_stream instanceof Gio.DataInputStream)) { - this.input_stream = new Gio.DataInputStream({ - base_stream: this.input_stream, - }); - } - - const [data] = await this.input_stream.read_line_async( - GLib.PRIORITY_DEFAULT, cancellable); - - if (data === null) { - throw new Gio.IOErrorEnum({ - message: 'End of stream', - code: Gio.IOErrorEnum.CONNECTION_CLOSED, - }); - } - - return new Packet(data); - } - - /** - * Send a packet. - * - * @param {Core.Packet} packet - The packet to send - * @param {Gio.Cancellable} [cancellable] - A cancellable - * @return {Promise} %true if successful - */ - sendPacket(packet, cancellable = null) { - if (cancellable === null) - cancellable = this.cancellable; - - return this.output_stream.write_all_async(packet.serialize(), - GLib.PRIORITY_DEFAULT, cancellable); - } - - /** - * Reject a transfer. - * - * @param {Core.Packet} packet - A packet with payload info - */ - rejectTransfer(packet) { - throw new GObject.NotImplementedError(); - } - - /** - * Download a payload from a device. Typically implementations will override - * this with an async function. - * - * @param {Core.Packet} packet - A packet - * @param {Gio.OutputStream} target - The target stream - * @param {Gio.Cancellable} [cancellable] - A cancellable for the upload - */ - download(packet, target, cancellable = null) { - throw new GObject.NotImplementedError(); - } - - - /** - * Upload a payload to a device. Typically implementations will override - * this with an async function. - * - * @param {Core.Packet} packet - The packet describing the transfer - * @param {Gio.InputStream} source - The source stream - * @param {number} size - The payload size - * @param {Gio.Cancellable} [cancellable] - A cancellable for the upload - */ - upload(packet, source, size, cancellable = null) { - throw new GObject.NotImplementedError(); - } -}); - - -/** - * ChannelService implementations provide Channel objects, emitting the - * ChannelService::channel signal when a new connection has been accepted. - */ -export const ChannelService = GObject.registerClass({ - GTypeName: 'GSConnectChannelService', - Properties: { - 'active': GObject.ParamSpec.boolean( - 'active', - 'Active', - 'Whether the service is active', - GObject.ParamFlags.READABLE, - false - ), - 'id': GObject.ParamSpec.string( - 'id', - 'ID', - 'The hostname or other network unique id', - GObject.ParamFlags.READWRITE, - null - ), - 'name': GObject.ParamSpec.string( - 'name', - 'Name', - 'The name of the backend', - GObject.ParamFlags.READWRITE, - null - ), - }, - Signals: { - 'channel': { - flags: GObject.SignalFlags.RUN_LAST, - param_types: [Channel.$gtype], - return_type: GObject.TYPE_BOOLEAN, - }, - }, -}, class ChannelService extends GObject.Object { - - get active() { - if (this._active === undefined) - this._active = false; - - return this._active; - } - - get cancellable() { - if (this._cancellable === undefined) - this._cancellable = new Gio.Cancellable(); - - return this._cancellable; - } - - get name() { - if (this._name === undefined) - this._name = GLib.get_host_name(); - - return this._name; - } - - set name(name) { - if (this.name === name) - return; - - this._name = name; - this.notify('name'); - } - - get id() { - if (this._id === undefined) - this._id = GLib.uuid_string_random(); - - return this._id; - } - - set id(id) { - if (this.id === id) - return; - - this._id = id; - } - - get identity() { - if (this._identity === undefined) - this.buildIdentity(); - - return this._identity; - } - - /** - * Broadcast directly to @address or the whole network if %null - * - * @param {string} [address] - A string address - */ - broadcast(address = null) { - throw new GObject.NotImplementedError(); - } - - /** - * Rebuild the identity packet used to identify the local device. An - * implementation may override this to make modifications to the default - * capabilities if necessary (eg. bluez without SFTP support). - */ - buildIdentity() { - this._identity = new Packet({ - id: 0, - type: 'kdeconnect.identity', - body: { - deviceId: this.id, - deviceName: this.name, - deviceType: _getDeviceType(), - protocolVersion: 7, - incomingCapabilities: [], - outgoingCapabilities: [], - }, - }); - - for (const name in plugins) { - const meta = plugins[name].Metadata; - - if (meta === undefined) - continue; - - for (const type of meta.incomingCapabilities) - this._identity.body.incomingCapabilities.push(type); - - for (const type of meta.outgoingCapabilities) - this._identity.body.outgoingCapabilities.push(type); - } - } - - /** - * Emit Core.ChannelService::channel - * - * @param {Core.Channel} channel - The new channel - */ - channel(channel) { - if (!this.emit('channel', channel)) - channel.close(); - } - - /** - * Start the channel service. Implementations should throw an error if the - * service fails to meet any of its requirements for opening or accepting - * connections. - */ - start() { - throw new GObject.NotImplementedError(); - } - - /** - * Stop the channel service. - */ - stop() { - throw new GObject.NotImplementedError(); - } - - /** - * Destroy the channel service. - */ - destroy() { - } -}); - - -/** - * A class representing a file transfer. - */ -export const Transfer = GObject.registerClass({ - GTypeName: 'GSConnectTransfer', - Properties: { - 'channel': GObject.ParamSpec.object( - 'channel', - 'Channel', - 'The channel that owns this transfer', - GObject.ParamFlags.READWRITE, - Channel.$gtype - ), - 'completed': GObject.ParamSpec.boolean( - 'completed', - 'Completed', - 'Whether the transfer has completed', - GObject.ParamFlags.READABLE, - false - ), - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device that created this transfer', - GObject.ParamFlags.READWRITE, - GObject.Object.$gtype - ), - }, -}, class Transfer extends GObject.Object { - - _init(params = {}) { - super._init(params); - - this._cancellable = new Gio.Cancellable(); - this._items = []; - } - - get channel() { - if (this._channel === undefined) - this._channel = null; - - return this._channel; - } - - set channel(channel) { - if (this.channel === channel) - return; - - this._channel = channel; - } - - get completed() { - if (this._completed === undefined) - this._completed = false; - - return this._completed; - } - - get device() { - if (this._device === undefined) - this._device = null; - - return this._device; - } - - set device(device) { - if (this.device === device) - return; - - this._device = device; - } - - get uuid() { - if (this._uuid === undefined) - this._uuid = GLib.uuid_string_random(); - - return this._uuid; - } - - /** - * Ensure there is a stream for the transfer item. - * - * @param {Object} item - A transfer item - * @param {Gio.Cancellable} [cancellable] - A cancellable - */ - async _ensureStream(item, cancellable = null) { - // This is an upload from a remote device - if (item.packet.hasPayload()) { - if (item.target instanceof Gio.OutputStream) - return; - - if (item.file instanceof Gio.File) { - item.target = await item.file.replace_async( - null, - false, - Gio.FileCreateFlags.REPLACE_DESTINATION, - GLib.PRIORITY_DEFAULT, - this._cancellable); - } - } else { - if (item.source instanceof Gio.InputStream) - return; - - if (item.file instanceof Gio.File) { - const read = item.file.read_async(GLib.PRIORITY_DEFAULT, - cancellable); - - const query = item.file.query_info_async( - Gio.FILE_ATTRIBUTE_STANDARD_SIZE, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, - cancellable); - - const [stream, info] = await Promise.all([read, query]); - item.source = stream; - item.size = info.get_size(); - } - } - } - - /** - * Add a file to the transfer. - * - * @param {Core.Packet} packet - A packet - * @param {Gio.File} file - A file to transfer - */ - addFile(packet, file) { - const item = { - packet: new Packet(packet), - file: file, - source: null, - target: null, - }; - - this._items.push(item); - } - - /** - * Add a filepath to the transfer. - * - * @param {Core.Packet} packet - A packet - * @param {string} path - A filepath to transfer - */ - addPath(packet, path) { - const item = { - packet: new Packet(packet), - file: Gio.File.new_for_path(path), - source: null, - target: null, - }; - - this._items.push(item); - } - - /** - * Add a stream to the transfer. - * - * @param {Core.Packet} packet - A packet - * @param {Gio.InputStream|Gio.OutputStream} stream - A stream to transfer - * @param {number} [size] - Payload size - */ - addStream(packet, stream, size = 0) { - const item = { - packet: new Packet(packet), - file: null, - source: null, - target: null, - size: size, - }; - - if (stream instanceof Gio.InputStream) - item.source = stream; - else if (stream instanceof Gio.OutputStream) - item.target = stream; - - this._items.push(item); - } - - /** - * Execute a transfer operation. Implementations may override this, while - * the default uses g_output_stream_splice(). - * - * @param {Gio.Cancellable} [cancellable] - A cancellable - */ - async start(cancellable = null) { - let error = null; - - try { - let item; - - // If a cancellable is passed in, chain to its signal - if (cancellable instanceof Gio.Cancellable) - cancellable.connect(() => this._cancellable.cancel()); - - while ((item = this._items.shift())) { - // If created for a device, ignore connection changes by - // ensuring we have the most recent channel - if (this.device !== null) - this._channel = this.device.channel; - - // TODO: transfer queueing? - if (this.channel === null || this.channel.closed) { - throw new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.CONNECTION_CLOSED, - message: 'Channel is closed', - }); - } - - await this._ensureStream(item, this._cancellable); - - if (item.packet.hasPayload()) { - await this.channel.download(item.packet, item.target, - this._cancellable); - } else { - await this.channel.upload(item.packet, item.source, - item.size, this._cancellable); - } - } - } catch (e) { - error = e; - } finally { - this._completed = true; - this.notify('completed'); - } - - if (error !== null) - throw error; - } - - cancel() { - if (this._cancellable.is_cancelled() === false) - this._cancellable.cancel(); - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js deleted file mode 100644 index aef96a2e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js +++ /dev/null @@ -1,1105 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../config.js'; -import * as Components from './components/index.js'; -import * as Core from './core.js'; -import plugins from './plugins/index.js'; - -/** - * An object representing a remote device. - * - * Device class is subclassed from Gio.SimpleActionGroup so it implements the - * GActionGroup and GActionMap interfaces, like Gio.Application. - * - */ -const Device = GObject.registerClass({ - GTypeName: 'GSConnectDevice', - Properties: { - 'connected': GObject.ParamSpec.boolean( - 'connected', - 'Connected', - 'Whether the device is connected', - GObject.ParamFlags.READABLE, - false - ), - 'contacts': GObject.ParamSpec.object( - 'contacts', - 'Contacts', - 'The contacts store for this device', - GObject.ParamFlags.READABLE, - GObject.Object - ), - 'encryption-info': GObject.ParamSpec.string( - 'encryption-info', - 'Encryption Info', - 'A formatted string with the local and remote fingerprints', - GObject.ParamFlags.READABLE, - null - ), - 'icon-name': GObject.ParamSpec.string( - 'icon-name', - 'Icon Name', - 'Icon name representing the device', - GObject.ParamFlags.READABLE, - null - ), - 'id': GObject.ParamSpec.string( - 'id', - 'Id', - 'The device hostname or other network unique id', - GObject.ParamFlags.READABLE, - '' - ), - 'name': GObject.ParamSpec.string( - 'name', - 'Name', - 'The device name', - GObject.ParamFlags.READABLE, - null - ), - 'paired': GObject.ParamSpec.boolean( - 'paired', - 'Paired', - 'Whether the device is paired', - GObject.ParamFlags.READABLE, - false - ), - 'type': GObject.ParamSpec.string( - 'type', - 'Type', - 'The device type', - GObject.ParamFlags.READABLE, - null - ), - }, -}, class Device extends Gio.SimpleActionGroup { - - _init(identity) { - super._init(); - - this._id = identity.body.deviceId; - - // GLib.Source timeout id's for pairing requests - this._incomingPairRequest = 0; - this._outgoingPairRequest = 0; - - // Maps of name->Plugin, packet->Plugin, uuid->Transfer - this._plugins = new Map(); - this._handlers = new Map(); - this._procs = new Set(); - this._transfers = new Map(); - - this._outputLock = false; - this._outputQueue = []; - - // GSettings - this.settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect.Device', - true - ), - path: `/org/gnome/shell/extensions/gsconnect/device/${this.id}/`, - }); - this._migratePlugins(); - - // Watch for changes to supported and disabled plugins - this._disabledPluginsChangedId = this.settings.connect( - 'changed::disabled-plugins', - this._onAllowedPluginsChanged.bind(this) - ); - this._supportedPluginsChangedId = this.settings.connect( - 'changed::supported-plugins', - this._onAllowedPluginsChanged.bind(this) - ); - - this._registerActions(); - this.menu = new Gio.Menu(); - - // Parse identity if initialized with a proper packet, otherwise load - if (identity.id !== undefined) - this._handleIdentity(identity); - else - this._loadPlugins(); - } - - get channel() { - if (this._channel === undefined) - this._channel = null; - - return this._channel; - } - - get connected() { - if (this._connected === undefined) - this._connected = false; - - return this._connected; - } - - get connection_type() { - const lastConnection = this.settings.get_string('last-connection'); - - return lastConnection.split('://')[0]; - } - - get contacts() { - const contacts = this._plugins.get('contacts'); - - if (contacts && contacts.settings.get_boolean('contacts-source')) - return contacts._store; - - if (this._contacts === undefined) - this._contacts = Components.acquire('contacts'); - - return this._contacts; - } - - // FIXME: backend should do this stuff - get encryption_info() { - let localCert = null; - let remoteCert = null; - - // Bluetooth connections have no certificate so we use the host address - if (this.connection_type === 'bluetooth') { - // TRANSLATORS: Bluetooth address for remote device - return _('Bluetooth device at %s').format('???'); - - // If the device is connected use the certificate from the connection - } else if (this.connected) { - remoteCert = this.channel.peer_certificate; - - // Otherwise pull it out of the settings - } else if (this.paired) { - remoteCert = Gio.TlsCertificate.new_from_pem( - this.settings.get_string('certificate-pem'), - -1 - ); - } - - // FIXME: another ugly reach-around - let lanBackend; - - if (this.service !== null) - lanBackend = this.service.manager.backends.get('lan'); - - if (lanBackend && lanBackend.certificate) - localCert = lanBackend.certificate; - - - let verificationKey = ''; - if (localCert && remoteCert) { - let a = localCert.pubkey_der(); - let b = remoteCert.pubkey_der(); - if (a.compare(b) < 0) - [a, b] = [b, a]; // swap - const checksum = new GLib.Checksum(GLib.ChecksumType.SHA256); - checksum.update(a.toArray()); - checksum.update(b.toArray()); - verificationKey = checksum.get_string(); - } - - // TRANSLATORS: Label for TLS connection verification key - // - // Example: - // - // Verification key: 0123456789abcdef000000000000000000000000 - return _('Verification key: %s').format(verificationKey); - } - - get id() { - return this._id; - } - - get name() { - return this.settings.get_string('name'); - } - - get paired() { - return this.settings.get_boolean('paired'); - } - - get icon_name() { - switch (this.type) { - case 'laptop': - return 'laptop-symbolic'; - case 'phone': - return 'smartphone-symbolic'; - case 'tablet': - return 'tablet-symbolic'; - case 'tv': - return 'tv-symbolic'; - case 'desktop': - default: - return 'computer-symbolic'; - } - } - - get service() { - if (this._service === undefined) - this._service = Gio.Application.get_default(); - - return this._service; - } - - get type() { - return this.settings.get_string('type'); - } - - _migratePlugins() { - const deprecated = ['photo']; - const supported = this.settings - .get_strv('supported-plugins') - .filter(name => !deprecated.includes(name)); - - this.settings.set_strv('supported-plugins', supported); - } - - _handleIdentity(packet) { - this.freeze_notify(); - - // If we're connected, record the reconnect URI - if (this.channel !== null) - this.settings.set_string('last-connection', this.channel.address); - - // The type won't change, but it might not be properly set yet - if (this.type !== packet.body.deviceType) { - this.settings.set_string('type', packet.body.deviceType); - this.notify('type'); - this.notify('icon-name'); - } - - // The name may change so we check and notify if so - if (this.name !== packet.body.deviceName) { - this.settings.set_string('name', packet.body.deviceName); - this.notify('name'); - } - - // Packets - const incoming = packet.body.incomingCapabilities.sort(); - const outgoing = packet.body.outgoingCapabilities.sort(); - const inc = this.settings.get_strv('incoming-capabilities'); - const out = this.settings.get_strv('outgoing-capabilities'); - - // Only write GSettings if something has changed - if (incoming.join('') !== inc.join('') || outgoing.join('') !== out.join('')) { - this.settings.set_strv('incoming-capabilities', incoming); - this.settings.set_strv('outgoing-capabilities', outgoing); - } - - // Determine supported plugins by matching incoming to outgoing types - const supported = []; - - for (const name in plugins) { - const meta = plugins[name].Metadata; - - if (meta === undefined) - continue; - - // If we can handle packets it sends or send packets it can handle - if (meta.incomingCapabilities.some(t => outgoing.includes(t)) || - meta.outgoingCapabilities.some(t => incoming.includes(t))) - supported.push(name); - } - - // Only write GSettings if something has changed - const currentSupported = this.settings.get_strv('supported-plugins'); - - if (currentSupported.join('') !== supported.sort().join('')) - this.settings.set_strv('supported-plugins', supported); - - this.thaw_notify(); - } - - /** - * Set the channel and start sending/receiving packets. If %null is passed - * the device becomes disconnected. - * - * @param {Core.Channel} [channel] - The new channel - */ - setChannel(channel = null) { - if (this.channel === channel) - return; - - if (this.channel !== null) - this.channel.close(); - - this._channel = channel; - - // If we've disconnected empty the queue, otherwise restart the read - // loop and update the device metadata - if (this.channel === null) { - this._outputQueue.length = 0; - } else { - this._handleIdentity(this.channel.identity); - this._readLoop(channel); - } - - // The connected state didn't change - if (this.connected === !!this.channel) - return; - - // Notify and trigger plugins - this._connected = !!this.channel; - this.notify('connected'); - this._triggerPlugins(); - } - - async _readLoop(channel) { - try { - let packet = null; - - while ((packet = await this.channel.readPacket())) { - debug(packet, this.name); - this.handlePacket(packet); - } - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - debug(e, this.name); - - if (this.channel === channel) - this.setChannel(null); - } - } - - _processExit(proc, result) { - try { - proc.wait_check_finish(result); - } catch (e) { - debug(e); - } - - this.delete(proc); - } - - /** - * Launch a subprocess for the device. If the device becomes unpaired, it is - * assumed the device is no longer trusted and all subprocesses will be - * killed. - * - * @param {string[]} args - process arguments - * @param {Gio.Cancellable} [cancellable] - optional cancellable - * @return {Gio.Subprocess} The subprocess - */ - launchProcess(args, cancellable = null) { - if (this._launcher === undefined) { - const application = GLib.build_filenamev([ - Config.PACKAGE_DATADIR, - 'service', - 'daemon.js', - ]); - - this._launcher = new Gio.SubprocessLauncher(); - this._launcher.setenv('GSCONNECT', application, false); - this._launcher.setenv('GSCONNECT_DEVICE_ID', this.id, false); - this._launcher.setenv('GSCONNECT_DEVICE_NAME', this.name, false); - this._launcher.setenv('GSCONNECT_DEVICE_ICON', this.icon_name, false); - this._launcher.setenv( - 'GSCONNECT_DEVICE_DBUS', - `${Config.APP_PATH}/Device/${this.id.replace(/\W+/g, '_')}`, - false - ); - } - - // Create and track the process - const proc = this._launcher.spawnv(args); - proc.wait_check_async(cancellable, this._processExit.bind(this._procs)); - this._procs.add(proc); - - return proc; - } - - /** - * Handle a packet and pass it to the appropriate plugin. - * - * @param {Core.Packet} packet - The incoming packet object - * @return {undefined} no return value - */ - handlePacket(packet) { - try { - if (packet.type === 'kdeconnect.pair') - return this._handlePair(packet); - - // The device must think we're paired; inform it we are not - if (!this.paired) - return this.unpair(); - - const handler = this._handlers.get(packet.type); - - if (handler !== undefined) - handler.handlePacket(packet); - else - debug(`Unsupported packet type (${packet.type})`, this.name); - } catch (e) { - debug(e, this.name); - } - } - - /** - * Send a packet to the device. - * - * @param {Object} packet - An object of packet data... - */ - async sendPacket(packet) { - try { - if (!this.connected) - return; - - if (!this.paired && packet.type !== 'kdeconnect.pair') - return; - - this._outputQueue.push(new Core.Packet(packet)); - - if (this._outputLock) - return; - - this._outputLock = true; - let next; - - while ((next = this._outputQueue.shift())) { - await this.channel.sendPacket(next); - debug(next, this.name); - } - - this._outputLock = false; - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - debug(e, this.name); - - this._outputLock = false; - } - } - - /** - * Actions - */ - _registerActions() { - // Pairing notification actions - const acceptPair = new Gio.SimpleAction({name: 'pair'}); - acceptPair.connect('activate', this.pair.bind(this)); - this.add_action(acceptPair); - - const rejectPair = new Gio.SimpleAction({name: 'unpair'}); - rejectPair.connect('activate', this.unpair.bind(this)); - this.add_action(rejectPair); - - // Transfer notification actions - const cancelTransfer = new Gio.SimpleAction({ - name: 'cancelTransfer', - parameter_type: new GLib.VariantType('s'), - }); - cancelTransfer.connect('activate', this.cancelTransfer.bind(this)); - this.add_action(cancelTransfer); - - const openPath = new Gio.SimpleAction({ - name: 'openPath', - parameter_type: new GLib.VariantType('s'), - }); - openPath.connect('activate', this.openPath); - this.add_action(openPath); - - const showPathInFolder = new Gio.SimpleAction({ - name: 'showPathInFolder', - parameter_type: new GLib.VariantType('s'), - }); - showPathInFolder.connect('activate', this.showPathInFolder); - this.add_action(showPathInFolder); - - // Preference helpers - const clearCache = new Gio.SimpleAction({ - name: 'clearCache', - parameter_type: null, - }); - clearCache.connect('activate', this._clearCache.bind(this)); - this.add_action(clearCache); - } - - /** - * Get the position of a GMenuItem with @actionName in the top level of the - * device menu. - * - * @param {string} actionName - An action name with scope (eg. device.foo) - * @return {number} An 0-based index or -1 if not found - */ - getMenuAction(actionName) { - for (let i = 0, len = this.menu.get_n_items(); i < len; i++) { - try { - const val = this.menu.get_item_attribute_value(i, 'action', null); - - if (val.unpack() === actionName) - return i; - } catch (e) { - continue; - } - } - - return -1; - } - - /** - * Add a GMenuItem to the top level of the device menu - * - * @param {Gio.MenuItem} menuItem - A GMenuItem - * @param {number} [index] - The position to place the item - * @return {number} The position the item was placed - */ - addMenuItem(menuItem, index = -1) { - try { - if (index > -1) { - this.menu.insert_item(index, menuItem); - return index; - } - - this.menu.append_item(menuItem); - return this.menu.get_n_items(); - } catch (e) { - debug(e, this.name); - return -1; - } - } - - /** - * Add a Device GAction to the top level of the device menu - * - * @param {Gio.Action} action - A GAction - * @param {number} [index] - The position to place the item - * @param {string} label - A label for the item - * @param {string} icon_name - A themed icon name for the item - * @return {number} The position the item was placed - */ - addMenuAction(action, index = -1, label, icon_name) { - try { - const item = new Gio.MenuItem(); - - if (label) - item.set_label(label); - - if (icon_name) - item.set_icon(new Gio.ThemedIcon({name: icon_name})); - - item.set_attribute_value( - 'hidden-when', - new GLib.Variant('s', 'action-disabled') - ); - - item.set_detailed_action(`device.${action.name}`); - - return this.addMenuItem(item, index); - } catch (e) { - debug(e, this.name); - return -1; - } - } - - /** - * Remove a GAction from the top level of the device menu by action name - * - * @param {string} actionName - A GAction name, including scope - * @return {number} The position the item was removed from or -1 - */ - removeMenuAction(actionName) { - try { - const index = this.getMenuAction(actionName); - - if (index > -1) - this.menu.remove(index); - - return index; - } catch (e) { - debug(e, this.name); - return -1; - } - } - - /** - * Withdraw a device notification. - * - * @param {string} id - Id for the notification to withdraw - */ - hideNotification(id) { - if (this.service === null) - return; - - this.service.withdraw_notification(`${this.id}|${id}`); - } - - /** - * Show a device notification. - * - * @param {Object} params - A dictionary of notification parameters - * @param {number} [params.id] - A UNIX epoch timestamp (ms) - * @param {string} [params.title] - A title - * @param {string} [params.body] - A body - * @param {Gio.Icon} [params.icon] - An icon - * @param {Gio.NotificationPriority} [params.priority] - The priority - * @param {Array} [params.actions] - A dictionary of action parameters - * @param {Array} [params.buttons] - An Array of buttons - */ - showNotification(params) { - if (this.service === null) - return; - - // KDE Connect on Android can sometimes give an undefined for params.body - Object.keys(params) - .forEach(key => params[key] === undefined && delete params[key]); - - params = Object.assign({ - id: Date.now(), - title: this.name, - body: '', - icon: new Gio.ThemedIcon({name: this.icon_name}), - priority: Gio.NotificationPriority.NORMAL, - action: null, - buttons: [], - }, params); - - const notif = new Gio.Notification(); - notif.set_title(params.title); - notif.set_body(params.body); - notif.set_icon(params.icon); - notif.set_priority(params.priority); - - // Default Action - if (params.action) { - const hasParameter = (params.action.parameter !== null); - - if (!hasParameter) - params.action.parameter = new GLib.Variant('s', ''); - - notif.set_default_action_and_target( - 'app.device', - new GLib.Variant('(ssbv)', [ - this.id, - params.action.name, - hasParameter, - params.action.parameter, - ]) - ); - } - - // Buttons - for (const button of params.buttons) { - const hasParameter = (button.parameter !== null); - - if (!hasParameter) - button.parameter = new GLib.Variant('s', ''); - - notif.add_button_with_target( - button.label, - 'app.device', - new GLib.Variant('(ssbv)', [ - this.id, - button.action, - hasParameter, - button.parameter, - ]) - ); - } - - this.service.send_notification(`${this.id}|${params.id}`, notif); - } - - /** - * Cancel an ongoing file transfer. - * - * @param {Gio.Action} action - The GAction - * @param {GLib.Variant} parameter - The activation parameter - */ - cancelTransfer(action, parameter) { - try { - const uuid = parameter.unpack(); - const transfer = this._transfers.get(uuid); - - if (transfer === undefined) - return; - - this._transfers.delete(uuid); - transfer.cancel(); - } catch (e) { - logError(e, this.name); - } - } - - /** - * Create a transfer object. - * - * @return {Core.Transfer} A new transfer - */ - createTransfer() { - const transfer = new Core.Transfer({device: this}); - - // Track the transfer - this._transfers.set(transfer.uuid, transfer); - - transfer.connect('notify::completed', (transfer) => { - this._transfers.delete(transfer.uuid); - }); - - return transfer; - } - - /** - * Reject the transfer payload described by @packet. - * - * @param {Core.Packet} packet - A packet - * @return {Promise} A promise for the operation - */ - rejectTransfer(packet) { - if (!packet || !packet.hasPayload()) - return; - - return this.channel.rejectTransfer(packet); - } - - openPath(action, parameter) { - const path = parameter.unpack(); - - // Normalize paths to URIs, assuming local file - const uri = path.includes('://') ? path : `file://${path}`; - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } - - showPathInFolder(action, parameter) { - const path = parameter.unpack(); - const uri = path.includes('://') ? path : `file://${path}`; - - const connection = Gio.DBus.session; - connection.call( - 'org.freedesktop.FileManager1', - '/org/freedesktop/FileManager1', - 'org.freedesktop.FileManager1', - 'ShowItems', - new GLib.Variant('(ass)', [[uri], 's']), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (connection, res) => { - try { - connection.call_finish(res); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - logError(e); - } - } - ); - } - - _clearCache(action, parameter) { - for (const plugin of this._plugins.values()) { - try { - plugin.clearCache(); - } catch (e) { - debug(e, this.name); - } - } - } - - /** - * Pair request handler - * - * @param {Core.Packet} packet - A complete kdeconnect.pair packet - */ - _handlePair(packet) { - // A pair has been requested/confirmed - if (packet.body.pair) { - // The device is accepting our request - if (this._outgoingPairRequest) { - this._setPaired(true); - this._loadPlugins(); - - // The device thinks we're unpaired - } else if (this.paired) { - this._setPaired(true); - this.sendPacket({ - type: 'kdeconnect.pair', - body: {pair: true}, - }); - this._triggerPlugins(); - - // The device is requesting pairing - } else { - this._notifyPairRequest(); - } - // Device is requesting unpairing/rejecting our request - } else { - this._setPaired(false); - this._unloadPlugins(); - } - } - - /** - * Notify the user of an incoming pair request and set a 30s timeout - */ - _notifyPairRequest() { - // Reset any active request - this._resetPairRequest(); - - this.showNotification({ - id: 'pair-request', - // TRANSLATORS: eg. Pair Request from Google Pixel - title: _('Pair Request from %s').format(this.name), - body: this.encryption_info, - icon: new Gio.ThemedIcon({name: 'channel-insecure-symbolic'}), - priority: Gio.NotificationPriority.URGENT, - buttons: [ - { - action: 'unpair', - label: _('Reject'), - parameter: null, - }, - { - action: 'pair', - label: _('Accept'), - parameter: null, - }, - ], - }); - - // Start a 30s countdown - this._incomingPairRequest = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - 30, - this._setPaired.bind(this, false) - ); - } - - /** - * Reset pair request timeouts and withdraw any notifications - */ - _resetPairRequest() { - this.hideNotification('pair-request'); - - if (this._incomingPairRequest) { - GLib.source_remove(this._incomingPairRequest); - this._incomingPairRequest = 0; - } - - if (this._outgoingPairRequest) { - GLib.source_remove(this._outgoingPairRequest); - this._outgoingPairRequest = 0; - } - } - - /** - * Set the internal paired state of the device and emit ::notify - * - * @param {boolean} paired - The paired state to set - */ - _setPaired(paired) { - this._resetPairRequest(); - - // For TCP connections we store or reset the TLS Certificate - if (this.connection_type === 'lan') { - if (paired) { - this.settings.set_string( - 'certificate-pem', - this.channel.peer_certificate.certificate_pem - ); - } else { - this.settings.reset('certificate-pem'); - } - } - - // If we've become unpaired, stop all subprocesses and transfers - if (!paired) { - for (const proc of this._procs) - proc.force_exit(); - - this._procs.clear(); - - for (const transfer of this._transfers.values()) - transfer.close(); - - this._transfers.clear(); - } - - this.settings.set_boolean('paired', paired); - this.notify('paired'); - } - - /** - * Send or accept an incoming pair request; also exported as a GAction - */ - pair() { - try { - // If we're accepting an incoming pair request, set the internal - // paired state and send the confirmation before loading plugins. - if (this._incomingPairRequest) { - this._setPaired(true); - - this.sendPacket({ - type: 'kdeconnect.pair', - body: {pair: true}, - }); - - this._loadPlugins(); - - // If we're initiating an outgoing pair request, be sure the timer - // is reset before sending the request and setting a 30s timeout. - } else if (!this.paired) { - this._resetPairRequest(); - - this.sendPacket({ - type: 'kdeconnect.pair', - body: {pair: true}, - }); - - this._outgoingPairRequest = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - 30, - this._setPaired.bind(this, false) - ); - } - } catch (e) { - logError(e, this.name); - } - } - - /** - * Unpair or reject an incoming pair request; also exported as a GAction - */ - unpair() { - try { - if (this.connected) { - this.sendPacket({ - type: 'kdeconnect.pair', - body: {pair: false}, - }); - } - - this._setPaired(false); - this._unloadPlugins(); - } catch (e) { - logError(e, this.name); - } - } - - /* - * Plugin Functions - */ - _onAllowedPluginsChanged(settings) { - const disabled = this.settings.get_strv('disabled-plugins'); - const supported = this.settings.get_strv('supported-plugins'); - const allowed = supported.filter(name => !disabled.includes(name)); - - // Unload any plugins that are disabled or unsupported - this._plugins.forEach(plugin => { - if (!allowed.includes(plugin.name)) - this._unloadPlugin(plugin.name); - }); - - // Make sure we change the contacts store if the plugin was disabled - if (!allowed.includes('contacts')) - this.notify('contacts'); - - // Load allowed plugins - for (const name of allowed) - this._loadPlugin(name); - } - - _loadPlugin(name) { - let handler, plugin; - - try { - if (this.paired && !this._plugins.has(name)) { - // Instantiate the handler - handler = plugins[name]; - plugin = new handler.default(this); - - // Register packet handlers - for (const packetType of handler.Metadata.incomingCapabilities) - this._handlers.set(packetType, plugin); - - // Register plugin - this._plugins.set(name, plugin); - - // Run the connected()/disconnected() handler - if (this.connected) - plugin.connected(); - else - plugin.disconnected(); - } - } catch (e) { - if (plugin !== undefined) - plugin.destroy(); - - if (this.service !== null) - this.service.notify_error(e); - else - logError(e, this.name); - } - } - - async _loadPlugins() { - const disabled = this.settings.get_strv('disabled-plugins'); - - for (const name of this.settings.get_strv('supported-plugins')) { - if (!disabled.includes(name)) - await this._loadPlugin(name); - } - } - - _unloadPlugin(name) { - let handler, plugin; - - try { - if (this._plugins.has(name)) { - // Unregister packet handlers - handler = plugins[name]; - - for (const type of handler.Metadata.incomingCapabilities) - this._handlers.delete(type); - - // Unregister plugin - plugin = this._plugins.get(name); - this._plugins.delete(name); - plugin.destroy(); - } - } catch (e) { - logError(e, this.name); - } - } - - async _unloadPlugins() { - for (const name of this._plugins.keys()) - await this._unloadPlugin(name); - } - - _triggerPlugins() { - for (const plugin of this._plugins.values()) { - if (this.connected) - plugin.connected(); - else - plugin.disconnected(); - } - } - - destroy() { - // Drop the default contacts store if we were using it - if (this._contacts !== undefined) - this._contacts = Components.release('contacts'); - - // Close the channel if still connected - if (this.channel !== null) - this.channel.close(); - - // Synchronously destroy plugins - this._plugins.forEach(plugin => plugin.destroy()); - this._plugins.clear(); - - // Dispose GSettings - this.settings.disconnect(this._disabledPluginsChangedId); - this.settings.disconnect(this._supportedPluginsChangedId); - this.settings.run_dispose(); - - GObject.signal_handlers_destroy(this); - } -}); - -export default Device; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_daemon.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_daemon.js deleted file mode 100644 index 1ddb3569..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_daemon.js +++ /dev/null @@ -1,702 +0,0 @@ -#!/usr/bin/env -S gjs -m - -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk?version=3.0'; -import 'gi://GdkPixbuf?version=2.0'; -import Gio from 'gi://Gio?version=2.0'; -import 'gi://GIRepository?version=2.0'; -import GLib from 'gi://GLib?version=2.0'; -import GObject from 'gi://GObject?version=2.0'; -import Gtk from 'gi://Gtk?version=3.0'; -import 'gi://Pango?version=1.0'; - -import system from 'system'; - -import './init.js'; - -import Config from '../config.js'; -import Manager from './manager.js'; -import * as ServiceUI from './ui/service.js'; - -import('gi://GioUnix?version=2.0').catch(() => {}); // Set version for optional dependency - - -/** - * Class representing the GSConnect service daemon. - */ -const Service = GObject.registerClass({ - GTypeName: 'GSConnectService', -}, class Service extends Gtk.Application { - - _init() { - super._init({ - application_id: 'org.gnome.Shell.Extensions.GSConnect', - flags: Gio.ApplicationFlags.HANDLES_OPEN, - resource_base_path: '/org/gnome/Shell/Extensions/GSConnect', - }); - - GLib.set_prgname('gsconnect'); - GLib.set_application_name('GSConnect'); - - // Command-line - this._initOptions(); - } - - get settings() { - if (this._settings === undefined) { - this._settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup(Config.APP_ID, true), - }); - } - - return this._settings; - } - - /* - * GActions - */ - _initActions() { - const actions = [ - ['connect', this._identify.bind(this), new GLib.VariantType('s')], - ['device', this._device.bind(this), new GLib.VariantType('(ssbv)')], - ['error', this._error.bind(this), new GLib.VariantType('a{ss}')], - ['preferences', this._preferences, null], - ['quit', () => this.quit(), null], - ['refresh', this._identify.bind(this), null], - ]; - - for (const [name, callback, type] of actions) { - const action = new Gio.SimpleAction({ - name: name, - parameter_type: type, - }); - action.connect('activate', callback); - this.add_action(action); - } - } - - /** - * A wrapper for Device GActions. This is used to route device notification - * actions to their device, since GNotifications need an 'app' level action. - * - * @param {Gio.Action} action - The GAction - * @param {GLib.Variant} parameter - The activation parameter - */ - _device(action, parameter) { - try { - parameter = parameter.unpack(); - - // Select the appropriate device(s) - let devices; - const id = parameter[0].unpack(); - - if (id === '*') - devices = this.manager.devices.values(); - else - devices = [this.manager.devices.get(id)]; - - // Unpack the action data and activate the action - const name = parameter[1].unpack(); - const target = parameter[2].unpack() ? parameter[3].unpack() : null; - - for (const device of devices) - device.activate_action(name, target); - } catch (e) { - logError(e); - } - } - - _error(action, parameter) { - try { - const error = parameter.deepUnpack(); - - // If there's a URL, we have better information in the Wiki - if (error.url !== undefined) { - Gio.AppInfo.launch_default_for_uri_async( - error.url, - null, - null, - null - ); - return; - } - - const dialog = new ServiceUI.ErrorDialog(error); - dialog.present(); - } catch (e) { - logError(e); - } - } - - _identify(action, parameter) { - try { - let uri = null; - - if (parameter instanceof GLib.Variant) - uri = parameter.unpack(); - - this.manager.identify(uri); - } catch (e) { - logError(e); - } - } - - _preferences() { - Gio.Subprocess.new( - [`${Config.PACKAGE_DATADIR}/gsconnect-preferences`], - Gio.SubprocessFlags.NONE - ); - } - - /** - * Report a service-level error - * - * @param {Object} error - An Error or object with name, message and stack - */ - notify_error(error) { - try { - // Always log the error - logError(error); - - // Create an new notification - let id, body, priority; - const notif = new Gio.Notification(); - const icon = new Gio.ThemedIcon({name: 'dialog-error'}); - let target = null; - - if (error.name === undefined) - error.name = 'Error'; - - if (error.url !== undefined) { - id = error.url; - body = _('Click for help troubleshooting'); - priority = Gio.NotificationPriority.URGENT; - - target = new GLib.Variant('a{ss}', { - name: error.name.trim(), - message: error.message.trim(), - stack: error.stack.trim(), - url: error.url, - }); - } else { - id = error.message.trim(); - body = _('Click for more information'); - priority = Gio.NotificationPriority.HIGH; - - target = new GLib.Variant('a{ss}', { - name: error.name.trim(), - message: error.message.trim(), - stack: error.stack.trim(), - }); - } - - notif.set_title(`GSConnect: ${error.name.trim()}`); - notif.set_body(body); - notif.set_icon(icon); - notif.set_priority(priority); - notif.set_default_action_and_target('app.error', target); - - this.send_notification(id, notif); - } catch (e) { - logError(e); - } - } - - vfunc_activate() { - super.vfunc_activate(); - } - - vfunc_startup() { - super.vfunc_startup(); - - this.hold(); - - // Watch *this* file and stop the service if it's updated/uninstalled - this._serviceMonitor = Gio.File.new_for_path( - `${Config.PACKAGE_DATADIR}/service/daemon.js` - ).monitor(Gio.FileMonitorFlags.WATCH_MOVES, null); - this._serviceMonitor.connect('changed', () => this.quit()); - - // Init some resources - const provider = new Gtk.CssProvider(); - provider.load_from_resource(`${Config.APP_PATH}/application.css`); - Gtk.StyleContext.add_provider_for_screen( - Gdk.Screen.get_default(), - provider, - Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION - ); - - // Ensure our handlers are registered - try { - const appInfo = Gio.DesktopAppInfo.new(`${Config.APP_ID}.desktop`); - appInfo.add_supports_type('x-scheme-handler/sms'); - appInfo.add_supports_type('x-scheme-handler/tel'); - } catch (e) { - debug(e); - } - - // GActions & GSettings - this._initActions(); - - this.manager.start(); - } - - vfunc_dbus_register(connection, object_path) { - if (!super.vfunc_dbus_register(connection, object_path)) - return false; - - this.manager = new Manager({ - connection: connection, - object_path: object_path, - }); - - return true; - } - - vfunc_dbus_unregister(connection, object_path) { - this.manager.destroy(); - - super.vfunc_dbus_unregister(connection, object_path); - } - - vfunc_open(files, hint) { - super.vfunc_open(files, hint); - - for (const file of files) { - let action, parameter, title; - - try { - switch (file.get_uri_scheme()) { - case 'sms': - title = _('Send SMS'); - action = 'uriSms'; - parameter = new GLib.Variant('s', file.get_uri()); - break; - - case 'tel': - title = _('Dial Number'); - action = 'shareUri'; - parameter = new GLib.Variant('s', file.get_uri()); - break; - - case 'file': - title = _('Share File'); - action = 'shareFile'; - parameter = new GLib.Variant('(sb)', [file.get_uri(), false]); - break; - - default: - throw new Error(`Unsupported URI: ${file.get_uri()}`); - } - - // Show chooser dialog - new ServiceUI.DeviceChooser({ - title: title, - action_name: action, - action_target: parameter, - }); - } catch (e) { - logError(e, `GSConnect: Opening ${file.get_uri()}`); - } - } - } - - vfunc_shutdown() { - // Dispose GSettings - if (this._settings !== undefined) - this.settings.run_dispose(); - - this.manager.stop(); - - // Exhaust the event loop to ensure any pending operations complete - const context = GLib.MainContext.default(); - - while (context.iteration(false)) - continue; - - // Force a GC to prevent any more calls back into JS, then chain-up - system.gc(); - super.vfunc_shutdown(); - } - - /* - * CLI - */ - _initOptions() { - /* - * Device Listings - */ - this.add_main_option( - 'list-devices', - 'l'.charCodeAt(0), - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('List available devices'), - null - ); - - this.add_main_option( - 'list-all', - 'a'.charCodeAt(0), - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('List all devices'), - null - ); - - this.add_main_option( - 'device', - 'd'.charCodeAt(0), - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Target Device'), - '' - ); - - /** - * Pairing - */ - this.add_main_option( - 'pair', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('Pair'), - null - ); - - this.add_main_option( - 'unpair', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('Unpair'), - null - ); - - /* - * Messaging - */ - this.add_main_option( - 'message', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING_ARRAY, - _('Send SMS'), - '' - ); - - this.add_main_option( - 'message-body', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Message Body'), - '' - ); - - /* - * Notifications - */ - this.add_main_option( - 'notification', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Send Notification'), - '' - ); - - this.add_main_option( - 'notification-appname', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Notification App Name'), - '<name>' - ); - - this.add_main_option( - 'notification-body', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Notification Body'), - '<text>' - ); - - this.add_main_option( - 'notification-icon', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Notification Icon'), - '<icon-name>' - ); - - this.add_main_option( - 'notification-id', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Notification ID'), - '<id>' - ); - - this.add_main_option( - 'ping', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('Ping'), - null - ); - - this.add_main_option( - 'ring', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('Ring'), - null - ); - - /* - * Sharing - */ - this.add_main_option( - 'share-file', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.FILENAME_ARRAY, - _('Share File'), - '<filepath|URI>' - ); - - this.add_main_option( - 'share-link', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING_ARRAY, - _('Share Link'), - '<URL>' - ); - - this.add_main_option( - 'share-text', - 0, - GLib.OptionFlags.NONE, - GLib.OptionArg.STRING, - _('Share Text'), - '<text>' - ); - - /* - * Misc - */ - this.add_main_option( - 'version', - 'v'.charCodeAt(0), - GLib.OptionFlags.NONE, - GLib.OptionArg.NONE, - _('Show release version'), - null - ); - } - - _cliAction(id, name, parameter = null) { - const parameters = []; - - if (parameter instanceof GLib.Variant) - parameters[0] = parameter; - - id = id.replace(/\W+/g, '_'); - - Gio.DBus.session.call_sync( - 'org.gnome.Shell.Extensions.GSConnect', - `/org/gnome/Shell/Extensions/GSConnect/Device/${id}`, - 'org.gtk.Actions', - 'Activate', - GLib.Variant.new('(sava{sv})', [name, parameters, {}]), - null, - Gio.DBusCallFlags.NONE, - -1, - null - ); - } - - _cliListDevices(full = true) { - const result = Gio.DBus.session.call_sync( - 'org.gnome.Shell.Extensions.GSConnect', - '/org/gnome/Shell/Extensions/GSConnect', - 'org.freedesktop.DBus.ObjectManager', - 'GetManagedObjects', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - null - ); - - const variant = result.unpack()[0].unpack(); - let device; - - for (let object of Object.values(variant)) { - object = object.recursiveUnpack(); - device = object['org.gnome.Shell.Extensions.GSConnect.Device']; - - if (full) - print(`${device.Id}\t${device.Name}\t${device.Connected}\t${device.Paired}`); - else if (device.Connected && device.Paired) - print(device.Id); - } - } - - _cliMessage(id, options) { - if (!options.contains('message-body')) - throw new TypeError('missing --message-body option'); - - // TODO: currently we only support single-recipient messaging - const addresses = options.lookup_value('message', null).deepUnpack(); - const body = options.lookup_value('message-body', null).deepUnpack(); - - this._cliAction( - id, - 'sendSms', - GLib.Variant.new('(ss)', [addresses[0], body]) - ); - } - - _cliNotify(id, options) { - const title = options.lookup_value('notification', null).unpack(); - let body = ''; - let icon = null; - let nid = `${Date.now()}`; - let appName = 'GSConnect CLI'; - - if (options.contains('notification-id')) - nid = options.lookup_value('notification-id', null).unpack(); - - if (options.contains('notification-body')) - body = options.lookup_value('notification-body', null).unpack(); - - if (options.contains('notification-appname')) - appName = options.lookup_value('notification-appname', null).unpack(); - - if (options.contains('notification-icon')) { - icon = options.lookup_value('notification-icon', null).unpack(); - icon = Gio.Icon.new_for_string(icon); - } else { - icon = new Gio.ThemedIcon({ - name: 'org.gnome.Shell.Extensions.GSConnect', - }); - } - - const notification = new GLib.Variant('a{sv}', { - appName: GLib.Variant.new_string(appName), - id: GLib.Variant.new_string(nid), - title: GLib.Variant.new_string(title), - text: GLib.Variant.new_string(body), - ticker: GLib.Variant.new_string(`${title}: ${body}`), - time: GLib.Variant.new_string(`${Date.now()}`), - isClearable: GLib.Variant.new_boolean(true), - icon: icon.serialize(), - }); - - this._cliAction(id, 'sendNotification', notification); - } - - _cliShareFile(device, options) { - const files = options.lookup_value('share-file', null).deepUnpack(); - - for (let file of files) { - file = new TextDecoder().decode(file); - this._cliAction(device, 'shareFile', GLib.Variant.new('(sb)', [file, false])); - } - } - - _cliShareLink(device, options) { - const uris = options.lookup_value('share-link', null).unpack(); - - for (const uri of uris) - this._cliAction(device, 'shareUri', uri); - } - - _cliShareText(device, options) { - const text = options.lookup_value('share-text', null).unpack(); - - this._cliAction(device, 'shareText', GLib.Variant.new_string(text)); - } - - vfunc_handle_local_options(options) { - try { - if (options.contains('version')) { - print(`GSConnect ${Config.PACKAGE_VERSION}`); - return 0; - } - - this.register(null); - - if (options.contains('list-devices')) { - this._cliListDevices(false); - return 0; - } - - if (options.contains('list-all')) { - this._cliListDevices(true); - return 0; - } - - // We need a device for anything else; exit since this is probably - // the daemon being started. - if (!options.contains('device')) - return -1; - - const id = options.lookup_value('device', null).unpack(); - - // Pairing - if (options.contains('pair')) { - this._cliAction(id, 'pair'); - return 0; - } - - if (options.contains('unpair')) { - this._cliAction(id, 'unpair'); - return 0; - } - - // Plugins - if (options.contains('message')) - this._cliMessage(id, options); - - if (options.contains('notification')) - this._cliNotify(id, options); - - if (options.contains('ping')) - this._cliAction(id, 'ping', GLib.Variant.new_string('')); - - if (options.contains('ring')) - this._cliAction(id, 'ring'); - - if (options.contains('share-file')) - this._cliShareFile(id, options); - - if (options.contains('share-link')) - this._cliShareLink(id, options); - - if (options.contains('share-text')) - this._cliShareText(id, options); - - return 0; - } catch (e) { - logError(e); - return 1; - } - } -}); - -await (new Service()).runAsync([system.programInvocationName].concat(ARGV)); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_nativeMessagingHost.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_nativeMessagingHost.js deleted file mode 100644 index 297d180a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/executable_nativeMessagingHost.js +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/env -S gjs -m - -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio?version=2.0'; -import GLib from 'gi://GLib?version=2.0'; -import GObject from 'gi://GObject?version=2.0'; - -import system from 'system'; - -// Retain compatibility with GLib < 2.80, which lacks GioUnix -let GioUnix; -try { - GioUnix = (await import('gi://GioUnix?version=2.0')).default; -} catch (e) { - GioUnix = { - InputStream: Gio.UnixInputStream, - OutputStream: Gio.UnixOutputStream, - }; -} - - -const NativeMessagingHost = GObject.registerClass({ - GTypeName: 'GSConnectNativeMessagingHost', -}, class NativeMessagingHost extends Gio.Application { - - _init() { - super._init({ - application_id: 'org.gnome.Shell.Extensions.GSConnect.NativeMessagingHost', - flags: Gio.ApplicationFlags.NON_UNIQUE, - }); - } - - get devices() { - if (this._devices === undefined) - this._devices = {}; - - return this._devices; - } - - vfunc_activate() { - super.vfunc_activate(); - } - - vfunc_startup() { - super.vfunc_startup(); - this.hold(); - - // IO Channels - this._stdin = new Gio.DataInputStream({ - base_stream: new GioUnix.InputStream({fd: 0}), - byte_order: Gio.DataStreamByteOrder.HOST_ENDIAN, - }); - - this._stdout = new Gio.DataOutputStream({ - base_stream: new GioUnix.OutputStream({fd: 1}), - byte_order: Gio.DataStreamByteOrder.HOST_ENDIAN, - }); - - const source = this._stdin.base_stream.create_source(null); - source.set_callback(this.receive.bind(this)); - source.attach(null); - - // Device Manager - try { - this._manager = Gio.DBusObjectManagerClient.new_for_bus_sync( - Gio.BusType.SESSION, - Gio.DBusObjectManagerClientFlags.DO_NOT_AUTO_START, - 'org.gnome.Shell.Extensions.GSConnect', - '/org/gnome/Shell/Extensions/GSConnect', - null, - null - ); - } catch (e) { - logError(e); - this.quit(); - } - - // Add currently managed devices - for (const object of this._manager.get_objects()) { - for (const iface of object.get_interfaces()) - this._onInterfaceAdded(this._manager, object, iface); - } - - // Watch for new and removed devices - this._manager.connect( - 'interface-added', - this._onInterfaceAdded.bind(this) - ); - this._manager.connect( - 'object-removed', - this._onObjectRemoved.bind(this) - ); - - // Watch for device property changes - this._manager.connect( - 'interface-proxy-properties-changed', - this.sendDeviceList.bind(this) - ); - - // Watch for service restarts - this._manager.connect( - 'notify::name-owner', - this.sendDeviceList.bind(this) - ); - - this.send({ - type: 'connected', - data: (this._manager.name_owner !== null), - }); - } - - receive() { - try { - // Read the message - const length = this._stdin.read_int32(null); - const bytes = this._stdin.read_bytes(length, null).toArray(); - const message = JSON.parse(new TextDecoder().decode(bytes)); - - // A request for a list of devices - if (message.type === 'devices') { - this.sendDeviceList(); - - // A request to invoke an action - } else if (message.type === 'share') { - let actionName; - const device = this.devices[message.data.device]; - - if (device) { - if (message.data.action === 'share') - actionName = 'shareUri'; - else if (message.data.action === 'telephony') - actionName = 'shareSms'; - - device.actions.activate_action( - actionName, - new GLib.Variant('s', message.data.url) - ); - } - } - - return GLib.SOURCE_CONTINUE; - } catch (e) { - this.quit(); - } - } - - send(message) { - try { - const data = JSON.stringify(message); - this._stdout.put_int32(data.length, null); - this._stdout.put_string(data, null); - } catch (e) { - this.quit(); - } - } - - sendDeviceList() { - // Inform the WebExtension we're disconnected from the service - if (this._manager && this._manager.name_owner === null) - return this.send({type: 'connected', data: false}); - - // Collect all the devices with supported actions - const available = []; - - for (const device of Object.values(this.devices)) { - const share = device.actions.get_action_enabled('shareUri'); - const telephony = device.actions.get_action_enabled('shareSms'); - - if (share || telephony) { - available.push({ - id: device.g_object_path, - name: device.name, - type: device.type, - share: share, - telephony: telephony, - }); - } - } - - this.send({type: 'devices', data: available}); - } - - _proxyGetter(name) { - try { - return this.get_cached_property(name).unpack(); - } catch (e) { - return null; - } - } - - _onInterfaceAdded(manager, object, iface) { - Object.defineProperties(iface, { - 'name': { - get: this._proxyGetter.bind(iface, 'Name'), - enumerable: true, - }, - // TODO: phase this out for icon-name - 'type': { - get: this._proxyGetter.bind(iface, 'Type'), - enumerable: true, - }, - }); - - iface.actions = Gio.DBusActionGroup.get( - iface.g_connection, - iface.g_name, - iface.g_object_path - ); - - this.devices[iface.g_object_path] = iface; - this.sendDeviceList(); - } - - _onObjectRemoved(manager, object) { - delete this.devices[object.g_object_path]; - this.sendDeviceList(); - } -}); - -// NOTE: must not pass ARGV -await (new NativeMessagingHost()).runAsync([system.programInvocationName]); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js deleted file mode 100644 index 313c70bd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js +++ /dev/null @@ -1,428 +0,0 @@ -// 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js deleted file mode 100644 index 1f3f86d1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js +++ /dev/null @@ -1,515 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../config.js'; -import * as DBus from './utils/dbus.js'; -import Device from './device.js'; - -import * as LanBackend from './backends/lan.js'; - -const DEVICE_NAME = 'org.gnome.Shell.Extensions.GSConnect.Device'; -const DEVICE_PATH = '/org/gnome/Shell/Extensions/GSConnect/Device'; -const DEVICE_IFACE = Config.DBUS.lookup_interface(DEVICE_NAME); - - -const backends = { - lan: LanBackend, -}; - - -/** - * A manager for devices. - */ -const Manager = GObject.registerClass({ - GTypeName: 'GSConnectManager', - Properties: { - 'active': GObject.ParamSpec.boolean( - 'active', - 'Active', - 'Whether the manager is active', - GObject.ParamFlags.READABLE, - false - ), - 'discoverable': GObject.ParamSpec.boolean( - 'discoverable', - 'Discoverable', - 'Whether the service responds to discovery requests', - GObject.ParamFlags.READWRITE, - false - ), - 'id': GObject.ParamSpec.string( - 'id', - 'Id', - 'The hostname or other network unique id', - GObject.ParamFlags.READWRITE, - null - ), - 'name': GObject.ParamSpec.string( - 'name', - 'Name', - 'The name announced to the network', - GObject.ParamFlags.READWRITE, - 'GSConnect' - ), - }, -}, class Manager extends Gio.DBusObjectManagerServer { - - _init(params = {}) { - super._init(params); - - this._exported = new WeakMap(); - this._reconnectId = 0; - - this._settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup(Config.APP_ID, true), - }); - this._initSettings(); - } - - get active() { - if (this._active === undefined) - this._active = false; - - return this._active; - } - - get backends() { - if (this._backends === undefined) - this._backends = new Map(); - - return this._backends; - } - - get devices() { - if (this._devices === undefined) - this._devices = new Map(); - - return this._devices; - } - - get discoverable() { - if (this._discoverable === undefined) - this._discoverable = this.settings.get_boolean('discoverable'); - - return this._discoverable; - } - - set discoverable(value) { - if (this.discoverable === value) - return; - - this._discoverable = value; - this.notify('discoverable'); - - // FIXME: This whole thing just keeps getting uglier - const application = Gio.Application.get_default(); - - if (application === null) - return; - - if (this.discoverable) { - Gio.Application.prototype.withdraw_notification.call( - application, - 'discovery-warning' - ); - } else { - const notif = new Gio.Notification(); - notif.set_title(_('Discovery Disabled')); - notif.set_body(_('Discovery has been disabled due to the number of devices on this network.')); - notif.set_icon(new Gio.ThemedIcon({name: 'dialog-warning'})); - notif.set_priority(Gio.NotificationPriority.HIGH); - notif.set_default_action('app.preferences'); - - Gio.Application.prototype.withdraw_notification.call( - application, - 'discovery-warning', - notif - ); - } - } - - get id() { - if (this._id === undefined) - this._id = this.settings.get_string('id'); - - return this._id; - } - - set id(value) { - if (this.id === value) - return; - - this._id = value; - this.notify('id'); - } - - get name() { - if (this._name === undefined) - this._name = this.settings.get_string('name'); - - return this._name; - } - - set name(value) { - if (this.name === value) - return; - - this._name = value; - this.notify('name'); - - // Broadcast changes to the network - for (const backend of this.backends.values()) { - backend.name = this.name; - backend.buildIdentity(); - } - - this.identify(); - } - - get settings() { - if (this._settings === undefined) { - this._settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup(Config.APP_ID, true), - }); - } - - return this._settings; - } - - vfunc_notify(pspec) { - if (pspec.name !== 'connection') - return; - - if (this.connection !== null) - this._exportDevices(); - else - this._unexportDevices(); - } - - /* - * GSettings - */ - _initSettings() { - // Initialize the ID and name of the service - if (this.settings.get_string('id').length === 0) - this.settings.set_string('id', GLib.uuid_string_random()); - - if (this.settings.get_string('name').length === 0) - this.settings.set_string('name', GLib.get_host_name()); - - // Bound Properties - this.settings.bind('discoverable', this, 'discoverable', 0); - this.settings.bind('id', this, 'id', 0); - this.settings.bind('name', this, 'name', 0); - } - - /* - * Backends - */ - _onChannel(backend, channel) { - try { - let device = this.devices.get(channel.identity.body.deviceId); - - switch (true) { - // Proceed if this is an existing device... - case (device !== undefined): - break; - - // Or the connection is allowed... - case this.discoverable || channel.allowed: - device = this._ensureDevice(channel.identity); - break; - - // ...otherwise bail - default: - debug(`${channel.identity.body.deviceName}: not allowed`); - return false; - } - - device.setChannel(channel); - return true; - } catch (e) { - logError(e, backend.name); - return false; - } - } - - _loadBackends() { - for (const name in backends) { - try { - const module = backends[name]; - - if (module.ChannelService === undefined) - continue; - - // Try to create the backend and track it if successful - const backend = new module.ChannelService({ - id: this.id, - name: this.name, - }); - this.backends.set(name, backend); - - // Connect to the backend - backend.__channelId = backend.connect( - 'channel', - this._onChannel.bind(this) - ); - - // Now try to start the backend, allowing us to retry if we fail - backend.start(); - } catch (e) { - if (Gio.Application.get_default()) - Gio.Application.get_default().notify_error(e); - } - } - } - - /* - * Devices - */ - _loadDevices() { - // Load cached devices - for (const id of this.settings.get_strv('devices')) { - const device = new Device({body: {deviceId: id}}); - this._exportDevice(device); - this.devices.set(id, device); - } - } - - _exportDevice(device) { - if (this.connection === null) - return; - - const info = { - object: null, - interface: null, - actions: 0, - menu: 0, - }; - - const objectPath = `${DEVICE_PATH}/${device.id.replace(/\W+/g, '_')}`; - - // Export an object path for the device - info.object = new Gio.DBusObjectSkeleton({ - g_object_path: objectPath, - }); - this.export(info.object); - - // Export GActions & GMenu - info.actions = Gio.DBus.session.export_action_group(objectPath, device); - info.menu = Gio.DBus.session.export_menu_model(objectPath, device.menu); - - // Export the Device interface - info.interface = new DBus.Interface({ - g_instance: device, - g_interface_info: DEVICE_IFACE, - }); - info.object.add_interface(info.interface); - - this._exported.set(device, info); - } - - _exportDevices() { - if (this.connection === null) - return; - - for (const device of this.devices.values()) - this._exportDevice(device); - } - - _unexportDevice(device) { - const info = this._exported.get(device); - - if (info === undefined) - return; - - // Unexport GActions and GMenu - Gio.DBus.session.unexport_action_group(info.actions); - Gio.DBus.session.unexport_menu_model(info.menu); - - // Unexport the Device interface and object - info.interface.flush(); - info.object.remove_interface(info.interface); - info.object.flush(); - this.unexport(info.object.g_object_path); - - this._exported.delete(device); - } - - _unexportDevices() { - for (const device of this.devices.values()) - this._unexportDevice(device); - } - - /** - * Return a device for @packet, creating it and adding it to the list of - * of known devices if it doesn't exist. - * - * @param {Core.Packet} packet - An identity packet for the device - * @return {Device} A device object - */ - _ensureDevice(packet) { - let device = this.devices.get(packet.body.deviceId); - - if (device === undefined) { - debug(`Adding ${packet.body.deviceName}`); - - // TODO: Remove when all clients support bluetooth-like discovery - // - // If this is the third unpaired device to connect, we disable - // discovery to avoid choking on networks with many devices - const unpaired = Array.from(this.devices.values()).filter(dev => { - return !dev.paired; - }); - - if (unpaired.length === 3) - this.discoverable = false; - - device = new Device(packet); - this._exportDevice(device); - this.devices.set(device.id, device); - - // Notify - this.settings.set_strv('devices', Array.from(this.devices.keys())); - } - - return device; - } - - /** - * Permanently remove a device. - * - * Removes the device from the list of known devices, deletes all GSettings - * and files. - * - * @param {string} id - The id of the device to delete - */ - _removeDevice(id) { - // Delete all GSettings - const settings_path = `/org/gnome/shell/extensions/gsconnect/${id}/`; - GLib.spawn_command_line_async(`dconf reset -f ${settings_path}`); - - // Delete the cache - const cache = GLib.build_filenamev([Config.CACHEDIR, id]); - Gio.File.rm_rf(cache); - - // Forget the device - this.devices.delete(id); - this.settings.set_strv('devices', Array.from(this.devices.keys())); - } - - /** - * A GSourceFunc that tries to reconnect to each paired device, while - * pruning unpaired devices that have disconnected. - * - * @return {boolean} Always %true - */ - _reconnect() { - for (const [id, device] of this.devices) { - if (device.connected) - continue; - - if (device.paired) { - this.identify(device.settings.get_string('last-connection')); - continue; - } - - this._unexportDevice(device); - this._removeDevice(id); - device.destroy(); - } - - return GLib.SOURCE_CONTINUE; - } - - /** - * Identify to an address or broadcast to the network. - * - * @param {string} [uri] - An address URI or %null to broadcast - */ - identify(uri = null) { - try { - // If we're passed a parameter, try and find a backend for it - if (uri !== null) { - const [scheme, address] = uri.split('://'); - - const backend = this.backends.get(scheme); - - if (backend !== undefined) - backend.broadcast(address); - - // If we're not discoverable, only try to reconnect known devices - } else if (!this.discoverable) { - this._reconnect(); - - // Otherwise have each backend broadcast to it's network - } else { - this.backends.forEach(backend => backend.broadcast()); - } - } catch (e) { - logError(e); - } - } - - /** - * Start managing devices. - */ - start() { - if (this.active) - return; - - this._loadDevices(); - this._loadBackends(); - - if (this._reconnectId === 0) { - this._reconnectId = GLib.timeout_add_seconds( - GLib.PRIORITY_LOW, - 5, - this._reconnect.bind(this) - ); - } - - this._active = true; - this.notify('active'); - } - - /** - * Stop managing devices. - */ - stop() { - if (!this.active) - return; - - if (this._reconnectId > 0) { - GLib.Source.remove(this._reconnectId); - this._reconnectId = 0; - } - - this._unexportDevices(); - - this.backends.forEach(backend => backend.destroy()); - this.backends.clear(); - - this.devices.forEach(device => device.destroy()); - this.devices.clear(); - - this._active = false; - this.notify('active'); - } - - /** - * Stop managing devices and free any resources. - */ - destroy() { - this.stop(); - this.set_connection(null); - } -}); - -export default Manager; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugin.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugin.js deleted file mode 100644 index ed2a5ef3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugin.js +++ /dev/null @@ -1,251 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../config.js'; -import plugins from './plugins/index.js'; - - -/** - * Base class for device plugins. - */ -const Plugin = GObject.registerClass({ - GTypeName: 'GSConnectPlugin', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device that owns this plugin', - GObject.ParamFlags.READABLE, - GObject.Object - ), - 'name': GObject.ParamSpec.string( - 'name', - 'Name', - 'The device name', - GObject.ParamFlags.READABLE, - null - ), - }, -}, class Plugin extends GObject.Object { - - _init(device, name, meta = null) { - super._init(); - - this._device = device; - this._name = name; - this._meta = meta; - - if (this._meta === null) - this._meta = plugins[name].Metadata; - - // GSettings - const schema = Config.GSCHEMA.lookup(this._meta.id, false); - - if (schema !== null) { - this.settings = new Gio.Settings({ - settings_schema: schema, - path: `${device.settings.path}plugin/${name}/`, - }); - } - - // GActions - this._gactions = []; - - if (this._meta.actions) { - const menu = this.device.settings.get_strv('menu-actions'); - - for (const name in this._meta.actions) { - const info = this._meta.actions[name]; - this._registerAction(name, menu.indexOf(name), info); - } - } - } - - get cancellable() { - if (this._cancellable === undefined) - this._cancellable = new Gio.Cancellable(); - - return this._cancellable; - } - - get device() { - return this._device; - } - - get name() { - return this._name; - } - - _activateAction(action, parameter) { - try { - let args = null; - - if (parameter instanceof GLib.Variant) - args = parameter.full_unpack(); - - if (Array.isArray(args)) - this[action.name](...args); - else - this[action.name](args); - } catch (e) { - logError(e, action.name); - } - } - - _registerAction(name, menuIndex, info) { - try { - // Device Action - const action = new Gio.SimpleAction({ - name: name, - parameter_type: info.parameter_type, - enabled: false, - }); - action.connect('activate', this._activateAction.bind(this)); - - this.device.add_action(action); - - // Menu - if (menuIndex > -1) { - this.device.addMenuAction( - action, - menuIndex, - info.label, - info.icon_name - ); - } - - this._gactions.push(action); - } catch (e) { - logError(e, `${this.device.name}: ${this.name}`); - } - } - - /** - * Called when the device connects. - */ - connected() { - // Enabled based on device capabilities, which might change - const incoming = this.device.settings.get_strv('incoming-capabilities'); - const outgoing = this.device.settings.get_strv('outgoing-capabilities'); - - for (const action of this._gactions) { - const info = this._meta.actions[action.name]; - - if (info.incoming.every(type => outgoing.includes(type)) && - info.outgoing.every(type => incoming.includes(type))) - action.set_enabled(true); - } - } - - /** - * Called when the device disconnects. - */ - disconnected() { - for (const action of this._gactions) - action.set_enabled(false); - } - - /** - * Called when a packet is received that the plugin is a handler for. - * - * @param {Core.Packet} packet - A KDE Connect packet - */ - handlePacket(packet) { - throw new GObject.NotImplementedError(); - } - - /** - * Cache JSON parseable properties on this object for persistence. The - * filename ~/.cache/gsconnect/<device-id>/<plugin-name>.json will be used - * to store the properties and values. - * - * Calling cacheProperties() opens a JSON cache file and reads any stored - * properties and values onto the current instance. When destroy() - * is called the properties are automatically stored in the same file. - * - * @param {Array} names - A list of this object's property names to cache - */ - async cacheProperties(names) { - try { - this._cacheProperties = names; - - // Ensure the device's cache directory exists - const cachedir = GLib.build_filenamev([ - Config.CACHEDIR, - this.device.id, - ]); - GLib.mkdir_with_parents(cachedir, 448); - - this._cacheFile = Gio.File.new_for_path( - GLib.build_filenamev([cachedir, `${this.name}.json`])); - - // Read the cache from disk - const [contents] = await this._cacheFile.load_contents_async( - this.cancellable); - const cache = JSON.parse(new TextDecoder().decode(contents)); - Object.assign(this, cache); - } catch (e) { - debug(e.message, `${this.device.name}: ${this.name}`); - } finally { - this.cacheLoaded(); - } - } - - /** - * An overridable function that is invoked when the on-disk cache is being - * cleared. Implementations should use this function to clear any in-memory - * cache data. - */ - clearCache() {} - - /** - * An overridable function that is invoked when the cache is done loading - */ - cacheLoaded() {} - - /** - * Unregister plugin actions, write the cache (if applicable) and destroy - * any dangling signal handlers. - */ - destroy() { - // Cancel any pending plugin operations - if (this._cancellable !== undefined) - this._cancellable.cancel(); - - for (const action of this._gactions) { - this.device.removeMenuAction(`device.${action.name}`); - this.device.remove_action(action.name); - } - - // Write the cache to disk synchronously - if (this._cacheFile !== undefined) { - try { - // Build the cache - const cache = {}; - - for (const name of this._cacheProperties) - cache[name] = this[name]; - - this._cacheFile.replace_contents( - JSON.stringify(cache, null, 2), - null, - false, - Gio.FileCreateFlags.REPLACE_DESTINATION, - null - ); - } catch (e) { - debug(e.message, `${this.device.name}: ${this.name}`); - } - } - - GObject.signal_handlers_destroy(this); - } -}); - -export default Plugin; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/battery.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/battery.js deleted file mode 100644 index c7dbe042..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/battery.js +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Battery'), - description: _('Exchange battery information'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Battery', - incomingCapabilities: [ - 'kdeconnect.battery', - 'kdeconnect.battery.request', - ], - outgoingCapabilities: [ - 'kdeconnect.battery', - 'kdeconnect.battery.request', - ], - actions: {}, -}; - - -/** - * Battery Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/battery - */ -const BatteryPlugin = GObject.registerClass({ - GTypeName: 'GSConnectBatteryPlugin', -}, class BatteryPlugin extends Plugin { - - _init(device) { - super._init(device, 'battery'); - - // Setup Cache; defaults are 90 minute charge, 1 day discharge - this._chargeState = [54, 0, -1]; - this._dischargeState = [864, 0, -1]; - this._thresholdLevel = 25; - - this.cacheProperties([ - '_chargeState', - '_dischargeState', - '_thresholdLevel', - ]); - - // Export battery state as GAction - this.__state = new Gio.SimpleAction({ - name: 'battery', - parameter_type: new GLib.VariantType('(bsii)'), - state: this.state, - }); - this.device.add_action(this.__state); - - // Local Battery (UPower) - this._upower = null; - this._sendStatisticsId = this.settings.connect( - 'changed::send-statistics', - this._onSendStatisticsChanged.bind(this) - ); - this._onSendStatisticsChanged(this.settings); - } - - get charging() { - if (this._charging === undefined) - this._charging = false; - - return this._charging; - } - - get icon_name() { - let icon; - - if (this.level === -1) - return 'battery-missing-symbolic'; - else if (this.level === 100) - return 'battery-full-charged-symbolic'; - else if (this.level < 3) - icon = 'battery-empty'; - else if (this.level < 10) - icon = 'battery-caution'; - else if (this.level < 30) - icon = 'battery-low'; - else if (this.level < 60) - icon = 'battery-good'; - else if (this.level >= 60) - icon = 'battery-full'; - - if (this.charging) - return `${icon}-charging-symbolic`; - - return `${icon}-symbolic`; - } - - get level() { - // This is what KDE Connect returns if the remote battery plugin is - // disabled or still being loaded - if (this._level === undefined) - this._level = -1; - - return this._level; - } - - get time() { - if (this._time === undefined) - this._time = 0; - - return this._time; - } - - get state() { - return new GLib.Variant( - '(bsii)', - [this.charging, this.icon_name, this.level, this.time] - ); - } - - cacheLoaded() { - this._initEstimate(); - this._sendState(); - } - - clearCache() { - this._chargeState = [54, 0, -1]; - this._dischargeState = [864, 0, -1]; - this._thresholdLevel = 25; - this._initEstimate(); - } - - connected() { - super.connected(); - - this._requestState(); - this._sendState(); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.battery': - this._receiveState(packet); - break; - - case 'kdeconnect.battery.request': - this._sendState(); - break; - } - } - - _onSendStatisticsChanged() { - if (this.settings.get_boolean('send-statistics')) - this._monitorState(); - else - this._unmonitorState(); - } - - /** - * Recalculate and update the estimated time remaining, but not the rate. - */ - _initEstimate() { - let rate, level; - - // elision of [rate, time, level] - if (this.charging) - [rate,, level] = this._chargeState; - else - [rate,, level] = this._dischargeState; - - if (!Number.isFinite(rate) || rate < 1) - rate = this.charging ? 864 : 90; - - if (!Number.isFinite(level) || level < 0) - level = this.level; - - // Update the time remaining - if (rate && this.charging) - this._time = Math.floor(rate * (100 - level)); - else if (rate && !this.charging) - this._time = Math.floor(rate * level); - - this.__state.state = this.state; - } - - /** - * Recalculate the (dis)charge rate and update the estimated time remaining. - */ - _updateEstimate() { - let rate, time, level; - const newTime = Math.floor(Date.now() / 1000); - const newLevel = this.level; - - // Load the state; ensure we have sane values for calculation - if (this.charging) - [rate, time, level] = this._chargeState; - else - [rate, time, level] = this._dischargeState; - - if (!Number.isFinite(rate) || rate < 1) - rate = this.charging ? 54 : 864; - - if (!Number.isFinite(time) || time <= 0) - time = newTime; - - if (!Number.isFinite(level) || level < 0) - level = newLevel; - - // Update the rate; use a weighted average to account for missed changes - // NOTE: (rate = seconds/percent) - const ldiff = this.charging ? newLevel - level : level - newLevel; - const tdiff = newTime - time; - const newRate = tdiff / ldiff; - - if (newRate && Number.isFinite(newRate)) - rate = Math.floor((rate * 0.4) + (newRate * 0.6)); - - // Store the state for the next recalculation - if (this.charging) - this._chargeState = [rate, newTime, newLevel]; - else - this._dischargeState = [rate, newTime, newLevel]; - - // Update the time remaining - if (rate && this.charging) - this._time = Math.floor(rate * (100 - newLevel)); - else if (rate && !this.charging) - this._time = Math.floor(rate * newLevel); - - this.__state.state = this.state; - } - - /** - * Notify the user the remote battery is full. - */ - _fullBatteryNotification() { - if (!this.settings.get_boolean('full-battery-notification')) - return; - - // Offer the option to ring the device, if available - let buttons = []; - - if (this.device.get_action_enabled('ring')) { - buttons = [{ - label: _('Ring'), - action: 'ring', - parameter: null, - }]; - } - - this.device.showNotification({ - id: 'battery|full', - // TRANSLATORS: eg. Google Pixel: Battery is full - title: _('%s: Battery is full').format(this.device.name), - // TRANSLATORS: when the battery is fully charged - body: _('Fully Charged'), - icon: Gio.ThemedIcon.new('battery-full-charged-symbolic'), - buttons: buttons, - }); - } - - /** - * Notify the user the remote battery is at custom charge level. - */ - _customBatteryNotification() { - if (!this.settings.get_boolean('custom-battery-notification')) - return; - - // Offer the option to ring the device, if available - let buttons = []; - - if (this.device.get_action_enabled('ring')) { - buttons = [{ - label: _('Ring'), - action: 'ring', - parameter: null, - }]; - } - - this.device.showNotification({ - id: 'battery|custom', - // TRANSLATORS: eg. Google Pixel: Battery has reached custom charge level - title: _('%s: Battery has reached custom charge level').format(this.device.name), - // TRANSLATORS: when the battery has reached custom charge level - body: _('%d%% Charged').format(this.level), - icon: Gio.ThemedIcon.new('battery-full-charged-symbolic'), - buttons: buttons, - }); - } - - /** - * Notify the user the remote battery is low. - */ - _lowBatteryNotification() { - if (!this.settings.get_boolean('low-battery-notification')) - return; - - // Offer the option to ring the device, if available - let buttons = []; - - if (this.device.get_action_enabled('ring')) { - buttons = [{ - label: _('Ring'), - action: 'ring', - parameter: null, - }]; - } - - this.device.showNotification({ - id: 'battery|low', - // TRANSLATORS: eg. Google Pixel: Battery is low - title: _('%s: Battery is low').format(this.device.name), - // TRANSLATORS: eg. 15% remaining - body: _('%d%% remaining').format(this.level), - icon: Gio.ThemedIcon.new('battery-caution-symbolic'), - buttons: buttons, - }); - } - - /** - * Handle a remote battery update. - * - * @param {Core.Packet} packet - A kdeconnect.battery packet - */ - _receiveState(packet) { - // Charging state changed - this._charging = packet.body.isCharging; - - // Level changed - if (this._level !== packet.body.currentCharge) { - this._level = packet.body.currentCharge; - - // If the level is above the threshold hide the notification - if (this._level > this._thresholdLevel) - this.device.hideNotification('battery|low'); - - // The level just changed to/from custom level while charging - if ((this._level === this.settings.get_uint('custom-battery-notification-value')) && this._charging) - this._customBatteryNotification(); - else - this.device.hideNotification('battery|custom'); - - // The level just changed to/from full - if (this._level === 100) - this._fullBatteryNotification(); - else - this.device.hideNotification('battery|full'); - } - - // Device considers the level low - if (packet.body.thresholdEvent > 0) { - this._lowBatteryNotification(); - this._thresholdLevel = this.level; - } - - this._updateEstimate(); - } - - /** - * Request the remote battery's current state - */ - _requestState() { - this.device.sendPacket({ - type: 'kdeconnect.battery.request', - body: {request: true}, - }); - } - - /** - * Report the local battery's current state - */ - _sendState() { - if (this._upower === null || !this._upower.is_present) - return; - - this.device.sendPacket({ - type: 'kdeconnect.battery', - body: { - currentCharge: this._upower.level, - isCharging: this._upower.charging, - thresholdEvent: this._upower.threshold, - }, - }); - } - - /* - * UPower monitoring methods - */ - _monitorState() { - try { - // Currently only true if the remote device is a desktop (rare) - const incoming = this.device.settings.get_strv('incoming-capabilities'); - - if (!incoming.includes('kdeconnect.battery')) - return; - - this._upower = Components.acquire('upower'); - - this._upowerId = this._upower.connect( - 'changed', - this._sendState.bind(this) - ); - - this._sendState(); - } catch (e) { - logError(e, this.device.name); - this._unmonitorState(); - } - } - - _unmonitorState() { - try { - if (this._upower === null) - return; - - this._upower.disconnect(this._upowerId); - this._upower = Components.release('upower'); - } catch (e) { - logError(e, this.device.name); - } - } - - destroy() { - this.device.remove_action('battery'); - this.settings.disconnect(this._sendStatisticsId); - this._unmonitorState(); - - super.destroy(); - } -}); - -export default BatteryPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/clipboard.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/clipboard.js deleted file mode 100644 index 7a065747..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/clipboard.js +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Clipboard'), - description: _('Share the clipboard content'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Clipboard', - incomingCapabilities: [ - 'kdeconnect.clipboard', - 'kdeconnect.clipboard.connect', - ], - outgoingCapabilities: [ - 'kdeconnect.clipboard', - 'kdeconnect.clipboard.connect', - ], - actions: { - clipboardPush: { - label: _('Clipboard Push'), - icon_name: 'edit-paste-symbolic', - - parameter_type: null, - incoming: [], - outgoing: ['kdeconnect.clipboard'], - }, - clipboardPull: { - label: _('Clipboard Pull'), - icon_name: 'edit-copy-symbolic', - - parameter_type: null, - incoming: ['kdeconnect.clipboard'], - outgoing: [], - }, - }, -}; - - -/** - * Clipboard Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/clipboard - */ -const ClipboardPlugin = GObject.registerClass({ - GTypeName: 'GSConnectClipboardPlugin', -}, class ClipboardPlugin extends Plugin { - - _init(device) { - super._init(device, 'clipboard'); - - this._clipboard = Components.acquire('clipboard'); - - // Watch local clipboard for changes - this._textChangedId = this._clipboard.connect( - 'notify::text', - this._onLocalClipboardChanged.bind(this) - ); - - // Buffer content to allow selective sync - this._localBuffer = this._clipboard.text; - this._localTimestamp = 0; - this._remoteBuffer = null; - } - - connected() { - super.connected(); - - // TODO: if we're not auto-syncing local->remote, but we are doing the - // reverse, it's possible older remote content will end up - // overwriting newer local content. - if (!this.settings.get_boolean('send-content')) - return; - - if (this._localBuffer === null && this._localTimestamp === 0) - return; - - this.device.sendPacket({ - type: 'kdeconnect.clipboard.connect', - body: { - content: this._localBuffer, - timestamp: this._localTimestamp, - }, - }); - } - - handlePacket(packet) { - if (!packet.body.hasOwnProperty('content')) - return; - - switch (packet.type) { - case 'kdeconnect.clipboard': - this._handleContent(packet); - break; - - case 'kdeconnect.clipboard.connect': - this._handleConnectContent(packet); - break; - } - } - - _handleContent(packet) { - this._onRemoteClipboardChanged(packet.body.content); - } - - _handleConnectContent(packet) { - if (packet.body.hasOwnProperty('timestamp') && - packet.body.timestamp > this._localTimestamp) - this._onRemoteClipboardChanged(packet.body.content); - } - - /* - * Store the local clipboard content and forward it if enabled - */ - _onLocalClipboardChanged(clipboard, pspec) { - this._localBuffer = clipboard.text; - this._localTimestamp = Date.now(); - - if (this.settings.get_boolean('send-content')) - this.clipboardPush(); - } - - /* - * Store the remote clipboard content and apply it if enabled - */ - _onRemoteClipboardChanged(text) { - this._remoteBuffer = text; - - if (this.settings.get_boolean('receive-content')) - this.clipboardPull(); - } - - /** - * Copy to the remote clipboard; called by _onLocalClipboardChanged() - */ - clipboardPush() { - // Don't sync if the clipboard is empty or not text - if (this._localTimestamp === 0) - return; - - if (this._remoteBuffer !== this._localBuffer) { - this._remoteBuffer = this._localBuffer; - - // If the buffer is %null, the clipboard contains non-text content, - // so we neither clear the remote clipboard nor pass the content - if (this._localBuffer !== null) { - this.device.sendPacket({ - type: 'kdeconnect.clipboard', - body: { - content: this._localBuffer, - }, - }); - } - } - } - - /** - * Copy from the remote clipboard; called by _onRemoteClipboardChanged() - */ - clipboardPull() { - if (this._localBuffer !== this._remoteBuffer) { - this._localBuffer = this._remoteBuffer; - this._localTimestamp = Date.now(); - - this._clipboard.text = this._remoteBuffer; - } - } - - destroy() { - if (this._clipboard && this._textChangedId) { - this._clipboard.disconnect(this._textChangedId); - this._clipboard = Components.release('clipboard'); - } - - super.destroy(); - } -}); - -export default ClipboardPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/connectivity_report.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/connectivity_report.js deleted file mode 100644 index 7107ff7a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/connectivity_report.js +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Connectivity Report'), - description: _('Display connectivity status'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.ConnectivityReport', - incomingCapabilities: [ - 'kdeconnect.connectivity_report', - ], - outgoingCapabilities: [ - 'kdeconnect.connectivity_report.request', - ], - actions: {}, -}; - - -/** - * Connectivity Report Plugin - * https://invent.kde.org/network/kdeconnect-kde/-/tree/master/plugins/connectivity_report - */ -const ConnectivityReportPlugin = GObject.registerClass({ - GTypeName: 'GSConnectConnectivityReportPlugin', -}, class ConnectivityReportPlugin extends Plugin { - - _init(device) { - super._init(device, 'connectivity_report'); - - // Export connectivity state as GAction - this.__state = new Gio.SimpleAction({ - name: 'connectivityReport', - // ( - // cellular_network_type, - // cellular_network_type_icon, - // cellular_network_strength(0..4), - // cellular_network_strength_icon, - // ) - parameter_type: new GLib.VariantType('(ssis)'), - state: this.state, - }); - this.device.add_action(this.__state); - } - - get signal_strength() { - if (this._signalStrength === undefined) - this._signalStrength = -1; - - return this._signalStrength; - } - - get network_type() { - if (this._networkType === undefined) - this._networkType = ''; - - return this._networkType; - } - - get signal_strength_icon_name() { - if (this.signal_strength === 0) - return 'network-cellular-signal-none-symbolic'; // SIGNAL_STRENGTH_NONE_OR_UNKNOWN - else if (this.signal_strength === 1) - return 'network-cellular-signal-weak-symbolic'; // SIGNAL_STRENGTH_POOR - else if (this.signal_strength === 2) - return 'network-cellular-signal-ok-symbolic'; // SIGNAL_STRENGTH_MODERATE - else if (this.signal_strength === 3) - return 'network-cellular-signal-good-symbolic'; // SIGNAL_STRENGTH_GOOD - else if (this.signal_strength >= 4) - return 'network-cellular-signal-excellent-symbolic'; // SIGNAL_STRENGTH_GREAT - - return 'network-cellular-offline-symbolic'; // OFF (signal_strength == -1) - } - - get network_type_icon_name() { - if (this.network_type === 'GSM' || this.network_type === 'CDMA' || this.network_type === 'iDEN') - return 'network-cellular-2g-symbolic'; - else if (this.network_type === 'UMTS' || this.network_type === 'CDMA2000') - return 'network-cellular-3g-symbolic'; - else if (this.network_type === 'LTE') - return 'network-cellular-4g-symbolic'; - else if (this.network_type === 'EDGE') - return 'network-cellular-edge-symbolic'; - else if (this.network_type === 'GPRS') - return 'network-cellular-gprs-symbolic'; - else if (this.network_type === 'HSPA') - return 'network-cellular-hspa-symbolic'; - else if (this.network_type === '5G') - return 'network-cellular-5g-symbolic'; - - return 'network-cellular-symbolic'; - } - - get state() { - return new GLib.Variant( - '(ssis)', - [ - this.network_type, - this.network_type_icon_name, - this.signal_strength, - this.signal_strength_icon_name, - ] - ); - } - - connected() { - super.connected(); - - this._requestState(); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.connectivity_report': - this._receiveState(packet); - break; - } - } - - /** - * Handle a remote state update. - * - * @param {Core.Packet} packet - A kdeconnect.connectivity_report packet - */ - _receiveState(packet) { - if (packet.body.signalStrengths) { - // TODO: Only first SIM (subscriptionID) is supported at the moment - const subs = Object.keys(packet.body.signalStrengths); - const firstSub = Math.min.apply(null, subs); - const data = packet.body.signalStrengths[firstSub]; - - this._networkType = data.networkType; - this._signalStrength = data.signalStrength; - } - - // Update DBus state - this.__state.state = this.state; - } - - /** - * Request the remote device's connectivity state - */ - _requestState() { - this.device.sendPacket({ - type: 'kdeconnect.connectivity_report.request', - body: {}, - }); - } - - destroy() { - this.device.remove_action('connectivity_report'); - - super.destroy(); - } -}); - -export default ConnectivityReportPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/contacts.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/contacts.js deleted file mode 100644 index 21687127..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/contacts.js +++ /dev/null @@ -1,463 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Plugin from '../plugin.js'; -import Contacts from '../components/contacts.js'; - -/* - * We prefer libebook's vCard parser if it's available - */ -let EBookContacts; -export const setEBookContacts = (ebook) => { // This function is only for tests to call! - EBookContacts = ebook; -}; - -try { - EBookContacts = (await import('gi://EBookContacts')).default; -} catch (e) { - EBookContacts = null; -} - - -export const Metadata = { - label: _('Contacts'), - description: _('Access contacts of the paired device'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Contacts', - incomingCapabilities: [ - 'kdeconnect.contacts.response_uids_timestamps', - 'kdeconnect.contacts.response_vcards', - ], - outgoingCapabilities: [ - 'kdeconnect.contacts.request_all_uids_timestamps', - 'kdeconnect.contacts.request_vcards_by_uid', - ], - actions: {}, -}; - - -/* - * vCard 2.1 Patterns - */ -const VCARD_FOLDING = /\r\n |\r |\n |=\n/g; -const VCARD_SUPPORTED = /^fn|tel|photo|x-kdeconnect/i; -const VCARD_BASIC = /^([^:;]+):(.+)$/; -const VCARD_TYPED = /^([^:;]+);([^:]+):(.+)$/; -const VCARD_TYPED_KEY = /item\d{1,2}\./; -const VCARD_TYPED_META = /([a-z]+)=(.*)/i; - - -/** - * Contacts Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/contacts - */ -const ContactsPlugin = GObject.registerClass({ - GTypeName: 'GSConnectContactsPlugin', -}, class ContactsPlugin extends Plugin { - - _init(device) { - super._init(device, 'contacts'); - - this._store = new Contacts(device.id); - this._store.fetch = this._requestUids.bind(this); - - // Notify when the store is ready - this._contactsStoreReadyId = this._store.connect( - 'notify::context', - () => this.device.notify('contacts') - ); - - // Notify if the contacts source changes - this._contactsSourceChangedId = this.settings.connect( - 'changed::contacts-source', - () => this.device.notify('contacts') - ); - - // Load the cache - this._store.load(); - } - - clearCache() { - this._store.clear(); - } - - connected() { - super.connected(); - this._requestUids(); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.contacts.response_uids_timestamps': - this._handleUids(packet); - break; - - case 'kdeconnect.contacts.response_vcards': - this._handleVCards(packet); - break; - } - } - - _handleUids(packet) { - try { - const contacts = this._store.contacts; - const remote_uids = packet.body.uids; - let removed = false; - delete packet.body.uids; - - // Usually a failed request, so avoid wiping the cache - if (remote_uids.length === 0) - return; - - // Delete any contacts that were removed on the device - for (let i = 0, len = contacts.length; i < len; i++) { - const contact = contacts[i]; - - if (!remote_uids.includes(contact.id)) { - this._store.remove(contact.id, false); - removed = true; - } - } - - // Build a list of new or updated contacts - const uids = []; - - for (const [uid, timestamp] of Object.entries(packet.body)) { - const contact = this._store.get_contact(uid); - - if (!contact || contact.timestamp !== timestamp) - uids.push(uid); - } - - // Send a request for any new or updated contacts - if (uids.length) - this._requestVCards(uids); - - // If we removed any contacts, save the cache - if (removed) - this._store.save(); - } catch (e) { - logError(e); - } - } - - /** - * Decode a string encoded as "QUOTED-PRINTABLE" and return a regular string - * - * See: https://github.com/mathiasbynens/quoted-printable/blob/master/src/quoted-printable.js - * - * @param {string} input - The QUOTED-PRINTABLE string - * @return {string} The decoded string - */ - _decodeQuotedPrintable(input) { - return input - // https://tools.ietf.org/html/rfc2045#section-6.7, rule 3 - .replace(/[\t\x20]$/gm, '') - // Remove hard line breaks preceded by `=` - .replace(/=(?:\r\n?|\n|$)/g, '') - // https://tools.ietf.org/html/rfc2045#section-6.7, note 1. - .replace(/=([a-fA-F0-9]{2})/g, ($0, $1) => { - const codePoint = parseInt($1, 16); - return String.fromCharCode(codePoint); - }); - } - - /** - * Decode a string encoded as "UTF-8" and return a regular string - * - * See: https://github.com/kvz/locutus/blob/master/src/php/xml/utf8_decode.js - * - * @param {string} input - The UTF-8 string - * @return {string} The decoded string - */ - _decodeUTF8(input) { - try { - const output = []; - let i = 0; - let c1 = 0; - let seqlen = 0; - - while (i < input.length) { - c1 = input.charCodeAt(i) & 0xFF; - seqlen = 0; - - if (c1 <= 0xBF) { - c1 &= 0x7F; - seqlen = 1; - } else if (c1 <= 0xDF) { - c1 &= 0x1F; - seqlen = 2; - } else if (c1 <= 0xEF) { - c1 &= 0x0F; - seqlen = 3; - } else { - c1 &= 0x07; - seqlen = 4; - } - - for (let ai = 1; ai < seqlen; ++ai) - c1 = ((c1 << 0x06) | (input.charCodeAt(ai + i) & 0x3F)); - - if (seqlen === 4) { - c1 -= 0x10000; - output.push(String.fromCharCode(0xD800 | ((c1 >> 10) & 0x3FF))); - output.push(String.fromCharCode(0xDC00 | (c1 & 0x3FF))); - } else { - output.push(String.fromCharCode(c1)); - } - - i += seqlen; - } - - return output.join(''); - - // Fallback to old unfaithful - } catch (e) { - try { - return decodeURIComponent(escape(input)); - - // Say "chowdah" frenchie! - } catch (e) { - debug(e, `Failed to decode UTF-8 VCard field ${input}`); - return input; - } - } - } - - /** - * Parse a vCard (v2.1 only) and return a dictionary of the fields - * - * See: http://jsfiddle.net/ARTsinn/P2t2P/ - * - * @param {string} vcard_data - The raw VCard data - * @return {Object} dictionary of vCard data - */ - _parseVCard21(vcard_data) { - // vcard skeleton - const vcard = { - fn: _('Unknown Contact'), - tel: [], - }; - - // Remove line folding and split - const unfolded = vcard_data.replace(VCARD_FOLDING, ''); - const lines = unfolded.split(/\r\n|\r|\n/); - - for (let i = 0, len = lines.length; i < len; i++) { - const line = lines[i]; - let results, key, type, value; - - // Empty line or a property we aren't interested in - if (!line || !line.match(VCARD_SUPPORTED)) - continue; - - // Basic Fields (fn, x-kdeconnect-timestamp, etc) - if ((results = line.match(VCARD_BASIC))) { - [, key, value] = results; - vcard[key.toLowerCase()] = value; - continue; - } - - // Typed Fields (tel, adr, etc) - if ((results = line.match(VCARD_TYPED))) { - [, key, type, value] = results; - key = key.replace(VCARD_TYPED_KEY, '').toLowerCase(); - value = value.split(';'); - type = type.split(';'); - - // Type(s) - const meta = {}; - - for (let i = 0, len = type.length; i < len; i++) { - const res = type[i].match(VCARD_TYPED_META); - - if (res) - meta[res[1]] = res[2]; - else - meta[`type${i === 0 ? '' : i}`] = type[i].toLowerCase(); - } - - // Value(s) - if (vcard[key] === undefined) - vcard[key] = []; - - // Decode QUOTABLE-PRINTABLE - if (meta.ENCODING && meta.ENCODING === 'QUOTED-PRINTABLE') { - delete meta.ENCODING; - value = value.map(v => this._decodeQuotedPrintable(v)); - } - - // Decode UTF-8 - if (meta.CHARSET && meta.CHARSET === 'UTF-8') { - delete meta.CHARSET; - value = value.map(v => this._decodeUTF8(v)); - } - - // Special case for FN (full name) - if (key === 'fn') - vcard[key] = value[0]; - else - vcard[key].push({meta: meta, value: value}); - } - } - - return vcard; - } - - /** - * Parse a vCard (v2.1 only) using native JavaScript and add it to the - * contact store. - * - * @param {string} uid - The contact UID - * @param {string} vcard_data - The raw vCard data - */ - async _parseVCardNative(uid, vcard_data) { - try { - const vcard = this._parseVCard21(vcard_data); - - const contact = { - id: uid, - name: vcard.fn, - numbers: [], - origin: 'device', - timestamp: parseInt(vcard['x-kdeconnect-timestamp']), - }; - - // Phone Numbers - contact.numbers = vcard.tel.map(entry => { - let type = 'unknown'; - - if (entry.meta && entry.meta.type) - type = entry.meta.type; - - return {type: type, value: entry.value[0]}; - }); - - // Avatar - if (vcard.photo) { - const data = GLib.base64_decode(vcard.photo[0].value[0]); - contact.avatar = await this._store.storeAvatar(data); - } - - this._store.add(contact); - } catch (e) { - debug(e, `Failed to parse VCard contact ${uid}`); - } - } - - /** - * Parse a vCard using libebook and add it to the contact store. - * - * @param {string} uid - The contact UID - * @param {string} vcard_data - The raw vCard data - */ - async _parseVCard(uid, vcard_data) { - try { - const contact = { - id: uid, - name: _('Unknown Contact'), - numbers: [], - origin: 'device', - timestamp: 0, - }; - - const evcard = EBookContacts.VCard.new_from_string(vcard_data); - const attrs = evcard.get_attributes(); - - for (let i = 0, len = attrs.length; i < len; i++) { - const attr = attrs[i]; - let data, number; - - switch (attr.get_name().toLowerCase()) { - case 'fn': - contact.name = attr.get_value(); - break; - - case 'tel': - number = {value: attr.get_value(), type: 'unknown'}; - - if (attr.has_type('CELL')) - number.type = 'cell'; - else if (attr.has_type('HOME')) - number.type = 'home'; - else if (attr.has_type('WORK')) - number.type = 'work'; - - contact.numbers.push(number); - break; - - case 'x-kdeconnect-timestamp': - contact.timestamp = parseInt(attr.get_value()); - break; - - case 'photo': - data = GLib.base64_decode(attr.get_value()); - contact.avatar = await this._store.storeAvatar(data); - break; - } - } - - this._store.add(contact); - } catch (e) { - debug(e, `Failed to parse VCard contact ${uid}`); - } - } - - /** - * Handle an incoming list of contact vCards and pass them to the best - * available parser. - * - * @param {Core.Packet} packet - A `kdeconnect.contacts.response_vcards` - */ - _handleVCards(packet) { - try { - // We don't use this - delete packet.body.uids; - - // Parse each vCard and add the contact - for (const [uid, vcard] of Object.entries(packet.body)) { - if (EBookContacts) - this._parseVCard(uid, vcard); - else - this._parseVCardNative(uid, vcard); - } - } catch (e) { - logError(e, this.device.name); - } - } - - /** - * Request a list of contact UIDs with timestamps. - */ - _requestUids() { - this.device.sendPacket({ - type: 'kdeconnect.contacts.request_all_uids_timestamps', - }); - } - - /** - * Request the vCards for @uids. - * - * @param {string[]} uids - A list of contact UIDs - */ - _requestVCards(uids) { - this.device.sendPacket({ - type: 'kdeconnect.contacts.request_vcards_by_uid', - body: { - uids: uids, - }, - }); - } - - destroy() { - this._store.disconnect(this._contactsStoreReadyId); - this.settings.disconnect(this._contactsSourceChangedId); - - super.destroy(); - } -}); - -export default ContactsPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/findmyphone.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/findmyphone.js deleted file mode 100644 index b5226bb9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/findmyphone.js +++ /dev/null @@ -1,249 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import * as Components from '../components/index.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Find My Phone'), - description: _('Ring your paired device'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.FindMyPhone', - incomingCapabilities: ['kdeconnect.findmyphone.request'], - outgoingCapabilities: ['kdeconnect.findmyphone.request'], - actions: { - ring: { - label: _('Ring'), - icon_name: 'phonelink-ring-symbolic', - - parameter_type: null, - incoming: [], - outgoing: ['kdeconnect.findmyphone.request'], - }, - }, -}; - - -/** - * FindMyPhone Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/findmyphone - */ -const FindMyPhonePlugin = GObject.registerClass({ - GTypeName: 'GSConnectFindMyPhonePlugin', -}, class FindMyPhonePlugin extends Plugin { - - _init(device) { - super._init(device, 'findmyphone'); - - this._dialog = null; - this._player = Components.acquire('sound'); - this._mixer = Components.acquire('pulseaudio'); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.findmyphone.request': - this._handleRequest(); - break; - } - } - - /** - * Handle an incoming location request. - */ - _handleRequest() { - try { - // If this is a second request, stop announcing and return - if (this._dialog !== null) { - this._dialog.response(Gtk.ResponseType.DELETE_EVENT); - return; - } - - this._dialog = new Dialog({ - device: this.device, - plugin: this, - }); - - this._dialog.connect('response', () => { - this._dialog = null; - }); - } catch (e) { - this._cancelRequest(); - logError(e, this.device.name); - } - } - - /** - * Cancel any ongoing ringing and destroy the dialog. - */ - _cancelRequest() { - if (this._dialog !== null) - this._dialog.response(Gtk.ResponseType.DELETE_EVENT); - } - - /** - * Request that the remote device announce it's location - */ - ring() { - this.device.sendPacket({ - type: 'kdeconnect.findmyphone.request', - body: {}, - }); - } - - destroy() { - this._cancelRequest(); - - if (this._mixer !== undefined) - this._mixer = Components.release('pulseaudio'); - - if (this._player !== undefined) - this._player = Components.release('sound'); - - super.destroy(); - } -}); - - -/* - * Used to ensure 'audible-bell' is enabled for fallback - */ -const _WM_SETTINGS = new Gio.Settings({ - schema_id: 'org.gnome.desktop.wm.preferences', - path: '/org/gnome/desktop/wm/preferences/', -}); - - -/** - * A custom GtkMessageDialog for alerting of incoming requests - */ -const Dialog = GObject.registerClass({ - GTypeName: 'GSConnectFindMyPhoneDialog', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin providing messages', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - }, -}, class Dialog extends Gtk.MessageDialog { - _init(params) { - super._init({ - buttons: Gtk.ButtonsType.CLOSE, - device: params.device, - image: new Gtk.Image({ - icon_name: 'phonelink-ring-symbolic', - pixel_size: 512, - halign: Gtk.Align.CENTER, - hexpand: true, - valign: Gtk.Align.CENTER, - vexpand: true, - visible: true, - }), - plugin: params.plugin, - urgency_hint: true, - }); - - this.set_keep_above(true); - this.maximize(); - this.message_area.destroy(); - - // If an output stream is available start fading the volume up - if (this.plugin._mixer && this.plugin._mixer.output) { - this._stream = this.plugin._mixer.output; - - this._previousMuted = this._stream.muted; - this._previousVolume = this._stream.volume; - - this._stream.muted = false; - this._stream.fade(0.85, 15); - - // Otherwise ensure audible-bell is enabled - } else { - this._previousBell = _WM_SETTINGS.get_boolean('audible-bell'); - _WM_SETTINGS.set_boolean('audible-bell', true); - } - - // Start the alarm - if (this.plugin._player !== undefined) - this.plugin._player.loopSound('phone-incoming-call', this.cancellable); - - // Show the dialog - this.show_all(); - } - - vfunc_key_press_event(event) { - this.response(Gtk.ResponseType.DELETE_EVENT); - - return Gdk.EVENT_STOP; - } - - vfunc_motion_notify_event(event) { - this.response(Gtk.ResponseType.DELETE_EVENT); - - return Gdk.EVENT_STOP; - } - - vfunc_response(response_id) { - // Stop the alarm - this.cancellable.cancel(); - - // Restore the mixer level - if (this._stream) { - this._stream.muted = this._previousMuted; - this._stream.fade(this._previousVolume); - - // Restore the audible-bell - } else { - _WM_SETTINGS.set_boolean('audible-bell', this._previousBell); - } - - this.destroy(); - } - - get cancellable() { - if (this._cancellable === undefined) - this._cancellable = new Gio.Cancellable(); - - return this._cancellable; - } - - get device() { - if (this._device === undefined) - this._device = null; - - return this._device; - } - - set device(device) { - this._device = device; - } - - get plugin() { - if (this._plugin === undefined) - this._plugin = null; - - return this._plugin; - } - - set plugin(plugin) { - this._plugin = plugin; - } -}); - -export default FindMyPhonePlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js deleted file mode 100644 index 3d304a04..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/index.js +++ /dev/null @@ -1,39 +0,0 @@ -// 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/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mousepad.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mousepad.js deleted file mode 100644 index a4e40aed..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mousepad.js +++ /dev/null @@ -1,381 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import {InputDialog} from '../ui/mousepad.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Mousepad'), - description: _('Enables the paired device to act as a remote mouse and keyboard'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Mousepad', - incomingCapabilities: [ - 'kdeconnect.mousepad.echo', - 'kdeconnect.mousepad.request', - 'kdeconnect.mousepad.keyboardstate', - ], - outgoingCapabilities: [ - 'kdeconnect.mousepad.echo', - 'kdeconnect.mousepad.request', - 'kdeconnect.mousepad.keyboardstate', - ], - actions: { - keyboard: { - label: _('Remote Input'), - icon_name: 'input-keyboard-symbolic', - - parameter_type: null, - incoming: [ - 'kdeconnect.mousepad.echo', - 'kdeconnect.mousepad.keyboardstate', - ], - outgoing: ['kdeconnect.mousepad.request'], - }, - }, -}; - -/** - * A map of "KDE Connect" keyvals to Gdk - */ -const KeyMap = new Map([ - [1, Gdk.KEY_BackSpace], - [2, Gdk.KEY_Tab], - [3, Gdk.KEY_Linefeed], - [4, Gdk.KEY_Left], - [5, Gdk.KEY_Up], - [6, Gdk.KEY_Right], - [7, Gdk.KEY_Down], - [8, Gdk.KEY_Page_Up], - [9, Gdk.KEY_Page_Down], - [10, Gdk.KEY_Home], - [11, Gdk.KEY_End], - [12, Gdk.KEY_Return], - [13, Gdk.KEY_Delete], - [14, Gdk.KEY_Escape], - [15, Gdk.KEY_Sys_Req], - [16, Gdk.KEY_Scroll_Lock], - [17, 0], - [18, 0], - [19, 0], - [20, 0], - [21, Gdk.KEY_F1], - [22, Gdk.KEY_F2], - [23, Gdk.KEY_F3], - [24, Gdk.KEY_F4], - [25, Gdk.KEY_F5], - [26, Gdk.KEY_F6], - [27, Gdk.KEY_F7], - [28, Gdk.KEY_F8], - [29, Gdk.KEY_F9], - [30, Gdk.KEY_F10], - [31, Gdk.KEY_F11], - [32, Gdk.KEY_F12], -]); - -const KeyMapCodes = new Map([ - [1, 14], - [2, 15], - [3, 101], - [4, 105], - [5, 103], - [6, 106], - [7, 108], - [8, 104], - [9, 109], - [10, 102], - [11, 107], - [12, 28], - [13, 111], - [14, 1], - [15, 99], - [16, 70], - [17, 0], - [18, 0], - [19, 0], - [20, 0], - [21, 59], - [22, 60], - [23, 61], - [24, 62], - [25, 63], - [26, 64], - [27, 65], - [28, 66], - [29, 67], - [30, 68], - [31, 87], - [32, 88], -]); - -/** - * Mousepad Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/mousepad - * - * TODO: support outgoing mouse events? - */ -const MousepadPlugin = GObject.registerClass({ - GTypeName: 'GSConnectMousepadPlugin', - Properties: { - 'state': GObject.ParamSpec.boolean( - 'state', - 'State', - 'Remote keyboard state', - GObject.ParamFlags.READABLE, - false - ), - }, -}, class MousepadPlugin extends Plugin { - _init(device) { - super._init(device, 'mousepad'); - - if (!globalThis.HAVE_GNOME) - this._input = Components.acquire('ydotool'); - else - this._input = Components.acquire('input'); - - this._shareControlChangedId = this.settings.connect( - 'changed::share-control', - this._sendState.bind(this) - ); - } - - get state() { - if (this._state === undefined) - this._state = false; - - return this._state; - } - - connected() { - super.connected(); - - this._sendState(); - } - - disconnected() { - super.disconnected(); - - this._state = false; - this.notify('state'); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.mousepad.request': - this._handleInput(packet.body); - break; - - case 'kdeconnect.mousepad.echo': - this._handleEcho(packet.body); - break; - - case 'kdeconnect.mousepad.keyboardstate': - this._handleState(packet); - break; - } - } - - /** - * Handle a input event. - * - * @param {Object} input - The body of a `kdeconnect.mousepad.request` - */ - _handleInput(input) { - if (!this.settings.get_boolean('share-control')) - return; - - let keysym; - let modifiers = 0; - const modifiers_codes = []; - - // These are ordered, as much as possible, to create the shortest code - // path for high-frequency, low-latency events (eg. mouse movement) - switch (true) { - case input.hasOwnProperty('scroll'): - this._input.scrollPointer(input.dx, input.dy); - break; - - case (input.hasOwnProperty('dx') && input.hasOwnProperty('dy')): - this._input.movePointer(input.dx, input.dy); - break; - - case (input.hasOwnProperty('key') || input.hasOwnProperty('specialKey')): - // NOTE: \u0000 sometimes sent in advance of a specialKey packet - if (input.key && input.key === '\u0000') - return; - - // Modifiers - if (input.alt) { - modifiers |= Gdk.ModifierType.MOD1_MASK; - modifiers_codes.push(56); - } - - if (input.ctrl) { - modifiers |= Gdk.ModifierType.CONTROL_MASK; - modifiers_codes.push(29); - } - - if (input.shift) { - modifiers |= Gdk.ModifierType.SHIFT_MASK; - modifiers_codes.push(42); - } - - if (input.super) { - modifiers |= Gdk.ModifierType.SUPER_MASK; - modifiers_codes.push(125); - } - - // Regular key (printable ASCII or Unicode) - if (input.key) { - if (!globalThis.HAVE_GNOME) - this._input.pressKeys(input.key, modifiers_codes); - else - this._input.pressKeys(input.key, modifiers); - - this._sendEcho(input); - - // Special key (eg. non-printable ASCII) - } else if (input.specialKey && KeyMap.has(input.specialKey)) { - if (!globalThis.HAVE_GNOME) { - keysym = KeyMapCodes.get(input.specialKey); - this._input.pressKeys(keysym, modifiers_codes); - } else { - keysym = KeyMap.get(input.specialKey); - this._input.pressKeys(keysym, modifiers); - } - - this._sendEcho(input); - } - break; - - case input.hasOwnProperty('singleclick'): - this._input.clickPointer(Gdk.BUTTON_PRIMARY); - break; - - case input.hasOwnProperty('doubleclick'): - this._input.doubleclickPointer(Gdk.BUTTON_PRIMARY); - break; - - case input.hasOwnProperty('middleclick'): - this._input.clickPointer(Gdk.BUTTON_MIDDLE); - break; - - case input.hasOwnProperty('rightclick'): - this._input.clickPointer(Gdk.BUTTON_SECONDARY); - break; - - case input.hasOwnProperty('singlehold'): - this._input.pressPointer(Gdk.BUTTON_PRIMARY); - break; - - case input.hasOwnProperty('singlerelease'): - this._input.releasePointer(Gdk.BUTTON_PRIMARY); - break; - - default: - logError(new Error('Unknown input')); - } - } - - /** - * Handle an echo/ACK of a event we sent, displaying it the dialog entry. - * - * @param {Object} input - The body of a `kdeconnect.mousepad.echo` - */ - _handleEcho(input) { - if (!this._dialog || !this._dialog.visible) - return; - - // Skip modifiers - if (input.alt || input.ctrl || input.super) - return; - - if (input.key) { - this._dialog._isAck = true; - this._dialog.entry.buffer.text += input.key; - this._dialog._isAck = false; - } else if (KeyMap.get(input.specialKey) === Gdk.KEY_BackSpace) { - this._dialog.entry.emit('backspace'); - } - } - - /** - * Handle a state change from the remote keyboard. This is an indication - * that the remote keyboard is ready to accept input. - * - * @param {Object} packet - A `kdeconnect.mousepad.keyboardstate` packet - */ - _handleState(packet) { - this._state = !!packet.body.state; - this.notify('state'); - } - - /** - * Send an echo/ACK of @input, if requested - * - * @param {Object} input - The body of a 'kdeconnect.mousepad.request' - */ - _sendEcho(input) { - if (!input.sendAck) - return; - - delete input.sendAck; - input.isAck = true; - - this.device.sendPacket({ - type: 'kdeconnect.mousepad.echo', - body: input, - }); - } - - /** - * Send the local keyboard state - * - * @param {boolean} state - Whether we're ready to accept input - */ - _sendState() { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.keyboardstate', - body: { - state: this.settings.get_boolean('share-control'), - }, - }); - } - - /** - * Open the Keyboard Input dialog - */ - keyboard() { - if (this._dialog === undefined) { - this._dialog = new InputDialog({ - device: this.device, - plugin: this, - }); - } - - this._dialog.present(); - } - - destroy() { - if (this._input !== undefined) { - if (!globalThis.HAVE_GNOME) - this._input = Components.release('ydotool'); - else - this._input = Components.release('input'); - } - - if (this._dialog !== undefined) - this._dialog.destroy(); - - this.settings.disconnect(this._shareControlChangedId); - - super.destroy(); - } -}); - -export default MousepadPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js deleted file mode 100644 index 2fd6a50f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js +++ /dev/null @@ -1,917 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Config from '../../config.js'; -import * as DBus from '../utils/dbus.js'; -import {Player} from '../components/mpris.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('MPRIS'), - description: _('Bidirectional remote media playback control'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.MPRIS', - incomingCapabilities: ['kdeconnect.mpris', 'kdeconnect.mpris.request'], - outgoingCapabilities: ['kdeconnect.mpris', 'kdeconnect.mpris.request'], - actions: {}, -}; - - -/** - * MPRIS Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/mpriscontrol - * - * See also: - * https://specifications.freedesktop.org/mpris-spec/latest/ - * https://github.com/GNOME/gnome-shell/blob/master/js/ui/mpris.js - */ -const MPRISPlugin = GObject.registerClass({ - GTypeName: 'GSConnectMPRISPlugin', -}, class MPRISPlugin extends Plugin { - - _init(device) { - super._init(device, 'mpris'); - - this._players = new Map(); - this._transferring = new WeakSet(); - this._updating = new WeakSet(); - - this._mpris = Components.acquire('mpris'); - - this._playerAddedId = this._mpris.connect( - 'player-added', - this._sendPlayerList.bind(this) - ); - - this._playerRemovedId = this._mpris.connect( - 'player-removed', - this._sendPlayerList.bind(this) - ); - - this._playerChangedId = this._mpris.connect( - 'player-changed', - this._onPlayerChanged.bind(this) - ); - - this._playerSeekedId = this._mpris.connect( - 'player-seeked', - this._onPlayerSeeked.bind(this) - ); - } - - connected() { - super.connected(); - - this._requestPlayerList(); - this._sendPlayerList(); - } - - disconnected() { - super.disconnected(); - - for (const [identity, player] of this._players) { - this._players.delete(identity); - player.destroy(); - } - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.mpris': - this._handleUpdate(packet); - break; - - case 'kdeconnect.mpris.request': - this._handleRequest(packet); - break; - } - } - - /** - * Handle a remote player update. - * - * @param {Core.Packet} packet - A `kdeconnect.mpris` - */ - _handleUpdate(packet) { - try { - if (packet.body.hasOwnProperty('playerList')) - this._handlePlayerList(packet.body.playerList); - else if (packet.body.hasOwnProperty('player')) - this._handlePlayerUpdate(packet); - } catch (e) { - debug(e, this.device.name); - } - } - - /** - * Handle an updated list of remote players. - * - * @param {string[]} playerList - A list of remote player names - */ - _handlePlayerList(playerList) { - // Destroy removed players before adding new ones - for (const player of this._players.values()) { - if (!playerList.includes(player.Identity)) { - this._players.delete(player.Identity); - player.destroy(); - } - } - - for (const identity of playerList) { - if (!this._players.has(identity)) { - const player = new PlayerRemote(this.device, identity); - this._players.set(identity, player); - } - - // Always request player updates; packets are cheap - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: identity, - requestNowPlaying: true, - requestVolume: true, - }, - }); - } - } - - /** - * Handle an update for a remote player. - * - * @param {Object} packet - A `kdeconnect.mpris` packet - */ - _handlePlayerUpdate(packet) { - const player = this._players.get(packet.body.player); - - if (player === undefined) - return; - - if (packet.body.hasOwnProperty('transferringAlbumArt')) - player.handleAlbumArt(packet); - else - player.update(packet.body); - } - - /** - * Request a list of remote players. - */ - _requestPlayerList() { - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - requestPlayerList: true, - }, - }); - } - - /** - * Handle a request for player information or action. - * - * @param {Core.Packet} packet - a `kdeconnect.mpris.request` - * @return {undefined} no return value - */ - _handleRequest(packet) { - // A request for the list of players - if (packet.body.hasOwnProperty('requestPlayerList')) - return this._sendPlayerList(); - - // A request for an unknown player; send the list of players - if (!this._mpris.hasPlayer(packet.body.player)) - return this._sendPlayerList(); - - // An album art request - if (packet.body.hasOwnProperty('albumArtUrl')) - return this._sendAlbumArt(packet); - - // A player command - this._handleCommand(packet); - } - - /** - * Handle an incoming player command or information request - * - * @param {Core.Packet} packet - A `kdeconnect.mpris.request` - */ - async _handleCommand(packet) { - if (!this.settings.get_boolean('share-players')) - return; - - let player; - - try { - player = this._mpris.getPlayer(packet.body.player); - - if (player === undefined || this._updating.has(player)) - return; - - this._updating.add(player); - - // Player Actions - if (packet.body.hasOwnProperty('action')) { - switch (packet.body.action) { - case 'PlayPause': - case 'Play': - case 'Pause': - case 'Next': - case 'Previous': - case 'Stop': - player[packet.body.action](); - break; - - default: - debug(`unknown action: ${packet.body.action}`); - } - } - - // Player Properties - if (packet.body.hasOwnProperty('setLoopStatus')) - player.LoopStatus = packet.body.setLoopStatus; - - if (packet.body.hasOwnProperty('setShuffle')) - player.Shuffle = packet.body.setShuffle; - - if (packet.body.hasOwnProperty('setVolume')) - player.Volume = packet.body.setVolume / 100; - - if (packet.body.hasOwnProperty('Seek')) - await player.Seek(packet.body.Seek); - - if (packet.body.hasOwnProperty('SetPosition')) { - // We want to avoid implementing this as a seek operation, - // because some players seek a fixed amount for every - // seek request, only respecting the sign of the parameter. - // (Chrome, for example, will only seek ±5 seconds, regardless - // what value is passed to Seek().) - const position = packet.body.SetPosition; - const metadata = player.Metadata; - if (metadata.hasOwnProperty('mpris:trackid')) { - const trackId = metadata['mpris:trackid']; - await player.SetPosition(trackId, position * 1000); - } else { - await player.Seek(position * 1000 - player.Position); - } - } - - // Information Request - let hasResponse = false; - - const response = { - type: 'kdeconnect.mpris', - body: { - player: packet.body.player, - }, - }; - - if (packet.body.hasOwnProperty('requestNowPlaying')) { - hasResponse = true; - - Object.assign(response.body, { - pos: Math.floor(player.Position / 1000), - isPlaying: (player.PlaybackStatus === 'Playing'), - canPause: player.CanPause, - canPlay: player.CanPlay, - canGoNext: player.CanGoNext, - canGoPrevious: player.CanGoPrevious, - canSeek: player.CanSeek, - loopStatus: player.LoopStatus, - shuffle: player.Shuffle, - - // default values for members that will be filled conditionally - albumArtUrl: '', - length: 0, - artist: '', - title: '', - album: '', - nowPlaying: '', - volume: 0, - }); - - const metadata = player.Metadata; - - if (metadata.hasOwnProperty('mpris:artUrl')) { - const file = Gio.File.new_for_uri(metadata['mpris:artUrl']); - response.body.albumArtUrl = file.get_uri(); - } - - if (metadata.hasOwnProperty('mpris:length')) { - const trackLen = Math.floor(metadata['mpris:length'] / 1000); - response.body.length = trackLen; - } - - if (metadata.hasOwnProperty('xesam:artist')) { - const artists = metadata['xesam:artist']; - response.body.artist = artists.join(', '); - } - - if (metadata.hasOwnProperty('xesam:title')) - response.body.title = metadata['xesam:title']; - - if (metadata.hasOwnProperty('xesam:album')) - response.body.album = metadata['xesam:album']; - - // Now Playing - if (response.body.artist && response.body.title) { - response.body.nowPlaying = [ - response.body.artist, - response.body.title, - ].join(' - '); - } else if (response.body.artist) { - response.body.nowPlaying = response.body.artist; - } else if (response.body.title) { - response.body.nowPlaying = response.body.title; - } else { - response.body.nowPlaying = _('Unknown'); - } - } - - if (packet.body.hasOwnProperty('requestVolume')) { - hasResponse = true; - response.body.volume = Math.floor(player.Volume * 100); - } - - if (hasResponse) - this.device.sendPacket(response); - } catch (e) { - debug(e, this.device.name); - } finally { - this._updating.delete(player); - } - } - - _onPlayerChanged(mpris, player) { - if (!this.settings.get_boolean('share-players')) - return; - - this._handleCommand({ - body: { - player: player.Identity, - requestNowPlaying: true, - requestVolume: true, - }, - }); - } - - _onPlayerSeeked(mpris, player, offset) { - // TODO: although we can handle full seeked signals, kdeconnect-android - // does not, and expects a position update instead - this.device.sendPacket({ - type: 'kdeconnect.mpris', - body: { - player: player.Identity, - pos: Math.floor(player.Position / 1000), - // Seek: Math.floor(offset / 1000), - }, - }); - } - - async _sendAlbumArt(packet) { - let player; - - try { - // Reject concurrent requests for album art - player = this._mpris.getPlayer(packet.body.player); - - if (player === undefined || this._transferring.has(player)) - return; - - // Ensure the requested albumArtUrl matches the current mpris:artUrl - const metadata = player.Metadata; - - if (!metadata.hasOwnProperty('mpris:artUrl')) - return; - - const file = Gio.File.new_for_uri(metadata['mpris:artUrl']); - const request = Gio.File.new_for_uri(packet.body.albumArtUrl); - - if (file.get_uri() !== request.get_uri()) - throw RangeError(`invalid URI "${packet.body.albumArtUrl}"`); - - // Transfer the album art - this._transferring.add(player); - - const transfer = this.device.createTransfer(); - - transfer.addFile({ - type: 'kdeconnect.mpris', - body: { - transferringAlbumArt: true, - player: packet.body.player, - albumArtUrl: packet.body.albumArtUrl, - }, - }, file); - - await transfer.start(); - } catch (e) { - debug(e, this.device.name); - } finally { - this._transferring.delete(player); - } - } - - /** - * Send the list of player identities and indicate whether we support - * transferring album art - */ - _sendPlayerList() { - let playerList = []; - - if (this.settings.get_boolean('share-players')) - playerList = this._mpris.getIdentities(); - - this.device.sendPacket({ - type: 'kdeconnect.mpris', - body: { - playerList: playerList, - supportAlbumArtPayload: true, - }, - }); - } - - destroy() { - if (this._mpris !== undefined) { - this._mpris.disconnect(this._playerAddedId); - this._mpris.disconnect(this._playerRemovedId); - this._mpris.disconnect(this._playerChangedId); - this._mpris.disconnect(this._playerSeekedId); - this._mpris = Components.release('mpris'); - } - - for (const [identity, player] of this._players) { - this._players.delete(identity); - player.destroy(); - } - - super.destroy(); - } -}); - - -/* - * A class for mirroring a remote Media Player on DBus - */ -const PlayerRemote = GObject.registerClass({ - GTypeName: 'GSConnectMPRISPlayerRemote', -}, class PlayerRemote extends Player { - - _init(device, identity) { - super._init(); - - this._device = device; - this._Identity = identity; - this._isPlaying = false; - - this._artist = null; - this._title = null; - this._album = null; - this._length = 0; - this._artUrl = null; - - this._ownerId = 0; - this._connection = null; - this._applicationIface = null; - this._playerIface = null; - } - - _getFile(albumArtUrl) { - const hash = GLib.compute_checksum_for_string(GLib.ChecksumType.MD5, - albumArtUrl, -1); - const path = GLib.build_filenamev([Config.CACHEDIR, hash]); - - return Gio.File.new_for_uri(`file://${path}`); - } - - _requestAlbumArt(state) { - if (this._artUrl === state.albumArtUrl) - return; - - const file = this._getFile(state.albumArtUrl); - - if (file.query_exists(null)) { - this._artUrl = file.get_uri(); - this._Metadata = undefined; - this.notify('Metadata'); - } else { - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - albumArtUrl: state.albumArtUrl, - }, - }); - } - } - - _updateMetadata(state) { - let metadataChanged = false; - - if (state.hasOwnProperty('artist')) { - if (this._artist !== state.artist) { - this._artist = state.artist; - metadataChanged = true; - } - } else if (this._artist) { - this._artist = null; - metadataChanged = true; - } - - if (state.hasOwnProperty('title')) { - if (this._title !== state.title) { - this._title = state.title; - metadataChanged = true; - } - } else if (this._title) { - this._title = null; - metadataChanged = true; - } - - if (state.hasOwnProperty('album')) { - if (this._album !== state.album) { - this._album = state.album; - metadataChanged = true; - } - } else if (this._album) { - this._album = null; - metadataChanged = true; - } - - if (state.hasOwnProperty('length')) { - if (this._length !== state.length * 1000) { - this._length = state.length * 1000; - metadataChanged = true; - } - } else if (this._length) { - this._length = 0; - metadataChanged = true; - } - - if (state.hasOwnProperty('albumArtUrl')) { - this._requestAlbumArt(state); - } else if (this._artUrl) { - this._artUrl = null; - metadataChanged = true; - } - - if (metadataChanged) { - this._Metadata = undefined; - this.notify('Metadata'); - } - } - - async export() { - try { - if (this._connection === null) { - this._connection = await DBus.newConnection(); - const MPRISIface = Config.DBUS.lookup_interface('org.mpris.MediaPlayer2'); - const MPRISPlayerIface = Config.DBUS.lookup_interface('org.mpris.MediaPlayer2.Player'); - - if (this._applicationIface === null) { - this._applicationIface = new DBus.Interface({ - g_instance: this, - g_connection: this._connection, - g_object_path: '/org/mpris/MediaPlayer2', - g_interface_info: MPRISIface, - }); - } - - if (this._playerIface === null) { - this._playerIface = new DBus.Interface({ - g_instance: this, - g_connection: this._connection, - g_object_path: '/org/mpris/MediaPlayer2', - g_interface_info: MPRISPlayerIface, - }); - } - } - - if (this._ownerId !== 0) - return; - - const name = [ - this.device.name, - this.Identity, - ].join('').replace(/[\W]*/g, ''); - - this._ownerId = Gio.bus_own_name_on_connection( - this._connection, - `org.mpris.MediaPlayer2.GSConnect.${name}`, - Gio.BusNameOwnerFlags.NONE, - null, - null - ); - } catch (e) { - debug(e, this.Identity); - } - } - - unexport() { - if (this._ownerId === 0) - return; - - Gio.bus_unown_name(this._ownerId); - this._ownerId = 0; - } - - /** - * Download album art for the current track of the remote player. - * - * @param {Core.Packet} packet - A `kdeconnect.mpris` packet - */ - async handleAlbumArt(packet) { - let file; - - try { - file = this._getFile(packet.body.albumArtUrl); - - // Transfer the album art - const transfer = this.device.createTransfer(); - transfer.addFile(packet, file); - - await transfer.start(); - - this._artUrl = file.get_uri(); - this._Metadata = undefined; - this.notify('Metadata'); - } catch (e) { - debug(e, this.device.name); - - if (file) - file.delete_async(GLib.PRIORITY_DEFAULT, null, null); - } - } - - /** - * Update the internal state of the media player. - * - * @param {Core.Packet} state - The body of a `kdeconnect.mpris` packet - */ - update(state) { - this.freeze_notify(); - - // Metadata - if (state.hasOwnProperty('nowPlaying') || - state.hasOwnProperty('artist') || - state.hasOwnProperty('title')) - this._updateMetadata(state); - - // Playback Status - if (state.hasOwnProperty('isPlaying')) { - if (this._isPlaying !== state.isPlaying) { - this._isPlaying = state.isPlaying; - this.notify('PlaybackStatus'); - } - } - - if (state.hasOwnProperty('canPlay')) { - if (this.CanPlay !== state.canPlay) { - this._CanPlay = state.canPlay; - this.notify('CanPlay'); - } - } - - if (state.hasOwnProperty('canPause')) { - if (this.CanPause !== state.canPause) { - this._CanPause = state.canPause; - this.notify('CanPause'); - } - } - - if (state.hasOwnProperty('canGoNext')) { - if (this.CanGoNext !== state.canGoNext) { - this._CanGoNext = state.canGoNext; - this.notify('CanGoNext'); - } - } - - if (state.hasOwnProperty('canGoPrevious')) { - if (this.CanGoPrevious !== state.canGoPrevious) { - this._CanGoPrevious = state.canGoPrevious; - this.notify('CanGoPrevious'); - } - } - - if (state.hasOwnProperty('pos')) - this._Position = state.pos * 1000; - - if (state.hasOwnProperty('volume')) { - if (this.Volume !== state.volume / 100) { - this._Volume = state.volume / 100; - this.notify('Volume'); - } - } - - this.thaw_notify(); - - if (!this._isPlaying && !this.CanControl) - this.unexport(); - else - this.export(); - } - - /* - * Native properties - */ - get device() { - return this._device; - } - - /* - * The org.mpris.MediaPlayer2.Player Interface - */ - get CanControl() { - return (this.CanPlay || this.CanPause); - } - - get Metadata() { - if (this._Metadata === undefined) { - this._Metadata = {}; - - if (this._artist) { - this._Metadata['xesam:artist'] = new GLib.Variant('as', - [this._artist]); - } - - if (this._title) { - this._Metadata['xesam:title'] = new GLib.Variant('s', - this._title); - } - - if (this._album) { - this._Metadata['xesam:album'] = new GLib.Variant('s', - this._album); - } - - if (this._artUrl) { - this._Metadata['mpris:artUrl'] = new GLib.Variant('s', - this._artUrl); - } - - this._Metadata['mpris:length'] = new GLib.Variant('x', - this._length); - } - - return this._Metadata; - } - - get PlaybackStatus() { - if (this._isPlaying) - return 'Playing'; - - return 'Stopped'; - } - - get Volume() { - if (this._Volume === undefined) - this._Volume = 0.3; - - return this._Volume; - } - - set Volume(level) { - if (this._Volume === level) - return; - - this._Volume = level; - this.notify('Volume'); - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - setVolume: Math.floor(this._Volume * 100), - }, - }); - } - - Next() { - if (!this.CanGoNext) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'Next', - }, - }); - } - - Pause() { - if (!this.CanPause) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'Pause', - }, - }); - } - - Play() { - if (!this.CanPlay) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'Play', - }, - }); - } - - PlayPause() { - if (!this.CanPlay && !this.CanPause) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'PlayPause', - }, - }); - } - - Previous() { - if (!this.CanGoPrevious) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'Previous', - }, - }); - } - - Seek(offset) { - if (!this.CanSeek) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - Seek: offset, - }, - }); - } - - SetPosition(trackId, position) { - debug(`${this._Identity}: SetPosition(${trackId}, ${position})`); - - if (!this.CanControl || !this.CanSeek) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - SetPosition: position / 1000, - }, - }); - } - - Stop() { - if (!this.CanControl) - return; - - this.device.sendPacket({ - type: 'kdeconnect.mpris.request', - body: { - player: this.Identity, - action: 'Stop', - }, - }); - } - - destroy() { - this.unexport(); - - if (this._connection) { - this._connection.close(null, null); - this._connection = null; - - if (this._applicationIface) { - this._applicationIface.destroy(); - this._applicationIface = null; - } - - if (this._playerIface) { - this._playerIface.destroy(); - this._playerIface = null; - } - } - } -}); - -export default MPRISPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/notification.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/notification.js deleted file mode 100644 index bb317db6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/notification.js +++ /dev/null @@ -1,694 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import * as Components from '../components/index.js'; -import Config from '../../config.js'; -import Plugin from '../plugin.js'; -import ReplyDialog from '../ui/notification.js'; - - -export const Metadata = { - label: _('Notifications'), - description: _('Share notifications with the paired device'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Notification', - incomingCapabilities: [ - 'kdeconnect.notification', - 'kdeconnect.notification.request', - ], - outgoingCapabilities: [ - 'kdeconnect.notification', - 'kdeconnect.notification.action', - 'kdeconnect.notification.reply', - 'kdeconnect.notification.request', - ], - actions: { - withdrawNotification: { - label: _('Cancel Notification'), - icon_name: 'preferences-system-notifications-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.notification'], - }, - closeNotification: { - label: _('Close Notification'), - icon_name: 'preferences-system-notifications-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.notification.request'], - }, - replyNotification: { - label: _('Reply Notification'), - icon_name: 'preferences-system-notifications-symbolic', - - parameter_type: new GLib.VariantType('(ssa{ss})'), - incoming: ['kdeconnect.notification'], - outgoing: ['kdeconnect.notification.reply'], - }, - sendNotification: { - label: _('Send Notification'), - icon_name: 'preferences-system-notifications-symbolic', - - parameter_type: new GLib.VariantType('a{sv}'), - incoming: [], - outgoing: ['kdeconnect.notification'], - }, - activateNotification: { - label: _('Activate Notification'), - icon_name: 'preferences-system-notifications-symbolic', - - parameter_type: new GLib.VariantType('(ss)'), - incoming: [], - outgoing: ['kdeconnect.notification.action'], - }, - }, -}; - - -// A regex for our custom notificaiton ids -const ID_REGEX = /^(fdo|gtk)\|([^|]+)\|(.*)$/; - -// A list of known SMS apps -const SMS_APPS = [ - // Popular apps that don't contain the string 'sms' - 'com.android.messaging', // AOSP - 'com.google.android.apps.messaging', // Google Messages - 'com.textra', // Textra - 'xyz.klinker.messenger', // Pulse - 'com.calea.echo', // Mood Messenger - 'com.moez.QKSMS', // QKSMS - 'rpkandrodev.yaata', // YAATA - 'com.tencent.mm', // WeChat - 'com.viber.voip', // Viber - 'com.kakao.talk', // KakaoTalk - 'com.concentriclivers.mms.com.android.mms', // AOSP Clone - 'fr.slvn.mms', // AOSP Clone - 'com.promessage.message', // - 'com.htc.sense.mms', // HTC Messages - - // Known not to work with sms plugin - 'org.thoughtcrime.securesms', // Signal Private Messenger - 'com.samsung.android.messaging', // Samsung Messages -]; - - -/** - * Try to determine if an notification is from an SMS app - * - * @param {Core.Packet} packet - A `kdeconnect.notification` - * @return {boolean} Whether the notification is from an SMS app - */ -function _isSmsNotification(packet) { - const id = packet.body.id; - - if (id.includes('sms')) - return true; - - for (let i = 0, len = SMS_APPS.length; i < len; i++) { - if (id.includes(SMS_APPS[i])) - return true; - } - - return false; -} - - -/** - * Remove a local libnotify or Gtk notification. - * - * @param {String|Number} id - Gtk (string) or libnotify id (uint32) - * @param {String|null} application - Application Id if Gtk or null - */ -function _removeNotification(id, application = null) { - let name, path, method, variant; - - if (application !== null) { - name = 'org.gtk.Notifications'; - method = 'RemoveNotification'; - path = '/org/gtk/Notifications'; - variant = new GLib.Variant('(ss)', [application, id]); - } else { - name = 'org.freedesktop.Notifications'; - path = '/org/freedesktop/Notifications'; - method = 'CloseNotification'; - variant = new GLib.Variant('(u)', [id]); - } - - Gio.DBus.session.call( - name, path, name, method, variant, null, - Gio.DBusCallFlags.NONE, -1, null, - (connection, res) => { - try { - connection.call_finish(res); - } catch (e) { - logError(e); - } - } - ); -} - - -/** - * Notification Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/notifications - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/sendnotifications - */ -const NotificationPlugin = GObject.registerClass({ - GTypeName: 'GSConnectNotificationPlugin', -}, class NotificationPlugin extends Plugin { - - _init(device) { - super._init(device, 'notification'); - - this._listener = Components.acquire('notification'); - this._session = Components.acquire('session'); - - this._notificationAddedId = this._listener.connect( - 'notification-added', - this._onNotificationAdded.bind(this) - ); - - // Load application notification settings - this._applicationsChangedId = this.settings.connect( - 'changed::applications', - this._onApplicationsChanged.bind(this) - ); - this._onApplicationsChanged(this.settings, 'applications'); - this._applicationsChangedSkip = false; - } - - connected() { - super.connected(); - - this._requestNotifications(); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.notification': - this._handleNotification(packet); - break; - - // TODO - case 'kdeconnect.notification.action': - this._handleNotificationAction(packet); - break; - - // No Linux/BSD desktop notifications are repliable as yet - case 'kdeconnect.notification.reply': - debug(`Not implemented: ${packet.type}`); - break; - - case 'kdeconnect.notification.request': - this._handleNotificationRequest(packet); - break; - - default: - debug(`Unknown notification packet: ${packet.type}`); - } - } - - _onApplicationsChanged(settings, key) { - if (this._applicationsChangedSkip) - return; - - try { - const json = settings.get_string(key); - this._applications = JSON.parse(json); - } catch (e) { - debug(e, this.device.name); - - this._applicationsChangedSkip = true; - settings.set_string(key, '{}'); - this._applicationsChangedSkip = false; - } - } - - _onNotificationAdded(listener, notification) { - try { - const notif = notification.full_unpack(); - - // An unconfigured application - if (notif.appName && !this._applications[notif.appName]) { - this._applications[notif.appName] = { - iconName: 'system-run-symbolic', - enabled: true, - }; - - // Store the themed icons for the device preferences window - if (notif.icon === undefined) { - // Keep default - - } else if (typeof notif.icon === 'string') { - this._applications[notif.appName].iconName = notif.icon; - - } else if (notif.icon instanceof Gio.ThemedIcon) { - const iconName = notif.icon.get_names()[0]; - this._applications[notif.appName].iconName = iconName; - } - - this._applicationsChangedSkip = true; - this.settings.set_string( - 'applications', - JSON.stringify(this._applications) - ); - this._applicationsChangedSkip = false; - } - - // Sending notifications forbidden - if (!this.settings.get_boolean('send-notifications')) - return; - - // Sending when the session is active is forbidden - if (!this.settings.get_boolean('send-active') && this._session.active) - return; - - // Notifications disabled for this application - if (notif.appName && !this._applications[notif.appName].enabled) - return; - - this.sendNotification(notif); - } catch (e) { - debug(e, this.device.name); - } - } - - /** - * Handle an incoming notification or closed report. - * - * FIXME: upstream kdeconnect-android is tagging many notifications as - * `silent`, causing them to never be shown. Since we already handle - * duplicates in the Shell, we ignore that flag for now. - * - * @param {Core.Packet} packet - A `kdeconnect.notification` - */ - _handleNotification(packet) { - // A report that a remote notification has been dismissed - if (packet.body.hasOwnProperty('isCancel')) - this.device.hideNotification(packet.body.id); - - // A normal, remote notification - else - this._receiveNotification(packet); - } - - /** - * Handle an incoming request to activate a notification action. - * - * @param {Core.Packet} packet - A `kdeconnect.notification.action` - */ - _handleNotificationAction(packet) { - throw new GObject.NotImplementedError(); - } - - /** - * Handle an incoming request to close or list notifications. - * - * @param {Core.Packet} packet - A `kdeconnect.notification.request` - */ - _handleNotificationRequest(packet) { - // A request for our notifications. This isn't implemented and would be - // pretty hard to without communicating with GNOME Shell. - if (packet.body.hasOwnProperty('request')) - return; - - // A request to close a local notification - // - // TODO: kdeconnect-android doesn't send these, and will instead send a - // kdeconnect.notification packet with isCancel and an id of "0". - // - // For clients that do support it, we report notification ids in the - // form "type|application-id|notification-id" so we can close it with - // the appropriate service. - if (packet.body.hasOwnProperty('cancel')) { - const [, type, application, id] = ID_REGEX.exec(packet.body.cancel); - - if (type === 'fdo') - _removeNotification(parseInt(id)); - else if (type === 'gtk') - _removeNotification(id, application); - } - } - - /** - * Upload an icon from a GLib.Bytes object. - * - * @param {Core.Packet} packet - The packet for the notification - * @param {GLib.Bytes} bytes - The icon bytes - */ - _uploadBytesIcon(packet, bytes) { - const stream = Gio.MemoryInputStream.new_from_bytes(bytes); - this._uploadIconStream(packet, stream, bytes.get_size()); - } - - /** - * Upload an icon from a Gio.File object. - * - * @param {Core.Packet} packet - A `kdeconnect.notification` - * @param {Gio.File} file - A file object for the icon - */ - async _uploadFileIcon(packet, file) { - const read = file.read_async(GLib.PRIORITY_DEFAULT, null); - const query = file.query_info_async('standard::size', - Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_DEFAULT, null); - const [stream, info] = await Promise.all([read, query]); - - this._uploadIconStream(packet, stream, info.get_size()); - } - - /** - * A function for uploading GThemedIcons - * - * @param {Core.Packet} packet - The packet for the notification - * @param {Gio.ThemedIcon} icon - The GIcon to upload - */ - _uploadThemedIcon(packet, icon) { - const theme = Gtk.IconTheme.get_default(); - let file = null; - - for (const name of icon.names) { - // NOTE: kdeconnect-android doesn't support SVGs - const size = Math.max.apply(null, theme.get_icon_sizes(name)); - const info = theme.lookup_icon(name, size, Gtk.IconLookupFlags.NO_SVG); - - // Send the first icon we find from the options - if (info) { - file = Gio.File.new_for_path(info.get_filename()); - break; - } - } - - if (file) - this._uploadFileIcon(packet, file); - else - this.device.sendPacket(packet); - } - - /** - * All icon types end up being uploaded in this function. - * - * @param {Core.Packet} packet - The packet for the notification - * @param {Gio.InputStream} stream - A stream to read the icon bytes from - * @param {number} size - Size of the icon in bytes - */ - async _uploadIconStream(packet, stream, size) { - try { - const transfer = this.device.createTransfer(); - transfer.addStream(packet, stream, size); - - await transfer.start(); - } catch (e) { - debug(e); - - this.device.sendPacket(packet); - } - } - - /** - * Upload an icon from a GIcon or themed icon name. - * - * @param {Core.Packet} packet - A `kdeconnect.notification` - * @param {Gio.Icon|string|null} icon - An icon or %null - * @return {Promise} A promise for the operation - */ - _uploadIcon(packet, icon = null) { - // Normalize strings into GIcons - if (typeof icon === 'string') - icon = Gio.Icon.new_for_string(icon); - - if (icon instanceof Gio.ThemedIcon) - return this._uploadThemedIcon(packet, icon); - - if (icon instanceof Gio.FileIcon) - return this._uploadFileIcon(packet, icon.get_file()); - - if (icon instanceof Gio.BytesIcon) - return this._uploadBytesIcon(packet, icon.get_bytes()); - - return this.device.sendPacket(packet); - } - - /** - * Send a local notification to the remote device. - * - * @param {Object} notif - A dictionary of notification parameters - * @param {string} notif.appName - The notifying application - * @param {string} notif.id - The notification ID - * @param {string} notif.title - The notification title - * @param {string} notif.body - The notification body - * @param {string} notif.ticker - The notification title & body - * @param {boolean} notif.isClearable - If the notification can be closed - * @param {string|Gio.Icon} notif.icon - An icon name or GIcon - */ - async sendNotification(notif) { - try { - const icon = notif.icon || null; - delete notif.icon; - - await this._uploadIcon({ - type: 'kdeconnect.notification', - body: notif, - }, icon); - } catch (e) { - logError(e); - } - } - - async _downloadIcon(packet) { - try { - if (!packet.hasPayload()) - return null; - - // Save the file in the global cache - const path = GLib.build_filenamev([ - Config.CACHEDIR, - packet.body.payloadHash || `${Date.now()}`, - ]); - - // Check if we've already downloaded this icon - // NOTE: if we reject the transfer kdeconnect-android will resend - // the notification packet, which may cause problems wrt #789 - const file = Gio.File.new_for_path(path); - - if (file.query_exists(null)) - return new Gio.FileIcon({file: file}); - - // Open the target path and create a transfer - const transfer = this.device.createTransfer(); - - transfer.addFile(packet, file); - - try { - await transfer.start(); - - return new Gio.FileIcon({file: file}); - } catch (e) { - debug(e, this.device.name); - - file.delete_async(GLib.PRIORITY_DEFAULT, null, null); - return null; - } - } catch (e) { - debug(e, this.device.name); - return null; - } - } - - /** - * Receive an incoming notification. - * - * @param {Core.Packet} packet - A `kdeconnect.notification` - */ - async _receiveNotification(packet) { - try { - // Set defaults - let action = null; - let buttons = []; - let id = packet.body.id; - let title = packet.body.appName; - let body = `${packet.body.title}: ${packet.body.text}`; - let icon = await this._downloadIcon(packet); - - // Repliable Notification - if (packet.body.requestReplyId) { - id = `${packet.body.id}|${packet.body.requestReplyId}`; - action = { - name: 'replyNotification', - parameter: new GLib.Variant('(ssa{ss})', [ - packet.body.requestReplyId, - '', - { - appName: packet.body.appName, - title: packet.body.title, - text: packet.body.text, - }, - ]), - }; - } - - // Notification Actions - if (packet.body.actions) { - buttons = packet.body.actions.map(action => { - return { - label: action, - action: 'activateNotification', - parameter: new GLib.Variant('(ss)', [id, action]), - }; - }); - } - - // Special case for Missed Calls - if (packet.body.id.includes('MissedCall')) { - title = packet.body.title; - body = packet.body.text; - - if (icon === null) - icon = new Gio.ThemedIcon({name: 'call-missed-symbolic'}); - - // Special case for SMS notifications - } else if (_isSmsNotification(packet)) { - title = packet.body.title; - body = packet.body.text; - action = { - name: 'replySms', - parameter: new GLib.Variant('s', packet.body.title), - }; - - if (icon === null) - icon = new Gio.ThemedIcon({name: 'sms-symbolic'}); - - // Special case where 'appName' is the same as 'title' - } else if (packet.body.appName === packet.body.title) { - body = packet.body.text; - } - - // Use the device icon if we still don't have one - if (icon === null) - icon = new Gio.ThemedIcon({name: this.device.icon_name}); - - // Show the notification - this.device.showNotification({ - id: id, - title: title, - body: body, - icon: icon, - action: action, - buttons: buttons, - }); - } catch (e) { - logError(e); - } - } - - /** - * Request the remote notifications be sent - */ - _requestNotifications() { - this.device.sendPacket({ - type: 'kdeconnect.notification.request', - body: {request: true}, - }); - } - - /** - * Report that a local notification has been closed/dismissed. - * TODO: kdeconnect-android doesn't handle incoming isCancel packets. - * - * @param {string} id - The local notification id - */ - withdrawNotification(id) { - this.device.sendPacket({ - type: 'kdeconnect.notification', - body: { - isCancel: true, - id: id, - }, - }); - } - - /** - * Close a remote notification. - * TODO: ignore local notifications - * - * @param {string} id - The remote notification id - */ - closeNotification(id) { - this.device.sendPacket({ - type: 'kdeconnect.notification.request', - body: {cancel: id}, - }); - } - - /** - * Reply to a notification sent with a requestReplyId UUID - * - * @param {string} uuid - The requestReplyId for the repliable notification - * @param {string} message - The message to reply with - * @param {Object} notification - The original notification packet - */ - replyNotification(uuid, message, notification) { - // If this happens for some reason, things will explode - if (!uuid) - throw Error('Missing UUID'); - - // If the message has no content, open a dialog for the user to add one - if (!message) { - const dialog = new ReplyDialog({ - device: this.device, - uuid: uuid, - notification: notification, - plugin: this, - }); - dialog.present(); - - // Otherwise just send the reply - } else { - this.device.sendPacket({ - type: 'kdeconnect.notification.reply', - body: { - requestReplyId: uuid, - message: message, - }, - }); - } - } - - /** - * Activate a remote notification action - * - * @param {string} id - The remote notification id - * @param {string} action - The notification action (label) - */ - activateNotification(id, action) { - this.device.sendPacket({ - type: 'kdeconnect.notification.action', - body: { - action: action, - key: id, - }, - }); - } - - destroy() { - this.settings.disconnect(this._applicationsChangedId); - - if (this._listener !== undefined) { - this._listener.disconnect(this._notificationAddedId); - this._listener = Components.release('notification'); - } - - if (this._session !== undefined) - this._session = Components.release('session'); - - super.destroy(); - } -}); - -export default NotificationPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/ping.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/ping.js deleted file mode 100644 index 011ecf02..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/ping.js +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Ping'), - description: _('Send and receive pings'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Ping', - incomingCapabilities: ['kdeconnect.ping'], - outgoingCapabilities: ['kdeconnect.ping'], - actions: { - ping: { - label: _('Ping'), - icon_name: 'dialog-information-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.ping'], - }, - }, -}; - - -/** - * Ping Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/ping - */ -const PingPlugin = GObject.registerClass({ - GTypeName: 'GSConnectPingPlugin', -}, class PingPlugin extends Plugin { - - _init(device) { - super._init(device, 'ping'); - } - - handlePacket(packet) { - // Notification - const notif = { - title: this.device.name, - body: _('Ping'), - icon: new Gio.ThemedIcon({name: `${this.device.icon_name}`}), - }; - - if (packet.body.message) { - // TRANSLATORS: An optional message accompanying a ping, rarely if ever used - // eg. Ping: A message sent with ping - notif.body = _('Ping: %s').format(packet.body.message); - } - - this.device.showNotification(notif); - } - - ping(message = '') { - const packet = { - type: 'kdeconnect.ping', - body: {}, - }; - - if (message.length) - packet.body.message = message; - - this.device.sendPacket(packet); - } -}); - -export default PingPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/presenter.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/presenter.js deleted file mode 100644 index 3cccab03..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/presenter.js +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Presentation'), - description: _('Use the paired device as a presenter'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Presenter', - incomingCapabilities: ['kdeconnect.presenter'], - outgoingCapabilities: [], - actions: {}, -}; - - -/** - * Presenter Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/presenter - * https://github.com/KDE/kdeconnect-android/tree/master/src/org/kde/kdeconnect/Plugins/PresenterPlugin/ - */ -const PresenterPlugin = GObject.registerClass({ - GTypeName: 'GSConnectPresenterPlugin', -}, class PresenterPlugin extends Plugin { - - _init(device) { - super._init(device, 'presenter'); - - if (!globalThis.HAVE_GNOME) - this._input = Components.acquire('ydotool'); - else - this._input = Components.acquire('input'); - } - - handlePacket(packet) { - if (packet.body.hasOwnProperty('dx')) { - this._input.movePointer( - packet.body.dx * 1000, - packet.body.dy * 1000 - ); - } else if (packet.body.stop) { - // Currently unsupported and unnecessary as we just re-use the mouse - // pointer instead of showing an arbitrary window. - } - } - - destroy() { - if (this._input !== undefined) { - if (!globalThis.HAVE_GNOME) - this._input = Components.release('ydotool'); - else - this._input = Components.release('input'); - } - - super.destroy(); - } -}); - -export default PresenterPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/runcommand.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/runcommand.js deleted file mode 100644 index c57c6c0f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/runcommand.js +++ /dev/null @@ -1,254 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Run Commands'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.RunCommand', - description: _('Run commands on your paired device or let the device run predefined commands on this PC'), - incomingCapabilities: [ - 'kdeconnect.runcommand', - 'kdeconnect.runcommand.request', - ], - outgoingCapabilities: [ - 'kdeconnect.runcommand', - 'kdeconnect.runcommand.request', - ], - actions: { - commands: { - label: _('Commands'), - icon_name: 'system-run-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: ['kdeconnect.runcommand'], - outgoing: ['kdeconnect.runcommand.request'], - }, - executeCommand: { - label: _('Commands'), - icon_name: 'system-run-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: ['kdeconnect.runcommand'], - outgoing: ['kdeconnect.runcommand.request'], - }, - }, -}; - - -/** - * RunCommand Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/remotecommands - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/runcommand - */ -const RunCommandPlugin = GObject.registerClass({ - GTypeName: 'GSConnectRunCommandPlugin', - Properties: { - 'remote-commands': GObject.param_spec_variant( - 'remote-commands', - 'Remote Command List', - 'A list of the device\'s remote commands', - new GLib.VariantType('a{sv}'), - null, - GObject.ParamFlags.READABLE - ), - }, -}, class RunCommandPlugin extends Plugin { - - _init(device) { - super._init(device, 'runcommand'); - - // Local Commands - this._commandListChangedId = this.settings.connect( - 'changed::command-list', - this._sendCommandList.bind(this) - ); - - // We cache remote commands so they can be used in the settings even - // when the device is offline. - this._remote_commands = {}; - this.cacheProperties(['_remote_commands']); - } - - get remote_commands() { - return this._remote_commands; - } - - connected() { - super.connected(); - - this._sendCommandList(); - this._requestCommandList(); - this._handleCommandList(this.remote_commands); - } - - clearCache() { - this._remote_commands = {}; - this.notify('remote-commands'); - } - - cacheLoaded() { - if (!this.device.connected) - return; - - this._sendCommandList(); - this._requestCommandList(); - this._handleCommandList(this.remote_commands); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.runcommand': - this._handleCommandList(packet.body.commandList); - break; - - case 'kdeconnect.runcommand.request': - if (packet.body.hasOwnProperty('key')) - this._handleCommand(packet.body.key); - - else if (packet.body.hasOwnProperty('requestCommandList')) - this._sendCommandList(); - - break; - } - } - - /** - * Handle a request to execute the local command with the UUID @key - * - * @param {string} key - The UUID of the local command - */ - _handleCommand(key) { - try { - const commands = this.settings.get_value('command-list'); - const commandList = commands.recursiveUnpack(); - - if (!commandList.hasOwnProperty(key)) { - throw new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.PERMISSION_DENIED, - message: `Unknown command: ${key}`, - }); - } - - this.device.launchProcess([ - '/bin/sh', - '-c', - commandList[key].command, - ]); - } catch (e) { - logError(e, this.device.name); - } - } - - /** - * Parse the response to a request for the remote command list. Remove the - * command menu if there are no commands, otherwise amend the menu. - * - * @param {string|Object[]} commandList - A list of remote commands - */ - _handleCommandList(commandList) { - // See: https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/1051 - if (typeof commandList === 'string') { - try { - commandList = JSON.parse(commandList); - } catch (e) { - commandList = {}; - } - } - - this._remote_commands = commandList; - this.notify('remote-commands'); - - const commandEntries = Object.entries(this.remote_commands); - - // If there are no commands, hide the menu by disabling the action - this.device.lookup_action('commands').enabled = (commandEntries.length > 0); - - // Commands Submenu - const submenu = new Gio.Menu(); - - for (const [uuid, info] of commandEntries) { - const item = new Gio.MenuItem(); - item.set_label(info.name); - item.set_icon( - new Gio.ThemedIcon({name: 'application-x-executable-symbolic'}) - ); - item.set_detailed_action(`device.executeCommand::${uuid}`); - submenu.append_item(item); - } - - // Commands Item - const item = new Gio.MenuItem(); - item.set_detailed_action('device.commands::menu'); - item.set_attribute_value( - 'hidden-when', - new GLib.Variant('s', 'action-disabled') - ); - item.set_icon(new Gio.ThemedIcon({name: 'system-run-symbolic'})); - item.set_label(_('Commands')); - item.set_submenu(submenu); - - // If the submenu item is already present it will be replaced - const menuActions = this.device.settings.get_strv('menu-actions'); - const index = menuActions.indexOf('commands'); - - if (index > -1) { - this.device.removeMenuAction('device.commands'); - this.device.addMenuItem(item, index); - } - } - - /** - * Send a request for the remote command list - */ - _requestCommandList() { - this.device.sendPacket({ - type: 'kdeconnect.runcommand.request', - body: {requestCommandList: true}, - }); - } - - /** - * Send the local command list - */ - _sendCommandList() { - const commands = this.settings.get_value('command-list').recursiveUnpack(); - const commandList = JSON.stringify(commands); - - this.device.sendPacket({ - type: 'kdeconnect.runcommand', - body: {commandList: commandList}, - }); - } - - /** - * Placeholder function for command action - */ - commands() {} - - /** - * Send a request to execute the remote command with the UUID @key - * - * @param {string} key - The UUID of the remote command - */ - executeCommand(key) { - this.device.sendPacket({ - type: 'kdeconnect.runcommand.request', - body: {key: key}, - }); - } - - destroy() { - this.settings.disconnect(this._commandListChangedId); - - super.destroy(); - } -}); - -export default RunCommandPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sftp.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sftp.js deleted file mode 100644 index 2789ff36..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sftp.js +++ /dev/null @@ -1,487 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Config from '../../config.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('SFTP'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.SFTP', - description: _('Browse the paired device filesystem'), - incomingCapabilities: ['kdeconnect.sftp'], - outgoingCapabilities: ['kdeconnect.sftp.request'], - actions: { - mount: { - label: _('Mount'), - icon_name: 'folder-remote-symbolic', - - parameter_type: null, - incoming: ['kdeconnect.sftp'], - outgoing: ['kdeconnect.sftp.request'], - }, - unmount: { - label: _('Unmount'), - icon_name: 'media-eject-symbolic', - - parameter_type: null, - incoming: ['kdeconnect.sftp'], - outgoing: ['kdeconnect.sftp.request'], - }, - }, -}; - - -const MAX_MOUNT_DIRS = 12; - - -/** - * SFTP Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/sftp - * https://github.com/KDE/kdeconnect-android/tree/master/src/org/kde/kdeconnect/Plugins/SftpPlugin - */ -const SFTPPlugin = GObject.registerClass({ - GTypeName: 'GSConnectSFTPPlugin', -}, class SFTPPlugin extends Plugin { - - _init(device) { - super._init(device, 'sftp'); - - this._gmount = null; - this._mounting = false; - - // A reusable launcher for ssh processes - this._launcher = new Gio.SubprocessLauncher({ - flags: (Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_MERGE), - }); - - // Watch the volume monitor - this._volumeMonitor = Gio.VolumeMonitor.get(); - - this._mountAddedId = this._volumeMonitor.connect( - 'mount-added', - this._onMountAdded.bind(this) - ); - - this._mountRemovedId = this._volumeMonitor.connect( - 'mount-removed', - this._onMountRemoved.bind(this) - ); - } - - get gmount() { - if (this._gmount === null && this.device.connected) { - const host = this.device.channel.host; - - const regex = new RegExp( - `sftp://(${host}):(1739|17[4-5][0-9]|176[0-4])` - ); - - for (const mount of this._volumeMonitor.get_mounts()) { - const uri = mount.get_root().get_uri(); - - if (regex.test(uri)) { - this._gmount = mount; - this._addSubmenu(mount); - this._addSymlink(mount); - - break; - } - } - } - - return this._gmount; - } - - connected() { - super.connected(); - - // Only enable for Lan connections - if (this.device.channel.constructor.name === 'LanChannel') { // FIXME: Circular import workaround - if (this.settings.get_boolean('automount')) - this.mount(); - } else { - this.device.lookup_action('mount').enabled = false; - this.device.lookup_action('unmount').enabled = false; - } - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.sftp': - if (packet.body.hasOwnProperty('errorMessage')) - this._handleError(packet); - else - this._handleMount(packet); - - break; - } - } - - _onMountAdded(monitor, mount) { - if (this._gmount !== null || !this.device.connected) - return; - - const host = this.device.channel.host; - const regex = new RegExp(`sftp://(${host}):(1739|17[4-5][0-9]|176[0-4])`); - const uri = mount.get_root().get_uri(); - - if (!regex.test(uri)) - return; - - this._gmount = mount; - this._addSubmenu(mount); - this._addSymlink(mount); - } - - _onMountRemoved(monitor, mount) { - if (this.gmount !== mount) - return; - - this._gmount = null; - this._removeSubmenu(); - } - - async _listDirectories(mount) { - const file = mount.get_root(); - - const iter = await file.enumerate_children_async( - Gio.FILE_ATTRIBUTE_STANDARD_NAME, - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, - GLib.PRIORITY_DEFAULT, - this.cancellable); - - const infos = await iter.next_files_async(MAX_MOUNT_DIRS, - GLib.PRIORITY_DEFAULT, this.cancellable); - iter.close_async(GLib.PRIORITY_DEFAULT, null, null); - - const directories = {}; - - for (const info of infos) { - const name = info.get_name(); - directories[name] = `${file.get_uri()}${name}/`; - } - - return directories; - } - - _onAskQuestion(op, message, choices) { - op.reply(Gio.MountOperationResult.HANDLED); - } - - _onAskPassword(op, message, user, domain, flags) { - op.reply(Gio.MountOperationResult.HANDLED); - } - - /** - * Handle an error reported by the remote device. - * - * @param {Core.Packet} packet - a `kdeconnect.sftp` - */ - _handleError(packet) { - this.device.showNotification({ - id: 'sftp-error', - title: _('%s reported an error').format(this.device.name), - body: packet.body.errorMessage, - icon: new Gio.ThemedIcon({name: 'dialog-error-symbolic'}), - priority: Gio.NotificationPriority.HIGH, - }); - } - - /** - * Mount the remote device using the provided information. - * - * @param {Core.Packet} packet - a `kdeconnect.sftp` - */ - async _handleMount(packet) { - try { - // Already mounted or mounting - if (this.gmount !== null || this._mounting) - return; - - this._mounting = true; - - // Ensure the private key is in the keyring - await this._addPrivateKey(); - - // Create a new mount operation - const op = new Gio.MountOperation({ - username: packet.body.user || null, - password: packet.body.password || null, - password_save: Gio.PasswordSave.NEVER, - }); - - op.connect('ask-question', this._onAskQuestion); - op.connect('ask-password', this._onAskPassword); - - // This is the actual call to mount the device - const host = this.device.channel.host; - const uri = `sftp://${host}:${packet.body.port}/`; - const file = Gio.File.new_for_uri(uri); - - await file.mount_enclosing_volume(GLib.PRIORITY_DEFAULT, op, - this.cancellable); - } catch (e) { - // Special case when the GMount didn't unmount properly but is still - // on the same port and can be reused. - if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.ALREADY_MOUNTED)) - return; - - // There's a good chance this is a host key verification error; - // regardless we'll remove the key for security. - this._removeHostKey(this.device.channel.host); - logError(e, this.device.name); - } finally { - this._mounting = false; - } - } - - /** - * Add GSConnect's private key identity to the authentication agent so our - * identity can be verified by Android during private key authentication. - * - * @return {Promise} A promise for the operation - */ - async _addPrivateKey() { - const ssh_add = this._launcher.spawnv([ - Config.SSHADD_PATH, - GLib.build_filenamev([Config.CONFIGDIR, 'private.pem']), - ]); - - const [stdout] = await ssh_add.communicate_utf8_async(null, - this.cancellable); - - if (ssh_add.get_exit_status() !== 0) - debug(stdout.trim(), this.device.name); - } - - /** - * Remove all host keys from ~/.ssh/known_hosts for @host in the port range - * used by KDE Connect (1739-1764). - * - * @param {string} host - A hostname or IP address - */ - async _removeHostKey(host) { - for (let port = 1739; port <= 1764; port++) { - try { - const ssh_keygen = this._launcher.spawnv([ - Config.SSHKEYGEN_PATH, - '-R', - `[${host}]:${port}`, - ]); - - const [stdout] = await ssh_keygen.communicate_utf8_async(null, - this.cancellable); - - const status = ssh_keygen.get_exit_status(); - - if (status !== 0) { - throw new Gio.IOErrorEnum({ - code: Gio.io_error_from_errno(status), - message: `${GLib.strerror(status)}\n${stdout}`.trim(), - }); - } - } catch (e) { - logError(e, this.device.name); - } - } - } - - /* - * Mount menu helpers - */ - _getUnmountSection() { - if (this._unmountSection === undefined) { - this._unmountSection = new Gio.Menu(); - - const unmountItem = new Gio.MenuItem(); - unmountItem.set_label(Metadata.actions.unmount.label); - unmountItem.set_icon(new Gio.ThemedIcon({ - name: Metadata.actions.unmount.icon_name, - })); - unmountItem.set_detailed_action('device.unmount'); - this._unmountSection.append_item(unmountItem); - } - - return this._unmountSection; - } - - _getFilesMenuItem() { - if (this._filesMenuItem === undefined) { - // Files menu icon - const emblem = new Gio.Emblem({ - icon: new Gio.ThemedIcon({name: 'emblem-default'}), - }); - - const mountedIcon = new Gio.EmblemedIcon({ - gicon: new Gio.ThemedIcon({name: 'folder-remote-symbolic'}), - }); - mountedIcon.add_emblem(emblem); - - // Files menu item - this._filesMenuItem = new Gio.MenuItem(); - this._filesMenuItem.set_detailed_action('device.mount'); - this._filesMenuItem.set_icon(mountedIcon); - this._filesMenuItem.set_label(_('Files')); - } - - return this._filesMenuItem; - } - - async _addSubmenu(mount) { - try { - const directories = await this._listDirectories(mount); - - // Submenu sections - const dirSection = new Gio.Menu(); - const unmountSection = this._getUnmountSection(); - - for (const [name, uri] of Object.entries(directories)) - dirSection.append(name, `device.openPath::${uri}`); - - // Files submenu - const filesSubmenu = new Gio.Menu(); - filesSubmenu.append_section(null, dirSection); - filesSubmenu.append_section(null, unmountSection); - - // Files menu item - const filesMenuItem = this._getFilesMenuItem(); - filesMenuItem.set_submenu(filesSubmenu); - - // Replace the existing menu item - const index = this.device.removeMenuAction('device.mount'); - this.device.addMenuItem(filesMenuItem, index); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - debug(e, this.device.name); - - // Reset to allow retrying - this._gmount = null; - } - } - - _removeSubmenu() { - try { - const index = this.device.removeMenuAction('device.mount'); - const action = this.device.lookup_action('mount'); - - if (action !== null) { - this.device.addMenuAction( - action, - index, - Metadata.actions.mount.label, - Metadata.actions.mount.icon_name - ); - } - } catch (e) { - logError(e, this.device.name); - } - } - - /** - * Create a symbolic link referring to the device by name - * - * @param {Gio.Mount} mount - A GMount to link to - */ - async _addSymlink(mount) { - try { - const by_name_dir = Gio.File.new_for_path( - `${Config.RUNTIMEDIR}/by-name/` - ); - - try { - by_name_dir.make_directory_with_parents(null); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS)) - throw e; - } - - // Replace path separator with a Unicode lookalike: - let safe_device_name = this.device.name.replace('/', '∕'); - - if (safe_device_name === '.') - safe_device_name = '·'; - else if (safe_device_name === '..') - safe_device_name = '··'; - - const link_target = mount.get_root().get_path(); - const link = Gio.File.new_for_path( - `${by_name_dir.get_path()}/${safe_device_name}`); - - // Check for and remove any existing stale link - try { - const link_stat = await link.query_info_async( - 'standard::symlink-target', - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, - GLib.PRIORITY_DEFAULT, - this.cancellable); - - if (link_stat.get_symlink_target() === link_target) - return; - - await link.delete_async(GLib.PRIORITY_DEFAULT, - this.cancellable); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - throw e; - } - - link.make_symbolic_link(link_target, this.cancellable); - } catch (e) { - debug(e, this.device.name); - } - } - - /** - * Send a request to mount the remote device - */ - mount() { - if (this.gmount !== null) - return; - - this.device.sendPacket({ - type: 'kdeconnect.sftp.request', - body: { - startBrowsing: true, - }, - }); - } - - /** - * Remove the menu items, unmount the filesystem, replace the mount item - */ - async unmount() { - try { - if (this.gmount === null) - return; - - this._removeSubmenu(); - this._mounting = false; - - await this.gmount.unmount_with_operation( - Gio.MountUnmountFlags.FORCE, - new Gio.MountOperation(), - this.cancellable); - } catch (e) { - debug(e, this.device.name); - } - } - - destroy() { - if (this._volumeMonitor) { - this._volumeMonitor.disconnect(this._mountAddedId); - this._volumeMonitor.disconnect(this._mountRemovedId); - this._volumeMonitor = null; - } - - super.destroy(); - } -}); - -export default SFTPPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js deleted file mode 100644 index 73963971..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js +++ /dev/null @@ -1,492 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GdkPixbuf from 'gi://GdkPixbuf'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import Plugin from '../plugin.js'; -import * as URI from '../utils/uri.js'; - - -export const Metadata = { - label: _('Share'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Share', - description: _('Share files and URLs between devices'), - incomingCapabilities: ['kdeconnect.share.request'], - outgoingCapabilities: ['kdeconnect.share.request'], - actions: { - share: { - label: _('Share'), - icon_name: 'send-to-symbolic', - - parameter_type: null, - incoming: [], - outgoing: ['kdeconnect.share.request'], - }, - shareFile: { - label: _('Share File'), - icon_name: 'document-send-symbolic', - - parameter_type: new GLib.VariantType('(sb)'), - incoming: [], - outgoing: ['kdeconnect.share.request'], - }, - shareText: { - label: _('Share Text'), - icon_name: 'send-to-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.share.request'], - }, - shareUri: { - label: _('Share Link'), - icon_name: 'send-to-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.share.request'], - }, - }, -}; - - -/** - * Share Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/share - * - * TODO: receiving 'text' TODO: Window with textview & 'Copy to Clipboard.. - * https://github.com/KDE/kdeconnect-kde/commit/28f11bd5c9a717fb9fbb3f02ddd6cea62021d055 - */ -const SharePlugin = GObject.registerClass({ - GTypeName: 'GSConnectSharePlugin', -}, class SharePlugin extends Plugin { - - _init(device) { - super._init(device, 'share'); - } - - handlePacket(packet) { - // TODO: composite jobs (lastModified, numberOfFiles, totalPayloadSize) - if (packet.body.hasOwnProperty('filename')) { - if (this.settings.get_boolean('receive-files')) - this._handleFile(packet); - else - this._refuseFile(packet); - } else if (packet.body.hasOwnProperty('text')) { - this._handleText(packet); - } else if (packet.body.hasOwnProperty('url')) { - this._handleUri(packet); - } - } - - _ensureReceiveDirectory() { - let receiveDir = this.settings.get_string('receive-directory'); - - // Ensure a directory is set - if (receiveDir.length === 0) { - receiveDir = GLib.get_user_special_dir( - GLib.UserDirectory.DIRECTORY_DOWNLOAD - ); - - // Fallback to ~/Downloads - const homeDir = GLib.get_home_dir(); - - if (!receiveDir || receiveDir === homeDir) - receiveDir = GLib.build_filenamev([homeDir, 'Downloads']); - - this.settings.set_string('receive-directory', receiveDir); - } - - // Ensure the directory exists - if (!GLib.file_test(receiveDir, GLib.FileTest.IS_DIR)) - GLib.mkdir_with_parents(receiveDir, 448); - - return receiveDir; - } - - _getFile(filename) { - const dirpath = this._ensureReceiveDirectory(); - const basepath = GLib.build_filenamev([dirpath, filename]); - let filepath = basepath; - let copyNum = 0; - - while (GLib.file_test(filepath, GLib.FileTest.EXISTS)) - filepath = `${basepath} (${++copyNum})`; - - return Gio.File.new_for_path(filepath); - } - - _refuseFile(packet) { - try { - this.device.rejectTransfer(packet); - - this.device.showNotification({ - id: `${Date.now()}`, - title: _('Transfer Failed'), - // TRANSLATORS: eg. Google Pixel is not allowed to upload files - body: _('%s is not allowed to upload files').format( - this.device.name - ), - icon: new Gio.ThemedIcon({name: 'dialog-error-symbolic'}), - }); - } catch (e) { - debug(e, this.device.name); - } - } - - async _handleFile(packet) { - try { - const file = this._getFile(packet.body.filename); - - // Create the transfer - const transfer = this.device.createTransfer(); - - transfer.addFile(packet, file); - - // Notify that we're about to start the transfer - this.device.showNotification({ - id: transfer.uuid, - title: _('Transferring File'), - // TRANSLATORS: eg. Receiving 'book.pdf' from Google Pixel - body: _('Receiving “%s” from %s').format( - packet.body.filename, - this.device.name - ), - buttons: [{ - label: _('Cancel'), - action: 'cancelTransfer', - parameter: new GLib.Variant('s', transfer.uuid), - }], - icon: new Gio.ThemedIcon({name: 'document-save-symbolic'}), - }); - - // We'll show a notification (success or failure) - let title, body, action, iconName; - let buttons = []; - - try { - await transfer.start(); - - title = _('Transfer Successful'); - // TRANSLATORS: eg. Received 'book.pdf' from Google Pixel - body = _('Received “%s” from %s').format( - packet.body.filename, - this.device.name - ); - action = { - name: 'showPathInFolder', - parameter: new GLib.Variant('s', file.get_uri()), - }; - buttons = [ - { - label: _('Show File Location'), - action: 'showPathInFolder', - parameter: new GLib.Variant('s', file.get_uri()), - }, - { - label: _('Open File'), - action: 'openPath', - parameter: new GLib.Variant('s', file.get_uri()), - }, - ]; - iconName = 'document-save-symbolic'; - - if (packet.body.open) { - const uri = file.get_uri(); - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } - } catch (e) { - debug(e, this.device.name); - - title = _('Transfer Failed'); - // TRANSLATORS: eg. Failed to receive 'book.pdf' from Google Pixel - body = _('Failed to receive “%s” from %s').format( - packet.body.filename, - this.device.name - ); - iconName = 'dialog-warning-symbolic'; - - // Clean up the downloaded file on failure - file.delete_async(GLib.PRIORITY_DEAFAULT, null, null); - } - - this.device.hideNotification(transfer.uuid); - this.device.showNotification({ - id: transfer.uuid, - title: title, - body: body, - action: action, - buttons: buttons, - icon: new Gio.ThemedIcon({name: iconName}), - }); - } catch (e) { - logError(e, this.device.name); - } - } - - _handleUri(packet) { - const uri = packet.body.url; - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } - - _handleText(packet) { - const dialog = new Gtk.MessageDialog({ - text: _('Text Shared By %s').format(this.device.name), - secondary_text: URI.linkify(packet.body.text), - secondary_use_markup: true, - buttons: Gtk.ButtonsType.CLOSE, - }); - dialog.message_area.get_children()[1].selectable = true; - dialog.set_keep_above(true); - dialog.connect('response', (dialog) => dialog.destroy()); - dialog.show(); - } - - /** - * Open the file chooser dialog for selecting a file or inputing a URI. - */ - share() { - const dialog = new FileChooserDialog(this.device); - dialog.show(); - } - - /** - * Share local file path or URI - * - * @param {string} path - Local file path or URI - * @param {boolean} open - Whether the file should be opened after transfer - */ - async shareFile(path, open = false) { - try { - let file = null; - - if (path.includes('://')) - file = Gio.File.new_for_uri(path); - else - file = Gio.File.new_for_path(path); - - // Create the transfer - const transfer = this.device.createTransfer(); - - transfer.addFile({ - type: 'kdeconnect.share.request', - body: { - filename: file.get_basename(), - open: open, - }, - }, file); - - // Notify that we're about to start the transfer - this.device.showNotification({ - id: transfer.uuid, - title: _('Transferring File'), - // TRANSLATORS: eg. Sending 'book.pdf' to Google Pixel - body: _('Sending “%s” to %s').format( - file.get_basename(), - this.device.name - ), - buttons: [{ - label: _('Cancel'), - action: 'cancelTransfer', - parameter: new GLib.Variant('s', transfer.uuid), - }], - icon: new Gio.ThemedIcon({name: 'document-send-symbolic'}), - }); - - // We'll show a notification (success or failure) - let title, body, iconName; - - try { - await transfer.start(); - - title = _('Transfer Successful'); - // TRANSLATORS: eg. Sent "book.pdf" to Google Pixel - body = _('Sent “%s” to %s').format( - file.get_basename(), - this.device.name - ); - iconName = 'document-send-symbolic'; - } catch (e) { - debug(e, this.device.name); - - title = _('Transfer Failed'); - // TRANSLATORS: eg. Failed to send "book.pdf" to Google Pixel - body = _('Failed to send “%s” to %s').format( - file.get_basename(), - this.device.name - ); - iconName = 'dialog-warning-symbolic'; - } - - this.device.hideNotification(transfer.uuid); - this.device.showNotification({ - id: transfer.uuid, - title: title, - body: body, - icon: new Gio.ThemedIcon({name: iconName}), - }); - } catch (e) { - debug(e, this.device.name); - } - } - - /** - * Share a string of text. Remote behaviour is undefined. - * - * @param {string} text - A string of unicode text - */ - shareText(text) { - this.device.sendPacket({ - type: 'kdeconnect.share.request', - body: {text: text}, - }); - } - - /** - * Share a URI. Generally the remote device opens it with the scheme default - * - * @param {string} uri - A URI to share - */ - shareUri(uri) { - if (GLib.uri_parse_scheme(uri) === 'file') { - this.shareFile(uri); - return; - } - - this.device.sendPacket({ - type: 'kdeconnect.share.request', - body: {url: uri}, - }); - } -}); - - -/** A simple FileChooserDialog for sharing files */ -const FileChooserDialog = GObject.registerClass({ - GTypeName: 'GSConnectShareFileChooserDialog', -}, class FileChooserDialog extends Gtk.FileChooserDialog { - - _init(device) { - super._init({ - // TRANSLATORS: eg. Send files to Google Pixel - title: _('Send files to %s').format(device.name), - select_multiple: true, - extra_widget: new Gtk.CheckButton({ - // TRANSLATORS: Mark the file to be opened once completed - label: _('Open when done'), - visible: true, - }), - use_preview_label: false, - }); - - this.device = device; - - // Align checkbox with sidebar - const box = this.get_content_area().get_children()[0].get_children()[0]; - const paned = box.get_children()[0]; - paned.bind_property( - 'position', - this.extra_widget, - 'margin-left', - GObject.BindingFlags.SYNC_CREATE - ); - - // Preview Widget - this.preview_widget = new Gtk.Image(); - this.preview_widget_active = false; - this.connect('update-preview', this._onUpdatePreview); - - // URI entry - this._uriEntry = new Gtk.Entry({ - placeholder_text: 'https://', - hexpand: true, - visible: true, - }); - this._uriEntry.connect('activate', this._sendLink.bind(this)); - - // URI/File toggle - this._uriButton = new Gtk.ToggleButton({ - image: new Gtk.Image({ - icon_name: 'web-browser-symbolic', - pixel_size: 16, - }), - valign: Gtk.Align.CENTER, - // TRANSLATORS: eg. Send a link to Google Pixel - tooltip_text: _('Send a link to %s').format(device.name), - visible: true, - }); - this._uriButton.connect('toggled', this._onUriButtonToggled.bind(this)); - - this.add_button(_('Cancel'), Gtk.ResponseType.CANCEL); - const sendButton = this.add_button(_('Send'), Gtk.ResponseType.OK); - sendButton.connect('clicked', this._sendLink.bind(this)); - - this.get_header_bar().pack_end(this._uriButton); - this.set_default_response(Gtk.ResponseType.OK); - } - - _onUpdatePreview(chooser) { - try { - const pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( - chooser.get_preview_filename(), - chooser.get_scale_factor() * 128, - -1 - ); - chooser.preview_widget.pixbuf = pixbuf; - chooser.preview_widget.visible = true; - chooser.preview_widget_active = true; - } catch (e) { - chooser.preview_widget.visible = false; - chooser.preview_widget_active = false; - } - } - - _onUriButtonToggled(button) { - const header = this.get_header_bar(); - - // Show the URL entry - if (button.active) { - this.extra_widget.sensitive = false; - header.set_custom_title(this._uriEntry); - this.set_response_sensitive(Gtk.ResponseType.OK, true); - - // Hide the URL entry - } else { - header.set_custom_title(null); - this.set_response_sensitive( - Gtk.ResponseType.OK, - this.get_uris().length > 1 - ); - this.extra_widget.sensitive = true; - } - } - - _sendLink(widget) { - if (this._uriButton.active && this._uriEntry.text.length) - this.response(1); - } - - vfunc_response(response_id) { - if (response_id === Gtk.ResponseType.OK) { - for (const uri of this.get_uris()) { - const parameter = new GLib.Variant( - '(sb)', - [uri, this.extra_widget.active] - ); - this.device.activate_action('shareFile', parameter); - } - } else if (response_id === 1) { - const parameter = new GLib.Variant('s', this._uriEntry.text); - this.device.activate_action('shareUri', parameter); - } - - this.destroy(); - } -}); - -export default SharePlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sms.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sms.js deleted file mode 100644 index 4a359fd2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/sms.js +++ /dev/null @@ -1,536 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Plugin from '../plugin.js'; -import LegacyMessagingDialog from '../ui/legacyMessaging.js'; -import * as Messaging from '../ui/messaging.js'; -import SmsURI from '../utils/uri.js'; - - -export const Metadata = { - label: _('SMS'), - description: _('Send and read SMS of the paired device and be notified of new SMS'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.SMS', - incomingCapabilities: [ - 'kdeconnect.sms.messages', - ], - outgoingCapabilities: [ - 'kdeconnect.sms.request', - 'kdeconnect.sms.request_conversation', - 'kdeconnect.sms.request_conversations', - ], - actions: { - // SMS Actions - sms: { - label: _('Messaging'), - icon_name: 'sms-symbolic', - - parameter_type: null, - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - uriSms: { - label: _('New SMS (URI)'), - icon_name: 'sms-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - replySms: { - label: _('Reply SMS'), - icon_name: 'sms-symbolic', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - sendMessage: { - label: _('Send Message'), - icon_name: 'sms-send', - - parameter_type: new GLib.VariantType('(aa{sv})'), - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - sendSms: { - label: _('Send SMS'), - icon_name: 'sms-send', - - parameter_type: new GLib.VariantType('(ss)'), - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - shareSms: { - label: _('Share SMS'), - icon_name: 'sms-send', - - parameter_type: new GLib.VariantType('s'), - incoming: [], - outgoing: ['kdeconnect.sms.request'], - }, - }, -}; - - -/** - * SMS Message event type. Currently all events are TEXT_MESSAGE. - * - * TEXT_MESSAGE: Has a "body" field which contains pure, human-readable text - */ -export const MessageEventType = { - TEXT_MESSAGE: 0x1, -}; - - -/** - * SMS Message status. READ/UNREAD match the 'read' field from the Android App - * message packet. - * - * UNREAD: A message not marked as read - * READ: A message marked as read - */ -export const MessageStatus = { - UNREAD: 0, - READ: 1, -}; - - -/** - * SMS Message type, set from the 'type' field in the Android App - * message packet. - * - * See: https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html - * - * ALL: all messages - * INBOX: Received messages - * SENT: Sent messages - * DRAFT: Message drafts - * OUTBOX: Outgoing messages - * FAILED: Failed outgoing messages - * QUEUED: Messages queued to send later - */ -export const MessageBox = { - ALL: 0, - INBOX: 1, - SENT: 2, - DRAFT: 3, - OUTBOX: 4, - FAILED: 5, - QUEUED: 6, -}; - - -/** - * SMS Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/sms - * https://github.com/KDE/kdeconnect-android/tree/master/src/org/kde/kdeconnect/Plugins/SMSPlugin/ - */ -const SMSPlugin = GObject.registerClass({ - GTypeName: 'GSConnectSMSPlugin', - Properties: { - 'threads': GObject.param_spec_variant( - 'threads', - 'Conversation List', - 'A list of threads', - new GLib.VariantType('aa{sv}'), - null, - GObject.ParamFlags.READABLE - ), - }, -}, class SMSPlugin extends Plugin { - - _init(device) { - super._init(device, 'sms'); - - this.cacheProperties(['_threads']); - } - - get threads() { - if (this._threads === undefined) - this._threads = {}; - - return this._threads; - } - - get window() { - if (this.settings.get_boolean('legacy-sms')) { - return new LegacyMessagingDialog({ - device: this.device, - plugin: this, - }); - } - - if (this._window === undefined) { - this._window = new Messaging.Window({ - application: Gio.Application.get_default(), - device: this.device, - plugin: this, - }); - - this._window.connect('destroy', () => { - this._window = undefined; - }); - } - - return this._window; - } - - clearCache() { - this._threads = {}; - this.notify('threads'); - } - - cacheLoaded() { - this.notify('threads'); - } - - connected() { - super.connected(); - this._requestConversations(); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.sms.messages': - this._handleMessages(packet.body.messages); - break; - } - } - - /** - * Handle a digest of threads. - * - * @param {Object[]} messages - A list of message objects - * @param {string[]} thread_ids - A list of thread IDs as strings - */ - _handleDigest(messages, thread_ids) { - // Prune threads - for (const thread_id of Object.keys(this.threads)) { - if (!thread_ids.includes(thread_id)) - delete this.threads[thread_id]; - } - - // Request each new or newer thread - for (let i = 0, len = messages.length; i < len; i++) { - const message = messages[i]; - const cache = this.threads[message.thread_id]; - - if (cache === undefined) { - this._requestConversation(message.thread_id); - continue; - } - - // If this message is marked read, mark the rest as read - if (message.read === MessageStatus.READ) { - for (const msg of cache) - msg.read = MessageStatus.READ; - } - - // If we don't have a thread for this message or it's newer - // than the last message in the cache, request the thread - if (!cache.length || cache[cache.length - 1].date < message.date) - this._requestConversation(message.thread_id); - } - - this.notify('threads'); - } - - /** - * Handle a new single message - * - * @param {Object} message - A message object - */ - _handleMessage(message) { - let conversation = null; - - // If the window is open, try and find an active conversation - if (this._window) - conversation = this._window.getConversationForMessage(message); - - // If there's an active conversation, we should log the message now - if (conversation) - conversation.logNext(message); - } - - /** - * Parse a conversation (thread of messages) and sort them - * - * @param {Object[]} thread - A list of sms message objects from a thread - */ - _handleThread(thread) { - // If there are no addresses this will cause major problems... - if (!thread[0].addresses || !thread[0].addresses[0]) - return; - - const thread_id = thread[0].thread_id; - const cache = this.threads[thread_id] || []; - - // Handle each message - for (let i = 0, len = thread.length; i < len; i++) { - const message = thread[i]; - - // TODO: We only cache messages of a known MessageBox since we - // have no reliable way to determine its direction, let alone - // what to do with it. - if (message.type < 0 || message.type > 6) - continue; - - // If the message exists, just update it - const cacheMessage = cache.find(m => m.date === message.date); - - if (cacheMessage) { - Object.assign(cacheMessage, message); - } else { - cache.push(message); - this._handleMessage(message); - } - } - - // Sort the thread by ascending date and notify - this.threads[thread_id] = cache.sort((a, b) => a.date - b.date); - this.notify('threads'); - } - - /** - * Handle a response to telephony.request_conversation(s) - * - * @param {Object[]} messages - A list of sms message objects - */ - _handleMessages(messages) { - try { - // If messages is empty there's nothing to do... - if (messages.length === 0) - return; - - const thread_ids = []; - - // Perform some modification of the messages - for (let i = 0, len = messages.length; i < len; i++) { - const message = messages[i]; - - // COERCION: thread_id's to strings - message.thread_id = `${message.thread_id}`; - thread_ids.push(message.thread_id); - - // TODO: Remove bogus `insert-address-token` entries - let a = message.addresses.length; - - while (a--) { - if (message.addresses[a].address === undefined || - message.addresses[a].address === 'insert-address-token') - message.addresses.splice(a, 1); - } - } - - // If there's multiple thread_id's it's a summary of threads - if (thread_ids.some(id => id !== thread_ids[0])) - this._handleDigest(messages, thread_ids); - - // Otherwise this is single thread or new message - else - this._handleThread(messages); - } catch (e) { - debug(e, this.device.name); - } - } - - /** - * Request a list of messages from a single thread. - * - * @param {number} thread_id - The id of the thread to request - */ - _requestConversation(thread_id) { - this.device.sendPacket({ - type: 'kdeconnect.sms.request_conversation', - body: { - threadID: thread_id, - }, - }); - } - - /** - * Request a list of the last message in each unarchived thread. - */ - _requestConversations() { - this.device.sendPacket({ - type: 'kdeconnect.sms.request_conversations', - }); - } - - /** - * A notification action for replying to SMS messages (or missed calls). - * - * @param {string} hint - Could be either a contact name or phone number - */ - replySms(hint) { - this.window.present(); - // FIXME: causes problems now that non-numeric addresses are allowed - // this.window.address = hint.toPhoneNumber(); - } - - /** - * Send an SMS message - * - * @param {string} phoneNumber - The phone number to send the message to - * @param {string} messageBody - The message to send - */ - sendSms(phoneNumber, messageBody) { - this.device.sendPacket({ - type: 'kdeconnect.sms.request', - body: { - sendSms: true, - phoneNumber: phoneNumber, - messageBody: messageBody, - }, - }); - } - - /** - * Send a message - * - * @param {Object[]} addresses - A list of address objects - * @param {string} messageBody - The message text - * @param {number} [event] - An event bitmask - * @param {boolean} [forceSms] - Whether to force SMS - * @param {number} [subId] - The SIM card to use - */ - sendMessage(addresses, messageBody, event = 1, forceSms = false, subId = undefined) { - // TODO: waiting on support in kdeconnect-android - // if (this._version === 1) { - this.device.sendPacket({ - type: 'kdeconnect.sms.request', - body: { - sendSms: true, - phoneNumber: addresses[0].address, - messageBody: messageBody, - }, - }); - // } else if (this._version === 2) { - // this.device.sendPacket({ - // type: 'kdeconnect.sms.request', - // body: { - // version: 2, - // addresses: addresses, - // messageBody: messageBody, - // forceSms: forceSms, - // sub_id: subId - // } - // }); - // } - } - - /** - * Share a text content by SMS message. This is used by the WebExtension to - * share URLs from the browser, but could be used to initiate sharing of any - * text content. - * - * @param {string} url - The link to be shared - */ - shareSms(url) { - // Legacy Mode - if (this.settings.get_boolean('legacy-sms')) { - const window = this.window; - window.present(); - window.setMessage(url); - - // If there are active threads, show the chooser dialog - } else if (Object.values(this.threads).length > 0) { - const window = new Messaging.ConversationChooser({ - application: Gio.Application.get_default(), - device: this.device, - message: url, - plugin: this, - }); - - window.present(); - - // Otherwise show the window and wait for a contact to be chosen - } else { - this.window.present(); - this.window.setMessage(url, true); - } - } - - /** - * Open and present the messaging window - */ - sms() { - this.window.present(); - } - - /** - * This is the sms: URI scheme handler - * - * @param {string} uri - The URI the handle (sms:|sms://|sms:///) - */ - uriSms(uri) { - try { - uri = new SmsURI(uri); - - // Lookup contacts - const addresses = uri.recipients.map(number => { - return {address: number.toPhoneNumber()}; - }); - const contacts = this.device.contacts.lookupAddresses(addresses); - - // Present the window and show the conversation - const window = this.window; - window.present(); - window.setContacts(contacts); - - // Set the outgoing message if the uri has a body variable - if (uri.body) - window.setMessage(uri.body); - } catch (e) { - debug(e, `${this.device.name}: "${uri}"`); - } - } - - _threadHasAddress(thread, addressObj) { - const number = addressObj.address.toPhoneNumber(); - - for (const taddressObj of thread[0].addresses) { - const tnumber = taddressObj.address.toPhoneNumber(); - - if (number.endsWith(tnumber) || tnumber.endsWith(number)) - return true; - } - - return false; - } - - /** - * Try to find a thread_id in @smsPlugin for @addresses. - * - * @param {Object[]} addresses - a list of address objects - * @return {string|null} a thread ID - */ - getThreadIdForAddresses(addresses = []) { - const threads = Object.values(this.threads); - - for (const thread of threads) { - if (addresses.length !== thread[0].addresses.length) - continue; - - if (addresses.every(addressObj => this._threadHasAddress(thread, addressObj))) - return thread[0].thread_id; - } - - return null; - } - - destroy() { - if (this._window !== undefined) - this._window.destroy(); - - super.destroy(); - } -}); - -export default SMSPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js deleted file mode 100644 index 9db02d1d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js +++ /dev/null @@ -1,204 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Config from '../../config.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('System Volume'), - description: _('Enable the paired device to control the system volume'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.SystemVolume', - incomingCapabilities: ['kdeconnect.systemvolume.request'], - outgoingCapabilities: ['kdeconnect.systemvolume'], - actions: {}, -}; - - -/** - * SystemVolume Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/systemvolume - * https://github.com/KDE/kdeconnect-android/tree/master/src/org/kde/kdeconnect/Plugins/SystemvolumePlugin/ - */ -const SystemVolumePlugin = GObject.registerClass({ - GTypeName: 'GSConnectSystemVolumePlugin', -}, class SystemVolumePlugin extends Plugin { - - _init(device) { - super._init(device, 'systemvolume'); - - // Cache stream properties - this._cache = new WeakMap(); - - // Connect to the mixer - try { - this._mixer = Components.acquire('pulseaudio'); - - this._streamChangedId = this._mixer.connect( - 'stream-changed', - this._sendSink.bind(this) - ); - - this._outputAddedId = this._mixer.connect( - 'output-added', - this._sendSinkList.bind(this) - ); - - this._outputRemovedId = this._mixer.connect( - 'output-removed', - this._sendSinkList.bind(this) - ); - - // Modify the error to redirect to the wiki - } catch (e) { - e.name = _('PulseAudio not found'); - e.url = `${Config.PACKAGE_URL}/wiki/Error#pulseaudio-not-found`; - throw e; - } - } - - handlePacket(packet) { - switch (true) { - case packet.body.hasOwnProperty('requestSinks'): - this._sendSinkList(); - break; - - case packet.body.hasOwnProperty('name'): - this._changeSink(packet); - break; - } - } - - connected() { - super.connected(); - - this._sendSinkList(); - } - - /** - * Handle a request to change an output - * - * @param {Core.Packet} packet - a `kdeconnect.systemvolume.request` - */ - _changeSink(packet) { - let stream; - - for (const sink of this._mixer.get_sinks()) { - if (sink.name === packet.body.name) { - stream = sink; - break; - } - } - - // No sink with the given name - if (stream === undefined) { - this._sendSinkList(); - return; - } - - // Get a cache and store volume and mute states if changed - const cache = this._cache.get(stream) || {}; - - if (packet.body.hasOwnProperty('muted')) { - cache.muted = packet.body.muted; - this._cache.set(stream, cache); - stream.change_is_muted(packet.body.muted); - } - - if (packet.body.hasOwnProperty('volume')) { - cache.volume = packet.body.volume; - this._cache.set(stream, cache); - stream.volume = packet.body.volume; - stream.push_volume(); - } - } - - /** - * Update the cache for @stream - * - * @param {Gvc.MixerStream} stream - The stream to cache - * @return {Object} The updated cache object - */ - _updateCache(stream) { - const state = { - name: stream.name, - description: stream.display_name, - muted: stream.is_muted, - volume: stream.volume, - maxVolume: this._mixer.get_vol_max_norm(), - }; - - this._cache.set(stream, state); - - return state; - } - - /** - * Send the state of a local sink - * - * @param {Gvc.MixerControl} mixer - The mixer that owns the stream - * @param {number} id - The Id of the stream that changed - */ - _sendSink(mixer, id) { - // Avoid starving the packet channel when fading - if (this._mixer.fading) - return; - - // Check the cache - const stream = this._mixer.lookup_stream_id(id); - const cache = this._cache.get(stream) || {}; - - // If the port has changed we have to send the whole list to update the - // display name - if (!cache.display_name || cache.display_name !== stream.display_name) { - this._sendSinkList(); - return; - } - - // If only volume and/or mute are set, send a single update - if (cache.volume !== stream.volume || cache.muted !== stream.is_muted) { - // Update the cache - const state = this._updateCache(stream); - - // Send the stream update - this.device.sendPacket({ - type: 'kdeconnect.systemvolume', - body: state, - }); - } - } - - /** - * Send a list of local sinks - */ - _sendSinkList() { - const sinkList = this._mixer.get_sinks().map(sink => { - return this._updateCache(sink); - }); - - // Send the sinkList - this.device.sendPacket({ - type: 'kdeconnect.systemvolume', - body: { - sinkList: sinkList, - }, - }); - } - - destroy() { - if (this._mixer !== undefined) { - this._mixer.disconnect(this._streamChangedId); - this._mixer.disconnect(this._outputAddedId); - this._mixer.disconnect(this._outputRemovedId); - this._mixer = Components.release('pulseaudio'); - } - - super.destroy(); - } -}); - -export default SystemVolumePlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/telephony.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/telephony.js deleted file mode 100644 index af1dae16..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/telephony.js +++ /dev/null @@ -1,245 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GdkPixbuf from 'gi://GdkPixbuf'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import * as Components from '../components/index.js'; -import Plugin from '../plugin.js'; - - -export const Metadata = { - label: _('Telephony'), - description: _('Be notified about calls and adjust system volume during ringing/ongoing calls'), - id: 'org.gnome.Shell.Extensions.GSConnect.Plugin.Telephony', - incomingCapabilities: [ - 'kdeconnect.telephony', - ], - outgoingCapabilities: [ - 'kdeconnect.telephony.request', - 'kdeconnect.telephony.request_mute', - ], - actions: { - muteCall: { - // TRANSLATORS: Silence the actively ringing call - label: _('Mute Call'), - icon_name: 'audio-volume-muted-symbolic', - - parameter_type: null, - incoming: ['kdeconnect.telephony'], - outgoing: ['kdeconnect.telephony.request_mute'], - }, - }, -}; - - -/** - * Telephony Plugin - * https://github.com/KDE/kdeconnect-kde/tree/master/plugins/telephony - * https://github.com/KDE/kdeconnect-android/tree/master/src/org/kde/kdeconnect/Plugins/TelephonyPlugin - */ -const TelephonyPlugin = GObject.registerClass({ - GTypeName: 'GSConnectTelephonyPlugin', -}, class TelephonyPlugin extends Plugin { - - _init(device) { - super._init(device, 'telephony'); - - // Neither of these are crucial for the plugin to work - this._mpris = Components.acquire('mpris'); - this._mixer = Components.acquire('pulseaudio'); - } - - handlePacket(packet) { - switch (packet.type) { - case 'kdeconnect.telephony': - this._handleEvent(packet); - break; - } - } - - /** - * Change volume, microphone and media player state in response to an - * incoming or answered call. - * - * @param {string} eventType - 'ringing' or 'talking' - */ - _setMediaState(eventType) { - // Mixer Volume - if (this._mixer !== undefined) { - switch (this.settings.get_string(`${eventType}-volume`)) { - case 'restore': - this._mixer.restore(); - break; - - case 'lower': - this._mixer.lowerVolume(); - break; - - case 'mute': - this._mixer.muteVolume(); - break; - } - - if (eventType === 'talking' && this.settings.get_boolean('talking-microphone')) - this._mixer.muteMicrophone(); - } - - // Media Playback - if (this._mpris && this.settings.get_boolean(`${eventType}-pause`)) - this._mpris.pauseAll(); - } - - /** - * Restore volume, microphone and media player state (if changed), making - * sure to unpause before raising volume. - * - * TODO: there's a possibility we might revert a media/mixer state set for - * another device. - */ - _restoreMediaState() { - // Media Playback - if (this._mpris) - this._mpris.unpauseAll(); - - // Mixer Volume - if (this._mixer) - this._mixer.restore(); - } - - /** - * Load a Gdk.Pixbuf from base64 encoded data - * - * @param {string} data - Base64 encoded JPEG data - * @return {Gdk.Pixbuf|null} A contact photo - */ - _getThumbnailPixbuf(data) { - const loader = new GdkPixbuf.PixbufLoader(); - - try { - data = GLib.base64_decode(data); - loader.write(data); - loader.close(); - } catch (e) { - debug(e, this.device.name); - } - - return loader.get_pixbuf(); - } - - /** - * Handle a telephony event (ringing, talking), showing or hiding a - * notification and possibly adjusting the media/mixer state. - * - * @param {Core.Packet} packet - A `kdeconnect.telephony` - */ - _handleEvent(packet) { - // Only handle 'ringing' or 'talking' events; leave the notification - // plugin to handle 'missedCall' since they're often repliable - if (!['ringing', 'talking'].includes(packet.body.event)) - return; - - // This is the end of a telephony event - if (packet.body.isCancel) - this._cancelEvent(packet); - else - this._notifyEvent(packet); - } - - _cancelEvent(packet) { - // Ensure we have a sender - // TRANSLATORS: No name or phone number - let sender = _('Unknown Contact'); - - if (packet.body.contactName) - sender = packet.body.contactName; - else if (packet.body.phoneNumber) - sender = packet.body.phoneNumber; - - this.device.hideNotification(`${packet.body.event}|${sender}`); - this._restoreMediaState(); - } - - _notifyEvent(packet) { - let body; - let buttons = []; - let icon = null; - let priority = Gio.NotificationPriority.NORMAL; - - // Ensure we have a sender - // TRANSLATORS: No name or phone number - let sender = _('Unknown Contact'); - - if (packet.body.contactName) - sender = packet.body.contactName; - else if (packet.body.phoneNumber) - sender = packet.body.phoneNumber; - - // If there's a photo, use it as the notification icon - if (packet.body.phoneThumbnail) - icon = this._getThumbnailPixbuf(packet.body.phoneThumbnail); - - if (icon === null) - icon = new Gio.ThemedIcon({name: 'call-start-symbolic'}); - - // Notify based based on the event type - if (packet.body.event === 'ringing') { - this._setMediaState('ringing'); - - // TRANSLATORS: The phone is ringing - body = _('Incoming call'); - buttons = [{ - action: 'muteCall', - // TRANSLATORS: Silence the actively ringing call - label: _('Mute'), - parameter: null, - }]; - priority = Gio.NotificationPriority.URGENT; - } - - if (packet.body.event === 'talking') { - this.device.hideNotification(`ringing|${sender}`); - this._setMediaState('talking'); - - // TRANSLATORS: A phone call is active - body = _('Ongoing call'); - } - - this.device.showNotification({ - id: `${packet.body.event}|${sender}`, - title: sender, - body: body, - icon: icon, - priority: priority, - buttons: buttons, - }); - } - - /** - * Silence an incoming call and restore the previous mixer/media state, if - * applicable. - */ - muteCall() { - this.device.sendPacket({ - type: 'kdeconnect.telephony.request_mute', - body: {}, - }); - - this._restoreMediaState(); - } - - destroy() { - if (this._mixer !== undefined) - this._mixer = Components.release('pulseaudio'); - - if (this._mpris !== undefined) - this._mpris = Components.release('mpris'); - - super.destroy(); - } -}); - -export default TelephonyPlugin; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/contacts.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/contacts.js deleted file mode 100644 index 3ead9600..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/contacts.js +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import GdkPixbuf from 'gi://GdkPixbuf'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import system from 'system'; - - -/** - * Return a random color - * - * @param {*} [salt] - If not %null, will be used as salt for generating a color - * @param {number} alpha - A value in the [0...1] range for the alpha channel - * @return {Gdk.RGBA} A new Gdk.RGBA object generated from the input - */ -function randomRGBA(salt = null, alpha = 1.0) { - let red, green, blue; - - if (salt !== null) { - const hash = new GLib.Variant('s', `${salt}`).hash(); - red = ((hash & 0xFF0000) >> 16) / 255; - green = ((hash & 0x00FF00) >> 8) / 255; - blue = (hash & 0x0000FF) / 255; - } else { - red = Math.random(); - green = Math.random(); - blue = Math.random(); - } - - return new Gdk.RGBA({red: red, green: green, blue: blue, alpha: alpha}); -} - - -/** - * Get the relative luminance of a RGB set - * See: https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef - * - * @param {Gdk.RGBA} rgba - A GdkRGBA object - * @return {number} The relative luminance of the color - */ -function relativeLuminance(rgba) { - const {red, green, blue} = rgba; - - const R = (red > 0.03928) ? red / 12.92 : Math.pow(((red + 0.055) / 1.055), 2.4); - const G = (green > 0.03928) ? green / 12.92 : Math.pow(((green + 0.055) / 1.055), 2.4); - const B = (blue > 0.03928) ? blue / 12.92 : Math.pow(((blue + 0.055) / 1.055), 2.4); - - return 0.2126 * R + 0.7152 * G + 0.0722 * B; -} - - -/** - * Get a GdkRGBA contrasted for the input - * See: https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef - * - * @param {Gdk.RGBA} rgba - A GdkRGBA object for the background color - * @return {Gdk.RGBA} A GdkRGBA object for the foreground color - */ -function getFgRGBA(rgba) { - const bgLuminance = relativeLuminance(rgba); - const lightContrast = (0.07275541795665634 + 0.05) / (bgLuminance + 0.05); - const darkContrast = (bgLuminance + 0.05) / (0.0046439628482972135 + 0.05); - - const value = (darkContrast > lightContrast) ? 0.06 : 0.94; - return new Gdk.RGBA({red: value, green: value, blue: value, alpha: 0.5}); -} - - -/** - * Get a GdkPixbuf for @path, allowing the corrupt JPEG's KDE Connect sometimes - * sends. This function is synchronous. - * - * @param {string} path - A local file path - * @param {number} size - Size in pixels - * @param {scale} [scale] - Scale factor for the size - * @return {Gdk.Pixbuf} A pixbuf - */ -function getPixbufForPath(path, size, scale = 1.0) { - let data, loader; - - // Catch missing avatar files - try { - data = GLib.file_get_contents(path)[1]; - } catch (e) { - debug(e, path); - return undefined; - } - - // Consider errors from partially corrupt JPEGs to be warnings - try { - loader = new GdkPixbuf.PixbufLoader(); - loader.write(data); - loader.close(); - } catch (e) { - debug(e, path); - } - - const pixbuf = loader.get_pixbuf(); - - // Scale to monitor - size = Math.floor(size * scale); - return pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.HYPER); -} - -function getPixbufForIcon(name, size, scale, bgColor) { - const color = getFgRGBA(bgColor); - const theme = Gtk.IconTheme.get_default(); - const info = theme.lookup_icon_for_scale( - name, - size, - scale, - Gtk.IconLookupFlags.FORCE_SYMBOLIC - ); - - return info.load_symbolic(color, null, null, null)[0]; -} - - -/** - * Return a localized string for a phone number type - * See: http://www.ietf.org/rfc/rfc2426.txt - * - * @param {string} type - An RFC2426 phone number type - * @return {string} A localized string like 'Mobile' - */ -function getNumberTypeLabel(type) { - if (type.includes('fax')) - // TRANSLATORS: A fax number - return _('Fax'); - - if (type.includes('work')) - // TRANSLATORS: A work or office phone number - return _('Work'); - - if (type.includes('cell')) - // TRANSLATORS: A mobile or cellular phone number - return _('Mobile'); - - if (type.includes('home')) - // TRANSLATORS: A home phone number - return _('Home'); - - // TRANSLATORS: All other phone number types - return _('Other'); -} - -/** - * Get a display number from @contact for @address. - * - * @param {Object} contact - A contact object - * @param {string} address - A phone number - * @return {string} A (possibly) better display number for the address - */ -export function getDisplayNumber(contact, address) { - const number = address.toPhoneNumber(); - - for (const contactNumber of contact.numbers) { - const cnumber = contactNumber.value.toPhoneNumber(); - - if (number.endsWith(cnumber) || cnumber.endsWith(number)) - return GLib.markup_escape_text(contactNumber.value, -1); - } - - return GLib.markup_escape_text(address, -1); -} - - -/** - * Contact Avatar - */ -const AvatarCache = new WeakMap(); - -export const Avatar = GObject.registerClass({ - GTypeName: 'GSConnectContactAvatar', -}, class ContactAvatar extends Gtk.DrawingArea { - - _init(contact = null) { - super._init({ - height_request: 32, - width_request: 32, - valign: Gtk.Align.CENTER, - visible: true, - }); - - this.contact = contact; - } - - get rgba() { - if (this._rgba === undefined) { - if (this.contact) - this._rgba = randomRGBA(this.contact.name); - else - this._rgba = randomRGBA(GLib.uuid_string_random()); - } - - return this._rgba; - } - - get contact() { - if (this._contact === undefined) - this._contact = null; - - return this._contact; - } - - set contact(contact) { - if (this.contact === contact) - return; - - this._contact = contact; - this._surface = undefined; - this._rgba = undefined; - this._offset = 0; - } - - _loadSurface() { - // Get the monitor scale - const display = Gdk.Display.get_default(); - const monitor = display.get_monitor_at_window(this.get_window()); - const scale = monitor.get_scale_factor(); - - // If there's a contact with an avatar, try to load it - if (this.contact && this.contact.avatar) { - // Check the cache - this._surface = AvatarCache.get(this.contact); - - // Try loading the pixbuf - if (!this._surface) { - const pixbuf = getPixbufForPath( - this.contact.avatar, - this.width_request, - scale - ); - - if (pixbuf) { - this._surface = Gdk.cairo_surface_create_from_pixbuf( - pixbuf, - 0, - this.get_window() - ); - AvatarCache.set(this.contact, this._surface); - } - } - } - - // If we still don't have a surface, load a fallback - if (!this._surface) { - let iconName; - - // If we were given a contact, it's direct message otherwise group - if (this.contact) - iconName = 'avatar-default-symbolic'; - else - iconName = 'group-avatar-symbolic'; - - // Center the icon - this._offset = (this.width_request - 24) / 2; - - // Load the fallback - const pixbuf = getPixbufForIcon(iconName, 24, scale, this.rgba); - - this._surface = Gdk.cairo_surface_create_from_pixbuf( - pixbuf, - 0, - this.get_window() - ); - } - } - - vfunc_draw(cr) { - if (!this._surface) - this._loadSurface(); - - // Clip to a circle - const rad = this.width_request / 2; - cr.arc(rad, rad, rad, 0, 2 * Math.PI); - cr.clipPreserve(); - - // Fill the background if the the surface is offset - if (this._offset > 0) { - Gdk.cairo_set_source_rgba(cr, this.rgba); - cr.fill(); - } - - // Draw the avatar/icon - cr.setSourceSurface(this._surface, this._offset, this._offset); - cr.paint(); - - cr.$dispose(); - return Gdk.EVENT_PROPAGATE; - } -}); - - -/** - * A row for a contact address (usually a phone number). - */ -const AddressRow = GObject.registerClass({ - GTypeName: 'GSConnectContactsAddressRow', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/contacts-address-row.ui', - Children: ['avatar', 'name-label', 'address-label', 'type-label'], -}, class AddressRow extends Gtk.ListBoxRow { - - _init(contact, index = 0) { - super._init(); - - this._index = index; - this._number = contact.numbers[index]; - this.contact = contact; - } - - get contact() { - if (this._contact === undefined) - this._contact = null; - - return this._contact; - } - - set contact(contact) { - if (this.contact === contact) - return; - - this._contact = contact; - - if (this._index === 0) { - this.avatar.contact = contact; - this.avatar.visible = true; - - this.name_label.label = GLib.markup_escape_text(contact.name, -1); - this.name_label.visible = true; - - this.address_label.margin_start = 0; - this.address_label.margin_end = 0; - } else { - this.avatar.visible = false; - this.name_label.visible = false; - - // TODO: rtl inverts margin-start so the number don't align - this.address_label.margin_start = 38; - this.address_label.margin_end = 38; - } - - this.address_label.label = GLib.markup_escape_text(this.number.value, -1); - - if (this.number.type !== undefined) - this.type_label.label = getNumberTypeLabel(this.number.type); - } - - get number() { - if (this._number === undefined) - return {value: 'unknown', type: 'unknown'}; - - return this._number; - } -}); - - -/** - * A widget for selecting contact addresses (usually phone numbers) - */ -export const ContactChooser = GObject.registerClass({ - GTypeName: 'GSConnectContactChooser', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'store': GObject.ParamSpec.object( - 'store', - 'Store', - 'The contacts store', - GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT, - GObject.Object - ), - }, - Signals: { - 'number-selected': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [GObject.TYPE_STRING], - }, - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/contact-chooser.ui', - Children: ['entry', 'list', 'scrolled'], -}, class ContactChooser extends Gtk.Grid { - - _init(params) { - super._init(params); - - // Setup the contact list - this.list._entry = this.entry.text; - this.list.set_filter_func(this._filter); - this.list.set_sort_func(this._sort); - - // Make sure we're using the correct contacts store - this.device.bind_property( - 'contacts', - this, - 'store', - GObject.BindingFlags.SYNC_CREATE - ); - - // Cleanup on ::destroy - this.connect('destroy', this._onDestroy); - } - - get store() { - if (this._store === undefined) - this._store = null; - - return this._store; - } - - set store(store) { - if (this.store === store) - return; - - // Unbind the old store - if (this._store) { - // Disconnect from the store - this._store.disconnect(this._contactAddedId); - this._store.disconnect(this._contactRemovedId); - this._store.disconnect(this._contactChangedId); - - // Clear the contact list - const rows = this.list.get_children(); - - for (let i = 0, len = rows.length; i < len; i++) { - rows[i].destroy(); - // HACK: temporary mitigator for mysterious GtkListBox leak - system.gc(); - } - } - - // Set the store - this._store = store; - - // Bind the new store - if (this._store) { - // Connect to the new store - this._contactAddedId = store.connect( - 'contact-added', - this._onContactAdded.bind(this) - ); - - this._contactRemovedId = store.connect( - 'contact-removed', - this._onContactRemoved.bind(this) - ); - - this._contactChangedId = store.connect( - 'contact-changed', - this._onContactChanged.bind(this) - ); - - // Populate the list - this._populate(); - } - } - - /* - * ContactStore Callbacks - */ - _onContactAdded(store, id) { - const contact = this.store.get_contact(id); - this._addContact(contact); - } - - _onContactRemoved(store, id) { - const rows = this.list.get_children(); - - for (let i = 0, len = rows.length; i < len; i++) { - const row = rows[i]; - - if (row.contact.id === id) { - row.destroy(); - // HACK: temporary mitigator for mysterious GtkListBox leak - system.gc(); - } - } - } - - _onContactChanged(store, id) { - this._onContactRemoved(store, id); - this._onContactAdded(store, id); - } - - _onDestroy(chooser) { - chooser.store = null; - } - - _onSearchChanged(entry) { - this.list._entry = entry.text; - let dynamic = this.list.get_row_at_index(0); - - // If the entry contains string with 2 or more digits... - if (entry.text.replace(/\D/g, '').length >= 2) { - // ...ensure we have a dynamic contact for it - if (!dynamic || !dynamic.__tmp) { - dynamic = new AddressRow({ - // TRANSLATORS: A phone number (eg. "Send to 555-5555") - name: _('Send to %s').format(entry.text), - numbers: [{type: 'unknown', value: entry.text}], - }); - dynamic.__tmp = true; - this.list.add(dynamic); - - // ...or if we already do, then update it - } else { - const address = entry.text; - - // Update contact object - dynamic.contact.name = address; - dynamic.contact.numbers[0].value = address; - - // Update UI - dynamic.name_label.label = _('Send to %s').format(address); - dynamic.address_label.label = address; - } - - // ...otherwise remove any dynamic contact that's been created - } else if (dynamic && dynamic.__tmp) { - dynamic.destroy(); - } - - this.list.invalidate_filter(); - this.list.invalidate_sort(); - } - - // GtkListBox::row-activated - _onNumberSelected(box, row) { - if (row === null) - return; - - // Emit the number - const address = row.number.value; - this.emit('number-selected', address); - - // Reset the contact list - this.entry.text = ''; - this.list.select_row(null); - this.scrolled.vadjustment.value = 0; - } - - _filter(row) { - // Dynamic contact always shown - if (row.__tmp) - return true; - - const query = row.get_parent()._entry; - - // Show contact if text is substring of name - const queryName = query.toLocaleLowerCase(); - - if (row.contact.name.toLocaleLowerCase().includes(queryName)) - return true; - - // Show contact if text is substring of number - const queryNumber = query.toPhoneNumber(); - - if (queryNumber.length) { - for (const number of row.contact.numbers) { - if (number.value.toPhoneNumber().includes(queryNumber)) - return true; - } - - // Query is effectively empty - } else if (/^0+/.test(query)) { - return true; - } - - return false; - } - - _sort(row1, row2) { - if (row1.__tmp) - return -1; - - if (row2.__tmp) - return 1; - - return row1.contact.name.localeCompare(row2.contact.name); - } - - _populate() { - // Add each contact - const contacts = this.store.contacts; - - for (let i = 0, len = contacts.length; i < len; i++) - this._addContact(contacts[i]); - } - - _addContactNumber(contact, index) { - const row = new AddressRow(contact, index); - this.list.add(row); - - return row; - } - - _addContact(contact) { - try { - // HACK: fix missing contact names - if (contact.name === undefined) - contact.name = _('Unknown Contact'); - - if (contact.numbers.length === 1) - return this._addContactNumber(contact, 0); - - for (let i = 0, len = contact.numbers.length; i < len; i++) - this._addContactNumber(contact, i); - } catch (e) { - logError(e); - } - } - - /** - * Get a dictionary of number-contact pairs for each selected phone number. - * - * @return {Object[]} A dictionary of contacts - */ - getSelected() { - try { - const selected = {}; - - for (const row of this.list.get_selected_rows()) - selected[row.number.value] = row.contact; - - return selected; - } catch (e) { - logError(e); - return {}; - } - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/legacyMessaging.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/legacyMessaging.js deleted file mode 100644 index bda1ab31..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/legacyMessaging.js +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import * as Contacts from '../ui/contacts.js'; -import * as Messaging from '../ui/messaging.js'; -import * as URI from '../utils/uri.js'; -import '../utils/ui.js'; - - -const Dialog = GObject.registerClass({ - GTypeName: 'GSConnectLegacyMessagingDialog', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin providing messages', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/legacy-messaging-dialog.ui', - Children: [ - 'infobar', 'stack', - 'message-box', 'message-avatar', 'message-label', 'entry', - ], -}, class Dialog extends Gtk.Dialog { - - _init(params) { - super._init({ - application: Gio.Application.get_default(), - device: params.device, - plugin: params.plugin, - use_header_bar: true, - }); - - this.set_response_sensitive(Gtk.ResponseType.OK, false); - - // Dup some functions - this.headerbar = this.get_titlebar(); - this._setHeaderBar = Messaging.Window.prototype._setHeaderBar; - - // Info bar - this.device.bind_property( - 'connected', - this.infobar, - 'reveal-child', - GObject.BindingFlags.INVERT_BOOLEAN - ); - - // Message Entry/Send Button - this.device.bind_property( - 'connected', - this.entry, - 'sensitive', - GObject.BindingFlags.DEFAULT - ); - - this._connectedId = this.device.connect( - 'notify::connected', - this._onStateChanged.bind(this) - ); - - this._entryChangedId = this.entry.buffer.connect( - 'changed', - this._onStateChanged.bind(this) - ); - - // Set the message if given - if (params.message) { - this.message = params.message; - this.addresses = params.message.addresses; - - this.message_avatar.contact = this.device.contacts.query({ - number: this.addresses[0].address, - }); - this.message_label.label = URI.linkify(this.message.body); - this.message_box.visible = true; - - // Otherwise set the address(es) if we were passed those - } else if (params.addresses) { - this.addresses = params.addresses; - } - - // Load the contact list if we weren't supplied with an address - if (this.addresses.length === 0) { - this.contact_chooser = new Contacts.ContactChooser({ - device: this.device, - }); - this.stack.add_named(this.contact_chooser, 'contact-chooser'); - this.stack.child_set_property(this.contact_chooser, 'position', 0); - - this._numberSelectedId = this.contact_chooser.connect( - 'number-selected', - this._onNumberSelected.bind(this) - ); - - this.stack.visible_child_name = 'contact-chooser'; - } - - this.restoreGeometry('legacy-messaging-dialog'); - - this.connect('destroy', this._onDestroy); - } - - _onDestroy(dialog) { - if (dialog._numberSelectedId !== undefined) { - dialog.contact_chooser.disconnect(dialog._numberSelectedId); - dialog.contact_chooser.destroy(); - } - - dialog.entry.buffer.disconnect(dialog._entryChangedId); - dialog.device.disconnect(dialog._connectedId); - } - - vfunc_delete_event() { - this.saveGeometry(); - - return false; - } - - vfunc_response(response_id) { - if (response_id === Gtk.ResponseType.OK) { - // Refuse to send empty or whitespace only texts - if (!this.entry.buffer.text.trim()) - return; - - this.plugin.sendMessage( - this.addresses, - this.entry.buffer.text, - 1, - true - ); - } - - this.destroy(); - } - - get addresses() { - if (this._addresses === undefined) - this._addresses = []; - - return this._addresses; - } - - set addresses(addresses = []) { - this._addresses = addresses; - - // Set the headerbar - this._setHeaderBar(this._addresses); - - // Show the message editor - this.stack.visible_child_name = 'message-editor'; - this._onStateChanged(); - } - - get device() { - if (this._device === undefined) - this._device = null; - - return this._device; - } - - set device(device) { - this._device = device; - } - - get plugin() { - if (this._plugin === undefined) - this._plugin = null; - - return this._plugin; - } - - set plugin(plugin) { - this._plugin = plugin; - } - - _onActivateLink(label, uri) { - Gtk.show_uri_on_window( - this.get_toplevel(), - uri.includes('://') ? uri : `https://${uri}`, - Gtk.get_current_event_time() - ); - - return true; - } - - _onNumberSelected(chooser, number) { - const contacts = chooser.getSelected(); - - this.addresses = Object.keys(contacts).map(address => { - return {address: address}; - }); - } - - _onStateChanged() { - if (this.device.connected && - this.entry.buffer.text.trim() && - this.stack.visible_child_name === 'message-editor') - this.set_response_sensitive(Gtk.ResponseType.OK, true); - else - this.set_response_sensitive(Gtk.ResponseType.OK, false); - } - - /** - * Set the contents of the message entry - * - * @param {string} text - The message to place in the entry - */ - setMessage(text) { - this.entry.buffer.text = text; - } -}); - -export default Dialog; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/messaging.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/messaging.js deleted file mode 100644 index 6f535840..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/messaging.js +++ /dev/null @@ -1,1320 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; -import Pango from 'gi://Pango'; - -import system from 'system'; - -import * as Contacts from './contacts.js'; -import * as Sms from '../plugins/sms.js'; -import * as URI from '../utils/uri.js'; -import '../utils/ui.js'; - -const Tweener = imports.tweener.tweener; - - -/* - * Useful time constants - */ -const TIME_SPAN_MINUTE = 60000; -const TIME_SPAN_HOUR = 3600000; -const TIME_SPAN_DAY = 86400000; -const TIME_SPAN_WEEK = 604800000; - - -// Less than an hour (eg. 42 minutes ago) -const _lthLong = new Intl.RelativeTimeFormat('default', { - numeric: 'auto', - style: 'long', -}); - -// Less than a day ago (eg. 11:42 PM) -const _ltdFormat = new Intl.DateTimeFormat('default', { - hour: 'numeric', - minute: 'numeric', -}); - -// Less than a week ago (eg. Monday) -const _ltwLong = new Intl.DateTimeFormat('default', { - weekday: 'long', -}); - -// Less than a week ago (eg. Mon) -const _ltwShort = new Intl.DateTimeFormat('default', { - weekday: 'short', -}); - -// Less than a year (eg. Oct 31) -const _ltyShort = new Intl.DateTimeFormat('default', { - day: 'numeric', - month: 'short', -}); - -// Less than a year (eg. October 31) -const _ltyLong = new Intl.DateTimeFormat('default', { - day: 'numeric', - month: 'long', -}); - -// Greater than a year (eg. October 31, 2019) -const _gtyLong = new Intl.DateTimeFormat('default', { - day: 'numeric', - month: 'long', - year: 'numeric', -}); - -// Greater than a year (eg. 10/31/2019) -const _gtyShort = new Intl.DateTimeFormat('default', { - day: 'numeric', - month: 'numeric', - year: 'numeric', -}); - -// Pretty close to strftime's %c -const _cFormat = new Intl.DateTimeFormat('default', { - year: 'numeric', - month: 'short', - day: 'numeric', - weekday: 'short', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - timeZoneName: 'short', -}); - - -/** - * Return a human-readable timestamp, formatted for longer contexts. - * - * @param {number} time - Milliseconds since the epoch (local time) - * @return {string} A localized timestamp similar to what Android Messages uses - */ -function getTime(time) { - const date = new Date(time); - const now = new Date(); - const diff = now - time; - - // Super recent - if (diff < TIME_SPAN_MINUTE) - // TRANSLATORS: Less than a minute ago - return _('Just now'); - - // Under an hour (TODO: these labels aren't updated) - if (diff < TIME_SPAN_HOUR) - return _lthLong.format(-Math.floor(diff / TIME_SPAN_MINUTE), 'minute'); - - // Yesterday, but less than 24 hours ago - if (diff < TIME_SPAN_DAY && now.getDay() !== date.getDay()) - // TRANSLATORS: Yesterday, but less than 24 hours (eg. Yesterday · 11:29 PM) - return _('Yesterday・%s').format(_ltdFormat.format(time)); - - // Less than a day ago - if (diff < TIME_SPAN_DAY) - return _ltdFormat.format(time); - - // Less than a week ago - if (diff < TIME_SPAN_WEEK) - return _ltwLong.format(time); - - // Sometime this year - if (date.getFullYear() === now.getFullYear()) - return _ltyLong.format(time); - - // Earlier than that - return _gtyLong.format(time); -} - - -/** - * Return a human-readable timestamp, formatted for shorter contexts. - * - * @param {number} time - Milliseconds since the epoch (local time) - * @return {string} A localized timestamp similar to what Android Messages uses - */ -function getShortTime(time) { - const date = new Date(time); - const now = new Date(); - const diff = now - time; - - if (diff < TIME_SPAN_MINUTE) - // TRANSLATORS: Less than a minute ago - return _('Just now'); - - if (diff < TIME_SPAN_HOUR) { - // TRANSLATORS: Time duration in minutes (eg. 15 minutes) - return ngettext( - '%d minute', - '%d minutes', - (diff / TIME_SPAN_MINUTE) - ).format(diff / TIME_SPAN_MINUTE); - } - - // Less than a day ago - if (diff < TIME_SPAN_DAY) - return _ltdFormat.format(time); - - // Less than a week ago - if (diff < TIME_SPAN_WEEK) - return _ltwShort.format(time); - - // Sometime this year - if (date.getFullYear() === now.getFullYear()) - return _ltyShort.format(time); - - // Earlier than that - return _gtyShort.format(time); -} - - -/** - * Return a human-readable timestamp, similar to `strftime()` with `%c`. - * - * @param {number} time - Milliseconds since the epoch (local time) - * @return {string} A localized timestamp - */ -function getDetailedTime(time) { - return _cFormat.format(time); -} - - -function setAvatarVisible(row, visible) { - const incoming = row.message.type === Sms.MessageBox.INBOX; - - // Adjust the margins - if (visible) { - row.grid.margin_start = incoming ? 6 : 56; - row.grid.margin_bottom = 6; - } else { - row.grid.margin_start = incoming ? 44 : 56; - row.grid.margin_bottom = 0; - } - - // Show hide the avatar - if (incoming) - row.avatar.visible = visible; -} - - -/** - * A ListBoxRow for a preview of a conversation - */ -const ConversationMessage = GObject.registerClass({ - GTypeName: 'GSConnectMessagingConversationMessage', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/messaging-conversation-message.ui', - Children: ['grid', 'avatar', 'sender-label', 'message-label'], -}, class ConversationMessage extends Gtk.ListBoxRow { - _init(contact, message) { - super._init(); - - this.contact = contact; - this.message = message; - - // Sort properties - this.sender = message.addresses[0].address || 'unknown'; - this.message_label.label = URI.linkify(message.body); - this.message_label.tooltip_text = getDetailedTime(message.date); - - // Add avatar for incoming messages - if (message.type === Sms.MessageBox.INBOX) { - this.grid.margin_end = 18; - this.grid.halign = Gtk.Align.START; - - this.avatar.contact = this.contact; - this.avatar.visible = true; - - this.sender_label.label = contact.name; - this.sender_label.visible = true; - - this.message_label.get_style_context().add_class('message-in'); - this.message_label.halign = Gtk.Align.START; - } else { - this.message_label.get_style_context().add_class('message-out'); - } - } - - _onActivateLink(label, uri) { - Gtk.show_uri_on_window( - this.get_toplevel(), - uri.includes('://') ? uri : `https://${uri}`, - Gtk.get_current_event_time() - ); - - return true; - } - - get date() { - return this._message.date; - } - - get thread_id() { - return this._message.thread_id; - } - - get message() { - if (this._message === undefined) - this._message = null; - - return this._message; - } - - set message(message) { - this._message = message; - } -}); - - -/** - * A widget for displaying a conversation thread, with an entry for responding. - */ -const Conversation = GObject.registerClass({ - GTypeName: 'GSConnectMessagingConversation', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this conversation', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin providing this conversation', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'has-pending': GObject.ParamSpec.boolean( - 'has-pending', - 'Has Pending', - 'Whether there are sent messages pending confirmation', - GObject.ParamFlags.READABLE, - false - ), - 'thread-id': GObject.ParamSpec.string( - 'thread-id', - 'Thread ID', - 'The current thread', - GObject.ParamFlags.READWRITE, - '' - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/messaging-conversation.ui', - Children: [ - 'entry', 'list', 'scrolled', - 'pending', 'pending-box', - ], -}, class MessagingConversation extends Gtk.Grid { - - _init(params) { - super._init({ - device: params.device, - plugin: params.plugin, - }); - Object.assign(this, params); - - this.device.bind_property( - 'connected', - this.entry, - 'sensitive', - GObject.BindingFlags.SYNC_CREATE - ); - - // If we're disconnected pending messages might not succeed, but we'll - // leave them until reconnect when we'll ask for an update - this._connectedId = this.device.connect( - 'notify::connected', - this._onConnected.bind(this) - ); - - // Pending messages - this.pending.message = { - date: Number.MAX_SAFE_INTEGER, - type: Sms.MessageBox.OUTBOX, - }; - - // Auto-scrolling - this._vadj = this.scrolled.get_vadjustment(); - this._scrolledId = this._vadj.connect( - 'value-changed', - this._holdPosition.bind(this) - ); - - // Message List - this.list.set_header_func(this._headerMessages); - this.list.set_sort_func(this._sortMessages); - this._populateMessages(); - - // Cleanup on ::destroy - this.connect('destroy', this._onDestroy); - } - - get addresses() { - if (this._addresses === undefined) - this._addresses = []; - - return this._addresses; - } - - set addresses(addresses) { - if (!addresses || addresses.length === 0) { - this._addresses = []; - this._contacts = {}; - return; - } - - // Lookup a contact for each address object, then loop back to correct - // each address carried by the message. - this._addresses = addresses; - - for (let i = 0, len = this.addresses.length; i < len; i++) { - // Lookup the contact - const address = this.addresses[i].address; - const contact = this.device.contacts.query({number: address}); - - // Get corrected address - let number = address.toPhoneNumber(); - - if (!number) - continue; - - for (const contactNumber of contact.numbers) { - const cnumber = contactNumber.value.toPhoneNumber(); - - if (cnumber && (number.endsWith(cnumber) || cnumber.endsWith(number))) { - number = contactNumber.value; - break; - } - } - - // Store the final result - this.addresses[i].address = number; - this.contacts[address] = contact; - } - - // TODO: Mark the entry as insensitive for group messages - if (this.addresses.length > 1) { - this.entry.placeholder_text = _('Not available'); - this.entry.secondary_icon_name = null; - this.entry.secondary_icon_tooltip_text = null; - this.entry.sensitive = false; - this.entry.tooltip_text = null; - } - } - - get contacts() { - if (this._contacts === undefined) - this._contacts = {}; - - return this._contacts; - } - - get has_pending() { - if (this.pending_box === undefined) - return false; - - return (this.pending_box.get_children().length > 0); - } - - get plugin() { - if (this._plugin === undefined) - this._plugin = null; - - return this._plugin; - } - - set plugin(plugin) { - this._plugin = plugin; - } - - get thread_id() { - if (this._thread_id === undefined) - this._thread_id = null; - - return this._thread_id; - } - - set thread_id(thread_id) { - const thread = this.plugin.threads[thread_id]; - const message = (thread) ? thread[0] : null; - - if (message && this.addresses.length === 0) { - this.addresses = message.addresses; - this._thread_id = thread_id; - } - } - - _onConnected(device) { - if (device.connected) - this.pending_box.foreach(msg => msg.destroy()); - } - - _onDestroy(conversation) { - conversation.device.disconnect(conversation._connectedId); - conversation._vadj.disconnect(conversation._scrolledId); - - conversation.list.foreach(message => { - // HACK: temporary mitigator for mysterious GtkListBox leak - message.destroy(); - system.gc(); - }); - } - - _onEdgeReached(scrolled_window, pos) { - // Try to load more messages - if (pos === Gtk.PositionType.TOP) - this.logPrevious(); - - // Release any hold to resume auto-scrolling - else if (pos === Gtk.PositionType.BOTTOM) - this._releasePosition(); - } - - _onEntryChanged(entry) { - entry.secondary_icon_sensitive = (entry.text.length); - } - - _onKeyPressEvent(entry, event) { - const keyval = event.get_keyval()[1]; - const state = event.get_state()[1]; - const mask = state & Gtk.accelerator_get_default_mod_mask(); - - if (keyval === Gdk.KEY_Return && (mask & Gdk.ModifierType.SHIFT_MASK)) { - entry.emit('insert-at-cursor', '\n'); - return true; - } - - return false; - } - - _onSendMessage(entry, signal_id, event) { - // Don't send empty texts - if (!this.entry.text.trim()) - return; - - // Send the message - this.plugin.sendMessage(this.addresses, this.entry.text); - - // Add a phony message in the pending box - const message = new Gtk.Label({ - label: URI.linkify(this.entry.text), - halign: Gtk.Align.END, - selectable: true, - use_markup: true, - visible: true, - wrap: true, - wrap_mode: Pango.WrapMode.WORD_CHAR, - xalign: 0, - }); - message.get_style_context().add_class('message-out'); - message.date = Date.now(); - message.type = Sms.MessageBox.SENT; - - // Notify to reveal the pending box - this.pending_box.add(message); - this.notify('has-pending'); - - // Clear the entry - this.entry.text = ''; - } - - _onSizeAllocate(listbox, allocation) { - const upper = this._vadj.get_upper(); - const pageSize = this._vadj.get_page_size(); - - // If the scrolled window hasn't been filled yet, load another message - if (upper <= pageSize) { - this.logPrevious(); - this.scrolled.get_child().check_resize(); - - // We've been asked to hold the position, so we'll reset the adjustment - // value and update the hold position - } else if (this.__pos) { - this._vadj.set_value(upper - this.__pos); - - // Otherwise we probably appended a message and should scroll to it - } else { - this._scrollPosition(Gtk.PositionType.BOTTOM); - } - } - - /** - * Create a message row, ensuring a contact object has been retrieved or - * generated for the message. - * - * @param {Object} message - A dictionary of message data - * @return {ConversationMessage} A message row - */ - _createMessageRow(message) { - // Ensure we have a contact - const sender = message.addresses[0].address || 'unknown'; - - if (this.contacts[sender] === undefined) { - this.contacts[sender] = this.device.contacts.query({ - number: sender, - }); - } - - return new ConversationMessage(this.contacts[sender], message); - } - - _populateMessages() { - this.__first = null; - this.__last = null; - this.__pos = 0; - this.__messages = []; - - // Try and find a thread_id for this number - if (this.thread_id === null && this.addresses.length) - this._thread_id = this.plugin.getThreadIdForAddresses(this.addresses); - - // Make a copy of the thread and fill the window with messages - if (this.plugin.threads[this.thread_id]) { - this.__messages = this.plugin.threads[this.thread_id].slice(0); - this.logPrevious(); - } - } - - _headerMessages(row, before) { - // Skip pending - if (row.get_name() === 'pending') - return; - - if (before === null) - return setAvatarVisible(row, true); - - // Add date header if the last message was more than an hour ago - let header = row.get_header(); - - if ((row.message.date - before.message.date) > TIME_SPAN_HOUR) { - if (!header) { - header = new Gtk.Label({visible: true, selectable: true}); - header.get_style_context().add_class('dim-label'); - row.set_header(header); - } - - header.label = getTime(row.message.date); - - // Also show the avatar - setAvatarVisible(row, true); - - row.sender_label.visible = row.message.addresses.length > 1; - - // Or if the previous sender was the same, hide its avatar - } else if (row.message.type === before.message.type && - row.sender.equalsPhoneNumber(before.sender)) { - setAvatarVisible(before, false); - setAvatarVisible(row, true); - - row.sender_label.visible = false; - - // otherwise show the avatar - } else { - setAvatarVisible(row, true); - } - } - - _holdPosition() { - this.__pos = this._vadj.get_upper() - this._vadj.get_value(); - } - - _releasePosition() { - this.__pos = 0; - } - - _scrollPosition(pos = Gtk.PositionType.BOTTOM, animate = true) { - let vpos = pos; - this._vadj.freeze_notify(); - - if (pos === Gtk.PositionType.BOTTOM) - vpos = this._vadj.get_upper() - this._vadj.get_page_size(); - - if (animate) { - Tweener.addTween(this._vadj, { - value: vpos, - time: 0.5, - transition: 'easeInOutCubic', - onComplete: () => this._vadj.thaw_notify(), - }); - } else { - GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - this._vadj.set_value(vpos); - this._vadj.thaw_notify(); - }); - } - } - - _sortMessages(row1, row2) { - return (row1.message.date > row2.message.date) ? 1 : -1; - } - - /** - * Log the next message in the conversation. - * - * @param {Object} message - A message object - */ - logNext(message) { - try { - // TODO: Unsupported MessageBox - if (message.type !== Sms.MessageBox.INBOX && - message.type !== Sms.MessageBox.SENT) - throw TypeError(`invalid message box ${message.type}`); - - // Append the message - const row = this._createMessageRow(message); - this.list.add(row); - this.list.invalidate_headers(); - - // Remove the first pending message - if (this.has_pending && message.type === Sms.MessageBox.SENT) { - this.pending_box.get_children()[0].destroy(); - this.notify('has-pending'); - } - } catch (e) { - debug(e); - } - } - - /** - * Log the previous message in the thread - */ - logPrevious() { - try { - const message = this.__messages.pop(); - - if (!message) - return; - - // TODO: Unsupported MessageBox - if (message.type !== Sms.MessageBox.INBOX && - message.type !== Sms.MessageBox.SENT) - throw TypeError(`invalid message box ${message.type}`); - - // Prepend the message - const row = this._createMessageRow(message); - this.list.prepend(row); - this.list.invalidate_headers(); - } catch (e) { - debug(e); - } - } - - /** - * Set the contents of the message entry - * - * @param {string} text - The message to place in the entry - */ - setMessage(text) { - this.entry.text = text; - this.entry.emit('move-cursor', 0, text.length, false); - } -}); - - -/** - * A ListBoxRow for a preview of a conversation - */ -const ConversationSummary = GObject.registerClass({ - GTypeName: 'GSConnectMessagingConversationSummary', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/messaging-conversation-summary.ui', - Children: ['avatar', 'name-label', 'time-label', 'body-label'], -}, class ConversationSummary extends Gtk.ListBoxRow { - _init(contacts, message) { - super._init(); - - this.contacts = contacts; - this.message = message; - } - - get date() { - return this._message.date; - } - - get thread_id() { - return this._message.thread_id; - } - - get message() { - return this._message; - } - - set message(message) { - this._message = message; - this._sender = message.addresses[0].address || 'unknown'; - - // Contact Name - let nameLabel = _('Unknown Contact'); - - // Update avatar for single-recipient messages - if (message.addresses.length === 1) { - this.avatar.contact = this.contacts[this._sender]; - nameLabel = GLib.markup_escape_text(this.avatar.contact.name, -1); - } else { - this.avatar.contact = null; - nameLabel = _('Group Message'); - const participants = []; - message.addresses.forEach((address) => { - participants.push(this.contacts[address.address].name); - }); - this.name_label.tooltip_text = participants.join(', '); - } - - // Contact Name & Message body - let bodyLabel = message.body.split(/\r|\n/)[0]; - bodyLabel = GLib.markup_escape_text(bodyLabel, -1); - - // Ignore the 'read' flag if it's an outgoing message - if (message.type === Sms.MessageBox.SENT) { - // TRANSLATORS: An outgoing message body in a conversation summary - bodyLabel = _('You: %s').format(bodyLabel); - - // Otherwise make it bold if it's unread - } else if (message.read === Sms.MessageStatus.UNREAD) { - nameLabel = `<b>${nameLabel}</b>`; - bodyLabel = `<b>${bodyLabel}</b>`; - } - - // Set the labels, body always smaller - this.name_label.label = nameLabel; - this.body_label.label = `<small>${bodyLabel}</small>`; - - // Time - const timeLabel = `<small>${getShortTime(message.date)}</small>`; - this.time_label.label = timeLabel; - } - - /** - * Update the relative time label. - */ - update() { - const timeLabel = `<small>${getShortTime(this.message.date)}</small>`; - this.time_label.label = timeLabel; - } -}); - - -/** - * A Gtk.ApplicationWindow for SMS conversations - */ -export const Window = GObject.registerClass({ - GTypeName: 'GSConnectMessagingWindow', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin providing messages', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'thread-id': GObject.ParamSpec.string( - 'thread-id', - 'Thread ID', - 'The current thread', - GObject.ParamFlags.READWRITE, - '' - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/messaging-window.ui', - Children: [ - 'headerbar', 'infobar', - 'thread-list', 'stack', - ], -}, class MessagingWindow extends Gtk.ApplicationWindow { - - _init(params) { - super._init(params); - this.headerbar.subtitle = this.device.name; - - this.insert_action_group('device', this.device); - - // Device Status - this.device.bind_property( - 'connected', - this.infobar, - 'reveal-child', - GObject.BindingFlags.INVERT_BOOLEAN - ); - - // Contacts - this.contact_chooser = new Contacts.ContactChooser({ - device: this.device, - }); - this.stack.add_named(this.contact_chooser, 'contact-chooser'); - - this._numberSelectedId = this.contact_chooser.connect( - 'number-selected', - this._onNumberSelected.bind(this) - ); - - // Threads - this.thread_list.set_sort_func(this._sortThreads); - - this._threadsChangedId = this.plugin.connect( - 'notify::threads', - this._onThreadsChanged.bind(this) - ); - - this._timestampThreadsId = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT_IDLE, - 60, - this._timestampThreads.bind(this) - ); - - this._sync(); - this._onThreadsChanged(); - this.restoreGeometry('messaging'); - } - - vfunc_delete_event(event) { - this.saveGeometry(); - - GLib.source_remove(this._timestampThreadsId); - this.contact_chooser.disconnect(this._numberSelectedId); - this.plugin.disconnect(this._threadsChangedId); - - return false; - } - - get plugin() { - return this._plugin || null; - } - - set plugin(plugin) { - this._plugin = plugin; - } - - get thread_id() { - return this.stack.visible_child_name; - } - - set thread_id(thread_id) { - thread_id = `${thread_id}`; // FIXME - - // Reset to the empty placeholder - if (!thread_id) { - this.thread_list.select_row(null); - this.stack.set_visible_child_name('placeholder'); - return; - } - - // Create a conversation widget if there isn't one - let conversation = this.stack.get_child_by_name(thread_id); - const thread = this.plugin.threads[thread_id]; - - if (conversation === null) { - if (!thread) { - debug(`Thread ID ${thread_id} not found`); - return; - } - - conversation = new Conversation({ - device: this.device, - plugin: this.plugin, - thread_id: thread_id, - }); - - this.stack.add_named(conversation, thread_id); - } - - // Figure out whether this is a multi-recipient thread - this._setHeaderBar(thread[0].addresses); - - // Select the conversation and entry active - this.stack.visible_child = conversation; - this.stack.visible_child.entry.has_focus = true; - - // There was a pending message waiting for a conversation to be chosen - if (this._pendingShare) { - conversation.setMessage(this._pendingShare); - this._pendingShare = null; - } - - this._thread_id = thread_id; - this.notify('thread_id'); - } - - _setHeaderBar(addresses = []) { - const address = addresses[0].address; - const contact = this.device.contacts.query({number: address}); - - if (addresses.length === 1) { - this.headerbar.title = contact.name; - this.headerbar.subtitle = Contacts.getDisplayNumber(contact, address); - } else { - const otherLength = addresses.length - 1; - - this.headerbar.title = contact.name; - this.headerbar.subtitle = ngettext( - 'And %d other contact', - 'And %d others', - otherLength - ).format(otherLength); - } - } - - _sync() { - this.device.contacts.fetch(); - this.plugin.connected(); - } - - _onNewConversation() { - this._sync(); - this.stack.set_visible_child_name('contact-chooser'); - this.thread_list.select_row(null); - this.contact_chooser.entry.has_focus = true; - } - - _onNumberSelected(chooser, number) { - const contacts = chooser.getSelected(); - const row = this._getRowForContacts(contacts); - - if (row) - row.emit('activate'); - else - this.setContacts(contacts); - } - - /** - * Threads - */ - _onThreadsChanged() { - // Get the last message in each thread - const messages = {}; - - for (const [thread_id, thread] of Object.entries(this.plugin.threads)) { - const message = thread[thread.length - 1]; - - // Skip messages without a body (eg. MMS messages without text) - if (message.body) - messages[thread_id] = thread[thread.length - 1]; - } - - // Update existing summaries and destroy old ones - for (const row of this.thread_list.get_children()) { - const message = messages[row.thread_id]; - - // If it's an existing conversation, update it - if (message) { - // Ensure there's a contact mapping - const sender = message.addresses[0].address || 'unknown'; - - if (row.contacts[sender] === undefined) { - row.contacts[sender] = this.device.contacts.query({ - number: sender, - }); - } - - row.message = message; - delete messages[row.thread_id]; - - // Otherwise destroy it - } else { - // Destroy the conversation widget - const conversation = this.stack.get_child_by_name(`${row.thread_id}`); - - if (conversation) { - conversation.destroy(); - system.gc(); - } - - // Then the summary widget - row.destroy(); - // HACK: temporary mitigator for mysterious GtkListBox leak - system.gc(); - } - } - - // What's left in the dictionary is new summaries - for (const message of Object.values(messages)) { - const contacts = this.device.contacts.lookupAddresses(message.addresses); - const conversation = new ConversationSummary(contacts, message); - this.thread_list.add(conversation); - } - - // Re-sort the summaries - this.thread_list.invalidate_sort(); - } - - // GtkListBox::row-activated - _onThreadSelected(box, row) { - // Show the conversation for this number (if applicable) - if (row) { - this.thread_id = row.thread_id; - - // Show the placeholder - } else { - this.headerbar.title = _('Messaging'); - this.headerbar.subtitle = this.device.name; - } - } - - _sortThreads(row1, row2) { - return (row1.date > row2.date) ? -1 : 1; - } - - _timestampThreads() { - if (this.visible) - this.thread_list.foreach(row => row.update()); - - return GLib.SOURCE_CONTINUE; - } - - /** - * Find the thread row for @contacts - * - * @param {Object[]} contacts - A contact group - * @return {ConversationSummary|null} The thread row or %null - */ - _getRowForContacts(contacts) { - const addresses = Object.keys(contacts).map(address => { - return {address: address}; - }); - - // Try to find a thread_id - const thread_id = this.plugin.getThreadIdForAddresses(addresses); - - for (const row of this.thread_list.get_children()) { - if (row.message.thread_id === thread_id) - return row; - } - - return null; - } - - setContacts(contacts) { - // Group the addresses - const addresses = []; - - for (const address of Object.keys(contacts)) - addresses.push({address: address}); - - // Try to find a thread ID for this address group - let thread_id = this.plugin.getThreadIdForAddresses(addresses); - - if (thread_id === null) - thread_id = GLib.uuid_string_random(); - else - thread_id = thread_id.toString(); - - // Try to find a thread row for the ID - const row = this._getRowForContacts(contacts); - - if (row !== null) { - this.thread_list.select_row(row); - return; - } - - // We're creating a new conversation - const conversation = new Conversation({ - device: this.device, - plugin: this.plugin, - addresses: addresses, - }); - - // Set the headerbar - this._setHeaderBar(addresses); - - // Select the conversation and entry active - this.stack.add_named(conversation, thread_id); - this.stack.visible_child = conversation; - this.stack.visible_child.entry.has_focus = true; - - // There was a pending message waiting for a conversation to be chosen - if (this._pendingShare) { - conversation.setMessage(this._pendingShare); - this._pendingShare = null; - } - - this._thread_id = thread_id; - this.notify('thread-id'); - } - - _includesAddress(addresses, addressObj) { - const number = addressObj.address.toPhoneNumber(); - - for (const haystackObj of addresses) { - const tnumber = haystackObj.address.toPhoneNumber(); - - if (number.endsWith(tnumber) || tnumber.endsWith(number)) - return true; - } - - return false; - } - - /** - * Try and find an existing conversation widget for @message. - * - * @param {Object} message - A message object - * @return {Conversation|null} A conversation widget or %null - */ - getConversationForMessage(message) { - // TODO: This shouldn't happen? - if (message === null) - return null; - - // First try to find a conversation by thread_id - const thread_id = `${message.thread_id}`; - const conversation = this.stack.get_child_by_name(thread_id); - - if (conversation !== null) - return conversation; - - // Try and find one by matching addresses, which is necessary if we've - // started a thread locally and haven't set the thread_id - const addresses = message.addresses; - - for (const conversation of this.stack.get_children()) { - if (conversation.addresses === undefined || - conversation.addresses.length !== addresses.length) - continue; - - const caddrs = conversation.addresses; - - // If we find a match, set `thread-id` on the conversation and the - // child property `name`. - if (addresses.every(addr => this._includesAddress(caddrs, addr))) { - conversation._thread_id = thread_id; - this.stack.child_set_property(conversation, 'name', thread_id); - - return conversation; - } - } - - return null; - } - - /** - * Set the contents of the message entry. If @pending is %false set the - * message of the currently selected conversation, otherwise mark the - * message to be set for the next selected conversation. - * - * @param {string} message - The message to place in the entry - * @param {boolean} pending - Wait for a conversation to be selected - */ - setMessage(message, pending = false) { - try { - if (pending) - this._pendingShare = message; - else - this.stack.visible_child.setMessage(message); - } catch (e) { - debug(e); - } - } -}); - - -/** - * A Gtk.ApplicationWindow for selecting from open conversations - */ -export const ConversationChooser = GObject.registerClass({ - GTypeName: 'GSConnectConversationChooser', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'message': GObject.ParamSpec.string( - 'message', - 'Message', - 'The message to share', - GObject.ParamFlags.READWRITE, - '' - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin providing messages', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - }, -}, class ConversationChooser extends Gtk.ApplicationWindow { - - _init(params) { - super._init(Object.assign({ - title: _('Share Link'), - default_width: 300, - default_height: 200, - }, params)); - this.set_keep_above(true); - - // HeaderBar - this.headerbar = new Gtk.HeaderBar({ - title: _('Share Link'), - subtitle: this.message, - show_close_button: true, - tooltip_text: this.message, - }); - this.set_titlebar(this.headerbar); - - const newButton = new Gtk.Button({ - image: new Gtk.Image({icon_name: 'list-add-symbolic'}), - tooltip_text: _('New Conversation'), - always_show_image: true, - }); - newButton.connect('clicked', this._new.bind(this)); - this.headerbar.pack_start(newButton); - - // Threads - const scrolledWindow = new Gtk.ScrolledWindow({ - can_focus: false, - hexpand: true, - vexpand: true, - hscrollbar_policy: Gtk.PolicyType.NEVER, - }); - this.add(scrolledWindow); - - this.thread_list = new Gtk.ListBox({ - activate_on_single_click: false, - }); - this.thread_list.set_sort_func(Window.prototype._sortThreads); - this.thread_list.connect('row-activated', this._select.bind(this)); - scrolledWindow.add(this.thread_list); - - // Filter Setup - Window.prototype._onThreadsChanged.call(this); - this.show_all(); - } - - get plugin() { - return this._plugin || null; - } - - set plugin(plugin) { - this._plugin = plugin; - } - - _new(button) { - const message = this.message; - this.destroy(); - - this.plugin.sms(); - this.plugin.window._onNewConversation(); - this.plugin.window._pendingShare = message; - } - - _select(box, row) { - this.plugin.sms(); - this.plugin.window.thread_id = row.message.thread_id.toString(); - this.plugin.window.setMessage(this.message); - - this.destroy(); - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/mousepad.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/mousepad.js deleted file mode 100644 index 5c28603f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/mousepad.js +++ /dev/null @@ -1,460 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GLib from 'gi://GLib'; -import Gdk from 'gi://Gdk'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - - -/** - * A map of Gdk to "KDE Connect" keyvals - */ -const ReverseKeyMap = new Map([ - [Gdk.KEY_BackSpace, 1], - [Gdk.KEY_Tab, 2], - [Gdk.KEY_Linefeed, 3], - [Gdk.KEY_Left, 4], - [Gdk.KEY_Up, 5], - [Gdk.KEY_Right, 6], - [Gdk.KEY_Down, 7], - [Gdk.KEY_Page_Up, 8], - [Gdk.KEY_Page_Down, 9], - [Gdk.KEY_Home, 10], - [Gdk.KEY_End, 11], - [Gdk.KEY_Return, 12], - [Gdk.KEY_Delete, 13], - [Gdk.KEY_Escape, 14], - [Gdk.KEY_Sys_Req, 15], - [Gdk.KEY_Scroll_Lock, 16], - [Gdk.KEY_F1, 21], - [Gdk.KEY_F2, 22], - [Gdk.KEY_F3, 23], - [Gdk.KEY_F4, 24], - [Gdk.KEY_F5, 25], - [Gdk.KEY_F6, 26], - [Gdk.KEY_F7, 27], - [Gdk.KEY_F8, 28], - [Gdk.KEY_F9, 29], - [Gdk.KEY_F10, 30], - [Gdk.KEY_F11, 31], - [Gdk.KEY_F12, 32], -]); - - -/* - * A list of keyvals we consider modifiers - */ -const MOD_KEYS = [ - Gdk.KEY_Alt_L, - Gdk.KEY_Alt_R, - Gdk.KEY_Caps_Lock, - Gdk.KEY_Control_L, - Gdk.KEY_Control_R, - Gdk.KEY_Meta_L, - Gdk.KEY_Meta_R, - Gdk.KEY_Num_Lock, - Gdk.KEY_Shift_L, - Gdk.KEY_Shift_R, - Gdk.KEY_Super_L, - Gdk.KEY_Super_R, -]; - - -/* - * Some convenience functions for checking keyvals for modifiers - */ -const isAlt = (key) => [Gdk.KEY_Alt_L, Gdk.KEY_Alt_R].includes(key); -const isCtrl = (key) => [Gdk.KEY_Control_L, Gdk.KEY_Control_R].includes(key); -const isShift = (key) => [Gdk.KEY_Shift_L, Gdk.KEY_Shift_R].includes(key); -const isSuper = (key) => [Gdk.KEY_Super_L, Gdk.KEY_Super_R].includes(key); - - -export const InputDialog = GObject.registerClass({ - GTypeName: 'GSConnectMousepadInputDialog', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The mousepad plugin associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/mousepad-input-dialog.ui', - Children: [ - 'infobar', 'infobar-label', - 'touchpad-eventbox', 'mouse-left-button', 'mouse-middle-button', 'mouse-right-button', - 'touchpad-drag', 'touchpad-long-press', - 'shift-label', 'ctrl-label', 'alt-label', 'super-label', 'entry', - ], -}, class InputDialog extends Gtk.Dialog { - - _init(params) { - super._init(Object.assign({ - use_header_bar: true, - }, params)); - - const headerbar = this.get_titlebar(); - headerbar.title = _('Remote Input'); - headerbar.subtitle = this.device.name; - - // Main Box - const content = this.get_content_area(); - content.border_width = 0; - - // TRANSLATORS: Displayed when the remote keyboard is not ready to accept input - this.infobar_label.label = _('Remote keyboard on %s is not active').format(this.device.name); - - // Text Input - this.entry.buffer.connect( - 'insert-text', - this._onInsertText.bind(this) - ); - - this.infobar.connect('notify::reveal-child', this._onState.bind(this)); - this.plugin.bind_property('state', this.infobar, 'reveal-child', 6); - - // Mouse Pad - this._resetTouchpadMotion(); - this.touchpad_motion_timeout_id = 0; - this.touchpad_holding = false; - - // Scroll Input - this.add_events(Gdk.EventMask.SCROLL_MASK); - - this.show_all(); - } - - vfunc_delete_event(event) { - this._ungrab(); - return this.hide_on_delete(); - } - - vfunc_grab_broken_event(event) { - if (event.keyboard) - this._ungrab(); - - return false; - } - - vfunc_key_release_event(event) { - if (!this.plugin.state) - debug('ignoring remote keyboard state'); - - const keyvalLower = Gdk.keyval_to_lower(event.keyval); - const realMask = event.state & Gtk.accelerator_get_default_mod_mask(); - - this.alt_label.sensitive = !isAlt(keyvalLower) && (realMask & Gdk.ModifierType.MOD1_MASK); - this.ctrl_label.sensitive = !isCtrl(keyvalLower) && (realMask & Gdk.ModifierType.CONTROL_MASK); - this.shift_label.sensitive = !isShift(keyvalLower) && (realMask & Gdk.ModifierType.SHIFT_MASK); - this.super_label.sensitive = !isSuper(keyvalLower) && (realMask & Gdk.ModifierType.SUPER_MASK); - - return super.vfunc_key_release_event(event); - } - - vfunc_key_press_event(event) { - if (!this.plugin.state) - debug('ignoring remote keyboard state'); - - let keyvalLower = Gdk.keyval_to_lower(event.keyval); - let realMask = event.state & Gtk.accelerator_get_default_mod_mask(); - - this.alt_label.sensitive = isAlt(keyvalLower) || (realMask & Gdk.ModifierType.MOD1_MASK); - this.ctrl_label.sensitive = isCtrl(keyvalLower) || (realMask & Gdk.ModifierType.CONTROL_MASK); - this.shift_label.sensitive = isShift(keyvalLower) || (realMask & Gdk.ModifierType.SHIFT_MASK); - this.super_label.sensitive = isSuper(keyvalLower) || (realMask & Gdk.ModifierType.SUPER_MASK); - - // Wait for a real key before sending - if (MOD_KEYS.includes(keyvalLower)) - return false; - - // Normalize Tab - if (keyvalLower === Gdk.KEY_ISO_Left_Tab) - keyvalLower = Gdk.KEY_Tab; - - // Put shift back if it changed the case of the key, not otherwise. - if (keyvalLower !== event.keyval) - realMask |= Gdk.ModifierType.SHIFT_MASK; - - // HACK: we don't want to use SysRq as a keybinding (but we do want - // Alt+Print), so we avoid translation from Alt+Print to SysRq - if (keyvalLower === Gdk.KEY_Sys_Req && (realMask & Gdk.ModifierType.MOD1_MASK) !== 0) - keyvalLower = Gdk.KEY_Print; - - // CapsLock isn't supported as a keybinding modifier, so keep it from - // confusing us - realMask &= ~Gdk.ModifierType.LOCK_MASK; - - if (keyvalLower === 0) - return false; - - debug(`keyval: ${event.keyval}, mask: ${realMask}`); - - const request = { - alt: !!(realMask & Gdk.ModifierType.MOD1_MASK), - ctrl: !!(realMask & Gdk.ModifierType.CONTROL_MASK), - shift: !!(realMask & Gdk.ModifierType.SHIFT_MASK), - super: !!(realMask & Gdk.ModifierType.SUPER_MASK), - sendAck: true, - }; - - // specialKey - if (ReverseKeyMap.has(event.keyval)) { - request.specialKey = ReverseKeyMap.get(event.keyval); - - // key - } else { - const codePoint = Gdk.keyval_to_unicode(event.keyval); - request.key = String.fromCodePoint(codePoint); - } - - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: request, - }); - - // Pass these key combinations rather than using the echo reply - if (request.alt || request.ctrl || request.super) - return super.vfunc_key_press_event(event); - - return false; - } - - vfunc_scroll_event(event) { - if (event.delta_x === 0 && event.delta_y === 0) - return true; - - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - scroll: true, - dx: event.delta_x * 200, - dy: event.delta_y * 200, - }, - }); - return true; - } - - vfunc_window_state_event(event) { - if (!this.plugin.state) - debug('ignoring remote keyboard state'); - - if (event.new_window_state & Gdk.WindowState.FOCUSED) - this._grab(); - else - this._ungrab(); - - return super.vfunc_window_state_event(event); - } - - _onInsertText(buffer, location, text, len) { - if (this._isAck) - return; - - debug(`insert-text: ${text} (chars ${[...text].length})`); - - for (const char of [...text]) { - if (!char) - continue; - - // TODO: modifiers? - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - alt: false, - ctrl: false, - shift: false, - super: false, - sendAck: false, - key: char, - }, - }); - } - } - - _onState(widget) { - if (!this.plugin.state) - debug('ignoring remote keyboard state'); - - if (this.is_active) - this._grab(); - else - this._ungrab(); - } - - _grab() { - if (!this.visible || this._keyboard) - return; - - const seat = Gdk.Display.get_default().get_default_seat(); - const status = seat.grab( - this.get_window(), - Gdk.SeatCapabilities.KEYBOARD, - false, - null, - null, - null - ); - - if (status !== Gdk.GrabStatus.SUCCESS) { - logError(new Error('Grabbing keyboard failed')); - return; - } - - this._keyboard = seat.get_keyboard(); - this.grab_add(); - this.entry.has_focus = true; - } - - _ungrab() { - if (this._keyboard) { - this._keyboard.get_seat().ungrab(); - this._keyboard = null; - this.grab_remove(); - } - - this.entry.buffer.text = ''; - } - - _resetTouchpadMotion() { - this.touchpad_motion_prev_x = 0; - this.touchpad_motion_prev_y = 0; - this.touchpad_motion_x = 0; - this.touchpad_motion_y = 0; - } - - _onMouseLeftButtonClicked(button) { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - singleclick: true, - }, - }); - } - - _onMouseMiddleButtonClicked(button) { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - middleclick: true, - }, - }); - } - - _onMouseRightButtonClicked(button) { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - rightclick: true, - }, - }); - } - - _onTouchpadDragBegin(gesture) { - this._resetTouchpadMotion(); - - this.touchpad_motion_timeout_id = - GLib.timeout_add(GLib.PRIORITY_DEFAULT, 10, - this._onTouchpadMotionTimeout.bind(this)); - } - - _onTouchpadDragUpdate(gesture, offset_x, offset_y) { - this.touchpad_motion_x = offset_x; - this.touchpad_motion_y = offset_y; - } - - _onTouchpadDragEnd(gesture) { - this._resetTouchpadMotion(); - - GLib.Source.remove(this.touchpad_motion_timeout_id); - this.touchpad_motion_timeout_id = 0; - } - - _onTouchpadLongPressCancelled(gesture) { - const gesture_button = gesture.get_current_button(); - - // Check user dragged less than certain distances. - const is_click = - (Math.abs(this.touchpad_motion_x) < 4) && - (Math.abs(this.touchpad_motion_y) < 4); - - if (is_click) { - const click_body = {}; - switch (gesture_button) { - case 1: - click_body.singleclick = true; - break; - - case 2: - click_body.middleclick = true; - break; - - case 3: - click_body.rightclick = true; - break; - - default: - return; - } - - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: click_body, - }); - } - } - - _onTouchpadLongPressPressed(gesture) { - const gesture_button = gesture.get_current_button(); - - if (gesture_button !== 1) { - debug('Long press on other type of buttons are not handled.'); - } else { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - singlehold: true, - }, - }); - this.touchpad_holding = true; - } - } - - _onTouchpadLongPressEnd(gesture) { - if (this.touchpad_holding) { - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - singlerelease: true, - }, - }); - this.touchpad_holding = false; - } - } - - _onTouchpadMotionTimeout() { - const diff_x = this.touchpad_motion_x - this.touchpad_motion_prev_x; - const diff_y = this.touchpad_motion_y - this.touchpad_motion_prev_y; - - this.device.sendPacket({ - type: 'kdeconnect.mousepad.request', - body: { - dx: diff_x, - dy: diff_y, - }, - }); - - this.touchpad_motion_prev_x = this.touchpad_motion_x; - this.touchpad_motion_prev_y = this.touchpad_motion_y; - return true; - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/notification.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/notification.js deleted file mode 100644 index 654e4655..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/notification.js +++ /dev/null @@ -1,178 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import * as URI from '../utils/uri.js'; -import '../utils/ui.js'; - - -/** - * A dialog for repliable notifications. - */ -const ReplyDialog = GObject.registerClass({ - GTypeName: 'GSConnectNotificationReplyDialog', - Properties: { - 'device': GObject.ParamSpec.object( - 'device', - 'Device', - 'The device associated with this window', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'plugin': GObject.ParamSpec.object( - 'plugin', - 'Plugin', - 'The plugin that owns this notification', - GObject.ParamFlags.READWRITE, - GObject.Object - ), - 'uuid': GObject.ParamSpec.string( - 'uuid', - 'UUID', - 'The notification reply UUID', - GObject.ParamFlags.READWRITE, - null - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/notification-reply-dialog.ui', - Children: ['infobar', 'notification-title', 'notification-body', 'entry'], -}, class ReplyDialog extends Gtk.Dialog { - - _init(params) { - super._init({ - application: Gio.Application.get_default(), - device: params.device, - plugin: params.plugin, - uuid: params.uuid, - use_header_bar: true, - }); - - this.set_response_sensitive(Gtk.ResponseType.OK, false); - - // Info bar - this.device.bind_property( - 'connected', - this.infobar, - 'reveal-child', - GObject.BindingFlags.INVERT_BOOLEAN - ); - - // Notification Data - const headerbar = this.get_titlebar(); - headerbar.title = params.notification.appName; - headerbar.subtitle = this.device.name; - - this.notification_title.label = params.notification.title; - this.notification_body.label = URI.linkify(params.notification.text); - - // Message Entry/Send Button - this.device.bind_property( - 'connected', - this.entry, - 'sensitive', - GObject.BindingFlags.DEFAULT - ); - - this._connectedId = this.device.connect( - 'notify::connected', - this._onStateChanged.bind(this) - ); - - this._entryChangedId = this.entry.buffer.connect( - 'changed', - this._onStateChanged.bind(this) - ); - - this.restoreGeometry('notification-reply-dialog'); - - this.connect('destroy', this._onDestroy); - } - - _onDestroy(dialog) { - dialog.entry.buffer.disconnect(dialog._entryChangedId); - dialog.device.disconnect(dialog._connectedId); - } - - vfunc_delete_event() { - this.saveGeometry(); - - return false; - } - - vfunc_response(response_id) { - if (response_id === Gtk.ResponseType.OK) { - // Refuse to send empty or whitespace only messages - if (!this.entry.buffer.text.trim()) - return; - - this.plugin.replyNotification( - this.uuid, - this.entry.buffer.text - ); - } - - this.destroy(); - } - - get device() { - if (this._device === undefined) - this._device = null; - - return this._device; - } - - set device(device) { - this._device = device; - } - - get plugin() { - if (this._plugin === undefined) - this._plugin = null; - - return this._plugin; - } - - set plugin(plugin) { - this._plugin = plugin; - } - - get uuid() { - if (this._uuid === undefined) - this._uuid = null; - - return this._uuid; - } - - set uuid(uuid) { - this._uuid = uuid; - - // We must have a UUID - if (!uuid) { - this.destroy(); - debug('no uuid for repliable notification'); - } - } - - _onActivateLink(label, uri) { - Gtk.show_uri_on_window( - this.get_toplevel(), - uri.includes('://') ? uri : `https://${uri}`, - Gtk.get_current_event_time() - ); - - return true; - } - - _onStateChanged() { - if (this.device.connected && this.entry.buffer.text.trim()) - this.set_response_sensitive(Gtk.ResponseType.OK, true); - else - this.set_response_sensitive(Gtk.ResponseType.OK, false); - } -}); - -export default ReplyDialog; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/service.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/service.js deleted file mode 100644 index b84bb3d2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/ui/service.js +++ /dev/null @@ -1,252 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import system from 'system'; - -import Config from '../../config.js'; - - -/* - * Issue Header - */ -const ISSUE_HEADER = ` -GSConnect: ${Config.PACKAGE_VERSION} (${Config.IS_USER ? 'user' : 'system'}) -GJS: ${system.version} -Session: ${GLib.getenv('XDG_SESSION_TYPE')} -OS: ${GLib.get_os_info('PRETTY_NAME')} -`; - - -/** - * A dialog for selecting a device - */ -export const DeviceChooser = GObject.registerClass({ - GTypeName: 'GSConnectServiceDeviceChooser', - Properties: { - 'action-name': GObject.ParamSpec.string( - 'action-name', - 'Action Name', - 'The name of the associated action, like "sendFile"', - GObject.ParamFlags.READWRITE, - null - ), - 'action-target': GObject.param_spec_variant( - 'action-target', - 'Action Target', - 'The parameter for action invocations', - new GLib.VariantType('*'), - null, - GObject.ParamFlags.READWRITE - ), - }, - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/service-device-chooser.ui', - Children: ['device-list', 'cancel-button', 'select-button'], -}, class DeviceChooser extends Gtk.Dialog { - - _init(params = {}) { - super._init({ - use_header_bar: true, - application: Gio.Application.get_default(), - }); - this.set_keep_above(true); - - // HeaderBar - this.get_header_bar().subtitle = params.title; - - // Dialog Action - this.action_name = params.action_name; - this.action_target = params.action_target; - - // Device List - this.device_list.set_sort_func(this._sortDevices); - - this._devicesChangedId = this.application.settings.connect( - 'changed::devices', - this._onDevicesChanged.bind(this) - ); - this._onDevicesChanged(); - } - - vfunc_response(response_id) { - if (response_id === Gtk.ResponseType.OK) { - try { - const device = this.device_list.get_selected_row().device; - device.activate_action(this.action_name, this.action_target); - } catch (e) { - logError(e); - } - } - - this.destroy(); - } - - get action_name() { - if (this._action_name === undefined) - this._action_name = null; - - return this._action_name; - } - - set action_name(name) { - this._action_name = name; - } - - get action_target() { - if (this._action_target === undefined) - this._action_target = null; - - return this._action_target; - } - - set action_target(variant) { - this._action_target = variant; - } - - _onDeviceActivated(box, row) { - this.response(Gtk.ResponseType.OK); - } - - _onDeviceSelected(box) { - this.set_response_sensitive( - Gtk.ResponseType.OK, - (box.get_selected_row()) - ); - } - - _onDevicesChanged() { - // Collect known devices - const devices = {}; - - for (const [id, device] of this.application.manager.devices.entries()) - devices[id] = device; - - // Prune device rows - this.device_list.foreach(row => { - if (!devices.hasOwnProperty(row.name)) - row.destroy(); - else - delete devices[row.name]; - }); - - // Add new devices - for (const device of Object.values(devices)) { - const action = device.lookup_action(this.action_name); - - if (action === null) - continue; - - const row = new Gtk.ListBoxRow({ - visible: action.enabled, - }); - row.set_name(device.id); - row.device = device; - - action.bind_property( - 'enabled', - row, - 'visible', - Gio.SettingsBindFlags.DEFAULT - ); - - const grid = new Gtk.Grid({ - column_spacing: 12, - margin: 6, - visible: true, - }); - row.add(grid); - - const icon = new Gtk.Image({ - icon_name: device.icon_name, - pixel_size: 32, - visible: true, - }); - grid.attach(icon, 0, 0, 1, 1); - - const name = new Gtk.Label({ - label: device.name, - halign: Gtk.Align.START, - hexpand: true, - visible: true, - }); - grid.attach(name, 1, 0, 1, 1); - - this.device_list.add(row); - } - - if (this.device_list.get_selected_row() === null) - this.device_list.select_row(this.device_list.get_row_at_index(0)); - } - - _sortDevices(row1, row2) { - return row1.device.name.localeCompare(row2.device.name); - } -}); - - -/** - * A dialog for reporting an error. - */ -export const ErrorDialog = GObject.registerClass({ - GTypeName: 'GSConnectServiceErrorDialog', - Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/service-error-dialog.ui', - Children: [ - 'error-stack', - 'expander-arrow', - 'gesture', - 'report-button', - 'revealer', - ], -}, class ErrorDialog extends Gtk.Window { - - _init(error) { - super._init({ - application: Gio.Application.get_default(), - title: `GSConnect: ${error.name}`, - }); - this.set_keep_above(true); - - this.error = error; - this.error_stack.buffer.text = `${error.message}\n\n${error.stack}`; - this.gesture.connect('released', this._onReleased.bind(this)); - } - - _onClicked(button) { - if (this.report_button === button) { - const uri = this._buildUri(this.error.message, this.error.stack); - Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); - } - - this.destroy(); - } - - _onReleased(gesture, n_press) { - if (n_press === 1) - this.revealer.reveal_child = !this.revealer.reveal_child; - } - - _onRevealChild(revealer, pspec) { - this.expander_arrow.icon_name = this.revealer.reveal_child - ? 'pan-down-symbolic' - : 'pan-end-symbolic'; - } - - _buildUri(message, stack) { - const body = `\`\`\`${ISSUE_HEADER}\n${stack}\n\`\`\``; - const titleQuery = encodeURIComponent(message).replace('%20', '+'); - const bodyQuery = encodeURIComponent(body).replace('%20', '+'); - const uri = `${Config.PACKAGE_BUGREPORT}?title=${titleQuery}&body=${bodyQuery}`; - - // Reasonable URI length limit - if (uri.length > 2000) - return uri.substr(0, 2000); - - return uri; - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/dbus.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/dbus.js deleted file mode 100644 index f4a9d676..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/dbus.js +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GjsPrivate from 'gi://GjsPrivate'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - - -/* - * Some utility methods - */ -function toDBusCase(string) { - return string.replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, offset) => { - return ltr.toUpperCase(); - }).replace(/[\s_-]+/g, ''); -} - -function toUnderscoreCase(string) { - return string.replace(/(?:^\w|[A-Z]|_|\b\w)/g, (ltr, offset) => { - if (ltr === '_') - return ''; - - return (offset > 0) ? `_${ltr.toLowerCase()}` : ltr.toLowerCase(); - }).replace(/[\s-]+/g, ''); -} - - -/** - * DBus.Interface represents a DBus interface bound to an object instance, meant - * to be exported over DBus. - */ -export const Interface = GObject.registerClass({ - GTypeName: 'GSConnectDBusInterface', - Implements: [Gio.DBusInterface], - Properties: { - 'g-instance': GObject.ParamSpec.object( - 'g-instance', - 'Instance', - 'The delegate GObject', - GObject.ParamFlags.READWRITE, - GObject.Object.$gtype - ), - }, -}, class Interface extends GjsPrivate.DBusImplementation { - - _init(params) { - super._init({ - g_instance: params.g_instance, - g_interface_info: params.g_interface_info, - }); - - // Cache member lookups - this._instanceHandlers = []; - this._instanceMethods = {}; - this._instanceProperties = {}; - - const info = this.get_info(); - this.connect('handle-method-call', this._call.bind(this._instance, info)); - this.connect('handle-property-get', this._get.bind(this._instance, info)); - this.connect('handle-property-set', this._set.bind(this._instance, info)); - - // Automatically forward known signals - const id = this._instance.connect('notify', this._notify.bind(this)); - this._instanceHandlers.push(id); - - for (const signal of info.signals) { - const type = `(${signal.args.map(arg => arg.signature).join('')})`; - const id = this._instance.connect( - signal.name, - this._emit.bind(this, signal.name, type) - ); - - this._instanceHandlers.push(id); - } - - // Export if connection and object path were given - if (params.g_connection && params.g_object_path) - this.export(params.g_connection, params.g_object_path); - } - - get g_instance() { - if (this._instance === undefined) - this._instance = null; - - return this._instance; - } - - set g_instance(instance) { - this._instance = instance; - } - - /** - * Invoke an instance's method for a DBus method call. - * - * @param {Gio.DBusInterfaceInfo} info - The DBus interface - * @param {DBus.Interface} iface - The DBus interface - * @param {string} name - The DBus method name - * @param {GLib.Variant} parameters - The method parameters - * @param {Gio.DBusMethodInvocation} invocation - The method invocation info - */ - async _call(info, iface, name, parameters, invocation) { - let retval; - - // Invoke the instance method - try { - const args = parameters.unpack().map(parameter => { - if (parameter.get_type_string() === 'h') { - const message = invocation.get_message(); - const fds = message.get_unix_fd_list(); - const idx = parameter.deepUnpack(); - return fds.get(idx); - } else { - return parameter.recursiveUnpack(); - } - }); - - retval = await this[name](...args); - } catch (e) { - if (e instanceof GLib.Error) { - invocation.return_gerror(e); - } else { - // likely to be a normal JS error - if (!e.name.includes('.')) - e.name = `org.gnome.gjs.JSError.${e.name}`; - - invocation.return_dbus_error(e.name, e.message); - } - - logError(e, `${this}: ${name}`); - return; - } - - // `undefined` is an empty tuple on DBus - if (retval === undefined) - retval = new GLib.Variant('()', []); - - // Return the instance result or error - try { - if (!(retval instanceof GLib.Variant)) { - const args = info.lookup_method(name).out_args; - retval = new GLib.Variant( - `(${args.map(arg => arg.signature).join('')})`, - (args.length === 1) ? [retval] : retval - ); - } - - invocation.return_value(retval); - } catch (e) { - invocation.return_dbus_error( - 'org.gnome.gjs.JSError.ValueError', - 'Service implementation returned an incorrect value type' - ); - - logError(e, `${this}: ${name}`); - } - } - - _nativeProp(obj, name) { - if (this._instanceProperties[name] === undefined) { - let propName = name; - - if (propName in obj) - this._instanceProperties[name] = propName; - - if (this._instanceProperties[name] === undefined) { - propName = toUnderscoreCase(name); - - if (propName in obj) - this._instanceProperties[name] = propName; - } - } - - return this._instanceProperties[name]; - } - - _emit(name, type, obj, ...args) { - this.emit_signal(name, new GLib.Variant(type, args)); - } - - _get(info, iface, name) { - const nativeValue = this[iface._nativeProp(this, name)]; - const propertyInfo = info.lookup_property(name); - - if (nativeValue === undefined || propertyInfo === null) - return null; - - return new GLib.Variant(propertyInfo.signature, nativeValue); - } - - _set(info, iface, name, value) { - const nativeValue = value.recursiveUnpack(); - - this[iface._nativeProp(this, name)] = nativeValue; - } - - _notify(obj, pspec) { - const name = toDBusCase(pspec.name); - const propertyInfo = this.get_info().lookup_property(name); - - if (propertyInfo === null) - return; - - this.emit_property_changed( - name, - new GLib.Variant( - propertyInfo.signature, - // Adjust for GJS's '-'/'_' conversion - this._instance[pspec.name.replace(/-/gi, '_')] - ) - ); - } - - destroy() { - try { - for (const id of this._instanceHandlers) - this._instance.disconnect(id); - this._instanceHandlers = []; - - this.flush(); - this.unexport(); - } catch (e) { - logError(e); - } - } -}); - -/** - * Get a new, dedicated DBus connection on @busType - * - * @param {Gio.BusType} [busType] - a Gio.BusType constant - * @param {Gio.Cancellable} [cancellable] - an optional Gio.Cancellable - * @return {Promise<Gio.DBusConnection>} A new DBus connection - */ -export function newConnection(busType = Gio.BusType.SESSION, cancellable = null) { - return new Promise((resolve, reject) => { - Gio.DBusConnection.new_for_address( - Gio.dbus_address_get_for_bus_sync(busType, cancellable), - Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT | - Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION, - null, - cancellable, - (connection, res) => { - try { - resolve(Gio.DBusConnection.new_for_address_finish(res)); - } catch (e) { - reject(e); - } - } - ); - - }); -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/ui.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/ui.js deleted file mode 100644 index d0f31aa9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/ui.js +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Gtk from 'gi://Gtk'; - -import Config from '../../config.js'; - - -/* - * Window State - */ -Gtk.Window.prototype.restoreGeometry = function (context = 'default') { - this._windowState = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect.WindowState', - true - ), - path: `/org/gnome/shell/extensions/gsconnect/${context}/`, - }); - - // Size - const [width, height] = this._windowState.get_value('window-size').deepUnpack(); - - if (width && height) - this.set_default_size(width, height); - - // Maximized State - if (this._windowState.get_boolean('window-maximized')) - this.maximize(); -}; - -Gtk.Window.prototype.saveGeometry = function () { - const state = this.get_window().get_state(); - - // Maximized State - const maximized = (state & Gdk.WindowState.MAXIMIZED); - this._windowState.set_boolean('window-maximized', maximized); - - // Leave the size at the value before maximizing - if (maximized || (state & Gdk.WindowState.FULLSCREEN)) - return; - - // Size - const size = this.get_size(); - this._windowState.set_value('window-size', new GLib.Variant('(ii)', size)); -}; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/uri.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/uri.js deleted file mode 100644 index e7fca2c4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/service/utils/uri.js +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GLib from 'gi://GLib'; - - -/** - * The same regular expression used in GNOME Shell - * - * http://daringfireball.net/2010/07/improved_regex_for_matching_urls - */ -const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)'; -const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]'; -const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]'; - -const _urlRegexp = new RegExp( - '(^|' + _leadingJunk + ')' + - '(' + - '(?:' + - '(?:http|https)://' + // scheme:// - '|' + - 'www\\d{0,3}[.]' + // www. - '|' + - '[a-z0-9.\\-]+[.][a-z]{2,4}/' + // foo.xx/ - ')' + - '(?:' + // one or more: - '[^\\s()<>]+' + // run of non-space non-() - '|' + // or - _balancedParens + // balanced parens - ')+' + - '(?:' + // end with: - _balancedParens + // balanced parens - '|' + // or - _notTrailingJunk + // last non-junk char - ')' + - ')', 'gi'); - - -/** - * sms/tel URI RegExp (https://tools.ietf.org/html/rfc5724) - * - * A fairly lenient regexp for sms: URIs that allows tel: numbers with chars - * from global-number, local-number (without phone-context) and single spaces. - * This allows passing numbers directly from libfolks or GData without - * pre-processing. It also makes an allowance for URIs passed from Gio.File - * that always come in the form "sms:///". - */ -const _smsParam = "[\\w.!~*'()-]+=(?:[\\w.!~*'()-]|%[0-9A-F]{2})*"; -const _telParam = ";[a-zA-Z0-9-]+=(?:[\\w\\[\\]/:&+$.!~*'()-]|%[0-9A-F]{2})+"; -const _lenientDigits = '[+]?(?:[0-9A-F*#().-]| (?! )|%20(?!%20))+'; -const _lenientNumber = `${_lenientDigits}(?:${_telParam})*`; - -const _smsRegex = new RegExp( - '^' + - 'sms:' + // scheme - '(?:[/]{2,3})?' + // Gio.File returns ":///" - '(' + // one or more... - _lenientNumber + // phone numbers - '(?:,' + _lenientNumber + ')*' + // separated by commas - ')' + - '(?:\\?(' + // followed by optional... - _smsParam + // parameters... - '(?:&' + _smsParam + ')*' + // separated by "&" (unescaped) - '))?' + - '$', 'g'); // fragments (#foo) not allowed - - -const _numberRegex = new RegExp( - '^' + - '(' + _lenientDigits + ')' + // phone number digits - '((?:' + _telParam + ')*)' + // followed by optional parameters - '$', 'g'); - - -/** - * Searches @str for URLs and returns an array of objects with %url - * properties showing the matched URL string, and %pos properties indicating - * the position within @str where the URL was found. - * - * @param {string} str - the string to search - * @return {Object[]} the list of match objects, as described above - */ -export function findUrls(str) { - _urlRegexp.lastIndex = 0; - - const res = []; - let match; - - while ((match = _urlRegexp.exec(str))) { - const name = match[2]; - const url = GLib.uri_parse_scheme(name) ? name : `http://${name}`; - res.push({name, url, pos: match.index + match[1].length}); - } - - return res; -} - - -/** - * Return a string with URLs couched in <a> tags, parseable by Pango and - * using the same RegExp as GNOME Shell. - * - * @param {string} str - The string to be modified - * @param {string} [title] - An optional title (eg. alt text, tooltip) - * @return {string} the modified text - */ -export function linkify(str, title = null) { - const text = GLib.markup_escape_text(str, -1); - - _urlRegexp.lastIndex = 0; - - if (title) { - return text.replace( - _urlRegexp, - `$1<a href="$2" title="${title}">$2</a>` - ); - } else { - return text.replace(_urlRegexp, '$1<a href="$2">$2</a>'); - } -} - - -/** - * A simple parsing class for sms: URI's (https://tools.ietf.org/html/rfc5724) - */ -export default class URI { - constructor(uri) { - _smsRegex.lastIndex = 0; - const [, recipients, query] = _smsRegex.exec(uri); - - this.recipients = recipients.split(',').map(recipient => { - _numberRegex.lastIndex = 0; - const [, number, params] = _numberRegex.exec(recipient); - - if (params) { - for (const param of params.substr(1).split(';')) { - const [key, value] = param.split('='); - - // add phone-context to beginning of - if (key === 'phone-context' && value.startsWith('+')) - return value + unescape(number); - } - } - - return unescape(number); - }); - - if (query) { - for (const field of query.split('&')) { - const [key, value] = field.split('='); - - if (key === 'body') { - if (this.body) - throw URIError('duplicate "body" field'); - - this.body = value ? decodeURIComponent(value) : undefined; - } - } - } - } - - toString() { - const uri = `sms:${this.recipients.join(',')}`; - - return this.body ? `${uri}?body=${escape(this.body)}` : uri; - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/clipboard.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/clipboard.js deleted file mode 100644 index c9b61f35..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/clipboard.js +++ /dev/null @@ -1,380 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GjsPrivate from 'gi://GjsPrivate'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -import Meta from 'gi://Meta'; - - -/* - * DBus Interface Info - */ -const DBUS_NAME = 'org.gnome.Shell.Extensions.GSConnect.Clipboard'; -const DBUS_PATH = '/org/gnome/Shell/Extensions/GSConnect/Clipboard'; -const DBUS_NODE = Gio.DBusNodeInfo.new_for_xml(` -<node> - <interface name="org.gnome.Shell.Extensions.GSConnect.Clipboard"> - <!-- Methods --> - <method name="GetMimetypes"> - <arg direction="out" type="as" name="mimetypes"/> - </method> - <method name="GetText"> - <arg direction="out" type="s" name="text"/> - </method> - <method name="SetText"> - <arg direction="in" type="s" name="text"/> - </method> - <method name="GetValue"> - <arg direction="in" type="s" name="mimetype"/> - <arg direction="out" type="ay" name="value"/> - </method> - <method name="SetValue"> - <arg direction="in" type="ay" name="value"/> - <arg direction="in" type="s" name="mimetype"/> - </method> - - <!-- Signals --> - <signal name="OwnerChange"/> - </interface> -</node> -`); -const DBUS_INFO = DBUS_NODE.lookup_interface(DBUS_NAME); - - -/* - * Text Mimetypes - */ -const TEXT_MIMETYPES = [ - 'text/plain;charset=utf-8', - 'UTF8_STRING', - 'text/plain', - 'STRING', -]; - - -/* GSConnectClipboardPortal: - * - * A simple clipboard portal, especially useful on Wayland where GtkClipboard - * doesn't work in the background. - */ -export const Clipboard = GObject.registerClass({ - GTypeName: 'GSConnectShellClipboard', -}, class GSConnectShellClipboard extends GjsPrivate.DBusImplementation { - - _init(params = {}) { - super._init({ - g_interface_info: DBUS_INFO, - }); - - this._transferring = false; - - // Watch global selection - this._selection = global.display.get_selection(); - this._ownerChangedId = this._selection.connect( - 'owner-changed', - this._onOwnerChanged.bind(this) - ); - - // Prepare DBus interface - this._handleMethodCallId = this.connect( - 'handle-method-call', - this._onHandleMethodCall.bind(this) - ); - - this._nameId = Gio.DBus.own_name( - Gio.BusType.SESSION, - DBUS_NAME, - Gio.BusNameOwnerFlags.NONE, - this._onBusAcquired.bind(this), - null, - this._onNameLost.bind(this) - ); - } - - _onOwnerChanged(selection, type, source) { - /* We're only interested in the standard clipboard */ - if (type !== Meta.SelectionType.SELECTION_CLIPBOARD) - return; - - /* In Wayland an intermediate GMemoryOutputStream is used which triggers - * a second ::owner-changed emission, so we need to ensure we ignore - * that while the transfer is resolving. - */ - if (this._transferring) - return; - - this._transferring = true; - - /* We need to put our signal emission in an idle callback to ensure that - * Mutter's internal calls have finished resolving in the loop, or else - * we'll end up with the previous selection's content. - */ - GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { - this.emit_signal('OwnerChange', null); - this._transferring = false; - - return GLib.SOURCE_REMOVE; - }); - } - - _onBusAcquired(connection, name) { - try { - this.export(connection, DBUS_PATH); - } catch (e) { - logError(e); - } - } - - _onNameLost(connection, name) { - try { - this.unexport(); - } catch (e) { - logError(e); - } - } - - async _onHandleMethodCall(iface, name, parameters, invocation) { - let retval; - - try { - const args = parameters.recursiveUnpack(); - - retval = await this[name](...args); - } catch (e) { - if (e instanceof GLib.Error) { - invocation.return_gerror(e); - } else { - if (!e.name.includes('.')) - e.name = `org.gnome.gjs.JSError.${e.name}`; - - invocation.return_dbus_error(e.name, e.message); - } - - return; - } - - if (retval === undefined) - retval = new GLib.Variant('()', []); - - try { - if (!(retval instanceof GLib.Variant)) { - const args = DBUS_INFO.lookup_method(name).out_args; - retval = new GLib.Variant( - `(${args.map(arg => arg.signature).join('')})`, - (args.length === 1) ? [retval] : retval - ); - } - - invocation.return_value(retval); - - // Without a response, the client will wait for timeout - } catch (e) { - invocation.return_dbus_error( - 'org.gnome.gjs.JSError.ValueError', - 'Service implementation returned an incorrect value type' - ); - } - } - - /** - * Get the available mimetypes of the current clipboard content - * - * @return {Promise<string[]>} A list of mime-types - */ - GetMimetypes() { - return new Promise((resolve, reject) => { - try { - const mimetypes = this._selection.get_mimetypes( - Meta.SelectionType.SELECTION_CLIPBOARD - ); - - resolve(mimetypes); - } catch (e) { - reject(e); - } - }); - } - - /** - * Get the text content of the clipboard - * - * @return {Promise<string>} Text content of the clipboard - */ - GetText() { - return new Promise((resolve, reject) => { - const mimetypes = this._selection.get_mimetypes( - Meta.SelectionType.SELECTION_CLIPBOARD); - - const mimetype = TEXT_MIMETYPES.find(type => mimetypes.includes(type)); - - if (mimetype !== undefined) { - const stream = Gio.MemoryOutputStream.new_resizable(); - - this._selection.transfer_async( - Meta.SelectionType.SELECTION_CLIPBOARD, - mimetype, -1, - stream, null, - (selection, res) => { - try { - selection.transfer_finish(res); - - const bytes = stream.steal_as_bytes(); - const bytearray = bytes.get_data(); - - resolve(new TextDecoder().decode(bytearray)); - } catch (e) { - reject(e); - } - } - ); - } else { - reject(new Error('text not available')); - } - }); - } - - /** - * Set the text content of the clipboard - * - * @param {string} text - text content to set - * @return {Promise} A promise for the operation - */ - SetText(text) { - return new Promise((resolve, reject) => { - try { - if (typeof text !== 'string') { - throw new Gio.DBusError({ - code: Gio.DBusError.INVALID_ARGS, - message: 'expected string', - }); - } - - const source = Meta.SelectionSourceMemory.new( - 'text/plain;charset=utf-8', GLib.Bytes.new(text)); - - this._selection.set_owner( - Meta.SelectionType.SELECTION_CLIPBOARD, source); - - resolve(); - } catch (e) { - reject(e); - } - }); - } - - /** - * Get the content of the clipboard with the type @mimetype. - * - * @param {string} mimetype - the mimetype to request - * @return {Promise<Uint8Array>} The content of the clipboard - */ - GetValue(mimetype) { - return new Promise((resolve, reject) => { - const stream = Gio.MemoryOutputStream.new_resizable(); - - this._selection.transfer_async( - Meta.SelectionType.SELECTION_CLIPBOARD, - mimetype, -1, - stream, null, - (selection, res) => { - try { - selection.transfer_finish(res); - - const bytes = stream.steal_as_bytes(); - - resolve(bytes.get_data()); - } catch (e) { - reject(e); - } - } - ); - }); - } - - /** - * Set the content of the clipboard to @value with the type @mimetype. - * - * @param {Uint8Array} value - the value to set - * @param {string} mimetype - the mimetype of the value - * @return {Promise} - A promise for the operation - */ - SetValue(value, mimetype) { - return new Promise((resolve, reject) => { - try { - const source = Meta.SelectionSourceMemory.new(mimetype, - GLib.Bytes.new(value)); - - this._selection.set_owner( - Meta.SelectionType.SELECTION_CLIPBOARD, source); - - resolve(); - } catch (e) { - reject(e); - } - }); - } - - destroy() { - if (this._selection && this._ownerChangedId > 0) { - this._selection.disconnect(this._ownerChangedId); - this._ownerChangedId = 0; - } - - if (this._nameId > 0) { - Gio.bus_unown_name(this._nameId); - this._nameId = 0; - } - - if (this._handleMethodCallId > 0) { - this.disconnect(this._handleMethodCallId); - this._handleMethodCallId = 0; - this.unexport(); - } - } -}); - - -let _portal = null; -let _portalId = 0; - -/** - * Watch for the service to start and export the clipboard portal when it does. - */ -export function watchService() { - if (GLib.getenv('XDG_SESSION_TYPE') !== 'wayland') - return; - - if (_portalId > 0) - return; - - _portalId = Gio.bus_watch_name( - Gio.BusType.SESSION, - 'org.gnome.Shell.Extensions.GSConnect', - Gio.BusNameWatcherFlags.NONE, - () => { - if (_portal === null) - _portal = new Clipboard(); - }, - () => { - if (_portal !== null) { - _portal.destroy(); - _portal = null; - } - } - ); -} - -/** - * Stop watching the service and export the portal if currently running. - */ -export function unwatchService() { - if (_portalId > 0) { - Gio.bus_unwatch_name(_portalId); - _portalId = 0; - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/device.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/device.js deleted file mode 100644 index 59e4d96e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/device.js +++ /dev/null @@ -1,380 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; -import {getIcon} from './utils.js'; - -import * as GMenu from './gmenu.js'; -import Tooltip from './tooltip.js'; - - -/** - * A battery widget with an icon, text percentage and time estimate tooltip - */ -export const Battery = GObject.registerClass({ - GTypeName: 'GSConnectShellDeviceBattery', -}, class Battery extends St.BoxLayout { - - _init(params) { - super._init({ - reactive: true, - style_class: 'gsconnect-device-battery', - track_hover: true, - }); - Object.assign(this, params); - - // Percent Label - this.label = new St.Label({ - y_align: Clutter.ActorAlign.CENTER, - }); - this.label.clutter_text.ellipsize = 0; - this.add_child(this.label); - - // Battery Icon - this.icon = new St.Icon({ - fallback_icon_name: 'battery-missing-symbolic', - icon_size: 16, - }); - this.add_child(this.icon); - - // Battery Estimate - this.tooltip = new Tooltip({ - parent: this, - text: null, - }); - - // Battery GAction - this._actionAddedId = this.device.action_group.connect( - 'action-added', - this._onActionChanged.bind(this) - ); - this._actionRemovedId = this.device.action_group.connect( - 'action-removed', - this._onActionChanged.bind(this) - ); - this._actionStateChangedId = this.device.action_group.connect( - 'action-state-changed', - this._onStateChanged.bind(this) - ); - - this._onActionChanged(this.device.action_group, 'battery'); - - // Cleanup on destroy - this.connect('destroy', this._onDestroy); - } - - _onActionChanged(action_group, action_name) { - if (action_name !== 'battery') - return; - - if (action_group.has_action('battery')) { - const value = action_group.get_action_state('battery'); - const [charging, icon_name, level, time] = value.deepUnpack(); - - this._state = { - charging: charging, - icon_name: icon_name, - level: level, - time: time, - }; - } else { - this._state = null; - } - - this._sync(); - } - - _onStateChanged(action_group, action_name, value) { - if (action_name !== 'battery') - return; - - const [charging, icon_name, level, time] = value.deepUnpack(); - - this._state = { - charging: charging, - icon_name: icon_name, - level: level, - time: time, - }; - - this._sync(); - } - - _getBatteryLabel() { - if (!this._state) - return null; - - const {charging, level, time} = this._state; - - if (level === 100) - // TRANSLATORS: When the battery level is 100% - return _('Fully Charged'); - - if (time === 0) - // TRANSLATORS: When no time estimate for the battery is available - // EXAMPLE: 42% (Estimating…) - return _('%d%% (Estimating…)').format(level); - - const total = time / 60; - const minutes = Math.floor(total % 60); - const hours = Math.floor(total / 60); - - if (charging) { - // TRANSLATORS: Estimated time until battery is charged - // EXAMPLE: 42% (1:15 Until Full) - return _('%d%% (%d\u2236%02d Until Full)').format( - level, - hours, - minutes - ); - } else { - // TRANSLATORS: Estimated time until battery is empty - // EXAMPLE: 42% (12:15 Remaining) - return _('%d%% (%d\u2236%02d Remaining)').format( - level, - hours, - minutes - ); - } - } - - _onDestroy(actor) { - actor.device.action_group.disconnect(actor._actionAddedId); - actor.device.action_group.disconnect(actor._actionRemovedId); - actor.device.action_group.disconnect(actor._actionStateChangedId); - } - - _sync() { - this.visible = !!this._state; - - if (!this.visible) - return; - - this.icon.icon_name = this._state.icon_name; - this.label.text = (this._state.level > -1) ? `${this._state.level}%` : ''; - this.tooltip.text = this._getBatteryLabel(); - } -}); - - -/** - * A cell signal strength widget with two icons - */ -export const SignalStrength = GObject.registerClass({ - GTypeName: 'GSConnectShellDeviceSignalStrength', -}, class SignalStrength extends St.BoxLayout { - - _init(params) { - super._init({ - reactive: true, - style_class: 'gsconnect-device-signal-strength', - track_hover: true, - }); - Object.assign(this, params); - - // Network Type Icon - this.networkTypeIcon = new St.Icon({ - fallback_icon_name: 'network-cellular-symbolic', - icon_size: 16, - }); - this.add_child(this.networkTypeIcon); - - // Signal Strength Icon - this.signalStrengthIcon = new St.Icon({ - fallback_icon_name: 'network-cellular-offline-symbolic', - icon_size: 16, - }); - this.add_child(this.signalStrengthIcon); - - // Network Type Text - this.tooltip = new Tooltip({ - parent: this, - text: null, - }); - - // ConnectivityReport GAction - this._actionAddedId = this.device.action_group.connect( - 'action-added', - this._onActionChanged.bind(this) - ); - this._actionRemovedId = this.device.action_group.connect( - 'action-removed', - this._onActionChanged.bind(this) - ); - this._actionStateChangedId = this.device.action_group.connect( - 'action-state-changed', - this._onStateChanged.bind(this) - ); - - this._onActionChanged(this.device.action_group, 'connectivityReport'); - - // Cleanup on destroy - this.connect('destroy', this._onDestroy); - } - - _onActionChanged(action_group, action_name) { - if (action_name !== 'connectivityReport') - return; - - if (action_group.has_action('connectivityReport')) { - const value = action_group.get_action_state('connectivityReport'); - const [ - cellular_network_type, - cellular_network_type_icon, - cellular_network_strength, - cellular_network_strength_icon, - hotspot_name, - hotspot_bssid, - ] = value.deepUnpack(); - - this._state = { - cellular_network_type: cellular_network_type, - cellular_network_type_icon: cellular_network_type_icon, - cellular_network_strength: cellular_network_strength, - cellular_network_strength_icon: cellular_network_strength_icon, - hotspot_name: hotspot_name, - hotspot_bssid: hotspot_bssid, - }; - } else { - this._state = null; - } - - this._sync(); - } - - _onStateChanged(action_group, action_name, value) { - if (action_name !== 'connectivityReport') - return; - - const [ - cellular_network_type, - cellular_network_type_icon, - cellular_network_strength, - cellular_network_strength_icon, - hotspot_name, - hotspot_bssid, - ] = value.deepUnpack(); - - this._state = { - cellular_network_type: cellular_network_type, - cellular_network_type_icon: cellular_network_type_icon, - cellular_network_strength: cellular_network_strength, - cellular_network_strength_icon: cellular_network_strength_icon, - hotspot_name: hotspot_name, - hotspot_bssid: hotspot_bssid, - }; - - this._sync(); - } - - _onDestroy(actor) { - actor.device.action_group.disconnect(actor._actionAddedId); - actor.device.action_group.disconnect(actor._actionRemovedId); - actor.device.action_group.disconnect(actor._actionStateChangedId); - } - - _sync() { - this.visible = !!this._state; - - if (!this.visible) - return; - - this.networkTypeIcon.icon_name = this._state.cellular_network_type_icon; - this.signalStrengthIcon.icon_name = this._state.cellular_network_strength_icon; - this.tooltip.text = this._state.cellular_network_type; - } -}); - - -/** - * A PopupMenu used as an information and control center for a device - */ -export class Menu extends PopupMenu.PopupMenuSection { - - constructor(params) { - super(); - Object.assign(this, params); - - this.actor.add_style_class_name('gsconnect-device-menu'); - - // Title - this._title = new PopupMenu.PopupSeparatorMenuItem(this.device.name); - this.addMenuItem(this._title); - - // Title -> Name - this._title.label.style_class = 'gsconnect-device-name'; - this._title.label.clutter_text.ellipsize = 0; - this.device.bind_property( - 'name', - this._title.label, - 'text', - GObject.BindingFlags.SYNC_CREATE - ); - - // Title -> Cellular Signal Strength - this._signalStrength = new SignalStrength({device: this.device}); - this._title.actor.add_child(this._signalStrength); - - // Title -> Battery - this._battery = new Battery({device: this.device}); - this._title.actor.add_child(this._battery); - - // Actions - let actions; - - if (this.menu_type === 'icon') { - actions = new GMenu.IconBox({ - action_group: this.device.action_group, - model: this.device.menu, - }); - } else if (this.menu_type === 'list') { - actions = new GMenu.ListBox({ - action_group: this.device.action_group, - model: this.device.menu, - }); - } - - this.addMenuItem(actions); - } - - isEmpty() { - return false; - } -} - - -/** - * An indicator representing a Device in the Status Area - */ -export const Indicator = GObject.registerClass({ - GTypeName: 'GSConnectDeviceIndicator', -}, class Indicator extends PanelMenu.Button { - - _init(params) { - super._init(0.0, `${params.device.name} Indicator`, false); - Object.assign(this, params); - - // Device Icon - this._icon = new St.Icon({ - gicon: getIcon(this.device.icon_name), - style_class: 'system-status-icon gsconnect-device-indicator', - }); - this.add_child(this._icon); - - // Menu - const menu = new Menu({ - device: this.device, - menu_type: 'icon', - }); - this.menu.addMenuItem(menu); - } -}); - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/gmenu.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/gmenu.js deleted file mode 100644 index 62ae0f1a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/gmenu.js +++ /dev/null @@ -1,647 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Atk from 'gi://Atk'; -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -import {getIcon} from './utils.js'; - -import Tooltip from './tooltip.js'; - - -/** - * Get a dictionary of a GMenuItem's attributes - * - * @param {Gio.MenuModel} model - The menu model containing the item - * @param {number} index - The index of the item in @model - * @return {Object} A dictionary of the item's attributes - */ -function getItemInfo(model, index) { - const info = { - target: null, - links: [], - }; - - // - let iter = model.iterate_item_attributes(index); - - while (iter.next()) { - const name = iter.get_name(); - let value = iter.get_value(); - - switch (name) { - case 'icon': - value = Gio.Icon.deserialize(value); - - if (value instanceof Gio.ThemedIcon) - value = getIcon(value.names[0]); - - info[name] = value; - break; - - case 'target': - info[name] = value; - break; - - default: - info[name] = value.unpack(); - } - } - - // Submenus & Sections - iter = model.iterate_item_links(index); - - while (iter.next()) { - info.links.push({ - name: iter.get_name(), - value: iter.get_value(), - }); - } - - return info; -} - - -/** - * - */ -export class ListBox extends PopupMenu.PopupMenuSection { - - constructor(params) { - super(); - Object.assign(this, params); - - // Main Actor - this.actor = new St.BoxLayout({ - x_expand: true, - clip_to_allocation: true, - }); - this.actor._delegate = this; - - // Item Box - this.box.clip_to_allocation = true; - this.box.x_expand = true; - this.box.add_style_class_name('gsconnect-list-box'); - this.box.set_pivot_point(1, 1); - this.actor.add_child(this.box); - - // Submenu Container - this.sub = new St.BoxLayout({ - clip_to_allocation: true, - vertical: false, - visible: false, - x_expand: true, - }); - this.sub.set_pivot_point(1, 1); - this.sub._delegate = this; - this.actor.add_child(this.sub); - - // Handle transitions - this._boxTransitionsCompletedId = this.box.connect( - 'transitions-completed', - this._onTransitionsCompleted.bind(this) - ); - - this._subTransitionsCompletedId = this.sub.connect( - 'transitions-completed', - this._onTransitionsCompleted.bind(this) - ); - - // Handle keyboard navigation - this._submenuCloseKeyId = this.sub.connect( - 'key-press-event', - this._onSubmenuCloseKey.bind(this) - ); - - // Refresh the menu when mapped - this._mappedId = this.actor.connect( - 'notify::mapped', - this._onMapped.bind(this) - ); - - // Watch the model for changes - this._itemsChangedId = this.model.connect( - 'items-changed', - this._onItemsChanged.bind(this) - ); - this._onItemsChanged(); - } - - _onMapped(actor) { - if (actor.mapped) { - this._onItemsChanged(); - - // We use this instead of close() to avoid touching finalized objects - } else { - this.box.set_opacity(255); - this.box.set_width(-1); - this.box.set_height(-1); - this.box.visible = true; - - this._submenu = null; - this.sub.set_opacity(0); - this.sub.set_width(0); - this.sub.set_height(0); - this.sub.visible = false; - this.sub.get_children().map(menu => menu.hide()); - } - } - - _onSubmenuCloseKey(actor, event) { - if (this.submenu && event.get_key_symbol() === Clutter.KEY_Left) { - this.submenu.submenu_for.setActive(true); - this.submenu = null; - return Clutter.EVENT_STOP; - } - - return Clutter.EVENT_PROPAGATE; - } - - _onSubmenuOpenKey(actor, event) { - const item = actor._delegate; - - if (item.submenu && event.get_key_symbol() === Clutter.KEY_Right) { - this.submenu = item.submenu; - item.submenu.firstMenuItem.setActive(true); - } - - return Clutter.EVENT_PROPAGATE; - } - - _onGMenuItemActivate(item, event) { - this.emit('activate', item); - - if (item.submenu) { - this.submenu = item.submenu; - } else if (item.action_name) { - this.action_group.activate_action( - item.action_name, - item.action_target - ); - this.itemActivated(); - } - } - - _addGMenuItem(info) { - const item = new PopupMenu.PopupMenuItem(info.label); - this.addMenuItem(item); - - if (info.action !== undefined) { - item.action_name = info.action.split('.')[1]; - item.action_target = info.target; - - item.actor.visible = this.action_group.get_action_enabled( - item.action_name - ); - } - - item.connectObject( - 'activate', - this._onGMenuItemActivate.bind(this), - this - ); - - return item; - } - - _addGMenuSection(model) { - const section = new ListBox({ - model: model, - action_group: this.action_group, - }); - this.addMenuItem(section); - } - - _addGMenuSubmenu(model, item) { - // Add an expander arrow to the item - const arrow = PopupMenu.arrowIcon(St.Side.RIGHT); - arrow.x_align = Clutter.ActorAlign.END; - arrow.x_expand = true; - item.actor.add_child(arrow); - - // Mark it as an expandable and open on right-arrow - item.actor.add_accessible_state(Atk.StateType.EXPANDABLE); - - item.actor.connect( - 'key-press-event', - this._onSubmenuOpenKey.bind(this) - ); - - // Create the submenu - item.submenu = new ListBox({ - model: model, - action_group: this.action_group, - submenu_for: item, - _parent: this, - }); - item.submenu.actor.hide(); - - // Add to the submenu container - this.sub.add_child(item.submenu.actor); - } - - _onItemsChanged(model, position, removed, added) { - // Clear the menu - this.removeAll(); - this.sub.get_children().map(child => child.destroy()); - - for (let i = 0, len = this.model.get_n_items(); i < len; i++) { - const info = getItemInfo(this.model, i); - let item; - - // A regular item - if (info.hasOwnProperty('label')) - item = this._addGMenuItem(info); - - for (const link of info.links) { - // Submenu - if (link.name === 'submenu') { - this._addGMenuSubmenu(link.value, item); - - // Section - } else if (link.name === 'section') { - this._addGMenuSection(link.value); - - // len is length starting at 1 - if (i + 1 < len) - this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - } - } - } - - // If this is a submenu of another item... - if (this.submenu_for) { - // Prepend an "<= Go Back" item, bold with a unicode arrow - const prev = new PopupMenu.PopupMenuItem(this.submenu_for.label.text); - prev.label.style = 'font-weight: bold;'; - const prevArrow = PopupMenu.arrowIcon(St.Side.LEFT); - prev.replace_child(prev._ornamentIcon, prevArrow); - this.addMenuItem(prev, 0); - - prev.connectObject('activate', (item, event) => { - this.emit('activate', item); - this._parent.submenu = null; - }, this); - } - } - - _onTransitionsCompleted(actor) { - if (this.submenu) { - this.box.visible = false; - } else { - this.sub.visible = false; - this.sub.get_children().map(menu => menu.hide()); - } - } - - get submenu() { - return this._submenu || null; - } - - set submenu(submenu) { - // Get the current allocation to hold the menu width - const allocation = this.actor.allocation; - const width = Math.max(0, allocation.x2 - allocation.x1); - - // Prepare the appropriate child for tweening - if (submenu) { - this.sub.set_opacity(0); - this.sub.set_width(0); - this.sub.set_height(0); - this.sub.visible = true; - } else { - this.box.set_opacity(0); - this.box.set_width(0); - this.sub.set_height(0); - this.box.visible = true; - } - - // Setup the animation - this.box.save_easing_state(); - this.box.set_easing_mode(Clutter.AnimationMode.EASE_IN_OUT_CUBIC); - this.box.set_easing_duration(250); - - this.sub.save_easing_state(); - this.sub.set_easing_mode(Clutter.AnimationMode.EASE_IN_OUT_CUBIC); - this.sub.set_easing_duration(250); - - if (submenu) { - submenu.actor.show(); - - this.sub.set_opacity(255); - this.sub.set_width(width); - this.sub.set_height(-1); - - this.box.set_opacity(0); - this.box.set_width(0); - this.box.set_height(0); - } else { - this.box.set_opacity(255); - this.box.set_width(width); - this.box.set_height(-1); - - this.sub.set_opacity(0); - this.sub.set_width(0); - this.sub.set_height(0); - } - - // Reset the animation - this.box.restore_easing_state(); - this.sub.restore_easing_state(); - - // - this._submenu = submenu; - } - - destroy() { - this.actor.disconnect(this._mappedId); - this.box.disconnect(this._boxTransitionsCompletedId); - this.sub.disconnect(this._subTransitionsCompletedId); - this.sub.disconnect(this._submenuCloseKeyId); - this.model.disconnect(this._itemsChangedId); - - super.destroy(); - } -} - - -/** - * A St.Button subclass for iconic GMenu items - */ -export const IconButton = GObject.registerClass({ - GTypeName: 'GSConnectShellIconButton', -}, class Button extends St.Button { - - _init(params) { - super._init({ - style_class: 'gsconnect-icon-button', - can_focus: true, - }); - Object.assign(this, params); - - // Item attributes - if (params.info.hasOwnProperty('action')) - this.action_name = params.info.action.split('.')[1]; - - if (params.info.hasOwnProperty('target')) - this.action_target = params.info.target; - - if (params.info.hasOwnProperty('label')) { - this.tooltip = new Tooltip({ - parent: this, - markup: params.info.label, - }); - - this.accessible_name = params.info.label; - } - - if (params.info.hasOwnProperty('icon')) - this.child = new St.Icon({gicon: params.info.icon}); - - // Submenu - for (const link of params.info.links) { - if (link.name === 'submenu') { - this.add_accessible_state(Atk.StateType.EXPANDABLE); - this.toggle_mode = true; - this.connect('notify::checked', this._onChecked); - - this.submenu = new ListBox({ - model: link.value, - action_group: this.action_group, - _parent: this._parent, - }); - - this.submenu.actor.style_class = 'popup-sub-menu'; - this.submenu.actor.visible = false; - } - } - } - - // This is (reliably?) emitted before ::clicked - _onChecked(button) { - if (button.checked) { - button.add_accessible_state(Atk.StateType.EXPANDED); - button.add_style_pseudo_class('active'); - } else { - button.remove_accessible_state(Atk.StateType.EXPANDED); - button.remove_style_pseudo_class('active'); - } - } - - // This is (reliably?) emitted after notify::checked - vfunc_clicked(clicked_button) { - // Unless this has a submenu, activate the action and close the menu - if (!this.toggle_mode) { - this._parent._getTopMenu().close(); - - this.action_group.activate_action( - this.action_name, - this.action_target - ); - - // StButton.checked has already been toggled so we're opening - } else if (this.checked) { - this._parent.submenu = this.submenu; - - // If this is the active submenu being closed, animate-close it - } else if (this._parent.submenu === this.submenu) { - this._parent.submenu = null; - } - } -}); - - -export class IconBox extends PopupMenu.PopupMenuSection { - - constructor(params) { - super(); - Object.assign(this, params); - - // Main Actor - this.actor = new St.BoxLayout({ - vertical: true, - x_expand: true, - }); - this.actor._delegate = this; - - // Button Box - this.box._delegate = this; - this.box.style_class = 'gsconnect-icon-box'; - this.box.vertical = false; - this.actor.add_child(this.box); - - // Submenu Container - this.sub = new St.BoxLayout({ - clip_to_allocation: true, - vertical: true, - x_expand: true, - }); - this.sub.connect('transitions-completed', this._onTransitionsCompleted); - this.sub._delegate = this; - this.actor.add_child(this.sub); - - // Track menu items so we can use ::items-changed - this._menu_items = new Map(); - - // PopupMenu - this._mappedId = this.actor.connect( - 'notify::mapped', - this._onMapped.bind(this) - ); - - // GMenu - this._itemsChangedId = this.model.connect( - 'items-changed', - this._onItemsChanged.bind(this) - ); - - // GActions - this._actionAddedId = this.action_group.connect( - 'action-added', - this._onActionChanged.bind(this) - ); - this._actionEnabledChangedId = this.action_group.connect( - 'action-enabled-changed', - this._onActionChanged.bind(this) - ); - this._actionRemovedId = this.action_group.connect( - 'action-removed', - this._onActionChanged.bind(this) - ); - } - - destroy() { - this.actor.disconnect(this._mappedId); - this.model.disconnect(this._itemsChangedId); - this.action_group.disconnect(this._actionAddedId); - this.action_group.disconnect(this._actionEnabledChangedId); - this.action_group.disconnect(this._actionRemovedId); - - super.destroy(); - } - - get submenu() { - return this._submenu || null; - } - - set submenu(submenu) { - if (submenu) { - for (const button of this.box.get_children()) { - if (button.submenu && this._submenu && button.submenu !== submenu) { - button.checked = false; - button.submenu.actor.hide(); - } - } - - this.sub.set_height(0); - submenu.actor.show(); - } - - this.sub.save_easing_state(); - this.sub.set_easing_duration(250); - this.sub.set_easing_mode(Clutter.AnimationMode.EASE_IN_OUT_CUBIC); - - this.sub.set_height(submenu ? submenu.actor.get_preferred_size()[1] : 0); - this.sub.restore_easing_state(); - - this._submenu = submenu; - } - - _onMapped(actor) { - if (!actor.mapped) { - this._submenu = null; - - for (const button of this.box.get_children()) - button.checked = false; - - for (const submenu of this.sub.get_children()) - submenu.hide(); - } - } - - _onActionChanged(group, name, enabled) { - const menuItem = this._menu_items.get(name); - - if (menuItem !== undefined) - menuItem.visible = group.get_action_enabled(name); - } - - _onItemsChanged(model, position, removed, added) { - // Remove items - while (removed > 0) { - const button = this.box.get_child_at_index(position); - const action_name = button.action_name; - - if (button.submenu) - button.submenu.destroy(); - - button.destroy(); - - this._menu_items.delete(action_name); - removed--; - } - - // Add items - for (let i = 0; i < added; i++) { - const index = position + i; - - // Create an iconic button - const button = new IconButton({ - action_group: this.action_group, - info: getItemInfo(model, index), - // NOTE: Because this doesn't derive from a PopupMenu class - // it lacks some things its parent will expect from it - _parent: this, - _delegate: null, - }); - - // Set the visibility based on the enabled state - if (button.action_name !== undefined) { - button.visible = this.action_group.get_action_enabled( - button.action_name - ); - } - - // If it has a submenu, add it as a sibling - if (button.submenu) - this.sub.add_child(button.submenu.actor); - - // Track the item if it has an action - if (button.action_name !== undefined) - this._menu_items.set(button.action_name, button); - - // Insert it in the box at the defined position - this.box.insert_child_at_index(button, index); - } - } - - _onTransitionsCompleted(actor) { - const menu = actor._delegate; - - for (const button of menu.box.get_children()) { - if (button.submenu && button.submenu !== menu.submenu) { - button.checked = false; - button.submenu.actor.hide(); - } - } - - menu.sub.set_height(-1); - } - - // PopupMenu.PopupMenuBase overrides - isEmpty() { - return (this.box.get_children().length === 0); - } - - _setParent(parent) { - super._setParent(parent); - this._onItemsChanged(this.model, 0, 0, this.model.get_n_items()); - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/input.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/input.js deleted file mode 100644 index b2ef07e2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/input.js +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; - -import Config from '../config.js'; - -export class LockscreenRemoteAccess { - - constructor() { - this._inhibitor = null; - this._settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect', - null - ), - path: '/org/gnome/shell/extensions/gsconnect/', - }); - } - - patchInhibitor() { - if (this._inhibitor) - return; - - if (this._settings.get_boolean('keep-alive-when-locked')) { - this._inhibitor = global.backend.get_remote_access_controller().inhibit_remote_access; - global.backend.get_remote_access_controller().inhibit_remote_access = () => {}; - } - } - - unpatchInhibitor() { - if (!this._inhibitor) - return; - global.backend.get_remote_access_controller().inhibit_remote_access = this._inhibitor; - this._inhibitor = null; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/keybindings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/keybindings.js deleted file mode 100644 index 442fa0df..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/keybindings.js +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; - - -/** - * Keybindings.Manager is a simple convenience class for managing keyboard - * shortcuts in GNOME Shell. You bind a shortcut using add(), which on success - * will return a non-zero action id that can later be used with remove() to - * unbind the shortcut. - * - * Accelerators are accepted in the form returned by Gtk.accelerator_name() and - * callbacks are invoked directly, so should be complete closures. - * - * References: - * https://developer.gnome.org/gtk3/stable/gtk3-Keyboard-Accelerators.html - * https://developer.gnome.org/meta/stable/MetaDisplay.html - * https://developer.gnome.org/meta/stable/meta-MetaKeybinding.html - * https://gitlab.gnome.org/GNOME/gnome-shell/blob/master/js/ui/windowManager.js#L1093-1112 - */ -export class Manager { - - constructor() { - this._keybindings = new Map(); - - this._acceleratorActivatedId = global.display.connect( - 'accelerator-activated', - this._onAcceleratorActivated.bind(this) - ); - } - - _onAcceleratorActivated(display, action, inputDevice, timestamp) { - try { - const binding = this._keybindings.get(action); - - if (binding !== undefined) - binding.callback(); - } catch (e) { - logError(e); - } - } - - /** - * Add a keybinding with callback - * - * @param {string} accelerator - An accelerator in the form '<Control>q' - * @param {Function} callback - A callback for the accelerator - * @return {number} A non-zero action id on success, or 0 on failure - */ - add(accelerator, callback) { - try { - const action = global.display.grab_accelerator(accelerator, 0); - - if (action === Meta.KeyBindingAction.NONE) - throw new Error(`Failed to add keybinding: '${accelerator}'`); - - const name = Meta.external_binding_name_for_action(action); - Main.wm.allowKeybinding(name, Shell.ActionMode.ALL); - this._keybindings.set(action, {name: name, callback: callback}); - - return action; - } catch (e) { - logError(e); - } - } - - /** - * Remove a keybinding - * - * @param {number} action - A non-zero action id returned by add() - */ - remove(action) { - try { - const binding = this._keybindings.get(action); - global.display.ungrab_accelerator(action); - Main.wm.allowKeybinding(binding.name, Shell.ActionMode.NONE); - this._keybindings.delete(action); - } catch (e) { - logError(new Error(`Failed to remove keybinding: ${e.message}`)); - } - } - - /** - * Remove all keybindings - */ - removeAll() { - for (const action of this._keybindings.keys()) - this.remove(action); - } - - /** - * Destroy the keybinding manager and remove all keybindings - */ - destroy() { - global.display.disconnect(this._acceleratorActivatedId); - this.removeAll(); - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/notification.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/notification.js deleted file mode 100644 index 78b7f54b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/notification.js +++ /dev/null @@ -1,453 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; -import * as Calendar from 'resource:///org/gnome/shell/ui/calendar.js'; -import * as NotificationDaemon from 'resource:///org/gnome/shell/ui/notificationDaemon.js'; - -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; -import {getIcon} from './utils.js'; - -const APP_ID = 'org.gnome.Shell.Extensions.GSConnect'; -const APP_PATH = '/org/gnome/Shell/Extensions/GSConnect'; - - -// deviceId Pattern (<device-id>|<remote-id>) -const DEVICE_REGEX = new RegExp(/^([^|]+)\|([\s\S]+)$/); - -// requestReplyId Pattern (<device-id>|<remote-id>)|<reply-id>) -const REPLY_REGEX = new RegExp(/^([^|]+)\|([\s\S]+)\|([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/, 'i'); - - -/** - * Extracted from notificationDaemon.js, as it's no longer exported - * https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/notificationDaemon.js#L556 - * @returns {{ 'desktop-startup-id': string }} Object with ID containing current time - */ -function getPlatformData() { - const startupId = GLib.Variant.new('s', `_TIME${global.get_current_time()}`); - return {'desktop-startup-id': startupId}; -} - -// This is no longer directly exported, so we do this instead for now -const GtkNotificationDaemon = Main.notificationDaemon._gtkNotificationDaemon.constructor; - - -/** - * A slightly modified Notification Banner with an entry field - */ -const NotificationBanner = GObject.registerClass({ - GTypeName: 'GSConnectNotificationBanner', -}, class NotificationBanner extends Calendar.NotificationMessage { - - constructor(notification) { - super(notification); - if (notification.requestReplyId !== undefined) - this._addReplyAction(); - } - - _addReplyAction() { - if (!this._buttonBox) { - this._buttonBox = new St.BoxLayout({ - style_class: 'notification-buttons-bin', - x_expand: true, - }); - this.setActionArea(this._buttonBox); - global.focus_manager.add_group(this._buttonBox); - } - - // Reply Button - const button = new St.Button({ - style_class: 'notification-button', - label: _('Reply'), - x_expand: true, - can_focus: true, - }); - - button.connect( - 'clicked', - this._onEntryRequested.bind(this) - ); - - this._buttonBox.add_child(button); - - // Reply Entry - this._replyEntry = new St.Entry({ - can_focus: true, - hint_text: _('Type a message'), - style_class: 'chat-response', - x_expand: true, - visible: false, - }); - - this._buttonBox.add_child(this._replyEntry); - } - - _onEntryRequested(button) { - this.focused = true; - - for (const child of this._buttonBox.get_children()) - child.visible = (child === this._replyEntry); - - // Release the notification focus with the entry focus - this._replyEntry.connect( - 'key-focus-out', - this._onEntryDismissed.bind(this) - ); - - this._replyEntry.clutter_text.connect( - 'activate', - this._onEntryActivated.bind(this) - ); - - this._replyEntry.grab_key_focus(); - } - - _onEntryDismissed(entry) { - this.focused = false; - this.emit('unfocused'); - } - - _onEntryActivated(clutter_text) { - // Refuse to send empty replies - if (clutter_text.text === '') - return; - - // Copy the text, then clear the entry - const text = clutter_text.text; - clutter_text.text = ''; - - const {deviceId, requestReplyId} = this.notification; - - const target = new GLib.Variant('(ssbv)', [ - deviceId, - 'replyNotification', - true, - new GLib.Variant('(ssa{ss})', [requestReplyId, text, {}]), - ]); - const platformData = getPlatformData(); - - Gio.DBus.session.call( - APP_ID, - APP_PATH, - 'org.freedesktop.Application', - 'ActivateAction', - GLib.Variant.new('(sava{sv})', ['device', [target], platformData]), - null, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - null, - (connection, res) => { - try { - connection.call_finish(res); - } catch (e) { - // Silence errors - } - } - ); - - this.close(); - } -}); - - -/** - * A custom notification source for spawning notifications and closing device - * notifications. This source isn't actually used, but it's methods are patched - * into existing sources. - */ -const Source = GObject.registerClass({ - GTypeName: 'GSConnectNotificationSource', -}, class Source extends NotificationDaemon.GtkNotificationDaemonAppSource { - - _closeGSConnectNotification(notification, reason) { - if (reason !== MessageTray.NotificationDestroyedReason.DISMISSED) - return; - - // Avoid sending the request multiple times - if (notification._remoteClosed || notification.remoteId === undefined) - return; - - notification._remoteClosed = true; - - const target = new GLib.Variant('(ssbv)', [ - notification.deviceId, - 'closeNotification', - true, - new GLib.Variant('s', notification.remoteId), - ]); - const platformData = getPlatformData(); - - Gio.DBus.session.call( - APP_ID, - APP_PATH, - 'org.freedesktop.Application', - 'ActivateAction', - GLib.Variant.new('(sava{sv})', ['device', [target], platformData]), - null, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - null, - (connection, res) => { - try { - connection.call_finish(res); - } catch (e) { - // If we fail, reset in case we can try again - notification._remoteClosed = false; - } - } - ); - } - - /* - * Parse the id to determine if it's a repliable notification, device - * notification or a regular local notification - */ - _parseNotificationId(notificationId) { - let idMatch, deviceId, requestReplyId, remoteId, localId; - - if ((idMatch = REPLY_REGEX.exec(notificationId))) { - [, deviceId, remoteId, requestReplyId] = idMatch; - localId = `${deviceId}|${remoteId}`; - - } else if ((idMatch = DEVICE_REGEX.exec(notificationId))) { - [, deviceId, remoteId] = idMatch; - localId = `${deviceId}|${remoteId}`; - - } else { - localId = notificationId; - } - return [idMatch, deviceId, requestReplyId, remoteId, localId]; - } - - /* - * Add notification to source or update existing notification with extra - * GsConnect information - */ - _createNotification(notification) { - const [idMatch, deviceId, requestReplyId, remoteId, localId] = this._parseNotificationId(notification.id); - const cachedNotification = this._notifications[localId]; - - // Check if this is a repeat - if (cachedNotification) { - cachedNotification.requestReplyId = requestReplyId; - - // Bail early If @notificationParams represents an exact repeat - const title = notification.title; - const body = notification.body - ? notification.body - : null; - - if (cachedNotification.title === title && - cachedNotification.body === body) - return cachedNotification; - - cachedNotification.title = title; - cachedNotification.body = body; - - return cachedNotification; - } - - // Device Notification - if (idMatch) { - notification.deviceId = deviceId; - notification.remoteId = remoteId; - notification.requestReplyId = requestReplyId; - - notification.connect('destroy', (notification, reason) => { - this._closeGSConnectNotification(notification, reason); - delete this._notifications[localId]; - }); - - // Service Notification - } else { - notification.connect('destroy', (notification, reason) => { - delete this._notifications[localId]; - }); - } - - this._notifications[localId] = notification; - return notification; - } - - /* - * Override to control notification spawning - */ - addNotification(notification) { - this._notificationPending = true; - - // Fix themed icons - if (notification.icon) { - let gicon = notification.icon; - - if (gicon instanceof Gio.ThemedIcon) { - gicon = getIcon(gicon.names[0]); - notification.icon = gicon.serialize(); - } - } - - const createdNotification = this._createNotification(notification); - this._addNotificationToMessageTray(createdNotification); - - this._notificationPending = false; - } - - /* - * Reimplementation of MessageTray.addNotification to raise the usual - * notification limit (3) - */ - _addNotificationToMessageTray(notification) { - if (this.notifications.includes(notification)) { - notification.acknowledged = false; - return; - } - - while (this.notifications.length >= 10) { - const [oldest] = this.notifications; - oldest.destroy(MessageTray.NotificationDestroyedReason.EXPIRED); - } - - notification.connect('destroy', this._onNotificationDestroy.bind(this)); - notification.connect('notify::acknowledged', () => { - this.countUpdated(); - - // If acknowledged was set to false try to show the notification again - if (!notification.acknowledged) - this.emit('notification-request-banner', notification); - }); - this.notifications.push(notification); - - this.emit('notification-added', notification); - this.emit('notification-request-banner', notification); - } - - createBanner(notification) { - return new NotificationBanner(notification); - } -}); - - -/** - * If there is an active GtkNotificationDaemonAppSource for GSConnect when the - * extension is loaded, it has to be patched in place. - */ -export function patchGSConnectNotificationSource() { - const source = Main.notificationDaemon._gtkNotificationDaemon._sources[APP_ID]; - - if (source !== undefined) { - // Patch in the subclassed methods - source._closeGSConnectNotification = Source.prototype._closeGSConnectNotification; - source._parseNotificationId = Source.prototype._parseNotificationId; - source._createNotification = Source.prototype._createNotification; - source.addNotification = Source.prototype.addNotification; - source._addNotificationToMessageTray = Source.prototype._addNotificationToMessageTray; - source.createBanner = Source.prototype.createBanner; - - // Connect to existing notifications - for (const notification of Object.values(source._notifications)) { - - const _id = notification.connect('destroy', (notification, reason) => { - source._closeGSConnectNotification(notification, reason); - notification.disconnect(_id); - }); - } - } -} - - -/** - * Wrap GtkNotificationDaemon._ensureAppSource() to patch GSConnect's app source - * https://gitlab.gnome.org/GNOME/gnome-shell/blob/master/js/ui/notificationDaemon.js#L742-755 - */ -const __ensureAppSource = GtkNotificationDaemon.prototype._ensureAppSource; - -// eslint-disable-next-line func-style -const _ensureAppSource = function (appId) { - const source = __ensureAppSource.call(this, appId); - - if (source._appId === APP_ID) { - source._closeGSConnectNotification = Source.prototype._closeGSConnectNotification; - source._parseNotificationId = Source.prototype._parseNotificationId; - source._createNotification = Source.prototype._createNotification; - source.addNotification = Source.prototype.addNotification; - source._addNotificationToMessageTray = Source.prototype._addNotificationToMessageTray; - source.createBanner = Source.prototype.createBanner; - } - - return source; -}; - - -export function patchGtkNotificationDaemon() { - GtkNotificationDaemon.prototype._ensureAppSource = _ensureAppSource; -} - - -export function unpatchGtkNotificationDaemon() { - GtkNotificationDaemon.prototype._ensureAppSource = __ensureAppSource; -} - -/** - * We patch other Gtk notification sources so we can notify remote devices when - * notifications have been closed locally. - */ -const _addNotification = NotificationDaemon.GtkNotificationDaemonAppSource.prototype.addNotification; - -export function patchGtkNotificationSources() { - // eslint-disable-next-line func-style - const _withdrawGSConnectNotification = function (id, notification, reason) { - if (reason !== MessageTray.NotificationDestroyedReason.DISMISSED) - return; - - // Avoid sending the request multiple times - if (notification._remoteWithdrawn) - return; - - notification._remoteWithdrawn = true; - - // Recreate the notification id as it would've been sent - const target = new GLib.Variant('(ssbv)', [ - '*', - 'withdrawNotification', - true, - new GLib.Variant('s', `gtk|${this._appId}|${id}`), - ]); - const platformData = getPlatformData(); - - Gio.DBus.session.call( - APP_ID, - APP_PATH, - 'org.freedesktop.Application', - 'ActivateAction', - GLib.Variant.new('(sava{sv})', ['device', [target], platformData]), - null, - Gio.DBusCallFlags.NO_AUTO_START, - -1, - null, - (connection, res) => { - try { - connection.call_finish(res); - } catch (e) { - // If we fail, reset in case we can try again - notification._remoteWithdrawn = false; - } - } - ); - }; - - NotificationDaemon.GtkNotificationDaemonAppSource.prototype._withdrawGSConnectNotification = _withdrawGSConnectNotification; -} - - -export function unpatchGtkNotificationSources() { - NotificationDaemon.GtkNotificationDaemonAppSource.prototype.addNotification = _addNotification; - delete NotificationDaemon.GtkNotificationDaemonAppSource.prototype._withdrawGSConnectNotification; -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/tooltip.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/tooltip.js deleted file mode 100644 index 2996ce8e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/tooltip.js +++ /dev/null @@ -1,309 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Pango from 'gi://Pango'; -import St from 'gi://St'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - - -/** - * An StTooltip for ClutterActors - * - * Adapted from: https://github.com/RaphaelRochet/applications-overview-tooltip - * See also: https://github.com/GNOME/gtk/blob/master/gtk/gtktooltip.c - */ -export let TOOLTIP_BROWSE_ID = 0; -export let TOOLTIP_BROWSE_MODE = false; - -export default class Tooltip { - - constructor(params) { - Object.assign(this, params); - - this._bin = null; - this._hoverTimeoutId = 0; - this._showing = false; - - this._destroyId = this.parent.connect( - 'destroy', - this.destroy.bind(this) - ); - - this._hoverId = this.parent.connect( - 'notify::hover', - this._onHover.bind(this) - ); - - this._buttonPressEventId = this.parent.connect( - 'button-press-event', - this._hide.bind(this) - ); - } - - get custom() { - if (this._custom === undefined) - this._custom = null; - - return this._custom; - } - - set custom(actor) { - this._custom = actor; - this._markup = null; - this._text = null; - - if (this._showing) - this._show(); - } - - get gicon() { - if (this._gicon === undefined) - this._gicon = null; - - return this._gicon; - } - - set gicon(gicon) { - this._gicon = gicon; - - if (this._showing) - this._show(); - } - - get icon() { - return (this.gicon) ? this.gicon.name : null; - } - - set icon(icon_name) { - if (!icon_name) - this.gicon = null; - else - this.gicon = new Gio.ThemedIcon({name: icon_name}); - } - - get markup() { - if (this._markup === undefined) - this._markup = null; - - return this._markup; - } - - set markup(text) { - this._markup = text; - this._text = null; - - if (this._showing) - this._show(); - } - - get text() { - if (this._text === undefined) - this._text = null; - - return this._text; - } - - set text(text) { - this._markup = null; - this._text = text; - - if (this._showing) - this._show(); - } - - get x_offset() { - if (this._x_offset === undefined) - this._x_offset = 0; - - return this._x_offset; - } - - set x_offset(offset) { - this._x_offset = (Number.isInteger(offset)) ? offset : 0; - } - - get y_offset() { - if (this._y_offset === undefined) - this._y_offset = 0; - - return this._y_offset; - } - - set y_offset(offset) { - this._y_offset = (Number.isInteger(offset)) ? offset : 0; - } - - _show() { - if (this.text === null && this.markup === null) - return this._hide(); - - if (this._bin === null) { - this._bin = new St.Bin({ - style_class: 'osd-window gsconnect-tooltip', - opacity: 232, - }); - - if (this.custom) { - this._bin.child = this.custom; - } else { - this._bin.child = new St.BoxLayout({vertical: false}); - - if (this.gicon) { - this._bin.child.icon = new St.Icon({ - gicon: this.gicon, - y_align: St.Align.START, - }); - this._bin.child.icon.set_y_align(Clutter.ActorAlign.START); - this._bin.child.add_child(this._bin.child.icon); - } - - this.label = new St.Label({text: this.markup || this.text}); - this.label.clutter_text.line_wrap = true; - this.label.clutter_text.line_wrap_mode = Pango.WrapMode.WORD; - this.label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; - this.label.clutter_text.use_markup = (this.markup); - this._bin.child.add_child(this.label); - } - - Main.layoutManager.uiGroup.add_child(this._bin); - Main.layoutManager.uiGroup.set_child_above_sibling(this._bin, null); - } else if (this.custom) { - this._bin.child = this.custom; - } else { - if (this._bin.child.icon) - this._bin.child.icon.destroy(); - - if (this.gicon) { - this._bin.child.icon = new St.Icon({gicon: this.gicon}); - this._bin.child.insert_child_at_index(this._bin.child.icon, 0); - } - - this.label.clutter_text.text = this.markup || this.text; - this.label.clutter_text.use_markup = (this.markup); - } - - // Position tooltip - let [x, y] = this.parent.get_transformed_position(); - x = (x + (this.parent.width / 2)) - Math.round(this._bin.width / 2); - - x += this.x_offset; - y += this.y_offset; - - // Show tooltip - if (this._showing) { - this._bin.ease({ - x: x, - y: y, - time: 0.15, - transition: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - } else { - this._bin.set_position(x, y); - this._bin.ease({ - opacity: 232, - time: 0.15, - transition: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - - this._showing = true; - } - - // Enable browse mode - TOOLTIP_BROWSE_MODE = true; - - if (TOOLTIP_BROWSE_ID) { - GLib.source_remove(TOOLTIP_BROWSE_ID); - TOOLTIP_BROWSE_ID = 0; - } - - if (this._hoverTimeoutId) { - GLib.source_remove(this._hoverTimeoutId); - this._hoverTimeoutId = 0; - } - } - - _hide() { - if (this._bin) { - this._bin.ease({ - opacity: 0, - time: 0.10, - transition: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => { - Main.layoutManager.uiGroup.remove_actor(this._bin); - - if (this.custom) - this._bin.remove_child(this.custom); - - this._bin.destroy(); - this._bin = null; - }, - }); - } - - TOOLTIP_BROWSE_ID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => { - TOOLTIP_BROWSE_MODE = false; - TOOLTIP_BROWSE_ID = 0; - return false; - }); - - if (this._hoverTimeoutId) { - GLib.source_remove(this._hoverTimeoutId); - this._hoverTimeoutId = 0; - } - - this._showing = false; - this._hoverTimeoutId = 0; - } - - _onHover() { - if (this.parent.hover) { - if (!this._hoverTimeoutId) { - if (this._showing) { - this._show(); - } else { - this._hoverTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - (TOOLTIP_BROWSE_MODE) ? 60 : 500, - () => { - this._show(); - this._hoverTimeoutId = 0; - return false; - } - ); - } - } - } else { - this._hide(); - } - } - - destroy() { - this.parent.disconnect(this._destroyId); - this.parent.disconnect(this._hoverId); - this.parent.disconnect(this._buttonPressEventId); - - if (this.custom) - this.custom.destroy(); - - if (this._bin) { - Main.layoutManager.uiGroup.remove_actor(this._bin); - this._bin.destroy(); - } - - if (TOOLTIP_BROWSE_ID) { - GLib.source_remove(TOOLTIP_BROWSE_ID); - TOOLTIP_BROWSE_ID = 0; - } - - if (this._hoverTimeoutId) { - GLib.source_remove(this._hoverTimeoutId); - this._hoverTimeoutId = 0; - } - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/utils.js deleted file mode 100644 index beea4624..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/utils.js +++ /dev/null @@ -1,283 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Gtk from 'gi://Gtk'; - -import Config from '../config.js'; - -let St = null; // St is not available for prefs.js importing this file. -try { - St = (await import('gi://St')).default; -} catch (e) { } - - -/** - * Get a themed icon, using fallbacks from GSConnect's GResource when necessary. - * - * @param {string} name - A themed icon name - * @return {Gio.Icon} A themed icon - */ -export function getIcon(name) { - if (getIcon._resource === undefined) { - // Setup the desktop icons - const settings = St.Settings.get(); - getIcon._desktop = new Gtk.IconTheme(); - getIcon._desktop.set_theme_name(settings.gtk_icon_theme); - settings.connect('notify::gtk-icon-theme', (settings_, key_) => { - getIcon._desktop.set_theme_name(settings_.gtk_icon_theme); - }); - - // Preload our fallbacks - const iconPath = 'resource://org/gnome/Shell/Extensions/GSConnect/icons'; - const iconNames = [ - 'org.gnome.Shell.Extensions.GSConnect', - 'org.gnome.Shell.Extensions.GSConnect-symbolic', - 'computer-symbolic', - 'laptop-symbolic', - 'smartphone-symbolic', - 'tablet-symbolic', - 'tv-symbolic', - 'phonelink-ring-symbolic', - 'sms-symbolic', - ]; - - getIcon._resource = {}; - - for (const iconName of iconNames) { - getIcon._resource[iconName] = new Gio.FileIcon({ - file: Gio.File.new_for_uri(`${iconPath}/${iconName}.svg`), - }); - } - } - - // Check the desktop icon theme - if (getIcon._desktop.has_icon(name)) - return new Gio.ThemedIcon({name: name}); - - // Check our GResource - if (getIcon._resource[name] !== undefined) - return getIcon._resource[name]; - - // Fallback to hoping it's in the theme somewhere - return new Gio.ThemedIcon({name: name}); -} - - -/** - * Get the contents of a GResource file, replacing `@PACKAGE_DATADIR@` where - * necessary. - * - * @param {string} relativePath - A path relative to GSConnect's resource path - * @return {string} The file contents as a string - */ -function getResource(relativePath) { - try { - const bytes = Gio.resources_lookup_data( - GLib.build_filenamev([Config.APP_PATH, relativePath]), - Gio.ResourceLookupFlags.NONE - ); - - const source = new TextDecoder().decode(bytes.toArray()); - - return source.replace('@PACKAGE_DATADIR@', Config.PACKAGE_DATADIR); - } catch (e) { - logError(e, 'GSConnect'); - return null; - } -} - - -/** - * Install file contents, to an absolute directory path. - * - * @param {string} dirname - An absolute directory path - * @param {string} basename - The file name - * @param {string} contents - The file contents - * @return {boolean} A success boolean - */ -function _installFile(dirname, basename, contents) { - try { - const filename = GLib.build_filenamev([dirname, basename]); - GLib.mkdir_with_parents(dirname, 0o755); - - return GLib.file_set_contents(filename, contents); - } catch (e) { - logError(e, 'GSConnect'); - return false; - } -} - -/** - * Install file contents from a GResource, to an absolute directory path. - * - * @param {string} dirname - An absolute directory path - * @param {string} basename - The file name - * @param {string} relativePath - A path relative to GSConnect's resource path - * @return {boolean} A success boolean - */ -function _installResource(dirname, basename, relativePath) { - try { - const contents = getResource(relativePath); - - return _installFile(dirname, basename, contents); - } catch (e) { - logError(e, 'GSConnect'); - return false; - } -} - -/** - * Use Gio.File to ensure a file's executable bits are set. - * - * @param {string} filepath - An absolute path to a file - * @returns {boolean} - True if the file already was, or is now, executable - */ -function _setExecutable(filepath) { - try { - const file = Gio.File.new_for_path(filepath); - const finfo = file.query_info( - `${Gio.FILE_ATTRIBUTE_STANDARD_TYPE},${Gio.FILE_ATTRIBUTE_UNIX_MODE}`, - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, - null); - - if (!finfo.has_attribute(Gio.FILE_ATTRIBUTE_UNIX_MODE)) - return false; - - const mode = finfo.get_attribute_uint32( - Gio.FILE_ATTRIBUTE_UNIX_MODE); - const new_mode = (mode | 0o111); - if (mode === new_mode) - return true; - - return file.set_attribute_uint32( - Gio.FILE_ATTRIBUTE_UNIX_MODE, - new_mode, - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, - null); - } catch (e) { - logError(e, 'GSConnect'); - return false; - } -} - -/** - * Ensure critical files in the extension directory have the - * correct permissions. - */ -export function ensurePermissions() { - if (Config.IS_USER) { - const executableFiles = [ - 'gsconnect-preferences', - 'service/daemon.js', - 'service/nativeMessagingHost.js', - ]; - for (const file of executableFiles) - _setExecutable(GLib.build_filenamev([Config.PACKAGE_DATADIR, file])); - } -} - -/** - * Install the files necessary for the GSConnect service to run. - */ -export function installService() { - const settings = new Gio.Settings({ - settings_schema: Config.GSCHEMA.lookup( - 'org.gnome.Shell.Extensions.GSConnect', - null - ), - path: '/org/gnome/shell/extensions/gsconnect/', - }); - - const confDir = GLib.get_user_config_dir(); - const dataDir = GLib.get_user_data_dir(); - const homeDir = GLib.get_home_dir(); - - // DBus Service - const dbusDir = GLib.build_filenamev([dataDir, 'dbus-1', 'services']); - const dbusFile = `${Config.APP_ID}.service`; - - // Desktop Entry - const appDir = GLib.build_filenamev([dataDir, 'applications']); - const appFile = `${Config.APP_ID}.desktop`; - const appPrefsFile = `${Config.APP_ID}.Preferences.desktop`; - - // Application Icon - const iconDir = GLib.build_filenamev([dataDir, 'icons', 'hicolor', 'scalable', 'apps']); - const iconFull = `${Config.APP_ID}.svg`; - const iconSym = `${Config.APP_ID}-symbolic.svg`; - - // File Manager Extensions - const fileManagers = [ - [`${dataDir}/nautilus-python/extensions`, 'nautilus-gsconnect.py'], - [`${dataDir}/nemo-python/extensions`, 'nemo-gsconnect.py'], - ]; - - // WebExtension Manifests - const manifestFile = 'org.gnome.shell.extensions.gsconnect.json'; - const google = getResource(`webextension/${manifestFile}.google.in`); - const mozilla = getResource(`webextension/${manifestFile}.mozilla.in`); - const manifests = [ - [`${confDir}/chromium/NativeMessagingHosts/`, google], - [`${confDir}/google-chrome/NativeMessagingHosts/`, google], - [`${confDir}/google-chrome-beta/NativeMessagingHosts/`, google], - [`${confDir}/google-chrome-unstable/NativeMessagingHosts/`, google], - [`${confDir}/BraveSoftware/Brave-Browser/NativeMessagingHosts/`, google], - [`${confDir}/BraveSoftware/Brave-Browser-Beta/NativeMessagingHosts/`, google], - [`${confDir}/BraveSoftware/Brave-Browser-Nightly/NativeMessagingHosts/`, google], - [`${homeDir}/.mozilla/native-messaging-hosts/`, mozilla], - [`${homeDir}/.config/microsoft-edge-dev/NativeMessagingHosts`, google], - [`${homeDir}/.config/microsoft-edge-beta/NativeMessagingHosts`, google], - ]; - - // If running as a user extension, ensure the DBus service, desktop entry, - // file manager scripts, and WebExtension manifests are installed. - if (Config.IS_USER) { - // DBus Service - if (!_installResource(dbusDir, dbusFile, `${dbusFile}.in`)) - throw Error('GSConnect: Failed to install DBus Service'); - - // Desktop Entries - _installResource(appDir, appFile, appFile); - _installResource(appDir, appPrefsFile, appPrefsFile); - - // Application Icon - _installResource(iconDir, iconFull, `icons/${iconFull}`); - _installResource(iconDir, iconSym, `icons/${iconSym}`); - - // File Manager Extensions - const target = `${Config.PACKAGE_DATADIR}/nautilus-gsconnect.py`; - - for (const [dir, name] of fileManagers) { - const script = Gio.File.new_for_path(GLib.build_filenamev([dir, name])); - - if (!script.query_exists(null)) { - GLib.mkdir_with_parents(dir, 0o755); - script.make_symbolic_link(target, null); - } - } - - // WebExtension Manifests - if (settings.get_boolean('create-native-messaging-hosts')) { - for (const [dirname, contents] of manifests) - _installFile(dirname, manifestFile, contents); - } - - // Otherwise, if running as a system extension, ensure anything previously - // installed when running as a user extension is removed. - } else { - GLib.unlink(GLib.build_filenamev([dbusDir, dbusFile])); - GLib.unlink(GLib.build_filenamev([appDir, appFile])); - GLib.unlink(GLib.build_filenamev([appDir, appPrefsFile])); - GLib.unlink(GLib.build_filenamev([iconDir, iconFull])); - GLib.unlink(GLib.build_filenamev([iconDir, iconSym])); - - for (const [dir, name] of fileManagers) - GLib.unlink(GLib.build_filenamev([dir, name])); - - for (const manifest of manifests) - GLib.unlink(GLib.build_filenamev([manifest[0], manifestFile])); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/stylesheet.css deleted file mode 100644 index ea455d0e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/stylesheet.css +++ /dev/null @@ -1,127 +0,0 @@ -/* - * SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -/* Device Menu - -PopupMenu.PopupMenuSection.gsconnect-device-section - PopupMenu.PopupMenuSection.gsconnect-device-menu - PopupMenu.PopupSeparatorMenuItem - StLabel.gsconnect-device-name - StBoxLayout.gsconnect-device-battery - PopupMenu.PopupMenuSection - StBoxLayout.gsconnect-list-box - StBoxLayout (Submenu Container) -*/ -.gsconnect-device-section { -} - -/* Title Bar */ -.gsconnect-device-name { - font-weight: bold; -} - -.gsconnect-device-menu .popup-separator-menu-item { - margin-left: 0; - margin-right: 0; -} - -/* Battery Widget */ -.gsconnect-device-battery { - spacing: 3px; -} - -.gsconnect-device-battery StLabel { - font-size: 0.75em; -} - -.gsconnect-device-battery StIcon { - icon-size: 16px; -} - -/* Signal Strength Widget */ -.gsconnect-device-signal-strength { - spacing: 3px; -} - -.gsconnect-device-signal-strength StLabel { - font-size: 0.75em; -} - -.gsconnect-device-signal-strength StIcon { - icon-size: 16px; -} - -/* List Box */ -.gsconnect-list-box { -} - - -/* Device Panel Indicator - -PanelMenu.Button.gsconnect-device-indicator - PopupMenu.PopupMenu - PopupMenu.PopupMenuSection.gsconnect-device-menu - PopupMenu.PopupSeparatorMenuItem - StLabel.gsconnect-device-name - StBoxLayout.gsconnect-device-battery - PopupMenu.PopupMenuSection - StBoxLayout.gsconnect-icon-box - StBoxLayout (Submenu Container) - */ -.gsconnect-device-indicator { - -st-icon-style: symbolic; -} - -/* Icon Box */ -.gsconnect-icon-box { - margin: 0em 2em 0.5em; - spacing: 6px; -} - -.gsconnect-icon-button { - border-radius: 1em; - padding: 0.5em; -} - -.gsconnect-icon-button:hover, .gsconnect-icon-button:focus { - background-color: rgba(255, 255, 255, 0.125); -} - -.gsconnect-icon-button StIcon { - icon-size: 1em; -} - - -/* Tooltip - -StBin.gsconnect-tooltip (inherits from .osd-window) - StBoxLayout || [ Custom ClutterActor ] - StIcon - StLabel -*/ -.gsconnect-tooltip { - border-radius: 3px; - min-width: 0; - min-height: 0; - padding: 6px; -} - -.gsconnect-tooltip > StBoxLayout { - spacing: 6px; -} - -.gsconnect-tooltip StIcon { - icon-size: 16px; -} - -.gsconnect-tooltip StLabel { - font-weight: normal; - text-align: left; -} - -.gsconnect-tooltip StLabel:rtl { - text-align: right; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/remote.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/remote.js deleted file mode 100644 index 44760cd2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/remote.js +++ /dev/null @@ -1,516 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -const SERVICE_NAME = 'org.gnome.Shell.Extensions.GSConnect'; -const SERVICE_PATH = '/org/gnome/Shell/Extensions/GSConnect'; -const DEVICE_NAME = 'org.gnome.Shell.Extensions.GSConnect.Device'; - - -const _PROPERTIES = { - 'Connected': 'connected', - 'EncryptionInfo': 'encryption-info', - 'IconName': 'icon-name', - 'Id': 'id', - 'Name': 'name', - 'Paired': 'paired', - 'Type': 'type', -}; - - -function _proxyInit(proxy, cancellable = null) { - if (proxy.__initialized !== undefined) - return Promise.resolve(); - - return new Promise((resolve, reject) => { - proxy.init_async( - GLib.PRIORITY_DEFAULT, - cancellable, - (proxy, res) => { - try { - proxy.init_finish(res); - proxy.__initialized = true; - resolve(); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - reject(e); - } - } - ); - }); -} - - -/** - * A simple proxy wrapper for devices exported over DBus. - */ -export const Device = GObject.registerClass({ - GTypeName: 'GSConnectRemoteDevice', - Implements: [Gio.DBusInterface], - Properties: { - 'connected': GObject.ParamSpec.boolean( - 'connected', - 'Connected', - 'Whether the device is connected', - GObject.ParamFlags.READABLE, - null - ), - 'encryption-info': GObject.ParamSpec.string( - 'encryption-info', - 'Encryption Info', - 'A formatted string with the local and remote fingerprints', - GObject.ParamFlags.READABLE, - null - ), - 'icon-name': GObject.ParamSpec.string( - 'icon-name', - 'Icon Name', - 'Icon name representing the device', - GObject.ParamFlags.READABLE, - null - ), - 'id': GObject.ParamSpec.string( - 'id', - 'deviceId', - 'The device hostname or other unique id', - GObject.ParamFlags.READABLE, - '' - ), - 'name': GObject.ParamSpec.string( - 'name', - 'deviceName', - 'The device name', - GObject.ParamFlags.READABLE, - null - ), - 'paired': GObject.ParamSpec.boolean( - 'paired', - 'Paired', - 'Whether the device is paired', - GObject.ParamFlags.READABLE, - null - ), - 'type': GObject.ParamSpec.string( - 'type', - 'deviceType', - 'The device type', - GObject.ParamFlags.READABLE, - null - ), - }, -}, class Device extends Gio.DBusProxy { - - _init(service, object_path) { - this._service = service; - - super._init({ - g_connection: service.g_connection, - g_name: SERVICE_NAME, - g_object_path: object_path, - g_interface_name: DEVICE_NAME, - }); - } - - vfunc_g_properties_changed(changed, invalidated) { - try { - for (const name in changed.deepUnpack()) - this.notify(_PROPERTIES[name]); - } catch (e) { - logError(e); - } - } - - _get(name, fallback = null) { - try { - return this.get_cached_property(name).unpack(); - } catch (e) { - return fallback; - } - } - - get connected() { - return this._get('Connected', false); - } - - get encryption_info() { - return this._get('EncryptionInfo', ''); - } - - get icon_name() { - return this._get('IconName', 'computer'); - } - - get id() { - return this._get('Id', '0'); - } - - get name() { - return this._get('Name', 'Unknown'); - } - - get paired() { - return this._get('Paired', false); - } - - get service() { - return this._service; - } - - get type() { - return this._get('Type', 'desktop'); - } - - async start() { - try { - await _proxyInit(this); - - // For GActions & GMenu we pass the service's name owner to avoid - // any mixup with instances. - this.action_group = Gio.DBusActionGroup.get( - this.g_connection, - this.service.g_name_owner, - this.g_object_path - ); - - this.menu = Gio.DBusMenuModel.get( - this.g_connection, - this.service.g_name_owner, - this.g_object_path - ); - - // Poke the GMenu to ensure it's ready for us - await new Promise((resolve, reject) => { - this.g_connection.call( - SERVICE_NAME, - this.g_object_path, - 'org.gtk.Menus', - 'Start', - new GLib.Variant('(au)', [[0]]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (proxy, res) => { - try { - resolve(proxy.call_finish(res)); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - reject(e); - } - } - ); - }); - } catch (e) { - this.destroy(); - throw e; - } - } - - destroy() { - GObject.signal_handlers_destroy(this); - } -}); - - -/** - * A simple proxy wrapper for the GSConnect service. - */ -export const Service = GObject.registerClass({ - GTypeName: 'GSConnectRemoteService', - Implements: [Gio.DBusInterface], - Properties: { - 'active': GObject.ParamSpec.boolean( - 'active', - 'Active', - 'Whether the service is active', - GObject.ParamFlags.READABLE, - false - ), - }, - Signals: { - 'device-added': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [Device.$gtype], - }, - 'device-removed': { - flags: GObject.SignalFlags.RUN_FIRST, - param_types: [Device.$gtype], - }, - }, -}, class Service extends Gio.DBusProxy { - - _init() { - super._init({ - g_bus_type: Gio.BusType.SESSION, - g_name: SERVICE_NAME, - g_object_path: SERVICE_PATH, - g_interface_name: 'org.freedesktop.DBus.ObjectManager', - g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, - }); - - this._active = false; - this._devices = new Map(); - this._starting = false; - - // Watch the service - this._nameOwnerChangedId = this.connect( - 'notify::g-name-owner', - this._onNameOwnerChanged.bind(this) - ); - } - - get active() { - return this._active; - } - - get devices() { - return Array.from(this._devices.values()); - } - - vfunc_g_signal(sender_name, signal_name, parameters) { - try { - // Don't emit signals until the ObjectManager has started - if (!this.active) - return; - - parameters = parameters.deepUnpack(); - - switch (true) { - case (signal_name === 'InterfacesAdded'): - this._onInterfacesAdded(...parameters); - break; - - case (signal_name === 'InterfacesRemoved'): - this._onInterfacesRemoved(...parameters); - break; - } - } catch (e) { - logError(e); - } - } - - /** - * org.freedesktop.DBus.ObjectManager.InterfacesAdded - * - * @param {string} object_path - Path interfaces have been added to - * @param {Object} interfaces - A dictionary of interface objects - */ - async _onInterfacesAdded(object_path, interfaces) { - try { - // An empty list means only the object has been added - if (Object.values(interfaces).length === 0) - return; - - // Skip existing proxies - if (this._devices.has(object_path)) - return; - - // Create a proxy - const device = new Device(this, object_path); - await device.start(); - - // Hold the proxy and emit ::device-added - this._devices.set(object_path, device); - this.emit('device-added', device); - } catch (e) { - logError(e, object_path); - } - } - - /** - * org.freedesktop.DBus.ObjectManager.InterfacesRemoved - * - * @param {string} object_path - Path interfaces have been removed from - * @param {string[]} interfaces - List of interface names removed - */ - _onInterfacesRemoved(object_path, interfaces) { - try { - // An empty interface list means the object is being removed - if (interfaces.length === 0) - return; - - // Get the proxy - const device = this._devices.get(object_path); - - if (device === undefined) - return; - - // Release the proxy and emit ::device-removed - this._devices.delete(object_path); - this.emit('device-removed', device); - - // Destroy the device and force disposal - device.destroy(); - } catch (e) { - logError(e, object_path); - } - } - - async _addDevices() { - const objects = await new Promise((resolve, reject) => { - this.call( - 'GetManagedObjects', - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (proxy, res) => { - try { - const variant = proxy.call_finish(res); - resolve(variant.deepUnpack()[0]); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - reject(e); - } - } - ); - }); - - for (const [object_path, object] of Object.entries(objects)) - await this._onInterfacesAdded(object_path, object); - } - - _clearDevices() { - for (const [object_path, device] of this._devices) { - this._devices.delete(object_path); - this.emit('device-removed', device); - device.destroy(); - } - } - - async _onNameOwnerChanged() { - try { - // If the service stopped, remove each device and mark it inactive - if (this.g_name_owner === null) { - this._clearDevices(); - - this._active = false; - this.notify('active'); - - // If the service started, mark it active and add each device - } else { - this._active = true; - this.notify('active'); - - await this._addDevices(); - } - } catch (e) { - logError(e); - } - } - - /** - * Reload all devices without affecting the remote service. This amounts to - * removing and adding each device while emitting the appropriate signals. - */ - async reload() { - try { - if (this._starting === false) { - this._starting = true; - - this._clearDevices(); - await _proxyInit(this); - await this._onNameOwnerChanged(); - - this._starting = false; - } - } catch (e) { - this._starting = false; - throw e; - } - } - - /** - * Start the service - */ - async start() { - try { - if (this._starting === false && this.active === false) { - this._starting = true; - - await _proxyInit(this); - await this._onNameOwnerChanged(); - - // Activate the service if it's not already running - if (!this.active) { - await new Promise((resolve, reject) => { - this.g_connection.call( - SERVICE_NAME, - SERVICE_PATH, - 'org.freedesktop.Application', - 'Activate', - GLib.Variant.new('(a{sv})', [{}]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - (proxy, res) => { - try { - resolve(proxy.call_finish(res)); - } catch (e) { - Gio.DBusError.strip_remote_error(e); - reject(e); - } - } - ); - }); - } - - this._starting = false; - } - } catch (e) { - this._starting = false; - throw e; - } - } - - /** - * Stop the service - */ - stop() { - if (this.active) - this.activate_action('quit'); - } - - activate_action(name, parameter = null) { - try { - const paramArray = []; - - if (parameter instanceof GLib.Variant) - paramArray[0] = parameter; - - const connection = this.g_connection || Gio.DBus.session; - - connection.call( - SERVICE_NAME, - SERVICE_PATH, - 'org.freedesktop.Application', - 'ActivateAction', - GLib.Variant.new('(sava{sv})', [name, paramArray, {}]), - null, - Gio.DBusCallFlags.NONE, - -1, - null, - null - ); - } catch (e) { - logError(e); - } - } - - destroy() { - if (this._nameOwnerChangedId > 0) { - this.disconnect(this._nameOwnerChangedId); - this._nameOwnerChangedId = 0; - - this._clearDevices(); - this._active = false; - - GObject.signal_handlers_destroy(this); - } - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/setup.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/setup.js deleted file mode 100644 index eef58dc9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/setup.js +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; - -import Gettext from 'gettext'; - -import Config from '../config.js'; - - -/** - * Initialise and setup Gettext. - */ -export function setupGettext() { - // Init Gettext - String.prototype.format = imports.format.format; - Gettext.bindtextdomain(Config.APP_ID, Config.PACKAGE_LOCALEDIR); - globalThis._ = GLib.dgettext.bind(null, Config.APP_ID); - globalThis.ngettext = GLib.dngettext.bind(null, Config.APP_ID); -} - -/** - * Initialise and setup Config, GResources and GSchema. - * @param {string} extensionPath - The absolute path to the extension directory - */ -export default function setup(extensionPath) { - // Ensure config.js is setup properly - Config.PACKAGE_DATADIR = extensionPath; - const userDir = GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell']); - - if (Config.PACKAGE_DATADIR.startsWith(userDir)) { - Config.IS_USER = true; - - Config.GSETTINGS_SCHEMA_DIR = `${Config.PACKAGE_DATADIR}/schemas`; - Config.PACKAGE_LOCALEDIR = `${Config.PACKAGE_DATADIR}/locale`; - } - - // Init GResources - Gio.Resource.load( - GLib.build_filenamev([Config.PACKAGE_DATADIR, `${Config.APP_ID}.gresource`]) - )._register(); - - // Init GSchema - Config.GSCHEMA = Gio.SettingsSchemaSource.new_from_directory( - Config.GSETTINGS_SCHEMA_DIR, - Gio.SettingsSchemaSource.get_default(), - false - ); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js deleted file mode 100644 index 8e1dedd9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js +++ /dev/null @@ -1,296 +0,0 @@ -// SPDX-FileCopyrightText: JingMatrix https://github.com/JingMatrix -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import GjsPrivate from 'gi://GjsPrivate'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; - -// laucher for wl-clipboard -const launcher = new Gio.SubprocessLauncher({ - flags: Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_MERGE, -}); - -/* - * DBus Interface Info - */ -const DBUS_NAME = 'org.gnome.Shell.Extensions.GSConnect.Clipboard'; -const DBUS_PATH = '/org/gnome/Shell/Extensions/GSConnect/Clipboard'; -const DBUS_NODE = Gio.DBusNodeInfo.new_for_xml(` -<node> - <interface name="org.gnome.Shell.Extensions.GSConnect.Clipboard"> - <!-- Methods --> - <method name="GetMimetypes"> - <arg direction="out" type="as" name="mimetypes"/> - </method> - <method name="GetText"> - <arg direction="out" type="s" name="text"/> - </method> - <method name="SetText"> - <arg direction="in" type="s" name="text"/> - </method> - - <!-- Signals --> - <signal name="OwnerChange"/> - </interface> -</node> -`); -const DBUS_INFO = DBUS_NODE.lookup_interface(DBUS_NAME); - -/* - * Text Mimetypes - */ -const TEXT_MIMETYPES = [ - 'text/plain;charset=utf-8', - 'UTF8_STRING', - 'text/plain', - 'STRING', -]; - -/* GSConnectClipboardPortal: - * - * A simple clipboard portal, especially useful on Wayland where GtkClipboard - * doesn't work in the background. - */ -export const Clipboard = GObject.registerClass( - { - GTypeName: 'GSConnectShellClipboard', - }, - class GSConnectShellClipboard extends GjsPrivate.DBusImplementation { - _init() { - super._init({ - g_interface_info: DBUS_INFO, - }); - - this._transferring = false; - - this.watcher = Gio.Subprocess.new([ - 'wl-paste', - '-w', - 'dbus-send', - DBUS_PATH, - '--dest=' + DBUS_NAME, - DBUS_NAME + '.OwnerChange', - ], Gio.SubprocessFlags.NONE); - - // Prepare DBus interface - this._handleMethodCallId = this.connect( - 'handle-method-call', - this._onHandleMethodCall.bind(this) - ); - - this._nameId = Gio.DBus.own_name( - Gio.BusType.SESSION, - DBUS_NAME, - Gio.BusNameOwnerFlags.NONE, - this._onBusAcquired.bind(this), - null, - this._onNameLost.bind(this) - ); - } - - _onBusAcquired(connection, name) { - try { - this.export(connection, DBUS_PATH); - } catch (e) { - logError(e); - } - } - - _onNameLost(connection, name) { - try { - this.unexport(); - } catch (e) { - logError(e); - } - } - - async _onHandleMethodCall(iface, name, parameters, invocation) { - let retval; - - try { - const args = parameters.recursiveUnpack(); - - retval = await this[name](...args); - } catch (e) { - if (e instanceof GLib.Error) { - invocation.return_gerror(e); - } else { - if (!e.name.includes('.')) - e.name = `org.gnome.gjs.JSError.${e.name}`; - - invocation.return_dbus_error(e.name, e.message); - } - - return; - } - - if (retval === undefined) - retval = new GLib.Variant('()', []); - - try { - if (!(retval instanceof GLib.Variant)) { - const args = DBUS_INFO.lookup_method(name).out_args; - retval = new GLib.Variant( - `(${args.map((arg) => arg.signature).join('')})`, - args.length === 1 ? [retval] : retval - ); - } - - invocation.return_value(retval); - - // Without a response, the client will wait for timeout - } catch (e) { - invocation.return_dbus_error( - 'org.gnome.gjs.JSError.ValueError', - 'Service implementation returned an incorrect value type' - ); - } - } - - /** - * Get the available mimetypes of the current clipboard content - * - * @return {Promise<string[]>} A list of mime-types - */ - - GetMimetypes() { - return new Promise((resolve, reject) => { - const proc = launcher.spawnv([ - 'wl-paste', - '--list-types', - '-n', - ]); - proc.communicate_utf8_async(null, null, (proc, res) => { - try { - const [, stdout, stderr] = - proc.communicate_utf8_finish(res); - if (proc.get_successful()) - resolve(stdout.trim().split('\n')); - else - logError(stderr); - - } catch (e) { - reject(e); - } - }); - }); - } - - /** - * Get the text content of the clipboard - * - * @return {Promise<string>} Text content of the clipboard - */ - GetText() { - return new Promise((resolve, reject) => { - this.GetMimetypes().then((mimetypes) => { - const mimetype = TEXT_MIMETYPES.find((type) => - mimetypes.includes(type) - ); - - if (mimetype !== undefined) { - const proc = launcher.spawnv(['wl-paste', '-n']); - proc.communicate_utf8_async(null, null, (proc, res) => { - try { - const [, stdout, stderr] = - proc.communicate_utf8_finish(res); - if (proc.get_successful()) - resolve(stdout); - else - logError(stderr); - - } catch (e) { - reject(e); - } - }); - } else { - reject(new Error('text not available')); - } - }); - }); - } - - /** - * Set the text content of the clipboard - * - * @param {string} text - text content to set - * @return {Promise} A promise for the operation - */ - SetText(text) { - return new Promise((resolve, reject) => { - try { - if (typeof text !== 'string') { - throw new Gio.DBusError({ - code: Gio.DBusError.INVALID_ARGS, - message: 'expected string', - }); - } - - launcher.spawnv(['wl-copy', text]); - resolve(); - } catch (e) { - reject(e); - } - }); - } - - - - destroy() { - if (this._nameId > 0) { - Gio.bus_unown_name(this._nameId); - this._nameId = 0; - } - - if (this._handleMethodCallId > 0) { - this.disconnect(this._handleMethodCallId); - this._handleMethodCallId = 0; - this.unexport(); - } - if (this.watcher) - this.watcher.force_exit(); - - } - } -); - -let _portal = null; -let _portalId = 0; - -/** - * Watch for the service to start and export the clipboard portal when it does. - */ -export function watchService() { - if (_portalId > 0) - return; - - _portalId = Gio.bus_watch_name( - Gio.BusType.SESSION, - 'org.gnome.Shell.Extensions.GSConnect', - Gio.BusNameWatcherFlags.NONE, - () => { - if (_portal === null) - _portal = new Clipboard(); - }, - () => { - if (_portal !== null) { - _portal.destroy(); - _portal = null; - } - } - ); -} - -/** - * Stop watching the service and export the portal if currently running. - */ -export function unwatchService() { - if (_portalId > 0) { - Gio.bus_unwatch_name(_portalId); - _portalId = 0; - } -} - -// vim:tabstop=2:shiftwidth=2:expandtab diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/extension.js deleted file mode 100644 index 61ed3e68..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/extension.js +++ /dev/null @@ -1,52 +0,0 @@ -import St from 'gi://St'; -const DEFAULT_SPEED = 0.75; -import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; -import * as Settings from './settings.js'; - -function LOG(m){ - console.log("[impatience] " + m); -}; - -var noop = function() {}; - -export default class Impatience extends Extension { - constructor(metadata) { - super(metadata); - this.enabled = false; - this.original_speed = St.Settings.get().slow_down_factor; - this.modified_speed = DEFAULT_SPEED; - this.unbind = noop; - }; - - enable() { - this.enabled = true; - var pref = (new Settings.Prefs(this)).SPEED; - LOG("enabled"); - var binding = pref.changed(() => { - this.set_speed(pref.get()); - }); - this.unbind = () => { - pref.disconnect(binding); - this.unbind = noop; - }; - this.set_speed(pref.get()); - }; - - disable() { - this.enabled = false; - this.unbind(); - St.Settings.get().slow_down_factor = this.original_speed; - }; - - set_speed(new_speed) { - if(!this.enabled) { - LOG("NOT setting new speed, since the extension is disabled."); - return; - } - if(new_speed !== undefined) { - this.modified_speed = new_speed; - } - LOG("setting new speed: " + this.modified_speed); - St.Settings.get().slow_down_factor = this.modified_speed; - }; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/prefs.js deleted file mode 100644 index e55867a0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/prefs.js +++ /dev/null @@ -1,61 +0,0 @@ -import Gtk from 'gi://Gtk'; - -import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -import * as Settings from './settings.js'; - -export default class ImpatiencePrefs extends ExtensionPreferences { - getPreferencesWidget() { - let config = new Settings.Prefs(this); - let frame = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - 'margin-top': 20, - 'margin-bottom': 20, - 'margin-start': 20, - 'margin-end': 20 - }); - - (function() { - let hbox = new Gtk.Box({ - orientation: Gtk.Orientation.HORIZONTAL, - spacing: 20 - }); - - let label = new Gtk.Label({ - label: "Speed scaling\n<small>(1 = normal, 0.5 = twice as fast)</small>", - use_markup: true, - }); - let adjustment = new Gtk.Adjustment({ - lower: 0, - upper: 2, - step_increment: 0.05 - }); - let scale = new Gtk.Scale({ - orientation: Gtk.Orientation.HORIZONTAL, - digits:2, - adjustment: adjustment, - hexpand: true, - value_pos: Gtk.PositionType.RIGHT - }); - - hbox.append(label); - hbox.append(scale); - frame.append(hbox); - - var pref = config.SPEED; - scale.set_value(pref.get()); - [0.25, 0.5, 1.0, 2.0].forEach( - mark => scale.add_mark(mark, Gtk.PositionType.TOP, "<small>" + mark + "</small>") - ); - scale.connect('value-changed', function(sw) { - var oldval = pref.get(); - var newval = sw.get_value(); - if (newval != pref.get()) { - pref.set(newval); - } - }); - })(); - - frame.show(); - return frame; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/private_metadata.json deleted file mode 100644 index 66f450cc..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/private_metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Speed up the gnome-shell animation speed", - "name": "Impatience", - "settings-schema": "org.gnome.shell.extensions.net.gfxmonk.impatience", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "http://gfxmonk.net/dist/0install/gnome-shell-impatience.xml", - "uuid": "impatience@gfxmonk.net", - "version": 27 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/gschemas.compiled deleted file mode 100644 index 8be15e0d5016b23928fd4e5b2b23b0970294a322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmYL@Jqp4=5QWFTN(&poBgDd8Jb|5Bq!tUCpkop=yOJzoqlG81^E#eJEIfdnzR5-$ z7~W%kzv(>6)5tigq7PkoAJl(EXsbu`LHJ%+&MZ;?G;a?X6F;IEU7;^z4QcaO#l~i= ziiCGN#Ye}cNUbT9VW;BFF|%f?(rh2Ol+B8<g9sX4%NxRQvFEy|-0jeT-q0o<+)wAW zFo|!W-i1!YSFGZRLYhHCWU*&n4>!@u*<3nA&oKq-fx`d97f1tIm(aR|)_-UXXk9_; KKeWbSzx)NU7fqW0 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/org.gnome.shell.extensions.net.gfxmonk.impatience.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/org.gnome.shell.extensions.net.gfxmonk.impatience.gschema.xml deleted file mode 100644 index ffd0c931..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/schemas/org.gnome.shell.extensions.net.gfxmonk.impatience.gschema.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist> - <schema id="org.gnome.shell.extensions.net.gfxmonk.impatience" path="/org/gnome/shell/extensions/net/gfxmonk/impatience/"> - <key type="d" name="speed-factor"> - <default>0.75</default> - <summary>speed factor</summary> - <description/> - </key> - </schema> -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/settings.js deleted file mode 100644 index 5f25f975..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/impatience@gfxmonk.net/settings.js +++ /dev/null @@ -1,10 +0,0 @@ -export function Prefs(extension) { - var settings = this.settings = extension.getSettings(); - this.SPEED = { - key: 'speed-factor', - get: function() { return settings.get_double(this.key); }, - set: function(v) { settings.set_double(this.key, v); }, - changed: function(cb) { return settings.connect('changed::' + this.key, cb); }, - disconnect: function() { return settings.disconnect.apply(settings, arguments); }, - }; -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_CHANGELOG.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_CHANGELOG.md deleted file mode 100644 index 5474176a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_CHANGELOG.md +++ /dev/null @@ -1,555 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -We go to the next version after each release on the -[GNOME Shell Extensions website](https://extensions.gnome.org/). - -## [Unreleased] - -## [30.0] - 2024-07-31 - -### Added - -- GNOME Shell 47 Support. - -## [29.0] - 2024-07-06 - -### Added - -- Dark Mode Toggle Button Visibility in Quick Settings. -- Maximum Displayed Search Results feature (GNOME Shell 45 and higher). -- Gresources compiled file for the preferences window to load faster. - -### Fixed - -- Alt-Tab Switcher list Item Background Color for Shell Theme Override (GNOME Shell 46). -- Hidden panel timeout priority on Wayland. -- Panel Menu not Showing Up On Bottom Panel When the Height is Larger than the Screen Height. -- The dash app running indicator visibility. -- Workspace Popup visibility CPU usage. -- Japanese Translation by [@gnuey56](https://gitlab.gnome.org/gnuey56). - -### Changed - -- The clock menu position widget to `AdwSpinRow`. -- The panel height maximum size to 64. - -## [28.0 Lear] - 2024-03-06 - -### Added - -- Buy Me a Coffee donation link. -- GNOME Shell 46 Support. -- Option to maximize windows on creation by [@droserasprout](https://gitlab.gnome.org/droserasprout). - -### Fixed - -- The world clock visibility coming back after reboot or install change. - -### Removed - -- Window Picker Shell Theme Override. -- Search Shell Theme Override. -- Workspace Animation Shell Theme Override. -- Dash Background Shell Theme Override. - -## [27.0 Durer] - 2023-09-14 - -### Changed - -- The world clocks visibility from CSS to JS. - -### Added - -- "Almost none" option to animation speed feature (GNOME Shell 45). -- GNOME Shell 45 Support. -- Japanese Translation by [@gnuey56](https://gitlab.gnome.org/gnuey56). - -### Removed - -- Activities button icon feature (GNOME Shell 45). -- App menu indicator (GNOME Shell 45). - -## [26.0 Rosa] - 2023-08-07 - -### Fixed - -- Remove not defined. - -## [25.0 Rosa] - 2023-08-07 - -### Changed - -- The behavior of the panel is shown only in the overview. - Rather than sliding in from the top, it is now rendered behind the workspaces - by [Schneegans](https://gitlab.gnome.org/Schneegans). - -### Fixed - -- a11y error in GNOME Shell mobile. -- Activities button error in GNOME Shell mobile. -- Marked as an urgent signal for window demand attention focus feature. -- Panel flickering when its position is at the bottom. -- `.set_icon_size` is not a function error (Date Menu). -- Unwanted padding on the disabled power icon. -- Unwanted shadow for workspace in the app grid. - -### Added - -- Dash app running visibility. -- Disable the overlay key. -- EGO donations. -- Workspace peek (GNOME Shell 42 and higher). - -### Removed - -- GNOME Shell support (3.36, 3.38, 40 and 41 no longer getting new features). - -## [24.0 Hals] - 2023-03-01 - -### Changed - -- Window preview close button for super minimal profile (to disabled). - -### Added - -- GNOME Shell 44 support. -- Transparent dash background for shell theme override (GNOME Shell 4x only). - -## [23.0 Goya] - 2023-02-10 - -### Changed - -- Clock menu offset maximum to 20. -- Fastest animation speed (twice as fast as before). - -### Fixed - -- App menu label visibility compatibility issue with open whether extension. -- Hidden workspace switcher padding in overview. -- Keep the clock menu position when another widget is added to the panel. -- Looking Glass API conflicts with the "Dash to Panel" extension. -- Looking Glass error when primary monitor doesn't exist. -- Window preview gap when window picker close button is disabled. -- Workspace boxes top margin in the app grid when the search entry is disabled. -- Italian translation by [@svityboy](https://gitlab.gnome.org/svityboy). - -### Added - -- More dash icon size (16px, 22px, 24px, 40px and 56px). -- Overview spacing size. -- Screen recording indicator visibility. -- Screen sharing indicator visibility. -- Switcher popup delay by [@koplo199](https://gitlab.gnome.org/koplo199). - -## [22.0 Millet] - 2022-09-10 - -### Fixed - -- Dash app button visibility height. -- Looking glass error after unlock. - -### Added - -- App menu label visibility. -- GNOME Shell 43 support. -- Quick settings menu visibility. - -### Removed - -- Aggregate menu for GNOME Shell 43 and higher. - -## [21.0 Reynolds] - 2022-08-06 - -### Changed - -- Prefs compatibility layer checking to GTK and Adw instead of GNOME Shell version. - -### Fixed - -- Application button visibility in Ubuntu 22.04. -- Prefs window size for scaled displays. -- Prefs window size for small displays in GNOME Shell 42. -- Racy prefs window size. -- Window caption going out of display area when dash is disabled in GNOME Shell 40 and higher. -- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). -- Spanish translation by [@Luci](https://gitlab.gnome.org/Luci). - -### Added - -- Alt-Tab window preview icon size. -- Alt-Tab window preview size. -- Alt-Tab icon size. -- Dash separator visibility. -- Looking glass size by [@AdvendraDeswanta](https://gitlab.gnome.org/AdvendraDeswanta). -- OSD position. -- Take the screenshot button in the window menu visibility. - -### Removed - -- Gesture API for GNOME Shell 40 and higher. -- List box separators for GNOME Shell 40 and 41 (EOS). -- Prefs intro. - -## [20.0 Hayez] - 2022-04-01 - -### Fixed - -- Dynamic workspaces getting disabled by workspace popup. -- Flickering panel after Unlock. -- Notification banner position on GNOME Shell 42. -- Window demands attention focus on GNOME Shell 42. -- French translation by [@GeoffreyCoulaud](https://gitlab.gnome.org/GeoffreyCoulaud). -- Italian translation by [@svityboy](https://gitlab.gnome.org/svityboy). - -### Added - -- Events visibility in the clock menu. -- Calendar visibility in the clock menu. -- Dutch translation by [@Vistaus](https://gitlab.gnome.org/Vistaus). - -## [19.0 Ancher] - 2022-03-02 - -### Fixed - -- Blurry search entry on GNOME Shell themes with "box-shadow". -- Prefs file chooser recursion. -- SecondaryMonitorDisplay error on GNOME Shell 42. -- Shell theme overrides OSD on GNOME Shell 42. -- Shell theme overrides the workspace switcher on GNOME Shell 42. -- Workspace popup visibility in GNOME Shell 42. - -### Added - -- Libadwaita for GNOME Shell 42 prefs. -- Panel icon size. -- Panel world clock visibility. -- Weather visibility. - -## [18.0 Roslin] - 2022-02-12 - -### Fixed - -- GNOME 3.x prefs error. - -## [17.0 Roslin] - 2022-02-11 - -### Fixed - -- Emitting panel show when panel is visible. -- Looking glass not showing up. -- Looking glass position on startup when panel is hidden. -- Prefs height going off the screen in small displays. -- Prefs lunching url freeze on Wayland. -- Prefs padding in GNOME Shell 42. -- Prefs UI Improvement by [@muqtxdir](https://gitlab.gnome.org/muqtxdir). -- Startup animation for hiding panel when panel is disabled. -- Type to search when text entry content is replaced with another content. -- Window goes under panel after unlock on Wayland. -- Window picker caption visibility issue on Pop Shell. -- Galician translation by [@frandieguez](https://gitlab.gnome.org/frandieguez). - -### Added - -- Bottom to notification banner position. - -### Removed - -- Panel corner size option for GNOME Shell 42. - -## [16.0 Rembrandt] - 2021-11-15 - -### Fixed - -- Animation jump when search entry is disabled and entering app grid. -- Clock menu revealing in lockscreen when the position is left or right. -- Startup status for Ubuntu. -- Workspace switcher visibility in GNOME Shell 41. - -### Removed - -- Hot corner for GNOME Shell 41. -- Hot corner library for all supported Shell versions. - -### Added - -- Double supper to app grid for GNOME Shell 40 and 41. -- Panel corner size when panel is disabled. -- Panel visibility in overview when panel is disabled. -- Prefs window intro. -- Profile selector to the prefs window. -- Ripple box. - -## [15.0 Magnetized] - 2021-09-22 - -### Fixed - -- unlock recursion error. - -### Added - -- Hot corner support for GNOME Shell 41. - -## [14.0 Magnetized] - 2021-09-22 - -### Changed - -- Repo folder structure to have better organization. - -### Fixed - -- Bottom panel position for multi monitors by [@harshadgavali](https://gitlab.gnome.org/harshadgavali). -- First swipe up in desktop startup status. -- Looking glass position on bottom panel. -- Maximized window gap on Wayland. -- Search entry animation for type to search when search entry is disabled. -- Search entry API to avoid conflicting with other extensions. -- Window picker caption border on disable. -- Window picker disapearing on wayland with shell theme override. -- Galician translation by [@frandieguez](https://gitlab.gnome.org/frandieguez). -- Spanish translation by [@DiegoIvanME](https://gitlab.gnome.org/DiegoIvanME). - -### Removed - -- Donation popover in prefs. -- Hot corner for GNOME Shell 41. - -### Added - -- GNOME Shell 41 support. -- Panel indicator padding size. -- Window picker close button visibility. - -## [13.0 Ring] - 2021-08-10 - -### Changed - -- Search button position in prefs window. - -### Fixed - -- Accessing dash in case the original dash has been removed by third party extensions. -- API.monitorGetInfo for "pMonitor is null" error. -- Dropdown align in preferences dialog. -- Startup status blocking shortcut keys. -- Unwanted window demands attention focus. -- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). - -### Removed - -- Settings and Translation library and using ExtensionUtils instead. - -### Added - -- Panel button padding size. -- Panel height. -- Window picker caption visibility. -- Workspace background corner size in overview. -- Workspace wraparound (modified version of WorkspaceSwitcherWrapAround by [@war1025](https://github.com/war1025)). - -## [12.0 Queen Red] - 2021-06-29 - -### Changed - -- Lighter background color for switcher list (alt+tab) in override theme. -- Workspace switcher max size now maxed out to 30%. - -### Fixed - -- Combobox scroll issue on GTK4. -- Window demands attention focus notification popup. -- French translation by [@GeoffreyCoulaud](https://gitlab.gnome.org/GeoffreyCoulaud). -- Russian translation by [@librusekus35790](https://gitlab.gnome.org/librusekus35790). - -### Added - -- Always show workspace switcher on dynamic workspaces. -- More descriptions to the preferences dialog. -- Notification banner position. -- Startup status for GNOME Shell 40. -- Workspace animation background color for shell theme override. -- Workspaces visibility in app grid by [@fmuellner](https://gitlab.gnome.org/fmuellner). -- Chinese (Taiwan) translation by [@r0930514](https://gitlab.com/r0930514). - -## [11.0 Whisper] - 2021-05-20 - -### Changed - -- App gesture now only works on GNOME 3.36 and 3.38. -- Donation icon to GTK4 non-compatible icon sets. -- Shell theme override is now disabled by default. -- Workspace switcher size for GNOME Shell 40 is now maxed out to 15%. - -### Fixed - -- Gap when panel position is at the bottom and shell override theme happens. -- Panel menu margin when panel is in bottom. -- Window picker icon visibility on drag. -- Workspace switcher size for multi monitor setup. -- Arabic translation by [@AliGalal](https://gitlab.com/AliGalal). -- Chinese translation by [@wsxy162](https://gitlab.com/wsxy162). -- Italian translation by [@l3nn4rt](https://gitlab.com/l3nn4rt). -- Swedish translation by [@MorganAntonsson](https://gitlab.com/MorganAntonsson). - -### Added - -- Activities button icon. -- Dash icon size. -- Window demands attention focus. - -## [10.0] - 2021-03-26 - -### Changed - -- Organized prefs UI for icons and behavior. -- Removed quotes and side bar image from prefs UI. - -### Fixed - -- Fake hot corner primary monitor position. -- Horizontal scroll in prefs. -- Primary Monitor Panel Position. -- Arabic translation by [@karem34](https://gitlab.com/karem34). -- Russian translation by [@librusekus35790](https://gitlab.com/librusekus35790). - -### Added - -- Clock menu position. -- Disable animation or change the animation speed. -- Disable applications button in dash. -- Disable app menu icon. -- Disable panel arrow in GNOME 3.36 and 3.38. -- Disable panel notification icon. -- No results found for prefs window. -- Brazilian Portuguese translation by [@Zelling](https://gitlab.com/Zelling). -- Catalan translation by [@juxuanu](https://gitlab.com/juxuanu). -- Galician translation by [@frandieguez](https://gitlab.com/frandieguez). - -## [9.0] - 2021-03-06 - -### Changed - -- Prefs interface. - -### Fixed - -- Default value for hot corner on extension disable. -- GNOME Shell 40.beta version. - -### Added - -- Disable power icon. -- Panel position. -- Support to prefs window. - -## [8.0] - 2021-02-22 - -### Changed - -- Holding back lonely overview until the final GNOME 40 release. - -### Fixed - -- Dash override theme on GNOME Shell 40 beta. -- Focus for find entry on prefs. -- Search controller for GNOME Shell 40 beta. -- Start search for GNOME Shell 40 beta. -- Workspace switcher enable related to workspace switcher size. -- Nepali translation filename by [@IBA4](https://gitlab.com/IBA4). - -## [7.0] - 2021-02-12 - -### Fixed - -- GNOME Shell 40 hidden side by side workspace preview. -- GNOME Shell 40 search padding when panel is disabled. -- Initial prefs window size. - -### Added - -- GNOME Shell 40 window picker icon visibility to the settings. -- GNOME Shell 40 workspace switcher size to the settings. -- Panel corner size to the settings. -- Search feature to the settings. -- Type to Search to the settings. -- Nepali translation by [@IBA4](https://gitlab.com/IBA4). -- Spanish translation by [@oscfdezdz](https://gitlab.com/oscfdezdz). - -## [6.0] - 2021-01-29 - -### Fixed - -- GNOME Shell 3.38 extra padding on no workspace switcher. -- GNOME Shell 40 and GTK4 support for prefs. -- GNOME Shell 40 support for search entry. -- GNOME Shell 40 support for workspace switcher. - -## [5.0] - 2021-01-05 - -### Added - -- Accessibility Menu visibility to the settings. -- Activities button visibility to the settings. -- App menu visibility to the settings. -- Clock menu visibility to the settings. -- Keyboard Layout visibility to the settings. -- System Menu (Aggregate Menu) visibility to the settings. - -### Changed - -- OSD in settings to "On Screen Display (OSD)". - -### Fixed - -- Hot corner when top panel is visible. -- Padding on no dash. -- Search top padding on no top panel. - -## [4.0] 2020-12-25 - -### Added - -- API to decouple all libraries from using GNOME Shell ui directly. -- Automate build process by [@daPhipz](https://gitlab.com/daPhipz). -- CHANGELOG.md file. -- Compatibility layer for API. -- Translation automation script by [@daPhipz](https://gitlab.com/daPhipz). - -### Changed - -- Default settings to enable. -- Displaying error for generate-mo.sh by [@daPhipz](https://gitlab.com/daPhipz). -- German translation by [@M4he](https://gitlab.com/M4he). - -### Fixed - -- Top padding on no search and no top panel. - -## [3.0] - 2020-12-21 - -### Added - -- CONTRIBUTING.md file. -- Decoupled library from GNOME Shell ui. -- Extension logo. -- Initial Translations. -- Prefs as extension settings. - -## [2.0] - 2020-11-18 - -### Fixed - -- Destroy hot corner on disable. - - -### Added - -- Disable app gesture. -- Disable background menu. -- Hide dash. -- Hide search. -- Hide top panel. -- Hide workspace switcher. -- Hot corner to toggle overview visibility. - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_LICENSE b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_LICENSE deleted file mode 100644 index c4dc63ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_LICENSE +++ /dev/null @@ -1,675 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - Just Perfection GNOME Shell Desktop - Copyright (C) 2020-2024 Javad Rahmatzadeh - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Just Perfection GNOME Shell Desktop - Copyright (C) 2020-2024 Javad Rahmatzadeh - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_extension.js deleted file mode 100644 index 960017db..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_extension.js +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Extension - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Meta from 'gi://Meta'; -import St from 'gi://St'; - -import * as AltTab from 'resource:///org/gnome/shell/ui/altTab.js'; -import * as BackgroundMenu from 'resource:///org/gnome/shell/ui/backgroundMenu.js'; -import * as LookingGlass from 'resource:///org/gnome/shell/ui/lookingGlass.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; -import * as OSDWindow from 'resource:///org/gnome/shell/ui/osdWindow.js'; -import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js'; -import * as Panel from 'resource:///org/gnome/shell/ui/panel.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as Search from 'resource:///org/gnome/shell/ui/search.js'; -import * as SearchController from 'resource:///org/gnome/shell/ui/searchController.js'; -import * as SwitcherPopup from 'resource:///org/gnome/shell/ui/switcherPopup.js'; -import * as WindowMenu from 'resource:///org/gnome/shell/ui/windowMenu.js'; -import * as WindowPreview from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js'; -import * as WorkspacesView from 'resource:///org/gnome/shell/ui/workspacesView.js'; -import * as WorkspaceSwitcherPopup from 'resource:///org/gnome/shell/ui/workspaceSwitcherPopup.js'; -import * as WorkspaceThumbnail from 'resource:///org/gnome/shell/ui/workspaceThumbnail.js'; - -import * as Config from 'resource:///org/gnome/shell/misc/config.js'; -import * as Util from 'resource:///org/gnome/shell/misc/util.js'; - -import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import {API} from './lib/API.js'; -import {Manager} from './lib/Manager.js'; - -/** - * Extension entry point - */ -export default class JustPerfection extends Extension -{ - /** - * Instance of API - * - * @type {API|null} - */ - #api = null; - - /** - * Instance of Manager - * - * @type {Manager|null} - */ - #manager = null; - - /** - * Enable extension - * - * @returns {void} - */ - enable() - { - const shellVersion = parseFloat(Config.PACKAGE_VERSION); - - let InterfaceSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.interface'}); - - this.#api = new API( - { - Main, - BackgroundMenu, - OverviewControls, - WorkspaceSwitcherPopup, - SwitcherPopup, - InterfaceSettings, - Search, - SearchController, - WorkspaceThumbnail, - WorkspacesView, - Panel, - PanelMenu, - WindowPreview, - Workspace, - LookingGlass, - MessageTray, - OSDWindow, - WindowMenu, - AltTab, - St, - GLib, - Clutter, - Util, - Meta, - GObject, - }, - shellVersion - ); - - this.#api.open(); - - let settings = this.getSettings(); - - this.#manager = new Manager( - { - API: this.#api, - Settings: settings, - }, - shellVersion - ); - - this.#manager.registerSettingsSignals(); - this.#manager.applyAll(); - } - - /** - * Disable extension - * - * @returns {void} - */ - disable() - { - this.#manager?.revertAll(); - this.#manager = null; - - this.#api?.close(); - this.#api = null; - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_prefs.js deleted file mode 100644 index f7cea09d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_prefs.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Prefs Dialog - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -import Gtk from 'gi://Gtk'; -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; - -import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -import * as Config from 'resource:///org/gnome/Shell/Extensions/js/misc/config.js'; - -import {Prefs} from './lib/Prefs/Prefs.js'; -import {PrefsKeys} from './lib/Prefs/PrefsKeys.js'; - -/** - * Preferences window entry point - */ -export default class JustPerfectionPrefs extends ExtensionPreferences -{ - /** - * fill preferences window - * - * @returns {void} - */ - fillPreferencesWindow(window) - { - const shellVersion = parseFloat(Config.PACKAGE_VERSION); - const gettextDomain = this.metadata['gettext-domain']; - - let ResourcesFolderPath = this.path; - let prefsKeys = new PrefsKeys(shellVersion); - - let prefs = new Prefs( - { - Builder: new Gtk.Builder(), - Settings: this.getSettings(), - Gdk, - Gio, - }, - prefsKeys, - shellVersion - ); - - prefs.fillPrefsWindow(window, ResourcesFolderPath, gettextDomain); - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_stylesheet.css deleted file mode 100644 index 974d8e27..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/executable_stylesheet.css +++ /dev/null @@ -1,714 +0,0 @@ -.just-perfection -{ - font-size: small; -} - -.just-perfection .switcher-popup -{ - padding: 8px; - spacing: 24px; - font-size: small; -} - -.just-perfection .switcher-list -{ - color: #eeeeec; - background-color: rgba(0, 0, 0, .99); - border: 0 solid rgba(255, 255, 255, .16); - border-radius: 15px; - padding: 12px; - box-shadow: none; -} - -.just-perfection .switcher-list .item-box -{ - padding: 8px; - border-radius: 14px; - border: 1px solid transparent; - background-color: transparent; -} - -.just-perfection .switcher-list .item-box:outlined -{ - border: 0; - background-color: rgba(255, 255, 255, .1); - box-shadow: inset 0 2px 2px 0 rgba(0, 0, 0, .4); -} - -.just-perfection .switcher-list .item-box:selected -{ - background-color: #404040; - color: #eeeeec; -} - -.just-perfection .switcher-list .thumbnail-box -{ - padding: 2px; - spacing: 6px; -} - -.just-perfection .switcher-list .thumbnail -{ - width: 256px; -} - -.just-perfection .switcher-list .separator -{ - width: 1px; - background: #272727; -} - -.just-perfection .switcher-list .switcher-list-item-container -{ - spacing: 12px; -} - -.just-perfection .workspace-switcher-container -{ - background-color: rgba(0, 0, 0, .7); - box-shadow: none; - padding: 3px; - border: 0; - border-radius: 3px; -} - -.just-perfection .workspace-switcher -{ - background: transparent; - border: none; - border-radius: 0; - padding: 0; - spacing: 4px; -} - -.just-perfection .workspace-switcher -{ - background: rgba(0, 0, 0, .7); - box-shadow: none; - border: none; - border-radius: 5px; - padding: 0; - spacing: 4px; -} - -.just-perfection .ws-switcher-indicator, -.just-perfection .ws-switcher-indicator:active -{ - background: transparent; - background-color: rgba(255, 255, 255, .02); - height: 8px; - width: 20px; - border: 0; - border-radius: 2px; - padding: 2px; - margin: 5px; -} - -.just-perfection .ws-switcher-indicator:active -{ - background-color: rgba(255, 255, 255, .8); -} - -.just-perfection .ws-switcher-box -{ - background: transparent; - background-color: rgba(255, 255, 255, .02); - height: 10px; - background-size: 0; - border: 0; - border-radius: 1px; -} - -.just-perfection .ws-switcher-active-up, -.just-perfection .ws-switcher-active-down, -.just-perfection .ws-switcher-active-left, -.just-perfection .ws-switcher-active-right -{ - height: 10px; - background-color: rgba(255, 255, 255, .8); - border: 0; - border-radius: 1px; -} - -.just-perfection .osd-window -{ - background-color: rgba(0, 0, 0, 1); - border: 0; - border-radius: 8px; - padding: 10px; - box-shadow: none; -} - -.just-perfection .osd-window StIcon -{ - width: 22px; - height: 22px; -} - -.just-perfection .tile-preview -{ - background-color: rgba(255, 255, 255, 0.15); - border: 1px solid rgba(255, 255, 255, 0.6); - border-radius: 0; -} - -.just-perfection-api-no-search #overview -{ - spacing: 0; -} - -.just-perfection-api-no-search .overview-controls -{ - padding-top: 36px; - padding-bottom: 36px; -} - -/* commented because the icon will be shown when the window is getting dragged */ -/* icon-dropshadow isn't specific to the window picker icon but that's a quick fix for now */ -/* .just-perfection-api-no-window-picker-icon .workspaces-view StIcon */ -.just-perfection-api-no-window-picker-icon .icon-dropshadow -{ - width: 0; - height: 0; - padding: 0; -} - -.just-perfection-api-bottom-panel #overview -{ - margin-bottom: 24px; -} - -.just-perfection-api-bottom-panel .popup-menu.panel-menu -{ - margin-bottom: 0; -} - -.just-perfection-api-bottom-panel.just-perfection-api-no-panel #overview -{ - margin-bottom: 0; -} - -.just-perfection-api-no-panel #panel -{ - background-color: transparent; -} - -.just-perfection-api-no-panel-arrow .panel-button .popup-menu-arrow -{ - width: 0; - height: 0; -} - -.just-perfection-api-no-panel-notification-icon .clock-display StIcon -{ - width: 0; - height: 0; - padding: 0; -} - -.just-perfection-api-no-panel-notification-icon .clock-display-box -{ - padding: 0; - spacing: 0; -} - -.just-perfection-api-no-show-apps-button .show-apps, -.just-perfection-api-no-show-apps-button .show-apps StIcon -{ - width: 0; - margin: 0; - spacing: 0; -} - -.just-perfection-api-dash-icon-size16 #dash StIcon { height: 16px; width: 16px; } -.just-perfection-api-dash-icon-size22 #dash StIcon { height: 22px; width: 22px; } -.just-perfection-api-dash-icon-size24 #dash StIcon { height: 24px; width: 24px; } -.just-perfection-api-dash-icon-size32 #dash StIcon { height: 32px; width: 32px; } -.just-perfection-api-dash-icon-size40 #dash StIcon { height: 40px; width: 40px; } -.just-perfection-api-dash-icon-size48 #dash StIcon { height: 48px; width: 48px; } -.just-perfection-api-dash-icon-size56 #dash StIcon { height: 56px; width: 56px; } -.just-perfection-api-dash-icon-size64 #dash StIcon { height: 64px; width: 64px; } - - -.just-perfection-api-panel-button-padding-size0 .panel-button { -natural-hpadding: 0px; -minimum-hpadding: 0px; } -.just-perfection-api-panel-button-padding-size1 .panel-button { -natural-hpadding: 1px; -minimum-hpadding: 1px; } -.just-perfection-api-panel-button-padding-size2 .panel-button { -natural-hpadding: 2px; -minimum-hpadding: 2px; } -.just-perfection-api-panel-button-padding-size3 .panel-button { -natural-hpadding: 3px; -minimum-hpadding: 3px; } -.just-perfection-api-panel-button-padding-size4 .panel-button { -natural-hpadding: 4px; -minimum-hpadding: 4px; } -.just-perfection-api-panel-button-padding-size5 .panel-button { -natural-hpadding: 5px; -minimum-hpadding: 5px; } -.just-perfection-api-panel-button-padding-size6 .panel-button { -natural-hpadding: 6px; -minimum-hpadding: 6px; } -.just-perfection-api-panel-button-padding-size7 .panel-button { -natural-hpadding: 7px; -minimum-hpadding: 7px; } -.just-perfection-api-panel-button-padding-size8 .panel-button { -natural-hpadding: 8px; -minimum-hpadding: 8px; } -.just-perfection-api-panel-button-padding-size9 .panel-button { -natural-hpadding: 9px; -minimum-hpadding: 9px; } -.just-perfection-api-panel-button-padding-size10 .panel-button { -natural-hpadding: 10px; -minimum-hpadding: 10px; } -.just-perfection-api-panel-button-padding-size11 .panel-button { -natural-hpadding: 11px; -minimum-hpadding: 11px; } -.just-perfection-api-panel-button-padding-size12 .panel-button { -natural-hpadding: 12px; -minimum-hpadding: 12px; } -.just-perfection-api-panel-button-padding-size13 .panel-button { -natural-hpadding: 13px; -minimum-hpadding: 13px; } -.just-perfection-api-panel-button-padding-size14 .panel-button { -natural-hpadding: 14px; -minimum-hpadding: 14px; } -.just-perfection-api-panel-button-padding-size15 .panel-button { -natural-hpadding: 15px; -minimum-hpadding: 15px; } -.just-perfection-api-panel-button-padding-size16 .panel-button { -natural-hpadding: 16px; -minimum-hpadding: 16px; } -.just-perfection-api-panel-button-padding-size17 .panel-button { -natural-hpadding: 17px; -minimum-hpadding: 17px; } -.just-perfection-api-panel-button-padding-size18 .panel-button { -natural-hpadding: 18px; -minimum-hpadding: 18px; } -.just-perfection-api-panel-button-padding-size19 .panel-button { -natural-hpadding: 19px; -minimum-hpadding: 19px; } -.just-perfection-api-panel-button-padding-size20 .panel-button { -natural-hpadding: 20px; -minimum-hpadding: 20px; } -.just-perfection-api-panel-button-padding-size21 .panel-button { -natural-hpadding: 21px; -minimum-hpadding: 21px; } -.just-perfection-api-panel-button-padding-size22 .panel-button { -natural-hpadding: 22px; -minimum-hpadding: 22px; } -.just-perfection-api-panel-button-padding-size23 .panel-button { -natural-hpadding: 23px; -minimum-hpadding: 23px; } -.just-perfection-api-panel-button-padding-size24 .panel-button { -natural-hpadding: 24px; -minimum-hpadding: 24px; } -.just-perfection-api-panel-button-padding-size25 .panel-button { -natural-hpadding: 25px; -minimum-hpadding: 25px; } -.just-perfection-api-panel-button-padding-size26 .panel-button { -natural-hpadding: 26px; -minimum-hpadding: 26px; } -.just-perfection-api-panel-button-padding-size27 .panel-button { -natural-hpadding: 27px; -minimum-hpadding: 27px; } -.just-perfection-api-panel-button-padding-size28 .panel-button { -natural-hpadding: 28px; -minimum-hpadding: 28px; } -.just-perfection-api-panel-button-padding-size29 .panel-button { -natural-hpadding: 29px; -minimum-hpadding: 29px; } -.just-perfection-api-panel-button-padding-size30 .panel-button { -natural-hpadding: 30px; -minimum-hpadding: 30px; } -.just-perfection-api-panel-button-padding-size31 .panel-button { -natural-hpadding: 31px; -minimum-hpadding: 31px; } -.just-perfection-api-panel-button-padding-size32 .panel-button { -natural-hpadding: 32px; -minimum-hpadding: 32px; } -.just-perfection-api-panel-button-padding-size33 .panel-button { -natural-hpadding: 33px; -minimum-hpadding: 33px; } -.just-perfection-api-panel-button-padding-size34 .panel-button { -natural-hpadding: 34px; -minimum-hpadding: 34px; } -.just-perfection-api-panel-button-padding-size35 .panel-button { -natural-hpadding: 35px; -minimum-hpadding: 35px; } -.just-perfection-api-panel-button-padding-size36 .panel-button { -natural-hpadding: 36px; -minimum-hpadding: 36px; } -.just-perfection-api-panel-button-padding-size37 .panel-button { -natural-hpadding: 37px; -minimum-hpadding: 37px; } -.just-perfection-api-panel-button-padding-size38 .panel-button { -natural-hpadding: 38px; -minimum-hpadding: 38px; } -.just-perfection-api-panel-button-padding-size39 .panel-button { -natural-hpadding: 39px; -minimum-hpadding: 39px; } -.just-perfection-api-panel-button-padding-size40 .panel-button { -natural-hpadding: 40px; -minimum-hpadding: 40px; } -.just-perfection-api-panel-button-padding-size41 .panel-button { -natural-hpadding: 41px; -minimum-hpadding: 41px; } -.just-perfection-api-panel-button-padding-size42 .panel-button { -natural-hpadding: 42px; -minimum-hpadding: 42px; } -.just-perfection-api-panel-button-padding-size43 .panel-button { -natural-hpadding: 43px; -minimum-hpadding: 43px; } -.just-perfection-api-panel-button-padding-size44 .panel-button { -natural-hpadding: 44px; -minimum-hpadding: 44px; } -.just-perfection-api-panel-button-padding-size45 .panel-button { -natural-hpadding: 45px; -minimum-hpadding: 45px; } -.just-perfection-api-panel-button-padding-size46 .panel-button { -natural-hpadding: 46px; -minimum-hpadding: 46px; } -.just-perfection-api-panel-button-padding-size47 .panel-button { -natural-hpadding: 47px; -minimum-hpadding: 47px; } -.just-perfection-api-panel-button-padding-size48 .panel-button { -natural-hpadding: 48px; -minimum-hpadding: 48px; } -.just-perfection-api-panel-button-padding-size49 .panel-button { -natural-hpadding: 49px; -minimum-hpadding: 49px; } -.just-perfection-api-panel-button-padding-size50 .panel-button { -natural-hpadding: 50px; -minimum-hpadding: 50px; } -.just-perfection-api-panel-button-padding-size51 .panel-button { -natural-hpadding: 51px; -minimum-hpadding: 51px; } -.just-perfection-api-panel-button-padding-size52 .panel-button { -natural-hpadding: 52px; -minimum-hpadding: 52px; } -.just-perfection-api-panel-button-padding-size53 .panel-button { -natural-hpadding: 53px; -minimum-hpadding: 53px; } -.just-perfection-api-panel-button-padding-size54 .panel-button { -natural-hpadding: 54px; -minimum-hpadding: 54px; } -.just-perfection-api-panel-button-padding-size55 .panel-button { -natural-hpadding: 55px; -minimum-hpadding: 55px; } -.just-perfection-api-panel-button-padding-size56 .panel-button { -natural-hpadding: 56px; -minimum-hpadding: 56px; } -.just-perfection-api-panel-button-padding-size57 .panel-button { -natural-hpadding: 57px; -minimum-hpadding: 57px; } -.just-perfection-api-panel-button-padding-size58 .panel-button { -natural-hpadding: 58px; -minimum-hpadding: 58px; } -.just-perfection-api-panel-button-padding-size59 .panel-button { -natural-hpadding: 59px; -minimum-hpadding: 59px; } -.just-perfection-api-panel-button-padding-size60 .panel-button { -natural-hpadding: 60px; -minimum-hpadding: 60px; } - -.just-perfection-api-no-window-caption .window-caption -{ - spacing: 0; - background-color: transparent; - border-radius: 0; - border: 0; - padding: 0; - font-size: 0; -} - -.just-perfection-api-workspace-background-radius-size0 .workspace-background { border-radius: 0; } -.just-perfection-api-workspace-background-radius-size1 .workspace-background { border-radius: 1px; } -.just-perfection-api-workspace-background-radius-size2 .workspace-background { border-radius: 2px; } -.just-perfection-api-workspace-background-radius-size3 .workspace-background { border-radius: 3px; } -.just-perfection-api-workspace-background-radius-size4 .workspace-background { border-radius: 4px; } -.just-perfection-api-workspace-background-radius-size5 .workspace-background { border-radius: 5px; } -.just-perfection-api-workspace-background-radius-size6 .workspace-background { border-radius: 6px; } -.just-perfection-api-workspace-background-radius-size7 .workspace-background { border-radius: 7px; } -.just-perfection-api-workspace-background-radius-size8 .workspace-background { border-radius: 8px; } -.just-perfection-api-workspace-background-radius-size9 .workspace-background { border-radius: 9px; } -.just-perfection-api-workspace-background-radius-size10 .workspace-background { border-radius: 10px; } -.just-perfection-api-workspace-background-radius-size11 .workspace-background { border-radius: 11px; } -.just-perfection-api-workspace-background-radius-size12 .workspace-background { border-radius: 12px; } -.just-perfection-api-workspace-background-radius-size13 .workspace-background { border-radius: 13px; } -.just-perfection-api-workspace-background-radius-size14 .workspace-background { border-radius: 14px; } -.just-perfection-api-workspace-background-radius-size15 .workspace-background { border-radius: 15px; } -.just-perfection-api-workspace-background-radius-size16 .workspace-background { border-radius: 16px; } -.just-perfection-api-workspace-background-radius-size17 .workspace-background { border-radius: 17px; } -.just-perfection-api-workspace-background-radius-size18 .workspace-background { border-radius: 18px; } -.just-perfection-api-workspace-background-radius-size19 .workspace-background { border-radius: 19px; } -.just-perfection-api-workspace-background-radius-size20 .workspace-background { border-radius: 20px; } -.just-perfection-api-workspace-background-radius-size21 .workspace-background { border-radius: 21px; } -.just-perfection-api-workspace-background-radius-size22 .workspace-background { border-radius: 22px; } -.just-perfection-api-workspace-background-radius-size23 .workspace-background { border-radius: 23px; } -.just-perfection-api-workspace-background-radius-size24 .workspace-background { border-radius: 24px; } -.just-perfection-api-workspace-background-radius-size25 .workspace-background { border-radius: 25px; } -.just-perfection-api-workspace-background-radius-size26 .workspace-background { border-radius: 26px; } -.just-perfection-api-workspace-background-radius-size27 .workspace-background { border-radius: 27px; } -.just-perfection-api-workspace-background-radius-size28 .workspace-background { border-radius: 28px; } -.just-perfection-api-workspace-background-radius-size29 .workspace-background { border-radius: 29px; } -.just-perfection-api-workspace-background-radius-size30 .workspace-background { border-radius: 30px; } -.just-perfection-api-workspace-background-radius-size31 .workspace-background { border-radius: 31px; } -.just-perfection-api-workspace-background-radius-size32 .workspace-background { border-radius: 32px; } -.just-perfection-api-workspace-background-radius-size33 .workspace-background { border-radius: 33px; } -.just-perfection-api-workspace-background-radius-size34 .workspace-background { border-radius: 34px; } -.just-perfection-api-workspace-background-radius-size35 .workspace-background { border-radius: 35px; } -.just-perfection-api-workspace-background-radius-size36 .workspace-background { border-radius: 36px; } -.just-perfection-api-workspace-background-radius-size37 .workspace-background { border-radius: 37px; } -.just-perfection-api-workspace-background-radius-size38 .workspace-background { border-radius: 38px; } -.just-perfection-api-workspace-background-radius-size39 .workspace-background { border-radius: 39px; } -.just-perfection-api-workspace-background-radius-size40 .workspace-background { border-radius: 40px; } -.just-perfection-api-workspace-background-radius-size41 .workspace-background { border-radius: 41px; } -.just-perfection-api-workspace-background-radius-size42 .workspace-background { border-radius: 42px; } -.just-perfection-api-workspace-background-radius-size43 .workspace-background { border-radius: 43px; } -.just-perfection-api-workspace-background-radius-size44 .workspace-background { border-radius: 44px; } -.just-perfection-api-workspace-background-radius-size45 .workspace-background { border-radius: 45px; } -.just-perfection-api-workspace-background-radius-size46 .workspace-background { border-radius: 46px; } -.just-perfection-api-workspace-background-radius-size47 .workspace-background { border-radius: 47px; } -.just-perfection-api-workspace-background-radius-size48 .workspace-background { border-radius: 48px; } -.just-perfection-api-workspace-background-radius-size49 .workspace-background { border-radius: 49px; } -.just-perfection-api-workspace-background-radius-size50 .workspace-background { border-radius: 50px; } -.just-perfection-api-workspace-background-radius-size51 .workspace-background { border-radius: 51px; } -.just-perfection-api-workspace-background-radius-size52 .workspace-background { border-radius: 52px; } -.just-perfection-api-workspace-background-radius-size53 .workspace-background { border-radius: 53px; } -.just-perfection-api-workspace-background-radius-size54 .workspace-background { border-radius: 54px; } -.just-perfection-api-workspace-background-radius-size55 .workspace-background { border-radius: 55px; } -.just-perfection-api-workspace-background-radius-size56 .workspace-background { border-radius: 56px; } -.just-perfection-api-workspace-background-radius-size57 .workspace-background { border-radius: 57px; } -.just-perfection-api-workspace-background-radius-size58 .workspace-background { border-radius: 58px; } -.just-perfection-api-workspace-background-radius-size59 .workspace-background { border-radius: 59px; } -.just-perfection-api-workspace-background-radius-size60 .workspace-background { border-radius: 60px; } - -.just-perfection-api-panel-indicator-padding-size0 .panel-status-indicators-box { spacing: 0; } -.just-perfection-api-panel-indicator-padding-size1 .panel-status-indicators-box { spacing: 1px; } -.just-perfection-api-panel-indicator-padding-size2 .panel-status-indicators-box { spacing: 2px; } -.just-perfection-api-panel-indicator-padding-size3 .panel-status-indicators-box { spacing: 3px; } -.just-perfection-api-panel-indicator-padding-size4 .panel-status-indicators-box { spacing: 4px; } -.just-perfection-api-panel-indicator-padding-size5 .panel-status-indicators-box { spacing: 5px; } -.just-perfection-api-panel-indicator-padding-size6 .panel-status-indicators-box { spacing: 6px; } -.just-perfection-api-panel-indicator-padding-size7 .panel-status-indicators-box { spacing: 7px; } -.just-perfection-api-panel-indicator-padding-size8 .panel-status-indicators-box { spacing: 8px; } -.just-perfection-api-panel-indicator-padding-size9 .panel-status-indicators-box { spacing: 9px; } -.just-perfection-api-panel-indicator-padding-size10 .panel-status-indicators-box { spacing: 10px; } -.just-perfection-api-panel-indicator-padding-size11 .panel-status-indicators-box { spacing: 11px; } -.just-perfection-api-panel-indicator-padding-size12 .panel-status-indicators-box { spacing: 12px; } -.just-perfection-api-panel-indicator-padding-size13 .panel-status-indicators-box { spacing: 13px; } -.just-perfection-api-panel-indicator-padding-size14 .panel-status-indicators-box { spacing: 14px; } -.just-perfection-api-panel-indicator-padding-size15 .panel-status-indicators-box { spacing: 15px; } -.just-perfection-api-panel-indicator-padding-size16 .panel-status-indicators-box { spacing: 16px; } -.just-perfection-api-panel-indicator-padding-size17 .panel-status-indicators-box { spacing: 17px; } -.just-perfection-api-panel-indicator-padding-size18 .panel-status-indicators-box { spacing: 18px; } -.just-perfection-api-panel-indicator-padding-size19 .panel-status-indicators-box { spacing: 19px; } -.just-perfection-api-panel-indicator-padding-size20 .panel-status-indicators-box { spacing: 20px; } -.just-perfection-api-panel-indicator-padding-size21 .panel-status-indicators-box { spacing: 21px; } -.just-perfection-api-panel-indicator-padding-size22 .panel-status-indicators-box { spacing: 22px; } -.just-perfection-api-panel-indicator-padding-size23 .panel-status-indicators-box { spacing: 23px; } -.just-perfection-api-panel-indicator-padding-size24 .panel-status-indicators-box { spacing: 24px; } -.just-perfection-api-panel-indicator-padding-size25 .panel-status-indicators-box { spacing: 25px; } -.just-perfection-api-panel-indicator-padding-size26 .panel-status-indicators-box { spacing: 26px; } -.just-perfection-api-panel-indicator-padding-size27 .panel-status-indicators-box { spacing: 27px; } -.just-perfection-api-panel-indicator-padding-size28 .panel-status-indicators-box { spacing: 28px; } -.just-perfection-api-panel-indicator-padding-size29 .panel-status-indicators-box { spacing: 29px; } -.just-perfection-api-panel-indicator-padding-size30 .panel-status-indicators-box { spacing: 30px; } -.just-perfection-api-panel-indicator-padding-size31 .panel-status-indicators-box { spacing: 31px; } -.just-perfection-api-panel-indicator-padding-size32 .panel-status-indicators-box { spacing: 32px; } -.just-perfection-api-panel-indicator-padding-size33 .panel-status-indicators-box { spacing: 33px; } -.just-perfection-api-panel-indicator-padding-size34 .panel-status-indicators-box { spacing: 34px; } -.just-perfection-api-panel-indicator-padding-size35 .panel-status-indicators-box { spacing: 35px; } -.just-perfection-api-panel-indicator-padding-size36 .panel-status-indicators-box { spacing: 36px; } -.just-perfection-api-panel-indicator-padding-size37 .panel-status-indicators-box { spacing: 37px; } -.just-perfection-api-panel-indicator-padding-size38 .panel-status-indicators-box { spacing: 38px; } -.just-perfection-api-panel-indicator-padding-size39 .panel-status-indicators-box { spacing: 39px; } -.just-perfection-api-panel-indicator-padding-size40 .panel-status-indicators-box { spacing: 40px; } -.just-perfection-api-panel-indicator-padding-size41 .panel-status-indicators-box { spacing: 41px; } -.just-perfection-api-panel-indicator-padding-size42 .panel-status-indicators-box { spacing: 42px; } -.just-perfection-api-panel-indicator-padding-size43 .panel-status-indicators-box { spacing: 43px; } -.just-perfection-api-panel-indicator-padding-size44 .panel-status-indicators-box { spacing: 44px; } -.just-perfection-api-panel-indicator-padding-size45 .panel-status-indicators-box { spacing: 45px; } -.just-perfection-api-panel-indicator-padding-size46 .panel-status-indicators-box { spacing: 46px; } -.just-perfection-api-panel-indicator-padding-size47 .panel-status-indicators-box { spacing: 47px; } -.just-perfection-api-panel-indicator-padding-size48 .panel-status-indicators-box { spacing: 48px; } -.just-perfection-api-panel-indicator-padding-size49 .panel-status-indicators-box { spacing: 49px; } -.just-perfection-api-panel-indicator-padding-size50 .panel-status-indicators-box { spacing: 50px; } -.just-perfection-api-panel-indicator-padding-size51 .panel-status-indicators-box { spacing: 51px; } -.just-perfection-api-panel-indicator-padding-size52 .panel-status-indicators-box { spacing: 52px; } -.just-perfection-api-panel-indicator-padding-size53 .panel-status-indicators-box { spacing: 53px; } -.just-perfection-api-panel-indicator-padding-size54 .panel-status-indicators-box { spacing: 54px; } -.just-perfection-api-panel-indicator-padding-size55 .panel-status-indicators-box { spacing: 55px; } -.just-perfection-api-panel-indicator-padding-size56 .panel-status-indicators-box { spacing: 56px; } -.just-perfection-api-panel-indicator-padding-size57 .panel-status-indicators-box { spacing: 57px; } -.just-perfection-api-panel-indicator-padding-size58 .panel-status-indicators-box { spacing: 58px; } -.just-perfection-api-panel-indicator-padding-size59 .panel-status-indicators-box { spacing: 59px; } -.just-perfection-api-panel-indicator-padding-size60 .panel-status-indicators-box { spacing: 60px; } - -.just-perfection-api-no-window-close .window-close, -.just-perfection-api-no-window-close.just-perfection .window-close -{ - height: 0; - width: 30px; - background: transparent; - border-radius: 0; - border: 0; - spacing: 0; - box-shadow: none; -} - -.just-perfection-api-no-ripple-box .ripple-box -{ - background-color: transparent; -} - -/** - * This can refresh other styles that is not inculding any standard css styles. - * values are not important here. Just do something that can change the look - */ -.just-perfection-api-refresh-styles .panel-button, -.just-perfection-api-refresh-styles .panel-status-indicators-box, -.just-perfection-api-refresh-styles .panel-button StIcon, -.just-perfection-api-refresh-styles .system-status-icon -{ - background-color: gold; - color: gold; - border-radius: 100px; -} - -.just-perfection-api-no-weather .weather-button, -.just-perfection-api-no-weather .weather-button *, -.just-perfection-api-no-events-button .events-button, -.just-perfection-api-no-events-button .events-button *, -.just-perfection-api-no-screen-sharing-indicator .screen-sharing-indicator, -.just-perfection-api-no-screen-sharing-indicator .screen-sharing-indicator *, -.just-perfection-api-no-screen-recording-indicator .screen-recording-indicator, -.just-perfection-api-no-screen-recording-indicator .screen-recording-indicator * -{ - padding: 0; - margin: 0; - border: 0; - height: 0; - width: 0; -} - -.just-perfection-api-panel-icon-size1 .system-status-icon, .just-perfection-api-panel-icon-size1 .panel-button StIcon { icon-size: 1px; } -.just-perfection-api-panel-icon-size2 .system-status-icon, .just-perfection-api-panel-icon-size2 .panel-button StIcon { icon-size: 2px; } -.just-perfection-api-panel-icon-size3 .system-status-icon, .just-perfection-api-panel-icon-size3 .panel-button StIcon { icon-size: 3px; } -.just-perfection-api-panel-icon-size4 .system-status-icon, .just-perfection-api-panel-icon-size4 .panel-button StIcon { icon-size: 4px; } -.just-perfection-api-panel-icon-size5 .system-status-icon, .just-perfection-api-panel-icon-size5 .panel-button StIcon { icon-size: 5px; } -.just-perfection-api-panel-icon-size6 .system-status-icon, .just-perfection-api-panel-icon-size6 .panel-button StIcon { icon-size: 6px; } -.just-perfection-api-panel-icon-size7 .system-status-icon, .just-perfection-api-panel-icon-size7 .panel-button StIcon { icon-size: 7px; } -.just-perfection-api-panel-icon-size8 .system-status-icon, .just-perfection-api-panel-icon-size8 .panel-button StIcon { icon-size: 8px; } -.just-perfection-api-panel-icon-size9 .system-status-icon, .just-perfection-api-panel-icon-size9 .panel-button StIcon { icon-size: 9px; } -.just-perfection-api-panel-icon-size10 .system-status-icon, .just-perfection-api-panel-icon-size10 .panel-button StIcon { icon-size: 10px; } -.just-perfection-api-panel-icon-size11 .system-status-icon, .just-perfection-api-panel-icon-size11 .panel-button StIcon { icon-size: 11px; } -.just-perfection-api-panel-icon-size12 .system-status-icon, .just-perfection-api-panel-icon-size12 .panel-button StIcon { icon-size: 12px; } -.just-perfection-api-panel-icon-size13 .system-status-icon, .just-perfection-api-panel-icon-size13 .panel-button StIcon { icon-size: 13px; } -.just-perfection-api-panel-icon-size14 .system-status-icon, .just-perfection-api-panel-icon-size14 .panel-button StIcon { icon-size: 14px; } -.just-perfection-api-panel-icon-size15 .system-status-icon, .just-perfection-api-panel-icon-size15 .panel-button StIcon { icon-size: 15px; } -.just-perfection-api-panel-icon-size16 .system-status-icon, .just-perfection-api-panel-icon-size16 .panel-button StIcon { icon-size: 16px; } -.just-perfection-api-panel-icon-size17 .system-status-icon, .just-perfection-api-panel-icon-size17 .panel-button StIcon { icon-size: 17px; } -.just-perfection-api-panel-icon-size18 .system-status-icon, .just-perfection-api-panel-icon-size18 .panel-button StIcon { icon-size: 18px; } -.just-perfection-api-panel-icon-size19 .system-status-icon, .just-perfection-api-panel-icon-size19 .panel-button StIcon { icon-size: 19px; } -.just-perfection-api-panel-icon-size20 .system-status-icon, .just-perfection-api-panel-icon-size20 .panel-button StIcon { icon-size: 20px; } -.just-perfection-api-panel-icon-size21 .system-status-icon, .just-perfection-api-panel-icon-size21 .panel-button StIcon { icon-size: 21px; } -.just-perfection-api-panel-icon-size22 .system-status-icon, .just-perfection-api-panel-icon-size22 .panel-button StIcon { icon-size: 22px; } -.just-perfection-api-panel-icon-size23 .system-status-icon, .just-perfection-api-panel-icon-size23 .panel-button StIcon { icon-size: 23px; } -.just-perfection-api-panel-icon-size24 .system-status-icon, .just-perfection-api-panel-icon-size24 .panel-button StIcon { icon-size: 24px; } -.just-perfection-api-panel-icon-size25 .system-status-icon, .just-perfection-api-panel-icon-size25 .panel-button StIcon { icon-size: 25px; } -.just-perfection-api-panel-icon-size26 .system-status-icon, .just-perfection-api-panel-icon-size26 .panel-button StIcon { icon-size: 26px; } -.just-perfection-api-panel-icon-size27 .system-status-icon, .just-perfection-api-panel-icon-size27 .panel-button StIcon { icon-size: 27px; } -.just-perfection-api-panel-icon-size28 .system-status-icon, .just-perfection-api-panel-icon-size28 .panel-button StIcon { icon-size: 28px; } -.just-perfection-api-panel-icon-size29 .system-status-icon, .just-perfection-api-panel-icon-size29 .panel-button StIcon { icon-size: 29px; } -.just-perfection-api-panel-icon-size30 .system-status-icon, .just-perfection-api-panel-icon-size30 .panel-button StIcon { icon-size: 30px; } -.just-perfection-api-panel-icon-size31 .system-status-icon, .just-perfection-api-panel-icon-size31 .panel-button StIcon { icon-size: 31px; } -.just-perfection-api-panel-icon-size32 .system-status-icon, .just-perfection-api-panel-icon-size32 .panel-button StIcon { icon-size: 32px; } -.just-perfection-api-panel-icon-size33 .system-status-icon, .just-perfection-api-panel-icon-size33 .panel-button StIcon { icon-size: 33px; } -.just-perfection-api-panel-icon-size34 .system-status-icon, .just-perfection-api-panel-icon-size34 .panel-button StIcon { icon-size: 34px; } -.just-perfection-api-panel-icon-size35 .system-status-icon, .just-perfection-api-panel-icon-size35 .panel-button StIcon { icon-size: 35px; } -.just-perfection-api-panel-icon-size36 .system-status-icon, .just-perfection-api-panel-icon-size36 .panel-button StIcon { icon-size: 36px; } -.just-perfection-api-panel-icon-size37 .system-status-icon, .just-perfection-api-panel-icon-size37 .panel-button StIcon { icon-size: 37px; } -.just-perfection-api-panel-icon-size38 .system-status-icon, .just-perfection-api-panel-icon-size38 .panel-button StIcon { icon-size: 38px; } -.just-perfection-api-panel-icon-size39 .system-status-icon, .just-perfection-api-panel-icon-size39 .panel-button StIcon { icon-size: 39px; } -.just-perfection-api-panel-icon-size40 .system-status-icon, .just-perfection-api-panel-icon-size40 .panel-button StIcon { icon-size: 40px; } -.just-perfection-api-panel-icon-size41 .system-status-icon, .just-perfection-api-panel-icon-size41 .panel-button StIcon { icon-size: 41px; } -.just-perfection-api-panel-icon-size42 .system-status-icon, .just-perfection-api-panel-icon-size42 .panel-button StIcon { icon-size: 42px; } -.just-perfection-api-panel-icon-size43 .system-status-icon, .just-perfection-api-panel-icon-size43 .panel-button StIcon { icon-size: 43px; } -.just-perfection-api-panel-icon-size44 .system-status-icon, .just-perfection-api-panel-icon-size44 .panel-button StIcon { icon-size: 44px; } -.just-perfection-api-panel-icon-size45 .system-status-icon, .just-perfection-api-panel-icon-size45 .panel-button StIcon { icon-size: 45px; } -.just-perfection-api-panel-icon-size46 .system-status-icon, .just-perfection-api-panel-icon-size46 .panel-button StIcon { icon-size: 46px; } -.just-perfection-api-panel-icon-size47 .system-status-icon, .just-perfection-api-panel-icon-size47 .panel-button StIcon { icon-size: 47px; } -.just-perfection-api-panel-icon-size48 .system-status-icon, .just-perfection-api-panel-icon-size48 .panel-button StIcon { icon-size: 48px; } -.just-perfection-api-panel-icon-size49 .system-status-icon, .just-perfection-api-panel-icon-size49 .panel-button StIcon { icon-size: 49px; } -.just-perfection-api-panel-icon-size50 .system-status-icon, .just-perfection-api-panel-icon-size50 .panel-button StIcon { icon-size: 50px; } -.just-perfection-api-panel-icon-size51 .system-status-icon, .just-perfection-api-panel-icon-size51 .panel-button StIcon { icon-size: 51px; } -.just-perfection-api-panel-icon-size52 .system-status-icon, .just-perfection-api-panel-icon-size52 .panel-button StIcon { icon-size: 52px; } -.just-perfection-api-panel-icon-size53 .system-status-icon, .just-perfection-api-panel-icon-size53 .panel-button StIcon { icon-size: 53px; } -.just-perfection-api-panel-icon-size54 .system-status-icon, .just-perfection-api-panel-icon-size54 .panel-button StIcon { icon-size: 54px; } -.just-perfection-api-panel-icon-size55 .system-status-icon, .just-perfection-api-panel-icon-size55 .panel-button StIcon { icon-size: 55px; } -.just-perfection-api-panel-icon-size56 .system-status-icon, .just-perfection-api-panel-icon-size56 .panel-button StIcon { icon-size: 56px; } -.just-perfection-api-panel-icon-size57 .system-status-icon, .just-perfection-api-panel-icon-size57 .panel-button StIcon { icon-size: 57px; } -.just-perfection-api-panel-icon-size58 .system-status-icon, .just-perfection-api-panel-icon-size58 .panel-button StIcon { icon-size: 58px; } -.just-perfection-api-panel-icon-size59 .system-status-icon, .just-perfection-api-panel-icon-size59 .panel-button StIcon { icon-size: 59px; } -.just-perfection-api-panel-icon-size60 .system-status-icon, .just-perfection-api-panel-icon-size60 .panel-button StIcon { icon-size: 60px; } - -.just-perfection-api-controls-manager-spacing-size0 .controls-manager, .just-perfection-api-controls-manager-spacing-size0 .secondary-monitor-workspaces { spacing: 0; } -.just-perfection-api-controls-manager-spacing-size1 .controls-manager, .just-perfection-api-controls-manager-spacing-size1 .secondary-monitor-workspaces { spacing: 1px; } -.just-perfection-api-controls-manager-spacing-size2 .controls-manager, .just-perfection-api-controls-manager-spacing-size2 .secondary-monitor-workspaces { spacing: 2px; } -.just-perfection-api-controls-manager-spacing-size3 .controls-manager, .just-perfection-api-controls-manager-spacing-size3 .secondary-monitor-workspaces { spacing: 3px; } -.just-perfection-api-controls-manager-spacing-size4 .controls-manager, .just-perfection-api-controls-manager-spacing-size4 .secondary-monitor-workspaces { spacing: 4px; } -.just-perfection-api-controls-manager-spacing-size5 .controls-manager, .just-perfection-api-controls-manager-spacing-size5 .secondary-monitor-workspaces { spacing: 5px; } -.just-perfection-api-controls-manager-spacing-size6 .controls-manager, .just-perfection-api-controls-manager-spacing-size6 .secondary-monitor-workspaces { spacing: 6px; } -.just-perfection-api-controls-manager-spacing-size7 .controls-manager, .just-perfection-api-controls-manager-spacing-size7 .secondary-monitor-workspaces { spacing: 7px; } -.just-perfection-api-controls-manager-spacing-size8 .controls-manager, .just-perfection-api-controls-manager-spacing-size8 .secondary-monitor-workspaces { spacing: 8px; } -.just-perfection-api-controls-manager-spacing-size9 .controls-manager, .just-perfection-api-controls-manager-spacing-size9 .secondary-monitor-workspaces { spacing: 9px; } -.just-perfection-api-controls-manager-spacing-size10 .controls-manager, .just-perfection-api-controls-manager-spacing-size10 .secondary-monitor-workspaces { spacing: 10px; } -.just-perfection-api-controls-manager-spacing-size11 .controls-manager, .just-perfection-api-controls-manager-spacing-size11 .secondary-monitor-workspaces { spacing: 11px; } -.just-perfection-api-controls-manager-spacing-size12 .controls-manager, .just-perfection-api-controls-manager-spacing-size12 .secondary-monitor-workspaces { spacing: 12px; } -.just-perfection-api-controls-manager-spacing-size13 .controls-manager, .just-perfection-api-controls-manager-spacing-size13 .secondary-monitor-workspaces { spacing: 13px; } -.just-perfection-api-controls-manager-spacing-size14 .controls-manager, .just-perfection-api-controls-manager-spacing-size14 .secondary-monitor-workspaces { spacing: 14px; } -.just-perfection-api-controls-manager-spacing-size15 .controls-manager, .just-perfection-api-controls-manager-spacing-size15 .secondary-monitor-workspaces { spacing: 15px; } -.just-perfection-api-controls-manager-spacing-size16 .controls-manager, .just-perfection-api-controls-manager-spacing-size16 .secondary-monitor-workspaces { spacing: 16px; } -.just-perfection-api-controls-manager-spacing-size17 .controls-manager, .just-perfection-api-controls-manager-spacing-size17 .secondary-monitor-workspaces { spacing: 17px; } -.just-perfection-api-controls-manager-spacing-size18 .controls-manager, .just-perfection-api-controls-manager-spacing-size18 .secondary-monitor-workspaces { spacing: 18px; } -.just-perfection-api-controls-manager-spacing-size19 .controls-manager, .just-perfection-api-controls-manager-spacing-size19 .secondary-monitor-workspaces { spacing: 19px; } -.just-perfection-api-controls-manager-spacing-size20 .controls-manager, .just-perfection-api-controls-manager-spacing-size20 .secondary-monitor-workspaces { spacing: 20px; } -.just-perfection-api-controls-manager-spacing-size21 .controls-manager, .just-perfection-api-controls-manager-spacing-size21 .secondary-monitor-workspaces { spacing: 21px; } -.just-perfection-api-controls-manager-spacing-size22 .controls-manager, .just-perfection-api-controls-manager-spacing-size22 .secondary-monitor-workspaces { spacing: 22px; } -.just-perfection-api-controls-manager-spacing-size23 .controls-manager, .just-perfection-api-controls-manager-spacing-size23 .secondary-monitor-workspaces { spacing: 23px; } -.just-perfection-api-controls-manager-spacing-size24 .controls-manager, .just-perfection-api-controls-manager-spacing-size24 .secondary-monitor-workspaces { spacing: 24px; } -.just-perfection-api-controls-manager-spacing-size25 .controls-manager, .just-perfection-api-controls-manager-spacing-size25 .secondary-monitor-workspaces { spacing: 25px; } -.just-perfection-api-controls-manager-spacing-size26 .controls-manager, .just-perfection-api-controls-manager-spacing-size26 .secondary-monitor-workspaces { spacing: 26px; } -.just-perfection-api-controls-manager-spacing-size27 .controls-manager, .just-perfection-api-controls-manager-spacing-size27 .secondary-monitor-workspaces { spacing: 27px; } -.just-perfection-api-controls-manager-spacing-size28 .controls-manager, .just-perfection-api-controls-manager-spacing-size28 .secondary-monitor-workspaces { spacing: 28px; } -.just-perfection-api-controls-manager-spacing-size29 .controls-manager, .just-perfection-api-controls-manager-spacing-size29 .secondary-monitor-workspaces { spacing: 29px; } -.just-perfection-api-controls-manager-spacing-size30 .controls-manager, .just-perfection-api-controls-manager-spacing-size30 .secondary-monitor-workspaces { spacing: 30px; } -.just-perfection-api-controls-manager-spacing-size31 .controls-manager, .just-perfection-api-controls-manager-spacing-size31 .secondary-monitor-workspaces { spacing: 31px; } -.just-perfection-api-controls-manager-spacing-size32 .controls-manager, .just-perfection-api-controls-manager-spacing-size32 .secondary-monitor-workspaces { spacing: 32px; } -.just-perfection-api-controls-manager-spacing-size33 .controls-manager, .just-perfection-api-controls-manager-spacing-size33 .secondary-monitor-workspaces { spacing: 33px; } -.just-perfection-api-controls-manager-spacing-size34 .controls-manager, .just-perfection-api-controls-manager-spacing-size34 .secondary-monitor-workspaces { spacing: 34px; } -.just-perfection-api-controls-manager-spacing-size35 .controls-manager, .just-perfection-api-controls-manager-spacing-size35 .secondary-monitor-workspaces { spacing: 35px; } -.just-perfection-api-controls-manager-spacing-size36 .controls-manager, .just-perfection-api-controls-manager-spacing-size36 .secondary-monitor-workspaces { spacing: 36px; } -.just-perfection-api-controls-manager-spacing-size37 .controls-manager, .just-perfection-api-controls-manager-spacing-size37 .secondary-monitor-workspaces { spacing: 37px; } -.just-perfection-api-controls-manager-spacing-size38 .controls-manager, .just-perfection-api-controls-manager-spacing-size38 .secondary-monitor-workspaces { spacing: 38px; } -.just-perfection-api-controls-manager-spacing-size39 .controls-manager, .just-perfection-api-controls-manager-spacing-size39 .secondary-monitor-workspaces { spacing: 39px; } -.just-perfection-api-controls-manager-spacing-size40 .controls-manager, .just-perfection-api-controls-manager-spacing-size40 .secondary-monitor-workspaces { spacing: 40px; } -.just-perfection-api-controls-manager-spacing-size41 .controls-manager, .just-perfection-api-controls-manager-spacing-size41 .secondary-monitor-workspaces { spacing: 41px; } -.just-perfection-api-controls-manager-spacing-size42 .controls-manager, .just-perfection-api-controls-manager-spacing-size42 .secondary-monitor-workspaces { spacing: 42px; } -.just-perfection-api-controls-manager-spacing-size43 .controls-manager, .just-perfection-api-controls-manager-spacing-size43 .secondary-monitor-workspaces { spacing: 43px; } -.just-perfection-api-controls-manager-spacing-size44 .controls-manager, .just-perfection-api-controls-manager-spacing-size44 .secondary-monitor-workspaces { spacing: 44px; } -.just-perfection-api-controls-manager-spacing-size45 .controls-manager, .just-perfection-api-controls-manager-spacing-size45 .secondary-monitor-workspaces { spacing: 45px; } -.just-perfection-api-controls-manager-spacing-size46 .controls-manager, .just-perfection-api-controls-manager-spacing-size46 .secondary-monitor-workspaces { spacing: 46px; } -.just-perfection-api-controls-manager-spacing-size47 .controls-manager, .just-perfection-api-controls-manager-spacing-size47 .secondary-monitor-workspaces { spacing: 47px; } -.just-perfection-api-controls-manager-spacing-size48 .controls-manager, .just-perfection-api-controls-manager-spacing-size48 .secondary-monitor-workspaces { spacing: 48px; } -.just-perfection-api-controls-manager-spacing-size49 .controls-manager, .just-perfection-api-controls-manager-spacing-size49 .secondary-monitor-workspaces { spacing: 49px; } -.just-perfection-api-controls-manager-spacing-size50 .controls-manager, .just-perfection-api-controls-manager-spacing-size50 .secondary-monitor-workspaces { spacing: 50px; } -.just-perfection-api-controls-manager-spacing-size51 .controls-manager, .just-perfection-api-controls-manager-spacing-size51 .secondary-monitor-workspaces { spacing: 51px; } -.just-perfection-api-controls-manager-spacing-size52 .controls-manager, .just-perfection-api-controls-manager-spacing-size52 .secondary-monitor-workspaces { spacing: 52px; } -.just-perfection-api-controls-manager-spacing-size53 .controls-manager, .just-perfection-api-controls-manager-spacing-size53 .secondary-monitor-workspaces { spacing: 53px; } -.just-perfection-api-controls-manager-spacing-size54 .controls-manager, .just-perfection-api-controls-manager-spacing-size54 .secondary-monitor-workspaces { spacing: 54px; } -.just-perfection-api-controls-manager-spacing-size55 .controls-manager, .just-perfection-api-controls-manager-spacing-size55 .secondary-monitor-workspaces { spacing: 55px; } -.just-perfection-api-controls-manager-spacing-size56 .controls-manager, .just-perfection-api-controls-manager-spacing-size56 .secondary-monitor-workspaces { spacing: 56px; } -.just-perfection-api-controls-manager-spacing-size57 .controls-manager, .just-perfection-api-controls-manager-spacing-size57 .secondary-monitor-workspaces { spacing: 57px; } -.just-perfection-api-controls-manager-spacing-size58 .controls-manager, .just-perfection-api-controls-manager-spacing-size58 .secondary-monitor-workspaces { spacing: 58px; } -.just-perfection-api-controls-manager-spacing-size59 .controls-manager, .just-perfection-api-controls-manager-spacing-size59 .secondary-monitor-workspaces { spacing: 59px; } -.just-perfection-api-controls-manager-spacing-size60 .controls-manager, .just-perfection-api-controls-manager-spacing-size60 .secondary-monitor-workspaces { spacing: 60px; } -.just-perfection-api-controls-manager-spacing-size61 .controls-manager, .just-perfection-api-controls-manager-spacing-size61 .secondary-monitor-workspaces { spacing: 61px; } -.just-perfection-api-controls-manager-spacing-size62 .controls-manager, .just-perfection-api-controls-manager-spacing-size62 .secondary-monitor-workspaces { spacing: 62px; } -.just-perfection-api-controls-manager-spacing-size63 .controls-manager, .just-perfection-api-controls-manager-spacing-size63 .secondary-monitor-workspaces { spacing: 63px; } -.just-perfection-api-controls-manager-spacing-size64 .controls-manager, .just-perfection-api-controls-manager-spacing-size64 .secondary-monitor-workspaces { spacing: 64px; } -.just-perfection-api-controls-manager-spacing-size65 .controls-manager, .just-perfection-api-controls-manager-spacing-size65 .secondary-monitor-workspaces { spacing: 65px; } -.just-perfection-api-controls-manager-spacing-size66 .controls-manager, .just-perfection-api-controls-manager-spacing-size66 .secondary-monitor-workspaces { spacing: 66px; } -.just-perfection-api-controls-manager-spacing-size67 .controls-manager, .just-perfection-api-controls-manager-spacing-size67 .secondary-monitor-workspaces { spacing: 67px; } -.just-perfection-api-controls-manager-spacing-size68 .controls-manager, .just-perfection-api-controls-manager-spacing-size68 .secondary-monitor-workspaces { spacing: 68px; } -.just-perfection-api-controls-manager-spacing-size69 .controls-manager, .just-perfection-api-controls-manager-spacing-size69 .secondary-monitor-workspaces { spacing: 69px; } -.just-perfection-api-controls-manager-spacing-size70 .controls-manager, .just-perfection-api-controls-manager-spacing-size70 .secondary-monitor-workspaces { spacing: 70px; } -.just-perfection-api-controls-manager-spacing-size71 .controls-manager, .just-perfection-api-controls-manager-spacing-size71 .secondary-monitor-workspaces { spacing: 71px; } -.just-perfection-api-controls-manager-spacing-size72 .controls-manager, .just-perfection-api-controls-manager-spacing-size72 .secondary-monitor-workspaces { spacing: 72px; } -.just-perfection-api-controls-manager-spacing-size73 .controls-manager, .just-perfection-api-controls-manager-spacing-size73 .secondary-monitor-workspaces { spacing: 73px; } -.just-perfection-api-controls-manager-spacing-size74 .controls-manager, .just-perfection-api-controls-manager-spacing-size74 .secondary-monitor-workspaces { spacing: 74px; } -.just-perfection-api-controls-manager-spacing-size75 .controls-manager, .just-perfection-api-controls-manager-spacing-size75 .secondary-monitor-workspaces { spacing: 75px; } -.just-perfection-api-controls-manager-spacing-size76 .controls-manager, .just-perfection-api-controls-manager-spacing-size76 .secondary-monitor-workspaces { spacing: 76px; } -.just-perfection-api-controls-manager-spacing-size77 .controls-manager, .just-perfection-api-controls-manager-spacing-size77 .secondary-monitor-workspaces { spacing: 77px; } -.just-perfection-api-controls-manager-spacing-size78 .controls-manager, .just-perfection-api-controls-manager-spacing-size78 .secondary-monitor-workspaces { spacing: 78px; } -.just-perfection-api-controls-manager-spacing-size79 .controls-manager, .just-perfection-api-controls-manager-spacing-size79 .secondary-monitor-workspaces { spacing: 79px; } -.just-perfection-api-controls-manager-spacing-size80 .controls-manager, .just-perfection-api-controls-manager-spacing-size80 .secondary-monitor-workspaces { spacing: 80px; } -.just-perfection-api-controls-manager-spacing-size81 .controls-manager, .just-perfection-api-controls-manager-spacing-size81 .secondary-monitor-workspaces { spacing: 81px; } -.just-perfection-api-controls-manager-spacing-size82 .controls-manager, .just-perfection-api-controls-manager-spacing-size82 .secondary-monitor-workspaces { spacing: 82px; } -.just-perfection-api-controls-manager-spacing-size83 .controls-manager, .just-perfection-api-controls-manager-spacing-size83 .secondary-monitor-workspaces { spacing: 83px; } -.just-perfection-api-controls-manager-spacing-size84 .controls-manager, .just-perfection-api-controls-manager-spacing-size84 .secondary-monitor-workspaces { spacing: 84px; } -.just-perfection-api-controls-manager-spacing-size85 .controls-manager, .just-perfection-api-controls-manager-spacing-size85 .secondary-monitor-workspaces { spacing: 85px; } -.just-perfection-api-controls-manager-spacing-size86 .controls-manager, .just-perfection-api-controls-manager-spacing-size86 .secondary-monitor-workspaces { spacing: 86px; } -.just-perfection-api-controls-manager-spacing-size87 .controls-manager, .just-perfection-api-controls-manager-spacing-size87 .secondary-monitor-workspaces { spacing: 87px; } -.just-perfection-api-controls-manager-spacing-size88 .controls-manager, .just-perfection-api-controls-manager-spacing-size88 .secondary-monitor-workspaces { spacing: 88px; } -.just-perfection-api-controls-manager-spacing-size89 .controls-manager, .just-perfection-api-controls-manager-spacing-size89 .secondary-monitor-workspaces { spacing: 89px; } -.just-perfection-api-controls-manager-spacing-size90 .controls-manager, .just-perfection-api-controls-manager-spacing-size90 .secondary-monitor-workspaces { spacing: 90px; } -.just-perfection-api-controls-manager-spacing-size91 .controls-manager, .just-perfection-api-controls-manager-spacing-size91 .secondary-monitor-workspaces { spacing: 91px; } -.just-perfection-api-controls-manager-spacing-size92 .controls-manager, .just-perfection-api-controls-manager-spacing-size92 .secondary-monitor-workspaces { spacing: 92px; } -.just-perfection-api-controls-manager-spacing-size93 .controls-manager, .just-perfection-api-controls-manager-spacing-size93 .secondary-monitor-workspaces { spacing: 93px; } -.just-perfection-api-controls-manager-spacing-size94 .controls-manager, .just-perfection-api-controls-manager-spacing-size94 .secondary-monitor-workspaces { spacing: 94px; } -.just-perfection-api-controls-manager-spacing-size95 .controls-manager, .just-perfection-api-controls-manager-spacing-size95 .secondary-monitor-workspaces { spacing: 95px; } -.just-perfection-api-controls-manager-spacing-size96 .controls-manager, .just-perfection-api-controls-manager-spacing-size96 .secondary-monitor-workspaces { spacing: 96px; } -.just-perfection-api-controls-manager-spacing-size97 .controls-manager, .just-perfection-api-controls-manager-spacing-size97 .secondary-monitor-workspaces { spacing: 97px; } -.just-perfection-api-controls-manager-spacing-size98 .controls-manager, .just-perfection-api-controls-manager-spacing-size98 .secondary-monitor-workspaces { spacing: 98px; } -.just-perfection-api-controls-manager-spacing-size99 .controls-manager, .just-perfection-api-controls-manager-spacing-size99 .secondary-monitor-workspaces { spacing: 99px; } -.just-perfection-api-controls-manager-spacing-size100 .controls-manager, .just-perfection-api-controls-manager-spacing-size100 .secondary-monitor-workspaces { spacing: 100px; } -.just-perfection-api-controls-manager-spacing-size101 .controls-manager, .just-perfection-api-controls-manager-spacing-size101 .secondary-monitor-workspaces { spacing: 101px; } -.just-perfection-api-controls-manager-spacing-size102 .controls-manager, .just-perfection-api-controls-manager-spacing-size102 .secondary-monitor-workspaces { spacing: 102px; } -.just-perfection-api-controls-manager-spacing-size103 .controls-manager, .just-perfection-api-controls-manager-spacing-size103 .secondary-monitor-workspaces { spacing: 103px; } -.just-perfection-api-controls-manager-spacing-size104 .controls-manager, .just-perfection-api-controls-manager-spacing-size104 .secondary-monitor-workspaces { spacing: 104px; } -.just-perfection-api-controls-manager-spacing-size105 .controls-manager, .just-perfection-api-controls-manager-spacing-size105 .secondary-monitor-workspaces { spacing: 105px; } -.just-perfection-api-controls-manager-spacing-size106 .controls-manager, .just-perfection-api-controls-manager-spacing-size106 .secondary-monitor-workspaces { spacing: 106px; } -.just-perfection-api-controls-manager-spacing-size107 .controls-manager, .just-perfection-api-controls-manager-spacing-size107 .secondary-monitor-workspaces { spacing: 107px; } -.just-perfection-api-controls-manager-spacing-size108 .controls-manager, .just-perfection-api-controls-manager-spacing-size108 .secondary-monitor-workspaces { spacing: 108px; } -.just-perfection-api-controls-manager-spacing-size109 .controls-manager, .just-perfection-api-controls-manager-spacing-size109 .secondary-monitor-workspaces { spacing: 109px; } -.just-perfection-api-controls-manager-spacing-size110 .controls-manager, .just-perfection-api-controls-manager-spacing-size110 .secondary-monitor-workspaces { spacing: 110px; } -.just-perfection-api-controls-manager-spacing-size111 .controls-manager, .just-perfection-api-controls-manager-spacing-size111 .secondary-monitor-workspaces { spacing: 111px; } -.just-perfection-api-controls-manager-spacing-size112 .controls-manager, .just-perfection-api-controls-manager-spacing-size112 .secondary-monitor-workspaces { spacing: 112px; } -.just-perfection-api-controls-manager-spacing-size113 .controls-manager, .just-perfection-api-controls-manager-spacing-size113 .secondary-monitor-workspaces { spacing: 113px; } -.just-perfection-api-controls-manager-spacing-size114 .controls-manager, .just-perfection-api-controls-manager-spacing-size114 .secondary-monitor-workspaces { spacing: 114px; } -.just-perfection-api-controls-manager-spacing-size115 .controls-manager, .just-perfection-api-controls-manager-spacing-size115 .secondary-monitor-workspaces { spacing: 115px; } -.just-perfection-api-controls-manager-spacing-size116 .controls-manager, .just-perfection-api-controls-manager-spacing-size116 .secondary-monitor-workspaces { spacing: 116px; } -.just-perfection-api-controls-manager-spacing-size117 .controls-manager, .just-perfection-api-controls-manager-spacing-size117 .secondary-monitor-workspaces { spacing: 117px; } -.just-perfection-api-controls-manager-spacing-size118 .controls-manager, .just-perfection-api-controls-manager-spacing-size118 .secondary-monitor-workspaces { spacing: 118px; } -.just-perfection-api-controls-manager-spacing-size119 .controls-manager, .just-perfection-api-controls-manager-spacing-size119 .secondary-monitor-workspaces { spacing: 119px; } -.just-perfection-api-controls-manager-spacing-size120 .controls-manager, .just-perfection-api-controls-manager-spacing-size120 .secondary-monitor-workspaces { spacing: 120px; } -.just-perfection-api-controls-manager-spacing-size121 .controls-manager, .just-perfection-api-controls-manager-spacing-size121 .secondary-monitor-workspaces { spacing: 121px; } -.just-perfection-api-controls-manager-spacing-size122 .controls-manager, .just-perfection-api-controls-manager-spacing-size122 .secondary-monitor-workspaces { spacing: 122px; } -.just-perfection-api-controls-manager-spacing-size123 .controls-manager, .just-perfection-api-controls-manager-spacing-size123 .secondary-monitor-workspaces { spacing: 123px; } -.just-perfection-api-controls-manager-spacing-size124 .controls-manager, .just-perfection-api-controls-manager-spacing-size124 .secondary-monitor-workspaces { spacing: 124px; } -.just-perfection-api-controls-manager-spacing-size125 .controls-manager, .just-perfection-api-controls-manager-spacing-size125 .secondary-monitor-workspaces { spacing: 125px; } -.just-perfection-api-controls-manager-spacing-size126 .controls-manager, .just-perfection-api-controls-manager-spacing-size126 .secondary-monitor-workspaces { spacing: 126px; } -.just-perfection-api-controls-manager-spacing-size127 .controls-manager, .just-perfection-api-controls-manager-spacing-size127 .secondary-monitor-workspaces { spacing: 127px; } -.just-perfection-api-controls-manager-spacing-size128 .controls-manager, .just-perfection-api-controls-manager-spacing-size128 .secondary-monitor-workspaces { spacing: 128px; } -.just-perfection-api-controls-manager-spacing-size129 .controls-manager, .just-perfection-api-controls-manager-spacing-size129 .secondary-monitor-workspaces { spacing: 129px; } -.just-perfection-api-controls-manager-spacing-size130 .controls-manager, .just-perfection-api-controls-manager-spacing-size130 .secondary-monitor-workspaces { spacing: 130px; } -.just-perfection-api-controls-manager-spacing-size131 .controls-manager, .just-perfection-api-controls-manager-spacing-size131 .secondary-monitor-workspaces { spacing: 131px; } -.just-perfection-api-controls-manager-spacing-size132 .controls-manager, .just-perfection-api-controls-manager-spacing-size132 .secondary-monitor-workspaces { spacing: 132px; } -.just-perfection-api-controls-manager-spacing-size133 .controls-manager, .just-perfection-api-controls-manager-spacing-size133 .secondary-monitor-workspaces { spacing: 133px; } -.just-perfection-api-controls-manager-spacing-size134 .controls-manager, .just-perfection-api-controls-manager-spacing-size134 .secondary-monitor-workspaces { spacing: 134px; } -.just-perfection-api-controls-manager-spacing-size135 .controls-manager, .just-perfection-api-controls-manager-spacing-size135 .secondary-monitor-workspaces { spacing: 135px; } -.just-perfection-api-controls-manager-spacing-size136 .controls-manager, .just-perfection-api-controls-manager-spacing-size136 .secondary-monitor-workspaces { spacing: 136px; } -.just-perfection-api-controls-manager-spacing-size137 .controls-manager, .just-perfection-api-controls-manager-spacing-size137 .secondary-monitor-workspaces { spacing: 137px; } -.just-perfection-api-controls-manager-spacing-size138 .controls-manager, .just-perfection-api-controls-manager-spacing-size138 .secondary-monitor-workspaces { spacing: 138px; } -.just-perfection-api-controls-manager-spacing-size139 .controls-manager, .just-perfection-api-controls-manager-spacing-size139 .secondary-monitor-workspaces { spacing: 139px; } -.just-perfection-api-controls-manager-spacing-size140 .controls-manager, .just-perfection-api-controls-manager-spacing-size140 .secondary-monitor-workspaces { spacing: 140px; } -.just-perfection-api-controls-manager-spacing-size141 .controls-manager, .just-perfection-api-controls-manager-spacing-size141 .secondary-monitor-workspaces { spacing: 141px; } -.just-perfection-api-controls-manager-spacing-size142 .controls-manager, .just-perfection-api-controls-manager-spacing-size142 .secondary-monitor-workspaces { spacing: 142px; } -.just-perfection-api-controls-manager-spacing-size143 .controls-manager, .just-perfection-api-controls-manager-spacing-size143 .secondary-monitor-workspaces { spacing: 143px; } -.just-perfection-api-controls-manager-spacing-size144 .controls-manager, .just-perfection-api-controls-manager-spacing-size144 .secondary-monitor-workspaces { spacing: 144px; } -.just-perfection-api-controls-manager-spacing-size145 .controls-manager, .just-perfection-api-controls-manager-spacing-size145 .secondary-monitor-workspaces { spacing: 145px; } -.just-perfection-api-controls-manager-spacing-size146 .controls-manager, .just-perfection-api-controls-manager-spacing-size146 .secondary-monitor-workspaces { spacing: 146px; } -.just-perfection-api-controls-manager-spacing-size147 .controls-manager, .just-perfection-api-controls-manager-spacing-size147 .secondary-monitor-workspaces { spacing: 147px; } -.just-perfection-api-controls-manager-spacing-size148 .controls-manager, .just-perfection-api-controls-manager-spacing-size148 .secondary-monitor-workspaces { spacing: 148px; } -.just-perfection-api-controls-manager-spacing-size149 .controls-manager, .just-perfection-api-controls-manager-spacing-size149 .secondary-monitor-workspaces { spacing: 149px; } -.just-perfection-api-controls-manager-spacing-size150 .controls-manager, .just-perfection-api-controls-manager-spacing-size150 .secondary-monitor-workspaces { spacing: 150px; } - -.just-perfection-api-osd-position-top .osd-window { margin: 4em 2.5em; } -.just-perfection-api-osd-position-center .osd-window { margin: 4em 3.5em; } -.just-perfection-api-osd-position-bottom .osd-window { margin: 4em 3em; } - -.just-perfection-api-no-dash-separator .dash-separator, -.just-perfection-api-no-dash-app-running-dot #dash .app-well-app-running-dot -{ - width: 0; - height: 0; - spacing: 0; - padding: 0; - margin: 0; -} - -.just-perfection-api-no-workspaces-in-app-grid .workspace-background -{ - background-color: transparent; - box-shadow: 0 4px 16px 4px transparent; -} - -.just-perfection-api-no-power-icon .power-status StIcon -{ - width: 0; - height: 0; - padding: 0; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_Prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_Prefs.js deleted file mode 100644 index 04b1e7e8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_Prefs.js +++ /dev/null @@ -1,410 +0,0 @@ -/** - * Prefs Library - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -/** - * prefs widget for showing prefs window - */ -export class Prefs -{ - /** - * Current shell version - * - * @type {number|null} - */ - #shellVersion = null; - - /** - * Instance of PrefsKeys - * - * @type {PrefsKeys|null} - */ - #prefsKeys = null; - - /** - * Instance of Gtk.Builder - * - * @type {Gtk.Builder|null} - */ - #builder = null; - - /** - * Instance of Gio.Settings - * - * @type {Settings|null} - */ - #settings = null; - - /** - * Instance of Resource - * - * @type {Gio.Resource|null} - */ - #resource = null; - - /** - * Instance of Gdk - * - * @type {Gdk|null} - */ - #gdk = null; - - /** - * Instance of Gio - * - * @type {Gio|null} - */ - #gio = null; - - /** - * All available profile names - * - * @type {Array} - */ - #profiles = [ - 'default', - 'minimal', - 'superminimal', - ]; - - /** - * class constructor - * - * @param {Object} dependencies - * 'Builder' instance of Gtk::Builder - * 'Settings' instance of Gio::Settings - * 'Gdk' reference to Gdk - * 'Gio' reference to Gio - * @param {PrefsKeys.PrefsKeys} prefsKeys instance of PrefsKeys - * @param {number} shellVersion float in major.minor format - */ - constructor(dependencies, prefsKeys, shellVersion) - { - this.#settings = dependencies['Settings'] || null; - this.#builder = dependencies['Builder'] || null; - this.#gdk = dependencies['Gdk'] || null; - this.#gio = dependencies['Gio'] || null; - - this.#prefsKeys = prefsKeys; - this.#shellVersion = shellVersion; - } - - /** - * fill prefs window - * - * @param {Adw.PreferencesWindow} window prefs dialog - * @param {string} ResourcesFolderPath folder path to resources folder - * @param {string} gettextDomain gettext domain - * - * @returns {void} - */ - fillPrefsWindow(window, ResourcesFolderPath, gettextDomain) - { - // changing the order here can change the elements order in ui - let uiFilenames = [ - 'profile', - 'visibility', - 'icons', - 'behavior', - 'customize', - ]; - - this.#loadResource(ResourcesFolderPath); - - this.#builder.set_translation_domain(gettextDomain); - for (let uiFilename of uiFilenames) { - this.#builder.add_from_resource( - `/org/gnome/Shell/Extensions/justperfection/ui/${uiFilename}.ui` - ); - } - - for (let uiFilename of uiFilenames) { - let page = this.#builder.get_object(uiFilename); - window.add(page); - } - - this.#setValues(); - this.#guessProfile(); - this.#onlyShowSupportedRows(); - this.#registerAllSignals(window); - - this.#setWindowSize(window); - - window.search_enabled = true; - } - - /** - * load resource - * - * @param {string} folder path to the resources folder - * - * @returns {void} - */ - #loadResource(path) - { - this.#resource = this.#gio.Resource.load(`${path}/resources.gresource`); - this.#gio.resources_register(this.#resource); - } - - /** - * set window size - * - * @param {Adw.PreferencesWindow} window prefs window - * - * @returns {void} - */ - #setWindowSize(window) - { - let [pmWidth, pmHeight, pmScale] = this.#getPrimaryMonitorInfo(); - let sizeTolerance = 50; - let width = 600; - let height = 730; - - if ( - (pmWidth / pmScale) - sizeTolerance >= width && - (pmHeight / pmScale) - sizeTolerance >= height - ) { - window.set_default_size(width, height); - } - } - - /** - * get primary monitor info - * - * @returns {Array} [width, height, scale] - */ - #getPrimaryMonitorInfo() - { - let display = this.#gdk.Display.get_default(); - - let pm = display.get_monitors().get_item(0); - - if (!pm) { - return [700, 500, 1]; - } - - let geo = pm.get_geometry(); - let scale = pm.get_scale_factor(); - - return [geo.width, geo.height, scale]; - } - - /** - * register all signals - * - * @param {Adw.PreferencesWindow} window prefs dialog - * - * @returns {void} - */ - #registerAllSignals(window) - { - this.#registerKeySignals(); - this.#registerProfileSignals(); - this.#registerCloseSignal(window); - } - - /** - * register close signal - * - * @param {Adw.PreferencesWindow} window prefs dialog - * - * @returns {void} - */ - #registerCloseSignal(window) - { - window.connect('close-request', () => { - if (this.#resource) { - this.#gio.resources_unregister(this.#resource); - } - }); - } - - /** - * register signals of all prefs keys - * - * @returns {void} - */ - #registerKeySignals() - { - // all available keys - for (let [, key] of Object.entries(this.#prefsKeys.keys)) { - - switch (key.widgetType) { - - case 'GtkSwitch': - this.#builder.get_object(key.widgetId).connect('state-set', (w) => { - this.#settings.set_boolean(key.name, w.get_active()); - this.#guessProfile(); - }); - break; - - case 'AdwActionRow': - this.#builder.get_object(key.widgetId).connect('notify::selected-item', (w) => { - let index = w.get_selected(); - let value = (index in key.maps) ? key.maps[index] : index; - this.#settings.set_int(key.name, value); - this.#guessProfile(); - }); - break; - - case 'AdwSpinRow': - this.#builder.get_object(key.widgetId).connect('notify::value', (w) => { - let value = w.get_value(); - this.#settings.set_int(key.name, value); - this.#guessProfile(); - }); - break; - } - } - } - - /** - * register profile signals - * - * @returns {void} - */ - #registerProfileSignals() - { - for (let profile of this.#profiles) { - let widget = this.#builder.get_object(`profile_${profile}`); - if (!widget) { - break; - } - widget.connect('clicked', (w) => { - this.#setValues(profile); - }); - } - } - - /** - * can check all current values and guess the profile based on the values - * - * @returns {void} - */ - #guessProfile() - { - let totalCount = 0; - let matchCount = {}; - - for (let profile of this.#profiles) { - matchCount[profile] = 0; - } - - for (let [, key] of Object.entries(this.#prefsKeys.keys)) { - - if (!key.supported) { - continue; - } - - let value; - - switch (key.widgetType) { - case 'GtkSwitch': - value = this.#builder.get_object(key.widgetId).get_active(); - break; - case 'AdwActionRow': - value = this.#builder.get_object(key.widgetId).get_selected(); - break; - case 'AdwSpinRow': - value = this.#builder.get_object(key.widgetId).get_value(); - break; - default: - value = ''; - continue; - } - - for (let profile of this.#profiles) { - if (key.profiles[profile] === value) { - matchCount[profile]++; - } - } - - totalCount++; - } - - let currentProfile = 'custom'; - for (let profile of this.#profiles) { - if (matchCount[profile] === totalCount) { - currentProfile = profile; - break; - } - } - - let widget = this.#builder.get_object(`profile_${currentProfile}`); - if (widget) { - widget.set_active(true); - } - } - - /** - * set values for all elements - * - * @param {string} profile profile name or null for get it from gsettings - * - * @returns {void} - */ - #setValues(profile) - { - for (let [, key] of Object.entries(this.#prefsKeys.keys)) { - - let widget = this.#builder.get_object(key.widgetId); - - let value; - - switch (key.widgetType) { - - case 'GtkSwitch': - value - = (profile) - ? key.profiles[profile] - : this.#settings.get_boolean(key.name); - - widget.set_active(value); - break; - - case 'AdwActionRow': - let index - = (profile) - ? key.profiles[profile] - : this.#settings.get_int(key.name); - - for (let k in key.maps) { - if (key.maps[k] === index) { - index = k; - break; - } - } - widget.set_selected(index); - break; - - case 'AdwSpinRow': - value - = (profile) - ? key.profiles[profile] - : this.#settings.get_int(key.name); - - widget.set_value(value); - break; - } - } - } - - /** - * apply all supported keys to the elements - * - * @returns {void} - */ - #onlyShowSupportedRows() - { - for (let [, key] of Object.entries(this.#prefsKeys.keys)) { - let row = this.#builder.get_object(`${key.id}_row`); - let visible = key.supported; - row.visible = visible; - } - } -}; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_PrefsKeys.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_PrefsKeys.js deleted file mode 100644 index 398c09ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/Prefs/executable_PrefsKeys.js +++ /dev/null @@ -1,880 +0,0 @@ -/** - * PrefsKeys Library - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -/** - * prefs keys - */ -export class PrefsKeys -{ - /** - * Current shell version - * - * @type {number|null} - */ - #shellVersion = null; - - /** - * class constructor - * - * @param {number} shellVersion float in major.minor format - */ - constructor(shellVersion) - { - this.#shellVersion = shellVersion; - - /** - * holds all keys generated by this.#setKey() - * - * @member {Object} - */ - this.keys = {}; - - this.#setDefaults(); - } - - /** - * set all default keys - * - * @returns {void} - */ - #setDefaults() - { - this.#setKey( - 'visibility', - 'panel', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'panel-in-overview', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'activities-button', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'clock-menu', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'keyboard-layout', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'accessibility-menu', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'quick-settings', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'quick-settings-dark-mode', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'screen-sharing-indicator', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'screen-recording-indicator', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'search', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'dash', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'dash-separator', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'dash-app-running', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'osd', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'workspace-popup', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'workspace', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'background-menu', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'show-apps-button', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'workspaces-in-app-grid', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'window-preview-caption', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'window-preview-close-button', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'ripple-box', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'visibility', - 'world-clock', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'weather', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'calendar', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'events-button', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'visibility', - 'window-menu-take-screenshot-button', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'icons', - 'panel-notification-icon', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'icons', - 'power-icon', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'icons', - 'window-picker-icon', - 'GtkSwitch', - true, - { - default: true, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'behavior', - 'type-to-search', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'behavior', - 'window-demands-attention-focus', - 'GtkSwitch', - true, - { - default: false, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'behavior', - 'window-maximized-on-create', - 'GtkSwitch', - true, - { - default: false, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'behavior', - 'workspace-switcher-should-show', - 'GtkSwitch', - true, - { - default: false, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'behavior', - 'startup-status', - 'AdwActionRow', - true, - { - default: 1, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'behavior', - 'workspace-wrap-around', - 'GtkSwitch', - true, - { - default: false, - minimal: false, - superminimal: false, - } - ); - - this.#setKey( - 'behavior', - 'workspace-peek', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'behavior', - 'overlay-key', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'behavior', - 'double-super-to-appgrid', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: false, - } - ); - - this.#setKey( - 'behavior', - 'switcher-popup-delay', - 'GtkSwitch', - true, - { - default: true, - minimal: true, - superminimal: true, - } - ); - - this.#setKey( - 'customize', - 'controls-manager-spacing-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 22, - } - ); - - this.#setKey( - 'customize', - 'workspace-background-corner-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 15, - } - ); - - this.#setKey( - 'customize', - 'top-panel-position', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'clock-menu-position', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'clock-menu-position-offset', - 'AdwSpinRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'workspace-switcher-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'animation', - 'AdwActionRow', - true, - { - default: 1, - minimal: 1, - superminimal: 1, - } - ); - - this.#setKey( - 'customize', - 'dash-icon-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 1, - superminimal: 0, - }, - { - '1': 16, - '2': 22, - '3': 24, - '4': 32, - '5': 40, - '6': 48, - '7': 56, - '8': 64, - } - ); - - this.#setKey( - 'customize', - 'notification-banner-position', - 'AdwActionRow', - true, - { - default: 1, - minimal: 1, - superminimal: 1, - } - ); - - this.#setKey( - 'customize', - 'panel-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'panel-button-padding-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'panel-indicator-padding-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'panel-icon-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'osd-position', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'looking-glass-width', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'looking-glass-height', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'customize', - 'alt-tab-window-preview-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - }, - { - '0': 0, - '1': 32, - '2': 64, - '3': 128, - '4': 256, - '5': 512, - } - ); - - this.#setKey( - 'customize', - 'alt-tab-small-icon-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - }, - { - '0': 0, - '1': 32, - '2': 64, - '3': 128, - '4': 256, - '5': 512, - } - ); - - this.#setKey( - 'customize', - 'alt-tab-icon-size', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - }, - { - '0': 0, - '1': 32, - '2': 64, - '3': 128, - '4': 256, - '5': 512, - } - ); - - this.#setKey( - 'customize', - 'max-displayed-search-results', - 'AdwActionRow', - true, - { - default: 0, - minimal: 0, - superminimal: 0, - } - ); - - this.#setKey( - 'override', - 'theme', - 'GtkSwitch', - true, - { - default: false, - minimal: true, - superminimal: true, - } - ); - } - - /** - * set key - * - * @param {string} category possible values: - * - visibility - * - icons - * - behavior - * - customize - * - override - * @param {string} name should be the same as gsettings key name - * @param {string} widgetType gtk widget type like 'GtkSwitch'. - * @param {boolean} supported whether supported in the current shell - * @param {Object} profiles values for each profile. for example: - * {default: true, minimal: false} - * @param {Object} [maps] for example for combobox you can specify - * if the index is 1 use 32 as value: - * {1 : 32} - * - * @returns {void} - */ - #setKey(category, name, widgetType, supported, profiles, maps = {}) - { - let id = name.replace(/-/g, '_'); - let widgetName = widgetType.toLowerCase().replace('gtk', ''); - - let widgetId - = (widgetType === 'AdwActionRow' || widgetType === 'AdwSpinRow') - ? `${id}_row` - : `${id}_${widgetName}`; - - this.keys[id] = { - category, - widgetType, - name, - id, - widgetId, - supported, - profiles, - maps, - }; - } - - /** - * delete key - * - * @param {string} id key id - * - * @returns {void} - */ - deleteKey(id) - { - delete(this.keys[id]); - } -}; - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_API.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_API.js deleted file mode 100644 index 707914a8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_API.js +++ /dev/null @@ -1,3226 +0,0 @@ -/** - * API Library - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -const XY_POSITION = { - TOP_START: 0, - TOP_CENTER: 1, - TOP_END: 2, - BOTTOM_START: 3, - BOTTOM_CENTER: 4, - BOTTOM_END: 5, - CENTER_START: 6, - CENTER_CENTER: 7, - CENTER_END: 8, -}; - -const PANEL_POSITION = { - TOP: 0, - BOTTOM: 1, -}; - -const PANEL_BOX_POSITION = { - CENTER: 0, - RIGHT: 1, - LEFT: 2, -}; - -const PANEL_HIDE_MODE = { - ALL: 0, - DESKTOP: 1, -}; - -const SHELL_STATUS = { - NONE: 0, - OVERVIEW: 1, -}; - -const DASH_ICON_SIZES = [16, 22, 24, 32, 40, 48, 56, 64]; - -/** - * API to avoid calling GNOME Shell directly - * and make all parts compatible with different GNOME Shell versions - */ -export class API -{ - /** - * Current shell version - * - * @type {number|null} - */ - #shellVersion = null; - - /** - * Originals holder - * - * @type {object} - */ - #originals = {}; - - /** - * Timeout ids - * - * @type {object} - */ - #timeoutIds = {}; - - /** - * Class Constructor - * - * @param {Object} dependencies - * 'Main' reference to ui::main - * 'BackgroundMenu' reference to ui::backgroundMenu - * 'OverviewControls' reference to ui::overviewControls - * 'WorkspaceSwitcherPopup' reference to ui::workspaceSwitcherPopup - * 'SwitcherPopup' reference to ui::switcherPopup - * 'InterfaceSettings' reference to Gio::Settings for 'org.gnome.desktop.interface' - * 'Search' reference to ui::search - * 'SearchController' reference to ui::searchController - * 'WorkspaceThumbnail' reference to ui::workspaceThumbnail - * 'WorkspacesView' reference to ui::workspacesView - * 'Panel' reference to ui::panel - * 'PanelMenu' reference to ui::panelMenu - * 'WindowPreview' reference to ui::windowPreview - * 'Workspace' reference to ui::workspace - * 'LookingGlass' reference to ui::lookingGlass - * 'MessageTray' reference to ui::messageTray - * 'OSDWindow' reference to ui::osdTray - * 'WindowMenu' reference to ui::windowMenu - * 'AltTab' reference to ui::altTab - * 'St' reference to St - * 'GLib' reference to GLib - * 'Clutter' reference to Clutter - * 'Util' reference to misc::util - * 'Meta' reference to Meta - * 'GObject' reference to GObject - * @param {number} shellVersion float in major.minor format - */ - constructor(dependencies, shellVersion) - { - this._main = dependencies['Main'] || null; - this._backgroundMenu = dependencies['BackgroundMenu'] || null; - this._overviewControls = dependencies['OverviewControls'] || null; - this._workspaceSwitcherPopup = dependencies['WorkspaceSwitcherPopup'] || null; - this._switcherPopup = dependencies['SwitcherPopup'] || null; - this._interfaceSettings = dependencies['InterfaceSettings'] || null; - this._search = dependencies['Search'] || null; - this._searchController = dependencies['SearchController'] || null; - this._workspaceThumbnail = dependencies['WorkspaceThumbnail'] || null; - this._workspacesView = dependencies['WorkspacesView'] || null; - this._panel = dependencies['Panel'] || null; - this._panelMenu = dependencies['PanelMenu'] || null; - this._windowPreview = dependencies['WindowPreview'] || null; - this._workspace = dependencies['Workspace'] || null; - this._lookingGlass = dependencies['LookingGlass'] || null; - this._messageTray = dependencies['MessageTray'] || null; - this._osdWindow = dependencies['OSDWindow'] || null; - this._windowMenu = dependencies['WindowMenu'] || null; - this._altTab = dependencies['AltTab'] || null; - this._st = dependencies['St'] || null; - this._glib = dependencies['GLib'] || null; - this._clutter = dependencies['Clutter'] || null; - this._util = dependencies['Util'] || null; - this._meta = dependencies['Meta'] || null; - this._gobject = dependencies['GObject'] || null; - - this.#shellVersion = shellVersion; - - /** - * whether search entry is visible - * - * @member {boolean} - */ - this._searchEntryVisibility = true; - } - - /** - * prepare everything needed for API - * - * @returns {void} - */ - open() - { - this.UIStyleClassAdd(this.#getAPIClassname('shell-version')); - } - - /** - * remove everything from GNOME Shell been added by this class - * - * @returns {void} - */ - close() - { - this.UIStyleClassRemove(this.#getAPIClassname('shell-version')); - this.#startSearchSignal(false); - this.#computeWorkspacesBoxForStateSetDefault(); - this.#altTabSizesSetDefault(); - - for (let [name, id] of Object.entries(this.#timeoutIds)) { - this._glib.source_remove(id); - delete(this.#timeoutIds[name]); - } - } - - /** - * get x and y align for position - * - * @param int pos position - * see XY_POSITION - * - * @returns {array} - * - 0 Clutter.ActorAlign - * - 1 Clutter.ActorAlign - */ - #xyAlignGet(pos) - { - if (XY_POSITION.TOP_START === pos) { - return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.START]; - } - - if (XY_POSITION.TOP_CENTER === pos) { - return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.START]; - } - - if (XY_POSITION.TOP_END === pos) { - return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.START]; - } - - if (XY_POSITION.CENTER_START === pos) { - return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.CENTER]; - } - - if (XY_POSITION.CENTER_CENTER === pos) { - return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.CENTER]; - } - - if (XY_POSITION.CENTER_END === pos) { - return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.CENTER]; - } - - if (XY_POSITION.BOTTOM_START === pos) { - return [this._clutter.ActorAlign.START, this._clutter.ActorAlign.END]; - } - - if (XY_POSITION.BOTTOM_CENTER === pos) { - return [this._clutter.ActorAlign.CENTER, this._clutter.ActorAlign.END]; - } - - if (XY_POSITION.BOTTOM_END === pos) { - return [this._clutter.ActorAlign.END, this._clutter.ActorAlign.END]; - } - } - - /** - * add to animation duration - * - * @param {number} duration in milliseconds - * - * @returns {number} - */ - #addToAnimationDuration(duration) - { - let settings = this._st.Settings.get(); - - return (settings.enable_animations) ? settings.slow_down_factor * duration : 1; - } - - /** - * get signal id of the event - * - * @param {Gtk.Widget} widget to find signal in - * @param {string} signalName signal name - * - * @returns {number} - */ - #getSignalId(widget, signalName) - { - return this._gobject.signal_handler_find(widget, {signalId: signalName}); - } - - /** - * get the css class name for API - * - * @param {string} type - * - * @returns {string} - */ - #getAPIClassname(type) - { - let starter = 'just-perfection-api-'; - - if (type === 'shell-version') { - let shellVerMajor = Math.trunc(this.#shellVersion); - return `${starter}gnome${shellVerMajor}`; - } - - return `${starter}${type}`; - } - - /** - * set panel size to default - * - * @returns {void} - */ - panelSetDefaultSize() - { - if (!this.#originals['panelHeight']) { - return; - } - - this.panelSetSize(this.#originals['panelHeight'], false); - } - - /** - * change panel size - * - * @param {number} size 0 to 100 - * @param {boolean} fake true means it shouldn't change the last size, - * false otherwise - * - * @returns {void} - */ - panelSetSize(size, fake) - { - if (!this.#originals['panelHeight']) { - this.#originals['panelHeight'] = this._main.panel.height; - } - - if (size > 100 || size < 0) { - return; - } - - this._main.panel.height = size; - - if (!fake) { - this._panelSize = size; - } - } - - /** - * get the last size of the panel - * - * @returns {number} - */ - panelGetSize() - { - if (this._panelSize !== undefined) { - return this._panelSize; - } - - if (this.#originals['panelHeight']) { - return this.#originals['panelHeight']; - } - - return this._main.panel.height; - } - - /** - * emit refresh styles - * this is useful when changed style doesn't emit change because doesn't have - * standard styles. for example, style with only `-natural-hpadding` - * won't notify any change. so you need to call this function - * to refresh that - * - * @returns {void} - */ - #emitRefreshStyles() - { - let classname = this.#getAPIClassname('refresh-styles'); - - this.UIStyleClassAdd(classname); - this.UIStyleClassRemove(classname); - } - - /** - * show panel - * - * @returns {void} - */ - panelShow() - { - this._panelVisibility = true; - - let classname = this.#getAPIClassname('no-panel'); - - if (!this.UIStyleClassContain(classname)) { - return; - } - - // The class name should be removed before addChrome the panelBox - // removing after can cause `st_theme_node_lookup_shadow` crash - this.UIStyleClassRemove(classname); - - let overview = this._main.overview; - let searchEntryParent = overview.searchEntry.get_parent(); - let panelBox = this._main.layoutManager.panelBox; - - panelBox.translation_y = 0; - - this._main.layoutManager.overviewGroup.remove_child(panelBox); - this._main.layoutManager.addChrome(panelBox, { - affectsStruts: true, - trackFullscreen: true, - }); - - if (this._hidePanelWorkareasChangedSignal) { - global.display.disconnect(this._hidePanelWorkareasChangedSignal); - delete(this._hidePanelWorkareasChangedSignal); - } - - if (this._hidePanelHeightSignal) { - panelBox.disconnect(this._hidePanelHeightSignal); - delete(this._hidePanelHeightSignal); - } - - searchEntryParent.set_style(`margin-top: 0;`); - - // hide and show can fix windows going under panel - panelBox.hide(); - panelBox.show(); - this.#fixLookingGlassPosition(); - - if (this.#timeoutIds.panelHide) { - this._glib.source_remove(this.#timeoutIds.panelHide); - delete(this.#timeoutIds.panelHide); - } - } - - /** - * hide panel - * - * @param {mode} hide mode see PANEL_HIDE_MODE. defaults to hide all - * @param {boolean} force apply hide even if it is hidden - * - * @returns {void} - */ - panelHide(mode) - { - this._panelVisibility = false; - this._panelHideMode = mode; - - let overview = this._main.overview; - let searchEntryParent = overview.searchEntry.get_parent(); - let panelBox = this._main.layoutManager.panelBox; - let panelHeight = this._main.panel.height; - let panelPosition = this.panelGetPosition(); - let direction = (panelPosition === PANEL_POSITION.BOTTOM) ? 1 : -1; - - if (panelBox.get_parent() === this._main.layoutManager.uiGroup) { - this._main.layoutManager.removeChrome(panelBox); - this._main.layoutManager.overviewGroup.insert_child_at_index(panelBox, 0); - } - - panelBox.translation_y = (mode === PANEL_HIDE_MODE.DESKTOP) ? 0 : panelHeight * direction; - - if (panelPosition === PANEL_POSITION.TOP) { - // when panel is hidden the first element gets too close to the top, - // so we fix it with top margin in search entry - let marginTop = (mode === PANEL_HIDE_MODE.ALL) ? 15 : panelHeight; - searchEntryParent.set_style(`margin-top: ${marginTop}px;`); - } else { - searchEntryParent.set_style(`margin-top: 0;`); - } - - // hide and show can fix windows going under panel - panelBox.hide(); - panelBox.show(); - this.#fixLookingGlassPosition(); - - if (this._hidePanelWorkareasChangedSignal) { - global.display.disconnect(this._hidePanelWorkareasChangedSignal); - delete(this._hidePanelWorkareasChangedSignal); - } - - this._hidePanelWorkareasChangedSignal = global.display.connect( - 'workareas-changed', - () => { - this.panelHide(this._panelHideMode); - } - ); - - if (!this._hidePanelHeightSignal) { - this._hidePanelHeightSignal = panelBox.connect( - 'notify::height', - () => { - this.panelHide(this._panelHideMode); - } - ); - } - - let classname = this.#getAPIClassname('no-panel'); - this.UIStyleClassAdd(classname); - - // update hot corners since we need to make them available - // outside overview - this._main.layoutManager._updateHotCorners(); - - // Maximized windows will have bad maximized gap after unlock in Wayland - // This is a Mutter issue, - // See https://gitlab.gnome.org/GNOME/mutter/-/issues/1627 - // TODO remove after the issue is fixed on Mutter - if (this._meta.is_wayland_compositor()) { - let duration = this.#addToAnimationDuration(180); - this.#timeoutIds.panelHide = this._glib.timeout_add( - this._glib.PRIORITY_DEFAULT, - duration, - () => { - panelBox.hide(); - panelBox.show(); - return this._glib.SOURCE_REMOVE; - } - ); - } - } - - /** - * check whether panel is visible - * - * @returns {boolean} - */ - isPanelVisible() - { - if (this._panelVisibility === undefined) { - return true; - } - - return this._panelVisibility; - } - - /** - * check whether dash is visible - * - * @returns {boolean} - */ - isDashVisible() - { - return this._dashVisibility === undefined || this._dashVisibility; - } - - /** - * show dash - * - * @returns {void} - */ - dashShow() - { - if (!this._main.overview.dash || this.isDashVisible()) { - return; - } - - this._dashVisibility = true; - - this._main.overview.dash.show(); - - this._main.overview.dash.height = -1; - this._main.overview.dash.setMaxSize(-1, -1); - - this.#updateWindowPreviewOverlap(); - } - - /** - * hide dash - * - * @returns {void} - */ - dashHide() - { - if (!this._main.overview.dash || !this.isDashVisible()) { - return; - } - - this._dashVisibility = false; - - this._main.overview.dash.hide(); - - this._main.overview.dash.height = 0; - - this.#updateWindowPreviewOverlap(); - } - - /** - * update window preview overlap - * - * @returns {void} - */ - #updateWindowPreviewOverlap() - { - let wpp = this._windowPreview.WindowPreview.prototype; - - if (this.isDashVisible() && wpp.overlapHeightsOld) { - wpp.overlapHeights = wpp.overlapHeightsOld; - delete(wpp.overlapHeightsOld); - return; - } - - if (!this.isDashVisible()) { - wpp.overlapHeightsOld = wpp.overlapHeights; - wpp.overlapHeights = function () { - let [top, bottom] = this.overlapHeightsOld(); - return [top + 24, bottom + 24]; - }; - } - } - - /** - * add class name to the UI group - * - * @param {string} classname class name - * - * @returns {void} - */ - UIStyleClassAdd(classname) - { - this._main.layoutManager.uiGroup.add_style_class_name(classname); - } - - /** - * remove class name from UI group - * - * @param {string} classname class name - * - * @returns {void} - */ - UIStyleClassRemove(classname) - { - this._main.layoutManager.uiGroup.remove_style_class_name(classname); - } - - /** - * check whether UI group has class name - * - * @param {string} classname class name - * - * @returns {boolean} - */ - UIStyleClassContain(classname) - { - return this._main.layoutManager.uiGroup.has_style_class_name(classname); - } - - /** - * enable background menu - * - * @returns {void} - */ - backgroundMenuEnable() - { - if (!this.#originals['backgroundMenuOpen']) { - return; - } - - this._backgroundMenu.BackgroundMenu.prototype.open = this.#originals['backgroundMenuOpen']; - } - - /** - * disable background menu - * - * @returns {void} - */ - backgroundMenuDisable() - { - let backgroundMenuProto = this._backgroundMenu.BackgroundMenu.prototype; - - if (!this.#originals['backgroundMenuOpen']) { - this.#originals['backgroundMenuOpen'] = backgroundMenuProto.open; - } - - backgroundMenuProto.open = () => {}; - } - - /** - * show search - * - * @param {boolean} fake true means it just needs to do the job but - * don't need to change the search visibility status - * - * @returns {void} - */ - searchEntryShow(fake) - { - let classname = this.#getAPIClassname('no-search'); - - if (!this.UIStyleClassContain(classname)) { - return; - } - - this.UIStyleClassRemove(classname); - - let searchEntry = this._main.overview.searchEntry; - let searchEntryParent = searchEntry.get_parent(); - - searchEntryParent.ease({ - height: searchEntry.height, - opacity: 255, - mode: this._clutter.AnimationMode.EASE, - duration: 110, - onComplete: () => { - searchEntryParent.height = -1; - searchEntry.ease({ - opacity: 255, - mode: this._clutter.AnimationMode.EASE, - duration: 700, - }); - }, - }); - - if (!fake) { - this._searchEntryVisibility = true; - } - - this.#computeWorkspacesBoxForStateChanged(); - } - - /** - * hide search - * - * @param {boolean} fake true means it just needs to do the job - * but don't need to change the search visibility status - * - * @returns {void} - */ - searchEntryHide(fake) - { - this.UIStyleClassAdd(this.#getAPIClassname('no-search')); - - let searchEntry = this._main.overview.searchEntry; - let searchEntryParent = searchEntry.get_parent(); - - searchEntry.ease({ - opacity: 0, - mode: this._clutter.AnimationMode.EASE, - duration: 50, - }); - - searchEntryParent.ease({ - height: 0, - opacity: 0, - mode: this._clutter.AnimationMode.EASE, - duration: 120, - }); - - if (!fake) { - this._searchEntryVisibility = false; - } - - this.#computeWorkspacesBoxForStateChanged(); - } - - /** - * enable start search - * - * @returns {void} - */ - startSearchEnable() - { - this.#startSearchSignal(true); - - if (!this.#originals['startSearch']) { - return; - } - - this._searchController.SearchController.prototype.startSearch = this.#originals['startSearch']; - } - - /** - * disable start search - * - * @returns {void} - */ - startSearchDisable() - { - this.#startSearchSignal(false); - - if (!this.#originals['startSearch']) { - this.#originals['startSearch'] = this._searchController.SearchController.prototype.startSearch - } - - this._searchController.SearchController.prototype.startSearch = () => {}; - } - - /** - * add search signals that needs to be show search entry when the - * search entry is hidden - * - * @param {boolean} add true means add the signal, false means remove - * the signal - * - * @returns {void} - */ - #startSearchSignal(add) - { - let controller - = this._main.overview.viewSelector || - this._main.overview._overview.viewSelector || - this._main.overview._overview.controls._searchController; - - // remove - if (!add) { - if (this._searchActiveSignal) { - controller.disconnect(this._searchActiveSignal); - this._searchActiveSignal = null; - } - return; - } - - // add - if (this._searchActiveSignal) { - return; - } - - this._searchActiveSignal = controller.connect('notify::search-active', () => { - if (this._searchEntryVisibility) { - return; - } - - let inSearch = controller.searchActive; - - if (inSearch) { - this.UIStyleClassAdd(this.#getAPIClassname('type-to-search')); - this.searchEntryShow(true); - } else { - this.UIStyleClassRemove(this.#getAPIClassname('type-to-search')); - this.searchEntryHide(true); - } - }); - } - - /** - * Set maximum displayed search result to default value - * - * @returns {void} - */ - setMaxDisplayedSearchResultToDefault() - { - if (!this.#originals['searchGetMaxDisplayedResults']) { - return; - } - - let ListSearchResultsProto = this._search.ListSearchResults.prototype; - - ListSearchResultsProto._getMaxDisplayedResults = this.#originals['searchGetMaxDisplayedResults']; - } - - /** - * Set maximum displayed search result - * - * @param {number} items max items - * - * @returns {void} - */ - setMaxDisplayedSearchResult(items) - { - let ListSearchResultsProto = this._search.ListSearchResults.prototype; - - if (!this.#originals['searchGetMaxDisplayedResults']) { - this.#originals['searchGetMaxDisplayedResults'] = ListSearchResultsProto._getMaxDisplayedResults; - } - - ListSearchResultsProto._getMaxDisplayedResults = () => { - return items; - } - } - - /** - * enable OSD - * - * @returns {void} - */ - OSDEnable() - { - if (!this.#originals['osdWindowManagerShow']) { - return; - } - - this._main.osdWindowManager.show = this.#originals['osdWindowManagerShow']; - } - - /** - * disable OSD - * - * @returns {void} - */ - OSDDisable() - { - if (!this.#originals['osdWindowManagerShow']) { - this.#originals['osdWindowManagerShow'] - = this._main.osdWindowManager.show; - } - - this._main.osdWindowManager.show = () => {}; - } - - /** - * enable workspace popup - * - * @returns {void} - */ - workspacePopupEnable() - { - if (!this.#originals['workspaceSwitcherPopupDisplay']) { - return; - } - - this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display - = this.#originals['workspaceSwitcherPopupDisplay'] - } - - /** - * disable workspace popup - * - * @returns {void} - */ - workspacePopupDisable() - { - if (!this.#originals['workspaceSwitcherPopupDisplay']) { - this.#originals['workspaceSwitcherPopupDisplay'] - = this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display; - } - - this._workspaceSwitcherPopup.WorkspaceSwitcherPopup.prototype.display = function (index) { - this.destroy(); - }; - } - - /** - * show workspace switcher - * - * @returns {void} - */ - workspaceSwitcherShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-workspace')); - - this.#workspaceSwitcherShouldShowSetToLast(); - } - - /** - * hide workspace switcher - * - * @returns {void} - */ - workspaceSwitcherHide() - { - this.workspaceSwitcherShouldShow(false, true); - - // should be after `this.workspaceSwitcherShouldShow()` - // since it checks whether it's visible or not - this.UIStyleClassAdd(this.#getAPIClassname('no-workspace')); - } - - /** - * check whether workspace switcher is visible - * - * @returns {boolean} - */ - isWorkspaceSwitcherVisible() - { - return !this.UIStyleClassContain(this.#getAPIClassname('no-workspace')); - } - - /** - * set workspace switcher to its default size - * - * @returns {void} - */ - workspaceSwitcherSetDefaultSize() - { - let thumbnailsBox = this._main.overview._overview._controls._thumbnailsBox; - let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; - - if (!ThumbnailsBoxProto._initOld) { - return; - } - - ThumbnailsBoxProto._init = ThumbnailsBoxProto._initOld; - delete(ThumbnailsBoxProto._initOld); - - thumbnailsBox._maxThumbnailScale = this._workspaceThumbnail.MAX_THUMBNAIL_SCALE; - } - - /** - * set workspace switcher size - * - * @param {number} size in float - * - * @returns {void} - */ - workspaceSwitcherSetSize(size) - { - let thumbnailsBox = this._main.overview._overview._controls._thumbnailsBox; - let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; - - thumbnailsBox._maxThumbnailScale = size; - - if (!ThumbnailsBoxProto._initOld) { - ThumbnailsBoxProto._initOld = ThumbnailsBoxProto._init; - } - - ThumbnailsBoxProto._init = function(...params) { - this._maxThumbnailScale = size; - this._initOld(...params); - }; - } - - /** - * add element to stage - * - * @param {St.Widget} element widget - * - * @returns {void} - */ - chromeAdd(element) - { - this._main.layoutManager.addChrome(element, { - affectsInputRegion : true, - affectsStruts : false, - trackFullscreen : true, - }); - } - - /** - * remove element from stage - * - * @param {St.Widget} element widget - * - * @returns {void} - */ - chromeRemove(element) - { - this._main.layoutManager.removeChrome(element); - } - - /** - * show activities button - * - * @returns {void} - */ - activitiesButtonShow() - { - let activities = this._main.panel.statusArea.activities; - - if (!this.isLocked() && activities) { - activities.container.show(); - } - } - - /** - * hide activities button - * - * @returns {void} - */ - activitiesButtonHide() - { - let activities = this._main.panel.statusArea.activities; - - if (activities) { - activities.container.hide(); - } - } - - /** - * show date menu - * - * @returns {void} - */ - dateMenuShow() - { - if (!this.isLocked()) { - this._main.panel.statusArea.dateMenu.container.show(); - } - } - - /** - * hide date menu - * - * @returns {void} - */ - dateMenuHide() - { - this._main.panel.statusArea.dateMenu.container.hide(); - } - - /** - * show keyboard layout - * - * @returns {void} - */ - keyboardLayoutShow() - { - this._main.panel.statusArea.keyboard.container.show(); - } - - /** - * hide keyboard layout - * - * @returns {void} - */ - keyboardLayoutHide() - { - this._main.panel.statusArea.keyboard.container.hide(); - } - - /** - * show accessibility menu - * - * @returns {void} - */ - accessibilityMenuShow() - { - this._main.panel.statusArea.a11y?.container.show(); - } - - /** - * hide accessibility menu - * - * @returns {void} - */ - accessibilityMenuHide() - { - this._main.panel.statusArea.a11y?.container.hide(); - } - - /** - * show quick settings menu - * - * @returns {void} - */ - quickSettingsMenuShow() - { - this._main.panel.statusArea.quickSettings.container.show(); - } - - /** - * hide quick settings menu - * - * @returns {void} - */ - quickSettingsMenuHide() - { - this._main.panel.statusArea.quickSettings.container.hide(); - } - - /** - * check whether lock dialog is currently showing - * - * @returns {boolean} - */ - isLocked() - { - return this._main.sessionMode.isLocked; - } - - /** - * enable window picker icon - * - * @returns {void} - */ - windowPickerIconEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-window-picker-icon')); - } - - /** - * disable window picker icon - * - * @returns {void} - */ - windowPickerIconDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-window-picker-icon')); - } - - /** - * show power icon - * - * @returns {void} - */ - powerIconShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-power-icon')); - } - - /** - * hide power icon - * - * @returns {void} - */ - powerIconHide() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-power-icon')); - } - - /** - * get primary monitor information - * - * @returns {false|Object} false when monitor does not exist | object - * x: int - * y: int - * width: int - * height: int - * geometryScale: float - */ - monitorGetInfo() - { - let pMonitor = this._main.layoutManager.primaryMonitor; - - if (!pMonitor) { - return false; - } - - return { - 'x': pMonitor.x, - 'y': pMonitor.y, - 'width': pMonitor.width, - 'height': pMonitor.height, - 'geometryScale': pMonitor.geometry_scale, - }; - } - - /** - * get panel position - * - * @returns {number} see PANEL_POSITION - */ - panelGetPosition() - { - if (this._panelPosition === undefined) { - return PANEL_POSITION.TOP; - } - - return this._panelPosition; - } - - /** - * move panel position - * - * @param {number} position see PANEL_POSITION - * @param {boolean} force allow to set even when the current position - * is the same - * - * @returns {void} - */ - panelSetPosition(position, force = false) - { - let monitorInfo = this.monitorGetInfo(); - let panelBox = this._main.layoutManager.panelBox; - - if (!force && position === this.panelGetPosition()) { - return; - } - - if (position === PANEL_POSITION.TOP) { - this._panelPosition = PANEL_POSITION.TOP; - if (this._workareasChangedSignal) { - global.display.disconnect(this._workareasChangedSignal); - this._workareasChangedSignal = null; - } - if (this._panelHeightSignal) { - panelBox.disconnect(this._panelHeightSignal); - this._panelHeightSignal = null; - } - let topX = (monitorInfo) ? monitorInfo.x : 0; - let topY = (monitorInfo) ? monitorInfo.y : 0; - panelBox.set_position(topX, topY); - this.UIStyleClassRemove(this.#getAPIClassname('bottom-panel')); - this.#fixPanelMenuSide(this._st.Side.TOP); - this.#fixLookingGlassPosition(); - return; - } - - this._panelPosition = PANEL_POSITION.BOTTOM; - - // only change it when a monitor detected - // 'workareas-changed' signal will do the job on next monitor detection - if (monitorInfo) { - let BottomX = monitorInfo.x; - let BottomY = monitorInfo.y + monitorInfo.height - this.panelGetSize(); - - panelBox.set_position(BottomX, BottomY); - this.UIStyleClassAdd(this.#getAPIClassname('bottom-panel')); - } - - if (!this._workareasChangedSignal) { - this._workareasChangedSignal - = global.display.connect('workareas-changed', () => { - this.panelSetPosition(PANEL_POSITION.BOTTOM, true); - }); - } - - if (!this._panelHeightSignal) { - this._panelHeightSignal = panelBox.connect('notify::height', () => { - this.panelSetPosition(PANEL_POSITION.BOTTOM, true); - }); - } - - this.#fixPanelMenuSide(this._st.Side.BOTTOM); - this.#fixLookingGlassPosition(); - } - - /** - * fix panel menu opening side based on panel position - * - * @param {number} position St.Side value - * is the same - * - * @returns {void} - */ - #fixPanelMenuSide(position) - { - let PanelMenuButton = this._panelMenu.Button; - let PanelMenuButtonProto = PanelMenuButton.prototype; - - // Set Instances - let findPanelMenus = (widget) => { - if (widget instanceof PanelMenuButton && widget.menu?._boxPointer) { - widget.menu._boxPointer._userArrowSide = position; - } - widget.get_children().forEach(subWidget => { - findPanelMenus(subWidget) - }); - } - - let panelBoxes = [ - this._main.panel._centerBox, - this._main.panel._rightBox, - this._main.panel._leftBox, - ]; - panelBoxes.forEach(panelBox => findPanelMenus(panelBox)); - - // Set Prototypes - if (position === this._st.Side.TOP) { - // reset to default since GNOME Shell panel is top by default - if (PanelMenuButtonProto._setMenuOld) { - PanelMenuButtonProto.setMenu = PanelMenuButtonProto._setMenuOld; - } - return; - } - - if (!PanelMenuButtonProto._setMenuOld) { - PanelMenuButtonProto._setMenuOld = PanelMenuButtonProto.setMenu; - } - - PanelMenuButtonProto.setMenu = function (menu) { - this._setMenuOld(menu); - if (menu) { - menu._boxPointer._userArrowSide = position; - } - } - } - - /** - * fix looking glass position - * - * @returns {void} - */ - #fixLookingGlassPosition() - { - let lookingGlassProto = this._lookingGlass.LookingGlass.prototype; - - if (this.#originals['lookingGlassResize'] === undefined) { - this.#originals['lookingGlassResize'] = lookingGlassProto._resize; - } - - if (this.panelGetPosition() === PANEL_POSITION.TOP && this.isPanelVisible()) { - - lookingGlassProto._resize = this.#originals['lookingGlassResize']; - delete(lookingGlassProto._oldResizeMethod); - delete(this.#originals['lookingGlassResize']); - - return; - } - - if (lookingGlassProto._oldResizeMethod === undefined) { - lookingGlassProto._oldResizeMethod = this.#originals['lookingGlassResize']; - - const Main = this._main; - - lookingGlassProto._resize = function () { - let panelHeight = Main.layoutManager.panelBox.height; - this._oldResizeMethod(); - this._targetY -= panelHeight; - this._hiddenY -= panelHeight; - }; - } - } - - /** - * enable panel notification icon - * - * @returns {void} - */ - panelNotificationIconEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-panel-notification-icon')); - } - - /** - * disable panel notification icon - * - * @returns {void} - */ - panelNotificationIconDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-panel-notification-icon')); - } - - /** - * disconnect all clock menu position signals - * - * @returns {void} - */ - #disconnectClockMenuPositionSignals() - { - let panelBoxes = [ - this._main.panel._centerBox, - this._main.panel._rightBox, - this._main.panel._leftBox, - ]; - - if (this._clockMenuPositionSignals) { - for (let i = 0; i <= 2; i++) { - panelBoxes[i].disconnect(this._clockMenuPositionSignals[i]); - } - delete(this._clockMenuPositionSignals); - } - } - - /** - * set the clock menu position to default - * - * @returns {void} - */ - clockMenuPositionSetDefault() - { - this.clockMenuPositionSet(0, 0); - this.#disconnectClockMenuPositionSignals(); - } - - /** - * set the clock menu position - * - * @param {number} pos see PANEL_BOX_POSITION - * @param {number} offset starts from 0 - * - * @returns {void} - */ - clockMenuPositionSet(pos, offset) - { - let dateMenu = this._main.panel.statusArea.dateMenu; - - let panelBoxes = [ - this._main.panel._centerBox, - this._main.panel._rightBox, - this._main.panel._leftBox, - ]; - - this.#disconnectClockMenuPositionSignals(); - - let fromPos = -1; - let fromIndex = -1; - let toIndex = -1; - let childLength = 0; - for (let i = 0; i <= 2; i++) { - let child = panelBoxes[i].get_children(); - let childIndex = child.indexOf(dateMenu.container); - if (childIndex !== -1) { - fromPos = i; - fromIndex = childIndex; - childLength = panelBoxes[pos].get_children().length; - toIndex = (offset > childLength) ? childLength : offset; - break; - } - } - - // couldn't find the from and to position because it has been removed - if (fromPos === -1 || fromIndex === -1 || toIndex === -1) { - return; - } - - if (pos === fromPos && toIndex === fromIndex) { - return; - } - - panelBoxes[fromPos].remove_child(dateMenu.container); - panelBoxes[pos].insert_child_at_index(dateMenu.container, toIndex); - - if (this.isLocked()) { - this.dateMenuHide(); - } - - if (!this._clockMenuPositionSignals) { - this._clockMenuPositionSignals = [null, null, null]; - for (let i = 0; i <= 2; i++) { - this._clockMenuPositionSignals[i] = panelBoxes[i].connect( - (this.#shellVersion >= 46) ? 'child-added' : 'actor-added', - () => { - this.clockMenuPositionSet(pos, offset); - } - ); - } - } - } - - /** - * enable show apps button - * - * @returns {void} - */ - showAppsButtonEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-show-apps-button')); - } - - /** - * disable show apps button - * - * @returns {void} - */ - showAppsButtonDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-show-apps-button')); - } - - /** - * set animation speed as default - * - * @returns {void} - */ - animationSpeedSetDefault() - { - if (this.#originals['StSlowDownFactor'] === undefined) { - return; - } - - this._st.Settings.get().slow_down_factor = this.#originals['StSlowDownFactor']; - } - - /** - * change animation speed - * - * @param {number} factor in float. bigger number means slower - * - * @returns {void} - */ - animationSpeedSet(factor) - { - if (this.#originals['StSlowDownFactor'] === undefined) { - this.#originals['StSlowDownFactor'] - = this._st.Settings.get().slow_down_factor; - } - - this._st.Settings.get().slow_down_factor = factor; - } - - /** - * set the enable animation as default - * - * @returns {void} - */ - enableAnimationsSetDefault() - { - if (this.#originals['enableAnimations'] === undefined) { - return; - } - - let status = this.#originals['enableAnimations']; - - this._interfaceSettings.set_boolean('enable-animations', status); - } - - /** - * set the enable animation status - * - * @param {boolean} status true to enable, false otherwise - * - * @returns {void} - */ - enableAnimationsSet(status) - { - if (this.#originals['enableAnimations'] === undefined) { - this.#originals['enableAnimations'] - = this._interfaceSettings.get_boolean('enable-animations'); - } - - this._interfaceSettings.set_boolean('enable-animations', status); - } - - /** - * enable focus when window demands attention happens - * - * @returns {void} - */ - windowDemandsAttentionFocusEnable() - { - if ( - this._displayWindowDemandsAttentionSignal || - this._displayWindowMarkedUrgentSignal - ) { - return; - } - - let display = global.display; - - let demandFunction = (display, window) => { - if (!window || window.has_focus() || window.is_skip_taskbar()) { - return; - } - this._main.activateWindow(window); - }; - - this._displayWindowDemandsAttentionSignal - = display.connect('window-demands-attention', demandFunction); - this._displayWindowMarkedUrgentSignal - = display.connect('window-marked-urgent', demandFunction); - - // since removing '_windowDemandsAttentionId' doesn't have any effect - // we remove the original signal and re-connect it on disable - let signalId = this.#getSignalId(global.display, 'window-demands-attention'); - let signalId2 = this.#getSignalId(global.display, 'window-marked-urgent'); - display.disconnect(signalId); - display.disconnect(signalId2); - } - - /** - * disable focus when window demands attention happens - * - * @returns {void} - */ - windowDemandsAttentionFocusDisable() - { - if ( - !this._displayWindowDemandsAttentionSignal || - !this._displayWindowMarkedUrgentSignal - ) { - return; - } - - let display = global.display; - - display.disconnect(this._displayWindowDemandsAttentionSignal); - display.disconnect(this._displayWindowMarkedUrgentSignal); - this._displayWindowDemandsAttentionSignal = null; - this._displayWindowMarkedUrgentSignal = null; - - let wah = this._main.windowAttentionHandler; - wah._windowDemandsAttentionId = display.connect( - 'window-demands-attention', - wah._onWindowDemandsAttention.bind(wah) - ); - wah._windowDemandsAttentionId = display.connect( - 'window-marked-urgent', - wah._onWindowDemandsAttention.bind(wah) - ); - } - - /** - * enable maximizing windows on creation - * - * @returns {void} - */ - windowMaximizedOnCreateEnable() - { - if (this._displayWindowCreatedSignal) { - return; - } - - let display = global.display; - - let createdFunction = (display, window) => { - if (window.can_maximize()) { - window.maximize(this._meta.MaximizeFlags.HORIZONTAL | this._meta.MaximizeFlags.VERTICAL); - } - }; - - this._displayWindowCreatedSignal = display.connect('window-created', createdFunction); - } - - /** - * disable maximizing windows on creation - * - * @returns {void} - */ - windowMaximizedOnCreateDisable() - { - if (!this._displayWindowCreatedSignal) { - return; - } - - let display = global.display; - - display.disconnect(this._displayWindowCreatedSignal); - delete(this._displayWindowCreatedSignal); - } - - /** - * set startup status - * - * @param {number} status see SHELL_STATUS for available status - * - * @returns {void} - */ - startupStatusSet(status) - { - let sessionMode = this._main.sessionMode; - let layoutManager = this._main.layoutManager; - - if (!layoutManager._startingUp) { - return; - } - - if (this.#originals['sessionModeHasOverview'] === undefined) { - this.#originals['sessionModeHasOverview'] = sessionMode.hasOverview; - } - - let ControlsState = this._overviewControls.ControlsState; - let Controls = this._main.overview._overview.controls; - - switch (status) { - - case SHELL_STATUS.NONE: - sessionMode.hasOverview = false; - layoutManager.startInOverview = false; - Controls._stateAdjustment.value = ControlsState.HIDDEN; - break; - - case SHELL_STATUS.OVERVIEW: - default: - sessionMode.hasOverview = true; - layoutManager.startInOverview = true; - break; - } - - if (!this._startupCompleteSignal) { - this._startupCompleteSignal - = layoutManager.connect('startup-complete', () => { - sessionMode.hasOverview = this.#originals['sessionModeHasOverview']; - }); - } - } - - /** - * set startup status to default - * - * @returns {void} - */ - startupStatusSetDefault() - { - if (this.#originals['sessionModeHasOverview'] === undefined) { - return; - } - - if (this._startupCompleteSignal) { - this._main.layoutManager.disconnect(this._startupCompleteSignal); - } - } - - /** - * set dash icon size to default - * - * @returns {void} - */ - dashIconSizeSetDefault() - { - let classnameStarter = this.#getAPIClassname('dash-icon-size'); - - DASH_ICON_SIZES.forEach(size => { - this.UIStyleClassRemove(classnameStarter + size); - }); - } - - /** - * set dash icon size - * - * @param {number} size in pixels - * see DASH_ICON_SIZES for available sizes - * - * @returns {void} - */ - dashIconSizeSet(size) - { - this.dashIconSizeSetDefault(); - - if (!DASH_ICON_SIZES.includes(size)) { - return; - } - - let classnameStarter = this.#getAPIClassname('dash-icon-size'); - - this.UIStyleClassAdd(classnameStarter + size); - } - - /** - * change ControlsManagerLayout._computeWorkspacesBoxForState - * base on the current state - * - * @returns {void} - */ - #computeWorkspacesBoxForStateChanged() - { - let controlsLayout = this._main.overview._overview._controls.layout_manager; - - if (!this.#originals['computeWorkspacesBoxForState']) { - this.#originals['computeWorkspacesBoxForState'] - = controlsLayout._computeWorkspacesBoxForState; - } - - controlsLayout._computeWorkspacesBoxForState = (state, box, searchHeight, ...args) => { - - let inAppGrid = state === this._overviewControls.ControlsState.APP_GRID; - - if (inAppGrid && !this._searchEntryVisibility) { - // We need some spacing on top of workspace box in app grid - // when the search entry is not visible. - searchHeight = 40; - } - - box = this.#originals['computeWorkspacesBoxForState'].call( - controlsLayout, state, box, searchHeight, ...args); - - if (inAppGrid && this._workspacesInAppGridHeight !== undefined) { - box.set_size( - box.get_width(), - this._workspacesInAppGridHeight - ); - } - - return box; - }; - - // Since workspace background has shadow around it, it can cause - // unwanted shadows in app grid when the workspace height is 0. - // so we are removing the shadow when we are in app grid - if (!this._appButtonForComputeWorkspacesSignal) { - this._appButtonForComputeWorkspacesSignal = - this._main.overview.dash.showAppsButton.connect( - 'notify::checked', - () => { - let checked = this._main.overview.dash.showAppsButton.checked; - let classname = this.#getAPIClassname('no-workspaces-in-app-grid'); - if (checked) { - this.UIStyleClassAdd(classname); - } else { - this.UIStyleClassRemove(classname); - } - } - ); - } - } - - /** - * change ControlsManagerLayout._computeWorkspacesBoxForState to its default - * - * @returns {void} - */ - #computeWorkspacesBoxForStateSetDefault() - { - if (!this.#originals['computeWorkspacesBoxForState']) { - return; - } - - let controlsLayout = this._main.overview._overview._controls.layout_manager; - - controlsLayout._computeWorkspacesBoxForState - = this.#originals['computeWorkspacesBoxForState']; - - if (this._appButtonForComputeWorkspacesSignal) { - let showAppsButton = this._main.overview.dash.showAppsButton; - showAppsButton.disconnect(this._appButtonForComputeWorkspacesSignal); - delete(this._appButtonForComputeWorkspacesSignal); - this.UIStyleClassRemove(this.#getAPIClassname('no-workspaces-in-app-grid')); - } - } - - /** - * disable workspaces in app grid - * - * @returns {void} - */ - workspacesInAppGridDisable() - { - this._workspacesInAppGridHeight = 0; - this.#computeWorkspacesBoxForStateChanged(); - } - - /** - * enable workspaces in app grid - * - * @returns {void} - */ - workspacesInAppGridEnable() - { - if (this._workspacesInAppGridHeight === undefined) { - return; - } - - delete(this._workspacesInAppGridHeight); - this.#computeWorkspacesBoxForStateChanged(); - } - - /** - * change notification banner position - * - * @param {number} pos - * see XY_POSITION for available positions - * - * @returns {void} - */ - notificationBannerPositionSet(pos) - { - let messageTray = this._main.messageTray; - let bannerBin = messageTray._bannerBin; - - if (this.#originals['bannerAlignmentX'] === undefined) { - this.#originals['bannerAlignmentX'] = messageTray.bannerAlignment; - } - - if (this.#originals['bannerAlignmentY'] === undefined) { - this.#originals['bannerAlignmentY'] = bannerBin.get_y_align(); - } - - if (this.#originals['hideNotification'] === undefined) { - this.#originals['hideNotification'] = messageTray._hideNotification; - } - - // TOP - messageTray._hideNotification = this.#originals['hideNotification']; - - bannerBin.set_y_align(this._clutter.ActorAlign.START); - - if (pos === XY_POSITION.TOP_START) { - messageTray.bannerAlignment = this._clutter.ActorAlign.START; - return; - } - - if (pos === XY_POSITION.TOP_END) { - messageTray.bannerAlignment = this._clutter.ActorAlign.END; - return; - } - - if (pos === XY_POSITION.TOP_CENTER) { - messageTray.bannerAlignment = this._clutter.ActorAlign.CENTER; - return; - } - - // BOTTOM - - // >> - // This block is going to fix the animation when the notification is - // in bottom area - // this is the same function from (ui.messageTray.messageTray._hideNotification) - // with clutter animation mode set to EASE. - // because the EASE_OUT_BACK (original code) causes glitch when - // the tray is on bottom - const State = this._messageTray.State; - const ANIMATION_TIME = this._messageTray.ANIMATION_TIME; - const Clutter = this._clutter; - - messageTray._hideNotification = function (animate) { - this._notificationFocusGrabber.ungrabFocus(); - this._banner.disconnectObject(this); - this._resetNotificationLeftTimeout(); - this._bannerBin.remove_all_transitions(); - - if (animate) { - this._notificationState = State.HIDING; - this._bannerBin.ease({ - opacity: 0, - duration: ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE, - }); - this._bannerBin.ease({ - opacity: 0, - y: this._bannerBin.height, - duration: ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE, - onComplete: () => { - this._notificationState = State.HIDDEN; - this._hideNotificationCompleted(); - this._updateState(); - }, - }); - } else { - this._bannerBin.y = this._bannerBin.height; - this._bannerBin.opacity = 0; - this._notificationState = State.HIDDEN; - this._hideNotificationCompleted(); - } - } - // << - - bannerBin.set_y_align(this._clutter.ActorAlign.END); - - if (pos === XY_POSITION.BOTTOM_START) { - messageTray.bannerAlignment = this._clutter.ActorAlign.START; - return; - } - - if (pos === XY_POSITION.BOTTOM_END) { - messageTray.bannerAlignment = this._clutter.ActorAlign.END; - return; - } - - if (pos === XY_POSITION.BOTTOM_CENTER) { - messageTray.bannerAlignment = this._clutter.ActorAlign.CENTER; - return; - } - } - - /** - * set notification banner position to default position - * - * @returns {void} - */ - notificationBannerPositionSetDefault() - { - if (this.#originals['bannerAlignmentX'] === undefined || - this.#originals['bannerAlignmentY'] === undefined || - this.#originals['hideNotification'] === undefined - ) { - return; - } - - let messageTray = this._main.messageTray; - let bannerBin = messageTray._bannerBin; - - messageTray.bannerAlignment = this.#originals['bannerAlignmentX']; - bannerBin.set_y_align(this.#originals['bannerAlignmentY']); - messageTray._hideNotification = this.#originals['hideNotification']; - } - - /** - * set the workspace switcher to always/never show - * - * @param {boolean} show true for always show, false for never show - * @param {boolean} fake true means set the current should show status - * - * @returns {void} - */ - workspaceSwitcherShouldShow(shouldShow = true, fake = false) - { - if (!fake) { - this._shouldShow = shouldShow; - } - - if (!this.isWorkspaceSwitcherVisible()) { - return; - } - - let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; - - if (!this.#originals['updateShouldShow']) { - this.#originals['updateShouldShow'] = ThumbnailsBoxProto._updateShouldShow; - } - - ThumbnailsBoxProto._updateShouldShow = function () { - if (this._shouldShow === shouldShow) { - return; - } - this._shouldShow = shouldShow; - this.notify('should-show'); - }; - } - - /** - * set the always show workspace switcher status to last real status - * - * @returns {void} - */ - #workspaceSwitcherShouldShowSetToLast() - { - if (this._shouldShow === undefined) { - this.workspaceSwitcherShouldShowSetDefault(); - return; - } - - this.workspaceSwitcherShouldShow(this._shouldShow); - } - - /** - * set the always show workspace switcher status to default - * - * @returns {void} - */ - workspaceSwitcherShouldShowSetDefault() - { - if (!this.#originals['updateShouldShow'] || !this.isWorkspaceSwitcherVisible()) { - return; - } - - let ThumbnailsBoxProto = this._workspaceThumbnail.ThumbnailsBox.prototype; - ThumbnailsBoxProto._updateShouldShow = this.#originals['updateShouldShow']; - delete(this.#originals['updateShouldShow']); - delete(this._shouldShow); - } - - /** - * set panel button hpadding to default - * - * @returns {void} - */ - panelButtonHpaddingSetDefault() - { - if (this._panelButtonHpaddingSize === undefined) { - return; - } - - let classnameStarter = this.#getAPIClassname('panel-button-padding-size'); - this.UIStyleClassRemove(classnameStarter + this._panelButtonHpaddingSize); - this.#emitRefreshStyles(); - - delete this._panelButtonHpaddingSize; - } - - /** - * set panel button hpadding size - * - * @param {number} size in pixels (0 - 60) - * - * @returns {void} - */ - panelButtonHpaddingSizeSet(size) - { - this.panelButtonHpaddingSetDefault(); - - if (size < 0 || size > 60) { - return; - } - - this._panelButtonHpaddingSize = size; - - let classnameStarter = this.#getAPIClassname('panel-button-padding-size'); - this.UIStyleClassAdd(classnameStarter + size); - this.#emitRefreshStyles(); - } - - /** - * set panel indicator padding to default - * - * @returns {void} - */ - panelIndicatorPaddingSetDefault() - { - if (this._panelIndicatorPaddingSize === undefined) { - return; - } - - let classnameStarter = this.#getAPIClassname('panel-indicator-padding-size'); - this.UIStyleClassRemove(classnameStarter + this._panelIndicatorPaddingSize); - this.#emitRefreshStyles(); - - delete this._panelIndicatorPaddingSize; - } - - /** - * set panel indicator padding size - * - * @param {number} size in pixels (0 - 60) - * - * @returns {void} - */ - panelIndicatorPaddingSizeSet(size) - { - this.panelIndicatorPaddingSetDefault(); - - if (size < 0 || size > 60) { - return; - } - - this._panelIndicatorPaddingSize = size; - - let classnameStarter = this.#getAPIClassname('panel-indicator-padding-size'); - this.UIStyleClassAdd(classnameStarter + size); - this.#emitRefreshStyles(); - } - - /** - * get window preview prototype - * - * @returns {Object} - */ - #windowPreviewGetPrototype() - { - return this._windowPreview.WindowPreview.prototype; - } - - /** - * enable window preview caption - * - * @returns {void} - */ - windowPreviewCaptionEnable() - { - if (!this.#originals['windowPreviewGetCaption']) { - return; - } - - let windowPreviewProto = this.#windowPreviewGetPrototype(); - windowPreviewProto._getCaption = this.#originals['windowPreviewGetCaption']; - - this.UIStyleClassRemove(this.#getAPIClassname('no-window-caption')); - } - - /** - * disable window preview caption - * - * @returns {void} - */ - windowPreviewCaptionDisable() - { - let windowPreviewProto = this.#windowPreviewGetPrototype(); - - if (!this.#originals['windowPreviewGetCaption']) { - this.#originals['windowPreviewGetCaption'] = windowPreviewProto._getCaption; - } - - windowPreviewProto._getCaption = () => { - return ''; - }; - - this.UIStyleClassAdd(this.#getAPIClassname('no-window-caption')); - } - - /** - * set workspace background border radius to default size - * - * @returns {void} - */ - workspaceBackgroundRadiusSetDefault() - { - if (this._workspaceBackgroundRadiusSize === undefined) { - return; - } - - let workspaceBackgroundProto = this._workspace.WorkspaceBackground.prototype; - - workspaceBackgroundProto._updateBorderRadius - = this.#originals['workspaceBackgroundUpdateBorderRadius']; - - let classnameStarter = this.#getAPIClassname('workspace-background-radius-size'); - this.UIStyleClassRemove(classnameStarter + this._workspaceBackgroundRadiusSize); - - delete this._workspaceBackgroundRadiusSize; - } - - /** - * set workspace background border radius size - * - * @param {number} size in pixels (0 - 60) - * - * @returns {void} - */ - workspaceBackgroundRadiusSet(size) - { - if (size < 0 || size > 60) { - return; - } - - this.workspaceBackgroundRadiusSetDefault(); - - let workspaceBackgroundProto = this._workspace.WorkspaceBackground.prototype; - - if (!this.#originals['workspaceBackgroundUpdateBorderRadius']) { - this.#originals['workspaceBackgroundUpdateBorderRadius'] - = workspaceBackgroundProto._updateBorderRadius; - } - - const Util = this._util; - const St = this._st; - - workspaceBackgroundProto._updateBorderRadius = function () { - const {scaleFactor} = St.ThemeContext.get_for_stage(global.stage); - const cornerRadius = scaleFactor * size; - - const backgroundContent = this._bgManager.backgroundActor.content; - backgroundContent.rounded_clip_radius = - Util.lerp(0, cornerRadius, this._stateAdjustment.value); - } - - this._workspaceBackgroundRadiusSize = size; - - let classnameStarter = this.#getAPIClassname('workspace-background-radius-size'); - this.UIStyleClassAdd(classnameStarter + size); - } - - /** - * enable workspace wraparound - * - * @returns {void} - */ - workspaceWraparoundEnable() - { - let metaWorkspaceProto = this._meta.Workspace.prototype; - - if (!this.#originals['metaWorkspaceGetNeighbor']) { - this.#originals['metaWorkspaceGetNeighbor'] - = metaWorkspaceProto.get_neighbor; - } - - const Meta = this._meta; - - metaWorkspaceProto.get_neighbor = function (dir) { - - let index = this.index(); - let lastIndex = global.workspace_manager.n_workspaces - 1; - let neighborIndex; - - if (dir === Meta.MotionDirection.UP || dir === Meta.MotionDirection.LEFT) { - // prev - neighborIndex = (index > 0) ? index - 1 : lastIndex; - } else { - // next - neighborIndex = (index < lastIndex) ? index + 1 : 0; - } - - return global.workspace_manager.get_workspace_by_index(neighborIndex); - }; - } - - /** - * disable workspace wraparound - * - * @returns {void} - */ - workspaceWraparoundDisable() - { - if (!this.#originals['metaWorkspaceGetNeighbor']) { - return; - } - - let metaWorkspaceProto = this._meta.Workspace.prototype; - metaWorkspaceProto.get_neighbor = this.#originals['metaWorkspaceGetNeighbor']; - } - - /** - * enable window preview close button - * - * @returns {void} - */ - windowPreviewCloseButtonEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-window-close')); - } - - /** - * disable window preview close button - * - * @returns {void} - */ - windowPreviewCloseButtonDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-window-close')); - } - - /** - * enable ripple box - * - * @returns {void} - */ - rippleBoxEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-ripple-box')); - } - - /** - * disable ripple box - * - * @returns {void} - */ - rippleBoxDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-ripple-box')); - } - - /** - * unblock overlay key - * - * @returns {void} - */ - unblockOverlayKey() - { - if (!this._overlayKeyOldSignalId) { - return; - } - - this._gobject.signal_handler_unblock( - global.display, - this._overlayKeyOldSignalId - ); - - delete(this._overlayKeyOldSignalId); - } - - /** - * block overlay key - * - * @returns {void} - */ - blockOverlayKey() - { - this._overlayKeyOldSignalId = this.#getSignalId(global.display, 'overlay-key'); - - if (!this._overlayKeyOldSignalId) { - return; - } - - this._gobject.signal_handler_block(global.display, this._overlayKeyOldSignalId); - } - - /** - * enable double super press to toggle app grid - * - * @returns {void} - */ - doubleSuperToAppGridEnable() - { - if (this._isDoubleSuperToAppGrid === true) { - return; - } - - if (!this._overlayKeyNewSignalId) { - return; - } - - global.display.disconnect(this._overlayKeyNewSignalId); - delete(this._overlayKeyNewSignalId); - this.unblockOverlayKey(); - - this._isDoubleSuperToAppGrid = true; - } - - /** - * disable double super press to toggle app grid - * - * @returns {void} - */ - doubleSuperToAppGridDisable() - { - if (this._isDoubleSuperToAppGrid === false) { - return; - } - - this.blockOverlayKey(); - - this._overlayKeyNewSignalId = global.display.connect('overlay-key', () => { - this._main.overview.toggle(); - }); - - this._isDoubleSuperToAppGrid = false; - } - - /** - * disable the removal of switcher popup delay - * - * @returns {void} - */ - switcherPopupDelaySetDefault() - { - let SwitcherPopupProto = this._switcherPopup.SwitcherPopup.prototype; - - if (!SwitcherPopupProto.showOld) { - return; - } - - SwitcherPopupProto.show = SwitcherPopupProto.showOld; - delete(SwitcherPopupProto.showOld); - } - - /** - * enable the removal of switcher popup delay - * - * @returns {void} - */ - removeSwitcherPopupDelay() - { - let SwitcherPopupProto = this._switcherPopup.SwitcherPopup.prototype; - - SwitcherPopupProto.showOld = SwitcherPopupProto.show; - - SwitcherPopupProto.show = function (...args) { - let res = this.showOld(...args); - if (res) { - this._showImmediately(); - } - return res; - }; - } - - /** - * set default OSD position - * - * @returns {void} - */ - osdPositionSetDefault() - { - if (!this.#originals['osdWindowShow']) { - return; - } - - let osdWindowProto = this._osdWindow.OsdWindow.prototype; - - osdWindowProto.show = this.#originals['osdWindowShow']; - - delete(osdWindowProto._oldShow); - delete(this.#originals['osdWindowShow']); - - if ( - this.#originals['osdWindowXAlign'] !== undefined && - this.#originals['osdWindowYAlign'] !== undefined - ) { - let osdWindows = this._main.osdWindowManager._osdWindows; - osdWindows.forEach(osdWindow => { - osdWindow.x_align = this.#originals['osdWindowXAlign']; - osdWindow.y_align = this.#originals['osdWindowYAlign']; - }); - delete(this.#originals['osdWindowXAlign']); - delete(this.#originals['osdWindowYAlign']); - } - - this.UIStyleClassRemove(this.#getAPIClassname('osd-position-top')); - this.UIStyleClassRemove(this.#getAPIClassname('osd-position-bottom')); - this.UIStyleClassRemove(this.#getAPIClassname('osd-position-center')); - } - - /** - * set OSD position - * - * @param int pos position XY_POSITION - * - * @returns {void} - */ - osdPositionSet(pos) - { - let osdWindowProto = this._osdWindow.OsdWindow.prototype; - - if (!this.#originals['osdWindowShow']) { - this.#originals['osdWindowShow'] = osdWindowProto.show; - } - - if ( - this.#originals['osdWindowXAlign'] === undefined || - this.#originals['osdWindowYAlign'] === undefined - ) { - let osdWindows = this._main.osdWindowManager._osdWindows; - this.#originals['osdWindowXAlign'] = osdWindows[0].x_align; - this.#originals['osdWindowYAlign'] = osdWindows[0].y_align; - } - - if (osdWindowProto._oldShow === undefined) { - osdWindowProto._oldShow = this.#originals['osdWindowShow']; - } - - let [xAlign, yAlign] = this.#xyAlignGet(pos); - osdWindowProto.show = function () { - this.x_align = xAlign; - this.y_align = yAlign; - this._oldShow(); - }; - - if ( - pos === XY_POSITION.TOP_START || - pos === XY_POSITION.TOP_CENTER || - pos === XY_POSITION.TOP_END - ) { - this.UIStyleClassAdd(this.#getAPIClassname('osd-position-top')); - } - - if ( - pos === XY_POSITION.BOTTOM_START || - pos === XY_POSITION.BOTTOM_CENTER || - pos === XY_POSITION.BOTTOM_END - ) { - this.UIStyleClassAdd(this.#getAPIClassname('osd-position-bottom')); - } - - if ( - pos === XY_POSITION.CENTER_START || - pos === XY_POSITION.CENTER_CENTER || - pos === XY_POSITION.CENTER_END - ) { - this.UIStyleClassAdd(this.#getAPIClassname('osd-position-center')); - } - } - - /** - * show weather in date menu - * - * @returns {void} - */ - weatherShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-weather')); - } - - /** - * hide weather in date menu - * - * @returns {void} - */ - weatherHide() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-weather')); - } - - /** - * show world clocks in date menu - * - * @returns {void} - */ - worldClocksShow() - { - if (!this.#originals['clocksItemSync']) { - return; - } - - let clocksItem = this._main.panel.statusArea.dateMenu._clocksItem; - - clocksItem._sync = this.#originals['clocksItemSync']; - delete(this.#originals['clocksItemSync']); - - if (this._clocksItemShowSignal) { - clocksItem.disconnect(this._clocksItemShowSignal); - delete(this._clocksItemShowSignal); - } - - clocksItem._sync(); - } - - /** - * hide world clocks in date menu - * - * @returns {void} - */ - worldClocksHide() - { - let clocksItem = this._main.panel.statusArea.dateMenu._clocksItem; - - if (!this.#originals['clocksItemSync']) { - this.#originals['clocksItemSync'] = clocksItem._sync; - } - - clocksItem._sync = function () { - this.visible = false; - }; - - if (!this._clocksItemShowSignal) { - this._clocksItemShowSignal = clocksItem.connect('show', () => { - clocksItem._sync(); - }); - } - - clocksItem._sync(); - } - - /** - * show events button in date menu - * - * @returns {void} - */ - eventsButtonShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-events-button')); - } - - /** - * hide events button in date menu - * - * @returns {void} - */ - eventsButtonHide() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-events-button')); - } - - /** - * show calendar in date menu - * - * @returns {void} - */ - calendarShow() - { - this._main.panel.statusArea.dateMenu._calendar.show(); - } - - /** - * hide calendar in date menu - * - * @returns {void} - */ - calendarHide() - { - this._main.panel.statusArea.dateMenu._calendar.hide(); - } - - /** - * set default panel icon size - * - * @returns {void} - */ - panelIconSetDefaultSize() - { - if (this._panelIconSize === undefined || !this.#originals['panelIconSize']) { - return; - } - - let classnameStarter = this.#getAPIClassname('panel-icon-size'); - this.UIStyleClassRemove(classnameStarter + this._panelIconSize); - this.#emitRefreshStyles(); - - let defaultSize = this.#originals['panelIconSize']; - this.#changeDateMenuIndicatorIconSize(defaultSize); - - delete(this._panelIconSize); - } - - /** - * set panel icon size - * - * @param {number} size 1-60 - * - * @returns {void} - */ - panelIconSetSize(size) - { - if (size < 1 || size > 60) { - return; - } - - if (!this.#originals['panelIconSize']) { - this.#originals['panelIconSize'] = this._panel.PANEL_ICON_SIZE; - } - - let classnameStarter = this.#getAPIClassname('panel-icon-size'); - this.UIStyleClassRemove(classnameStarter + this.panelIconGetSize()); - this.UIStyleClassAdd(classnameStarter + size); - this.#emitRefreshStyles(); - - this.#changeDateMenuIndicatorIconSize(size); - - this._panelIconSize = size; - } - - /** - * change date menu indicator icon size - * - * @param {number} size - * - * @returns {void} - */ - #changeDateMenuIndicatorIconSize(size) - { - let dateMenu = this._main.panel.statusArea.dateMenu; - - // we get set_icon_size is not a function in some setups - // in case the date menu has been removed or not created - if ( - dateMenu && - dateMenu._indicator && - dateMenu._indicator.set_icon_size - ) { - dateMenu._indicator.set_icon_size(size); - } - } - - /** - * get panel icon size - * - * @returns {void} - */ - panelIconGetSize() - { - if (this._panelIconSize !== undefined) { - return this._panelIconSize; - } - - return this._panel.PANEL_ICON_SIZE; - } - - /** - * show dash separator - * - * @returns {void} - */ - dashSeparatorShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-dash-separator')); - } - - /** - * hide dash separator - * - * @returns {void} - */ - dashSeparatorHide() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-dash-separator')); - } - - /** - * get looking glass size - * - * @returns {array} - * width: int - * height: int - */ - #lookingGlassGetSize() - { - let lookingGlass = this._main.createLookingGlass(); - - return [lookingGlass.width, lookingGlass.height]; - } - - /** - * set default looking glass size - * - * @returns {void} - */ - lookingGlassSetDefaultSize() - { - if (!this._lookingGlassShowSignal) { - return; - } - - this._main.lookingGlass.disconnect(this._lookingGlassShowSignal); - - delete(this._lookingGlassShowSignal); - delete(this._lookingGlassOriginalSize); - delete(this._monitorsChangedSignal); - } - - /** - * set looking glass size - * - * @param {number} width in float - * @param {number} height in float - * - * @returns {void} - */ - lookingGlassSetSize(width, height) - { - let lookingGlass = this._main.createLookingGlass(); - - if (!this._lookingGlassOriginalSize) { - this._lookingGlassOriginalSize = this.#lookingGlassGetSize(); - } - - if (this._lookingGlassShowSignal) { - lookingGlass.disconnect(this._lookingGlassShowSignal); - delete(this._lookingGlassShowSignal); - } - - this._lookingGlassShowSignal = lookingGlass.connect('show', () => { - let [, currentHeight] = this.#lookingGlassGetSize(); - let [originalWidth, originalHeight] = this._lookingGlassOriginalSize; - - let monitorInfo = this.monitorGetInfo(); - - let dialogWidth - = (width !== null) - ? monitorInfo.width * width - : originalWidth; - - let x = monitorInfo.x + (monitorInfo.width - dialogWidth) / 2; - lookingGlass.set_x(x); - - let keyboardHeight = this._main.layoutManager.keyboardBox.height; - let availableHeight = monitorInfo.height - keyboardHeight; - let dialogHeight - = (height !== null) - ? Math.min(monitorInfo.height * height, availableHeight * 0.9) - : originalHeight; - - let hiddenY = lookingGlass._hiddenY + currentHeight - dialogHeight; - lookingGlass.set_y(hiddenY); - lookingGlass._hiddenY = hiddenY; - - lookingGlass.set_size(dialogWidth, dialogHeight); - }); - - if (!this._monitorsChangedSignal) { - this._monitorsChangedSignal = this._main.layoutManager.connect('monitors-changed', - () => { - this.lookingGlassSetSize(width, height); - }); - } - } - - /** - * show screenshot in window menu - * - * @returns {void} - */ - screenshotInWindowMenuShow() - { - let windowMenuProto = this._windowMenu.WindowMenu.prototype; - - if (windowMenuProto._oldBuildMenu === undefined) { - return; - } - - windowMenuProto._buildMenu = this.#originals['WindowMenubuildMenu']; - - delete(windowMenuProto._oldBuildMenu); - } - - /** - * hide screenshot in window menu - * - * @returns {void} - */ - screenshotInWindowMenuHide() - { - let windowMenuProto = this._windowMenu.WindowMenu.prototype; - - if (!this.#originals['WindowMenubuildMenu']) { - this.#originals['WindowMenubuildMenu'] = windowMenuProto._buildMenu; - } - - if (windowMenuProto._oldBuildMenu === undefined) { - windowMenuProto._oldBuildMenu = this.#originals['WindowMenubuildMenu']; - } - - windowMenuProto._buildMenu = function (window) { - this._oldBuildMenu(window); - this.firstMenuItem.hide(); - }; - } - - /** - * set all alt tab sizes to default - * - * @returns {void} - */ - #altTabSizesSetDefault() - { - let WindowIconProto = this._altTab.WindowIcon.prototype; - if (WindowIconProto._initOld) { - WindowIconProto._init = WindowIconProto._initOld; - delete(WindowIconProto._initOld); - } - - delete(this._altTabAPP_ICON_SIZE); - delete(this._altTabAPP_ICON_SIZE_SMALL); - delete(this._altTabWINDOW_PREVIEW_SIZE); - } - - /** - * set alt tab sizes - * - * @param {number|null} appIconSize - * @param {number|null} appIconSizeSmall - * @param {number|null} windowPreviewSize - * - * @returns {void} - */ - #altTabSizesSet(appIconSize, appIconSizeSmall, windowPreviewSize) - { - let WindowIconProto = this._altTab.WindowIcon.prototype; - if (!WindowIconProto._initOld) { - WindowIconProto._initOld = WindowIconProto._init; - } - - this._altTabAPP_ICON_SIZE ||= this._altTab.APP_ICON_SIZE; - this._altTabAPP_ICON_SIZE_SMALL ||= this._altTab.APP_ICON_SIZE_SMALL; - this._altTabWINDOW_PREVIEW_SIZE ||= this._altTab.WINDOW_PREVIEW_SIZE; - - const APP_ICON_SIZE = appIconSize || this._altTabAPP_ICON_SIZE; - const APP_ICON_SIZE_SMALL = appIconSizeSmall || this._altTabAPP_ICON_SIZE_SMALL; - const WINDOW_PREVIEW_SIZE = windowPreviewSize || this._altTabWINDOW_PREVIEW_SIZE; - - WindowIconProto._init = function(window, mode) { - this._initOld(window, mode); - } - } - - /** - * set default alt tab window preview size - * - * @returns {void} - */ - altTabWindowPreviewSetDefaultSize() - { - if (!this.#originals['altTabWindowPreviewSize']) { - return; - } - - this.#altTabSizesSet(null, null, this.#originals['altTabWindowPreviewSize']); - } - - /** - * set alt tab window preview size - * - * @param {number} size 1-512 - * - * @returns {void} - */ - altTabWindowPreviewSetSize(size) - { - if (size < 1 || size > 512) { - return; - } - - if (!this.#originals['altTabWindowPreviewSize']) { - this.#originals['altTabWindowPreviewSize'] = this._altTab.WINDOW_PREVIEW_SIZE; - } - - this.#altTabSizesSet(null, null, size); - } - - /** - * set default alt tab small icon size - * - * @returns {void} - */ - altTabSmallIconSetDefaultSize() - { - if (!this.#originals['altTabAppIconSizeSmall']) { - return; - } - - this.#altTabSizesSet(null, this.#originals['altTabAppIconSizeSmall'], null); - } - - /** - * set alt tab small icon size - * - * @param {number} size 1-512 - * - * @returns {void} - */ - altTabSmallIconSetSize(size) - { - if (size < 1 || size > 512) { - return; - } - - if (!this.#originals['altTabAppIconSizeSmall']) { - this.#originals['altTabAppIconSizeSmall'] = this._altTab.APP_ICON_SIZE_SMALL; - } - - this.#altTabSizesSet(null, size, null); - } - - /** - * set default alt tab icon size - * - * @returns {void} - */ - altTabIconSetDefaultSize() - { - if (!this.#originals['altTabAppIconSize']) { - return; - } - - this.#altTabSizesSet(this.#originals['altTabAppIconSize'], null, null); - } - - /** - * set alt tab icon size - * - * @param {number} size 1-512 - * - * @returns {void} - */ - altTabIconSetSize(size) - { - if (size < 1 || size > 512) { - return; - } - - if (!this.#originals['altTabAppIconSize']) { - this.#originals['altTabAppIconSize'] = this._altTab.APP_ICON_SIZE; - } - - this.#altTabSizesSet(size, null, null); - } - - /** - * enable screen sharing indicator - * - * @returns {void} - */ - screenSharingIndicatorEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-screen-sharing-indicator')); - } - - /** - * disable screen sharing indicator - * - * @returns {void} - */ - screenSharingIndicatorDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-screen-sharing-indicator')); - } - - /** - * enable screen recording indicator - * - * @returns {void} - */ - screenRecordingIndicatorEnable() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-screen-recording-indicator')); - } - - /** - * disable screen recording indicator - * - * @returns {void} - */ - screenRecordingIndicatorDisable() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-screen-recording-indicator')); - } - - /** - * set controls manager spacing to default - * - * @returns {void} - */ - controlsManagerSpacingSetDefault() - { - if (this._controlsManagerSpacingSize === undefined) { - return; - } - - let classnameStarter = this.#getAPIClassname('controls-manager-spacing-size'); - this.UIStyleClassRemove(classnameStarter + this._controlsManagerSpacingSize); - - delete this._controlsManagerSpacingSize; - } - - /** - * set controls manager spacing size - * - * @param {number} size in pixels (0 - 150) - * - * @returns {void} - */ - controlsManagerSpacingSizeSet(size) - { - this.controlsManagerSpacingSetDefault(); - - if (size < 0 || size > 150) { - return; - } - - this._controlsManagerSpacingSize = size; - - let classnameStarter = this.#getAPIClassname('controls-manager-spacing-size'); - this.UIStyleClassAdd(classnameStarter + size); - } - - /** - * set workspaces view spacing to default - * - * @returns {void} - */ - workspacesViewSpacingSetDefault() - { - let wsvp = this._workspacesView.WorkspacesView.prototype; - - if (wsvp._getSpacingOld === undefined) { - return; - } - - wsvp._getSpacing = wsvp._getSpacingOld; - delete wsvp._getSpacingOld; - } - - /** - * set workspaces view spacing size - * - * @param {number} size in pixels (0 - 500) - * - * @returns {void} - */ - workspacesViewSpacingSizeSet(size) - { - if (size < 0 || size > 500) { - return; - } - - let wsvp = this._workspacesView.WorkspacesView.prototype; - - if (wsvp._getSpacingOld === undefined) { - wsvp._getSpacingOld = wsvp._getSpacing; - } - - wsvp._getSpacing = function (box, fitMode, vertical) { - if (fitMode === 0) { - return size; - } - return this._getSpacingOld(box, fitMode, vertical); - }; - } - - /** - * show dash app running dot - * - * @returns {void} - */ - dashAppRunningDotShow() - { - this.UIStyleClassRemove(this.#getAPIClassname('no-dash-app-running-dot')); - } - - /** - * hide dash app running dot - * - * @returns {void} - */ - dashAppRunningDotHide() - { - this.UIStyleClassAdd(this.#getAPIClassname('no-dash-app-running-dot')); - } - - /** - * show dark style toggle button in quick settings - * - * @returns {void} - */ - quickSettingsDarkStyleToggleShow() - { - this.#onQuickSettingsPropertyCall('_darkMode', (darkMode) => { - darkMode.quickSettingsItems[0].show(); - }); - } - - /** - * hide dark style toggle button in quick settings - * - * @returns {void} - */ - quickSettingsDarkStyleToggleHide() - { - this.#onQuickSettingsPropertyCall('_darkMode', (darkMode) => { - darkMode.quickSettingsItems[0].hide(); - }); - } - - /** - * set workspaces view spacing size - * - * @param {string} propertyName - * @param {Function} func function to call when the property is available - * - * @returns {void} - */ - #onQuickSettingsPropertyCall(propertyName, func) - { - const quickSettings = this._main.panel.statusArea.quickSettings; - - this._glib.idle_add(this._glib.PRIORITY_DEFAULT_IDLE, () => { - if (!quickSettings[propertyName]) { - return this._glib.SOURCE_CONTINUE; - } - func(quickSettings[propertyName]); - return this._glib.SOURCE_REMOVE; - }); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_Manager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_Manager.js deleted file mode 100644 index 95b14d17..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/lib/executable_Manager.js +++ /dev/null @@ -1,1481 +0,0 @@ -/** - * Manager Library - * - * @author Javad Rahmatzadeh <j.rahmatzadeh@gmail.com> - * @copyright 2020-2024 - * @license GPL-3.0-only - */ - -/** - * Apply settings to the GNOME Shell - */ -export class Manager -{ - /** - * Current shell version - * - * @type {number|null} - */ - #shellVersion = null; - - /** - * Instance of API - * - * @type {API|null} - */ - #api = null; - - /** - * Instance of Gio.Settings - * - * @type {Settings|null} - */ - #settings = null; - - /** - * Class Constructor - * - * @param {Object} dependencies - * 'API' instance of lib::API - * 'Settings' instance of Gio::Settings - * @param {number} shellVersion float in major.minor format - */ - constructor(dependencies, shellVersion) - { - this.#api = dependencies['API'] || null; - this.#settings = dependencies['Settings'] || null; - - this.#shellVersion = shellVersion; - } - - /** - * register all signals for settings - * - * @returns {void} - */ - registerSettingsSignals() - { - this.#settings.connect('changed::panel', () => { - this.#applyPanel(false); - }); - - this.#settings.connect('changed::panel-in-overview', () => { - this.#applyPanel(false); - }); - - this.#settings.connect('changed::search', () => { - this.#applySearch(false); - }); - - this.#settings.connect('changed::dash', () => { - this.#applyDash(false); - }); - - this.#settings.connect('changed::osd', () => { - this.#applyOSD(false); - }); - - this.#settings.connect('changed::workspace-popup', () => { - this.#applyWorkspacePopup(false); - }); - - this.#settings.connect('changed::workspace', () => { - this.#applyWorkspace(false); - }); - - this.#settings.connect('changed::background-menu', () => { - this.#applyBackgroundMenu(false); - }); - - this.#settings.connect('changed::theme', () => { - this.#applyTheme(false); - }); - - this.#settings.connect('changed::activities-button', () => { - this.#applyActivitiesButton(false); - }); - - this.#settings.connect('changed::clock-menu', () => { - this.#applyClockMenu(false); - }); - - this.#settings.connect('changed::keyboard-layout', () => { - this.#applyKeyboardLayout(false); - }); - - this.#settings.connect('changed::accessibility-menu', () => { - this.#applyAccessibilityMenu(false); - }); - - this.#settings.connect('changed::quick-settings', () => { - this.#applyQuickSettings(false); - }); - - this.#settings.connect('changed::quick-settings-dark-mode', () => { - this.#applyQuickSettingsDarkMode(false); - }); - - this.#settings.connect('changed::window-picker-icon', () => { - this.#applyWindowPickerIcon(false); - }); - - this.#settings.connect('changed::type-to-search', () => { - this.#applyTypeToSearch(false); - }); - - this.#settings.connect('changed::workspace-switcher-size', () => { - this.#applyWorkspaceSwitcherSize(false); - }); - - this.#settings.connect('changed::power-icon', () => { - this.#applyPowerIcon(false); - }); - - this.#settings.connect('changed::top-panel-position', () => { - this.#applyTopPanelPosition(false); - }); - - this.#settings.connect('changed::panel-notification-icon', () => { - this.#applyPanelNotificationIcon(false); - }); - - this.#settings.connect('changed::clock-menu-position', () => { - this.#applyClockMenuPosition(false); - }); - - this.#settings.connect('changed::clock-menu-position-offset', () => { - this.#applyClockMenuPosition(false); - }); - - this.#settings.connect('changed::show-apps-button', () => { - this.#applyShowAppsButton(false); - }); - - this.#settings.connect('changed::animation', () => { - this.#applyAnimation(false); - }); - - this.#settings.connect('changed::window-demands-attention-focus', () => { - this.#applyWindowDemandsAttentionFocus(false); - }); - - this.#settings.connect('changed::window-maximized-on-create', () => { - this.#applyWindowMaximizedOnCreate(false); - }); - - this.#settings.connect('changed::dash-icon-size', () => { - this.#applyDashIconSize(false); - }); - - this.#settings.connect('changed::startup-status', () => { - this.#applyStartupStatus(false); - }); - - this.#settings.connect('changed::workspaces-in-app-grid', () => { - this.#applyWorkspacesInAppGrid(false); - }); - - this.#settings.connect('changed::notification-banner-position', () => { - this.#applyNotificationBannerPosition(false); - }); - - this.#settings.connect('changed::workspace-switcher-should-show', () => { - this.#applyWorkspaceSwitcherShouldShow(false); - }); - - this.#settings.connect('changed::panel-size', () => { - this.#applyPanelSize(false); - }); - - this.#settings.connect('changed::panel-button-padding-size', () => { - this.#applyPanelButtonPaddingSize(false); - }); - - this.#settings.connect('changed::panel-indicator-padding-size', () => { - this.#applyPanelIndicatorPaddingSize(false); - }); - - this.#settings.connect('changed::window-preview-caption', () => { - this.#applyWindowPreviewCaption(false); - }); - - this.#settings.connect('changed::window-preview-close-button', () => { - this.#applyWindowPreviewCloseButton(false); - }); - - this.#settings.connect('changed::workspace-background-corner-size', () => { - this.#applyWorkspaceBackgroundCornerSize(false); - }); - - this.#settings.connect('changed::workspace-wrap-around', () => { - this.#applyWorkspaceWrapAround(false); - }); - - this.#settings.connect('changed::ripple-box', () => { - this.#applyRippleBox(false); - }); - - this.#settings.connect('changed::overlay-key', () => { - this.#applyOverlayKey(false); - }); - - this.#settings.connect('changed::double-super-to-appgrid', () => { - this.#applyOverlayKey(false); - }); - - this.#settings.connect('changed::switcher-popup-delay', () => { - this.#applySwitcherPopupDelay(false); - }); - - this.#settings.connect('changed::world-clock', () => { - this.#applyWorldClock(false); - }); - - this.#settings.connect('changed::weather', () => { - this.#applyWeather(false); - }); - - this.#settings.connect('changed::calendar', () => { - this.#applyCalendar(false); - }); - - this.#settings.connect('changed::events-button', () => { - this.#applyEventsButton(false); - }); - - this.#settings.connect('changed::panel-icon-size', () => { - this.#applyPanelIconSize(false); - }); - - this.#settings.connect('changed::dash-separator', () => { - this.#applyDashSeparator(false); - }); - - this.#settings.connect('changed::looking-glass-width', () => { - this.#applyLookingGlassSize(false); - }); - - this.#settings.connect('changed::looking-glass-height', () => { - this.#applyLookingGlassSize(false); - }); - - this.#settings.connect('changed::osd-position', () => { - this.#applyOSDPosition(false); - }); - - this.#settings.connect('changed::window-menu-take-screenshot-button', () => { - this.#applyWindowMenuTakeScreenshotButton(false); - }); - - this.#settings.connect('changed::alt-tab-window-preview-size', () => { - this.#applyAltTabWindowPreviewSize(false); - }); - - this.#settings.connect('changed::alt-tab-small-icon-size', () => { - this.#applyAltTabSmallIconSize(false); - }); - - this.#settings.connect('changed::alt-tab-icon-size', () => { - this.#applyAltTabIconSize(false); - }); - - this.#settings.connect('changed::screen-sharing-indicator', () => { - this.#applyScreenSharingIndicator(false); - }); - - this.#settings.connect('changed::screen-recording-indicator', () => { - this.#applyScreenRecordingIndicator(false); - }); - - this.#settings.connect('changed::controls-manager-spacing-size', () => { - this.#applyControlsManagerSpacingSize(false); - }); - - this.#settings.connect('changed::workspace-peek', () => { - this.#applyWorkspacePeek(false); - }); - - this.#settings.connect('changed::dash-app-running', () => { - this.#applyDashAppRunning(false); - }); - - this.#settings.connect('changed::max-displayed-search-results', () => { - this.#applyMaxDisplayedSearchResults(false); - }); - } - - /** - * apply everything to the GNOME Shell - * - * @returns {void} - */ - applyAll() - { - this.#applyTheme(false); - this.#applyPanel(false); - this.#applySearch(false); - this.#applyDash(false); - this.#applyOSD(false); - this.#applyWorkspacePopup(false); - this.#applyWorkspace(false); - this.#applyBackgroundMenu(false); - this.#applyActivitiesButton(false); - this.#applyClockMenu(false); - this.#applyKeyboardLayout(false); - this.#applyAccessibilityMenu(false); - this.#applyQuickSettings(false); - this.#applyQuickSettingsDarkMode(false); - this.#applyWindowPickerIcon(false); - this.#applyTypeToSearch(false); - this.#applyWorkspaceSwitcherSize(false); - this.#applyPowerIcon(false); - this.#applyTopPanelPosition(false); - this.#applyPanelNotificationIcon(false); - this.#applyClockMenuPosition(false); - this.#applyShowAppsButton(false); - this.#applyAnimation(false); - this.#applyWindowDemandsAttentionFocus(false); - this.#applyWindowMaximizedOnCreate(false); - this.#applyDashIconSize(false); - this.#applyStartupStatus(false); - this.#applyWorkspacesInAppGrid(false); - this.#applyNotificationBannerPosition(false); - this.#applyWorkspaceSwitcherShouldShow(false); - this.#applyPanelSize(false); - this.#applyPanelButtonPaddingSize(false); - this.#applyPanelIndicatorPaddingSize(false); - this.#applyWindowPreviewCaption(false); - this.#applyWindowPreviewCloseButton(false); - this.#applyWorkspaceBackgroundCornerSize(false); - this.#applyWorkspaceWrapAround(false); - this.#applyRippleBox(false); - this.#applyOverlayKey(false); - this.#applySwitcherPopupDelay(false); - this.#applyWorldClock(false); - this.#applyWeather(false); - this.#applyPanelIconSize(false); - this.#applyEventsButton(false); - this.#applyCalendar(false); - this.#applyDashSeparator(false); - this.#applyLookingGlassSize(false); - this.#applyOSDPosition(false); - this.#applyWindowMenuTakeScreenshotButton(false); - this.#applyAltTabWindowPreviewSize(false); - this.#applyAltTabSmallIconSize(false); - this.#applyAltTabIconSize(false); - this.#applyScreenSharingIndicator(false); - this.#applyScreenRecordingIndicator(false); - this.#applyControlsManagerSpacingSize(false); - this.#applyWorkspacePeek(false); - this.#applyDashAppRunning(false); - this.#applyMaxDisplayedSearchResults(false); - } - - /** - * revert everything done by this class to the GNOME Shell - * - * @returns {void} - */ - revertAll() - { - this.#applyTheme(true); - this.#applyPanel(true); - this.#applySearch(true); - this.#applyDash(true); - this.#applyOSD(true); - this.#applyWorkspace(true); - this.#applyWorkspacePopup(true); - this.#applyBackgroundMenu(true); - this.#applyActivitiesButton(true); - this.#applyClockMenu(true); - this.#applyKeyboardLayout(true); - this.#applyAccessibilityMenu(true); - this.#applyQuickSettings(true); - this.#applyQuickSettingsDarkMode(true); - this.#applyWindowPickerIcon(true); - this.#applyTypeToSearch(true); - this.#applyWorkspaceSwitcherSize(true); - this.#applyPowerIcon(true); - this.#applyTopPanelPosition(true); - this.#applyPanelNotificationIcon(true); - this.#applyClockMenuPosition(true); - this.#applyShowAppsButton(true); - this.#applyAnimation(true); - this.#applyWindowDemandsAttentionFocus(true); - this.#applyWindowMaximizedOnCreate(true); - this.#applyDashIconSize(true); - this.#applyStartupStatus(true); - this.#applyWorkspacesInAppGrid(true); - this.#applyNotificationBannerPosition(true); - this.#applyWorkspaceSwitcherShouldShow(true); - this.#applyPanelSize(true); - this.#applyPanelButtonPaddingSize(true); - this.#applyPanelIndicatorPaddingSize(true); - this.#applyWindowPreviewCaption(true); - this.#applyWindowPreviewCloseButton(true); - this.#applyWorkspaceBackgroundCornerSize(true); - this.#applyWorkspaceWrapAround(true); - this.#applyRippleBox(true); - this.#applyOverlayKey(true); - this.#applySwitcherPopupDelay(true); - this.#applyWorldClock(true); - this.#applyWeather(true); - this.#applyPanelIconSize(true); - this.#applyEventsButton(true); - this.#applyCalendar(true); - this.#applyDashSeparator(true); - this.#applyLookingGlassSize(true); - this.#applyOSDPosition(true); - this.#applyWindowMenuTakeScreenshotButton(true); - this.#applyAltTabWindowPreviewSize(true); - this.#applyAltTabSmallIconSize(true); - this.#applyAltTabIconSize(true); - this.#applyScreenSharingIndicator(true); - this.#applyScreenRecordingIndicator(true); - this.#applyControlsManagerSpacingSize(true); - this.#applyWorkspacePeek(true); - this.#applyDashAppRunning(true); - this.#applyMaxDisplayedSearchResults(true); - } - - /** - * apply panel settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanel(forceOriginal) - { - let panel = this.#settings.get_boolean('panel'); - let panelInOverview = this.#settings.get_boolean('panel-in-overview'); - - if (forceOriginal || panel) { - this.#api.panelShow(); - } else { - let mode = (panelInOverview) ? 1 : 0; - this.#api.panelHide(mode); - } - } - - /** - * apply search settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applySearch(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('search')) { - this.#api.searchEntryShow(false); - } else { - this.#api.searchEntryHide(false); - } - } - - /** - * apply type to search settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyTypeToSearch(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('type-to-search')) { - this.#api.startSearchEnable(); - } else { - this.#api.startSearchDisable(); - } - } - - /** - * apply dash settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyDash(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('dash')) { - this.#api.dashShow(); - } else { - this.#api.dashHide(); - } - } - - /** - * apply osd settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyOSD(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('osd')) { - this.#api.OSDEnable(); - } else { - this.#api.OSDDisable(); - } - } - - /** - * apply workspace popup settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspacePopup(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('workspace-popup')) { - this.#api.workspacePopupEnable(); - } else { - this.#api.workspacePopupDisable(); - } - } - - /** - * apply workspace settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspace(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('workspace')) { - this.#api.workspaceSwitcherShow(); - } else { - this.#api.workspaceSwitcherHide(); - } - } - - /** - * apply background menu settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyBackgroundMenu(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('background-menu')) { - this.#api.backgroundMenuEnable(); - } else { - this.#api.backgroundMenuDisable(); - } - } - - /** - * apply theme settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyTheme(forceOriginal) - { - let className = 'just-perfection'; - - if (forceOriginal || !this.#settings.get_boolean('theme')) { - this.#api.UIStyleClassRemove(className); - } else { - this.#api.UIStyleClassAdd(className); - } - } - - /** - * apply activities button settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyActivitiesButton(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('activities-button')) { - this.#api.activitiesButtonShow(); - } else { - this.#api.activitiesButtonHide(); - } - } - - /** - * apply clock menu (aka date menu) settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyClockMenu(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('clock-menu')) { - this.#api.dateMenuShow(); - } else { - this.#api.dateMenuHide(); - } - } - - /** - * apply keyboard layout settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyKeyboardLayout(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('keyboard-layout')) { - this.#api.keyboardLayoutShow(); - } else { - this.#api.keyboardLayoutHide(); - } - } - - /** - * apply accessibility menu settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyAccessibilityMenu(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('accessibility-menu')) { - this.#api.accessibilityMenuShow(); - } else { - this.#api.accessibilityMenuHide(); - } - } - - /** - * apply quick settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyQuickSettings(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('quick-settings')) { - this.#api.quickSettingsMenuShow(); - } else { - this.#api.quickSettingsMenuHide(); - } - } - - /** - * apply quick settings dark mode - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyQuickSettingsDarkMode(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('quick-settings-dark-mode')) { - this.#api.quickSettingsDarkStyleToggleShow(); - } else { - this.#api.quickSettingsDarkStyleToggleHide(); - } - } - - /** - * apply window picker icon settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowPickerIcon(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('window-picker-icon')) { - this.#api.windowPickerIconEnable(); - } else { - this.#api.windowPickerIconDisable(); - } - } - - /** - * apply workspace switcher size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspaceSwitcherSize(forceOriginal) - { - let size = this.#settings.get_int('workspace-switcher-size'); - - if (forceOriginal || size === 0) { - this.#api.workspaceSwitcherSetDefaultSize(); - } else { - this.#api.workspaceSwitcherSetSize(size / 100); - } - } - - /** - * apply power icon settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPowerIcon(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('power-icon')) { - this.#api.powerIconShow(); - } else { - this.#api.powerIconHide(); - } - } - - /** - * apply top panel position settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyTopPanelPosition(forceOriginal) - { - if (forceOriginal || this.#settings.get_int('top-panel-position') === 0) { - this.#api.panelSetPosition(0); - } else { - this.#api.panelSetPosition(1); - } - } - - /** - * apply panel notification icon settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanelNotificationIcon(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('panel-notification-icon')) { - this.#api.panelNotificationIconEnable(); - } else { - this.#api.panelNotificationIconDisable(); - } - } - - /** - * apply clock menu position settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyClockMenuPosition(forceOriginal) - { - if (forceOriginal) { - this.#api.clockMenuPositionSetDefault(); - } else { - let pos = this.#settings.get_int('clock-menu-position'); - let offset = this.#settings.get_int('clock-menu-position-offset'); - this.#api.clockMenuPositionSet(pos, offset); - } - } - - /** - * apply show apps button settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyShowAppsButton(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('show-apps-button')) { - this.#api.showAppsButtonEnable(); - } else { - this.#api.showAppsButtonDisable(); - } - } - - /** - * apply animation settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyAnimation(forceOriginal) - { - let animation = this.#settings.get_int('animation'); - - let factors = [ - 0.01, // almost none - 0.2, // fastest - 0.6, // faster - 0.8, // fast - 1.3, // slow - 1.6, // slower - 2.8, // slowest - ]; - - if (forceOriginal) { - this.#api.animationSpeedSetDefault(); - this.#api.enableAnimationsSetDefault(); - } else if (animation === 0) { - // disabled - this.#api.animationSpeedSetDefault(); - this.#api.enableAnimationsSet(false); - } else if (animation === 1) { - // default speed - this.#api.animationSpeedSetDefault(); - this.#api.enableAnimationsSet(true); - } else if (factors[animation - 2] !== undefined) { - // custom speed - this.#api.animationSpeedSet(factors[animation - 2]); - this.#api.enableAnimationsSet(true); - } - } - - /** - * apply window demands attention focus settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowDemandsAttentionFocus(forceOriginal) - { - let focus = this.#settings.get_boolean('window-demands-attention-focus'); - - if (forceOriginal || !focus) { - this.#api.windowDemandsAttentionFocusDisable(); - } else { - this.#api.windowDemandsAttentionFocusEnable(); - } - } - - /** - * apply window maximized on create settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowMaximizedOnCreate(forceOriginal) - { - let maximize = this.#settings.get_boolean('window-maximized-on-create'); - - if (forceOriginal || !maximize) { - this.#api.windowMaximizedOnCreateDisable(); - } else { - this.#api.windowMaximizedOnCreateEnable(); - } - } - - /** - * apply dash icon size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyDashIconSize(forceOriginal) - { - let size = this.#settings.get_int('dash-icon-size'); - - if (forceOriginal || size === 0) { - this.#api.dashIconSizeSetDefault(); - } else { - this.#api.dashIconSizeSet(size); - } - } - - /** - * apply startup status settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyStartupStatus(forceOriginal) - { - let status = this.#settings.get_int('startup-status'); - - if (forceOriginal) { - this.#api.startupStatusSetDefault(); - } else { - this.#api.startupStatusSet(status); - } - } - - /** - * apply workspaces in app grid status settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspacesInAppGrid(forceOriginal) - { - let status = this.#settings.get_boolean('workspaces-in-app-grid'); - - if (forceOriginal || status) { - this.#api.workspacesInAppGridEnable(); - } else { - this.#api.workspacesInAppGridDisable(); - } - } - - /** - * apply notification banner position settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyNotificationBannerPosition(forceOriginal) - { - let pos = this.#settings.get_int('notification-banner-position'); - - if (forceOriginal) { - this.#api.notificationBannerPositionSetDefault(); - } else { - this.#api.notificationBannerPositionSet(pos); - } - } - - /** - * apply workspace switcher should show settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspaceSwitcherShouldShow(forceOriginal) - { - let shouldShow = this.#settings.get_boolean('workspace-switcher-should-show'); - - if (forceOriginal || !shouldShow) { - this.#api.workspaceSwitcherShouldShowSetDefault(); - } else { - this.#api.workspaceSwitcherShouldShow(true); - } - } - - /** - * apply panel size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanelSize(forceOriginal) - { - let size = this.#settings.get_int('panel-size'); - - if (forceOriginal || size === 0) { - this.#api.panelSetDefaultSize(); - } else { - this.#api.panelSetSize(size, false); - } - } - - /** - * apply panel button padding size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanelButtonPaddingSize(forceOriginal) - { - let size = this.#settings.get_int('panel-button-padding-size'); - - if (forceOriginal || size === 0) { - this.#api.panelButtonHpaddingSetDefault(); - } else { - this.#api.panelButtonHpaddingSizeSet(size - 1); - } - } - - /** - * apply panel indicator padding size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanelIndicatorPaddingSize(forceOriginal) - { - let size = this.#settings.get_int('panel-indicator-padding-size'); - - if (forceOriginal || size === 0) { - this.#api.panelIndicatorPaddingSetDefault(); - } else { - this.#api.panelIndicatorPaddingSizeSet(size - 1); - } - } - - /** - * apply window preview caption settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowPreviewCaption(forceOriginal) - { - let status = this.#settings.get_boolean('window-preview-caption'); - - if (forceOriginal || status) { - this.#api.windowPreviewCaptionEnable(); - } else { - this.#api.windowPreviewCaptionDisable(); - } - } - - /** - * apply window preview close button settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowPreviewCloseButton(forceOriginal) - { - let status = this.#settings.get_boolean('window-preview-close-button'); - - if (forceOriginal || status) { - this.#api.windowPreviewCloseButtonEnable(); - } else { - this.#api.windowPreviewCloseButtonDisable(); - } - } - - /** - * apply workspace background corner size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspaceBackgroundCornerSize(forceOriginal) - { - let size = this.#settings.get_int('workspace-background-corner-size'); - - if (forceOriginal || size === 0) { - this.#api.workspaceBackgroundRadiusSetDefault(); - } else { - this.#api.workspaceBackgroundRadiusSet(size - 1); - } - } - - /** - * apply workspace wrap around settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspaceWrapAround(forceOriginal) - { - let status = this.#settings.get_boolean('workspace-wrap-around'); - - if (forceOriginal || !status) { - this.#api.workspaceWraparoundDisable(); - } else { - this.#api.workspaceWraparoundEnable(); - } - } - - /** - * apply ripple box settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyRippleBox(forceOriginal) - { - let status = this.#settings.get_boolean('ripple-box'); - - if (forceOriginal || status) { - this.#api.rippleBoxEnable(); - } else { - this.#api.rippleBoxDisable(); - } - } - - /** - * apply overlay key - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyOverlayKey(forceOriginal) - { - let overlayKey = this.#settings.get_boolean('overlay-key'); - let doubleSuper = this.#settings.get_boolean('double-super-to-appgrid'); - - if (forceOriginal) { - this.#api.doubleSuperToAppGridEnable(); - this.#api.unblockOverlayKey(); - } else if (!overlayKey) { - this.#api.doubleSuperToAppGridEnable(); - this.#api.blockOverlayKey(); - } else { - this.#api.unblockOverlayKey(); - if (doubleSuper) { - this.#api.doubleSuperToAppGridEnable(); - } else { - this.#api.doubleSuperToAppGridDisable(); - } - } - } - - /** - * apply switcher popup delay settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applySwitcherPopupDelay(forceOriginal) - { - let status = this.#settings.get_boolean('switcher-popup-delay'); - - if (forceOriginal || status) { - this.#api.switcherPopupDelaySetDefault(); - } else { - this.#api.removeSwitcherPopupDelay(); - } - } - - /** - * apply world clock settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorldClock(forceOriginal) - { - let status = this.#settings.get_boolean('world-clock'); - - if (forceOriginal || status) { - this.#api.worldClocksShow(); - } else { - this.#api.worldClocksHide(); - } - } - - /** - * apply weather settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWeather(forceOriginal) - { - let status = this.#settings.get_boolean('weather'); - - if (forceOriginal || status) { - this.#api.weatherShow(); - } else { - this.#api.weatherHide(); - } - } - - /** - * apply calendar settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyCalendar(forceOriginal) - { - let status = this.#settings.get_boolean('calendar'); - - if (forceOriginal || status) { - this.#api.calendarShow(); - } else { - this.#api.calendarHide(); - } - } - - /** - * apply events button settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyEventsButton(forceOriginal) - { - let status = this.#settings.get_boolean('events-button'); - - if (forceOriginal || status) { - this.#api.eventsButtonShow(); - } else { - this.#api.eventsButtonHide(); - } - } - - /** - * apply panel icon size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyPanelIconSize(forceOriginal) - { - let size = this.#settings.get_int('panel-icon-size'); - - if (forceOriginal || size === 0) { - this.#api.panelIconSetDefaultSize(); - } else { - this.#api.panelIconSetSize(size); - } - } - - /** - * apply dash separator settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyDashSeparator(forceOriginal) - { - let status = this.#settings.get_boolean('dash-separator'); - - if (forceOriginal || status) { - this.#api.dashSeparatorShow(); - } else { - this.#api.dashSeparatorHide(); - } - } - - /** - * apply looking glass size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyLookingGlassSize(forceOriginal) - { - let widthSize = this.#settings.get_int('looking-glass-width'); - let heightSize = this.#settings.get_int('looking-glass-height'); - - if (forceOriginal) { - this.#api.lookingGlassSetDefaultSize(); - } else { - let width = (widthSize !== 0) ? widthSize / 10 : null; - let height = (heightSize !== 0) ? heightSize / 10 : null; - this.#api.lookingGlassSetSize(width, height); - } - } - - /** - * apply osd position settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyOSDPosition(forceOriginal) - { - let pos = this.#settings.get_int('osd-position'); - - if (forceOriginal || pos === 0) { - this.#api.osdPositionSetDefault(); - } else { - this.#api.osdPositionSet(pos - 1); - } - } - - /** - * apply window menu take screenshot button settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWindowMenuTakeScreenshotButton(forceOriginal) - { - let status = this.#settings.get_boolean('window-menu-take-screenshot-button'); - - if (forceOriginal || status) { - this.#api.screenshotInWindowMenuShow(); - } else { - this.#api.screenshotInWindowMenuHide(); - } - } - - /** - * apply alt tab window preview size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyAltTabWindowPreviewSize(forceOriginal) - { - let size = this.#settings.get_int('alt-tab-window-preview-size'); - - if (forceOriginal || size === 0) { - this.#api.altTabWindowPreviewSetDefaultSize(); - } else { - this.#api.altTabWindowPreviewSetSize(size); - } - } - - /** - * apply alt tab small icon size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyAltTabSmallIconSize(forceOriginal) - { - let size = this.#settings.get_int('alt-tab-small-icon-size'); - - if (forceOriginal || size === 0) { - this.#api.altTabSmallIconSetDefaultSize(); - } else { - this.#api.altTabSmallIconSetSize(size); - } - } - - /** - * apply alt tab icon size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyAltTabIconSize(forceOriginal) - { - let size = this.#settings.get_int('alt-tab-icon-size'); - - if (forceOriginal || size === 0) { - this.#api.altTabIconSetDefaultSize(); - } else { - this.#api.altTabIconSetSize(size); - } - } - - /** - * apply screen sharing indicator settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyScreenSharingIndicator(forceOriginal) - { - let status = this.#settings.get_boolean('screen-sharing-indicator'); - - if (forceOriginal || status) { - this.#api.screenSharingIndicatorEnable(); - } else { - this.#api.screenSharingIndicatorDisable(); - } - } - - /** - * apply screen recording indicator settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyScreenRecordingIndicator(forceOriginal) - { - let status = this.#settings.get_boolean('screen-recording-indicator'); - - if (forceOriginal || status) { - this.#api.screenRecordingIndicatorEnable(); - } else { - this.#api.screenRecordingIndicatorDisable(); - } - } - - /** - * apply controls manager spacing size settings - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyControlsManagerSpacingSize(forceOriginal) - { - let size = this.#settings.get_int('controls-manager-spacing-size'); - - if (forceOriginal || size === 0) { - this.#api.controlsManagerSpacingSetDefault(); - } else { - this.#api.controlsManagerSpacingSizeSet(size); - } - } - - /** - * apply workspace peek - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyWorkspacePeek(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('workspace-peek')) { - this.#api.workspacesViewSpacingSetDefault(); - } else { - this.#api.workspacesViewSpacingSizeSet(400); - } - } - - /** - * apply dash app running - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyDashAppRunning(forceOriginal) - { - if (forceOriginal || this.#settings.get_boolean('dash-app-running')) { - this.#api.dashAppRunningDotShow(); - } else { - this.#api.dashAppRunningDotHide(); - } - } - - /** - * apply max displayed search results - * - * @param {boolean} forceOriginal force original shell setting - * - * @returns {void} - */ - #applyMaxDisplayedSearchResults(forceOriginal) - { - let items = this.#settings.get_int('max-displayed-search-results'); - - if (forceOriginal || items === 0) { - this.#api.setMaxDisplayedSearchResultToDefault(); - } else { - this.#api.setMaxDisplayedSearchResult(items); - } - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/af/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 64b1c7b6e6075bb4af2ef016ccd444c97902eba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11200 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 Kj2PjS=zjsBCW}A- diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ar/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index fd2f0c5d1b342e87b780abba48aaac84a4aa3718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13597 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 R_F+$TiFePn4_->){{yCRe@_4a diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/be/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index e84ec4b5a4776bb9e6369cbb9e96a9312761e182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15311 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/bg/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 09909ff0a6d15860c2da9f2876acb9fd8a1fe3e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16160 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ca/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 1ccd83b8825bccfa96773a7c137d2115f4e8d6dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12285 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 F{|g}$EZ_hD diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/de/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 9149e9e3726efc3435be8d4f24eeb9b4c4f62e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11762 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/es/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 1dce32870bdae5a50e0a19e4fb27618b8ea9c3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12591 zcmbuFdyE}dea8>vMNEJ|cqBmS32lQDvWx9JFdI9>UauV|UVG!+*a@MO*?VXAj(6_N z&CFb{*SraBk|qUJX=$RWRnh`#Dk6k{s7+M0V*fxDRsVn%RH)KQrA4JrwW0;uh<?83 zoS8d!y*80L^10tRbKbxA`K_OO)%m|}cs@>fBjw@qjrn8ne_z56&ktT|%&Wj3g4cqV zTw=^C!FPasGPi@*gU7*R;KQN)??6la``{bE*S^e{H-S6Ai@`g<SAh3`T51Kn5UfD{ znfLLt1$+=>3iE5B{sg#_`e(rj@bAHwgO~B6dEN}Z7JMtH`SyaE=OCzg7D7D&FQcA< zuLnO2s{e0-+TZVhkivX6w0|DtpZT+Z-v+l+{~mY~_(l$M5qKBKmdtxYJp+H5`bqF| z@ROj{`5Y*^JPm4{uZ8d51U1idp!o3*;054$mwI|#3|>wB3Q*&wLABosz8X9X>RcVr zf~%nBdldXM_&6v!?1zb(e;(Wi4nTeX5;z5Z8GIf1JSaZD1|blAuLR!-UK8pkz}HYO zLG9x~@Cxt~AX_(2f?DSfLCyCKP;~rPP<(kFWC`;UHm!AD58e!31*$y;wf_OAai>7d zcR%<p@KfL}@W-Im-vtpgZZ9al&Vr(Q5BwSMBjA<br$O=IE1~_*L9PGYQ2$SGJM~LA z+)?mmQ1t#)P~$!cYG1zvYG0oQ#rH3Q;_H_|wq%|Ie-8W)@OtoagmV&{1>X+79~3{o z2x`6OLj6*RbsqI8Q0KWB)OrU&r$3<9y(hGv0L7OfsD57pS<?IwxC8t;cnx?V#MlpR z2c?gvK<)Q8K=uCuD7yVA2y4uDKnwmisP!&~x#H_vK()UeWNLF82+7PMcrCaJYTi$Q zqQjqnqVHdT{4;;c&wIchfrr4mS@eMy8S@zs5}3Ea<Qu{Lp!W3vQ1bZ*xBxy5-Uogk z)O>3{<>~ndD7)}g@H+5^py)TjVYQ!~pw6)XN?tl3Dq)g<r$L?Tp-}&AaEAKlz}vv@ zhxS`gYRx+jiofpxB^Mt9B?k|ITIVrP^!h!Jt(ZRmC4b)l)$a$O&UK;n@^u+FN&Rw= zrOW|P`&k0_fNP-m_bjOSU(95%#=H{Ley#x}XE%VN!wFFG@F@6Z@bOSz2gQ%Cf|~!E zp!oJZQ0I6ZokiC-fxEz+pyX}{YQ7JF(%bt%(eE)(<9|Q2e-r#C>VE@jpI=4!II8&; zcm(_rsPVV`tmpr`LGAlVQ1bK~DEj;tsQ%|eWXab8sC^~i1>k+4)_oAv{7-}1z;A#S zyyz+~e_KJVw+j>>4ugn}Nx^r34~F)2@IvZ;3F=&b4Zaop7x07N6>stV9|c8+uYr=! zZ-E@i{5xpDS8qjz!5cuyVGN3XkA?5Q3u^wagW~gdzz94KV{jiBgBO7R2x{EFf$IOm zfLpHd^mzjaiOkiY&T|;t4X%K9f=_}w!5@Riz?~fCcJLG6UhvzY{w9d1bDsdU&b<LY z3Q9g60Y(4MfG-7~1>X*S1=K!&3|jC4gpOBp6)1krgYN+!07a+of;#W>patKEu(JiT z8`Sp%+yOoSicimiSAu^9iogE@YW_DsT-9#{XTctL1Nbz^)aIYTmw~U}W(=e?TfrW9 z2Uvm6fG<)z<sQlc<pf22bk1eUO%%~|jiTok_e-n;%BI!NX<kl+ig<Aw1+jN@IST6B zFQMr9Ws2yDm^k_1I8JW?_xuvS+W+0YYJMJ^rbLt%QxZy_Qa|E_&L`e+BxmCR^D+JK ze8@xdE1qq9L^nO+lW6v^D&dhVeLTD)dQQd{LD`%K!uJmb6#r6+`1KIw2t~BMmvSfN zB;^+=dR{@fgOXDYQGSJDDSGx&-b;~Q>XAKIrDT*Tik`zBoK4j0{h{6gXDROtb%E^u z%PG>s_fhm5@Zf&W=U2Lc$uM1t<myt&FHj_lucg$_6}&u1nF$|m23IJTP!5J~0_m{i z_uZ8DQ-+i|ik^87PA@;eJEq0S^j+b53GSlYNRiDNP;RB@`3Ob&auFq_TueESQa`uz zQcylhxt{W2%67_r%DX5_lzkMlr_+hcGFeR0q*}AHaW>rKlTEU2(uu0Pu#3a0$}>LL zL6pTQovY+zQYCR|_qrytC++8DWe?|B%zK&Jl`LP)Y*gBARK>Q>61ME+tDzocU0Wsn zxHY8)74cGBl(x$4YF@0AgQyeRsyFN}W>J#zy%$w>EoY|Kjm%HR#mOXIwM*==jMJEH zWy>}ijb<;EU5FO#!4CVMPflxh{>yQWm#^BnB6d^!#13KbYP43`c}`-FH(Q)vO{z{W zF3g@R=|@$PXJ&8ISy?XfA?I}D-5d9!lSy8fy*Z@p2e8v|Rx!?hv@=<^ex0wPqB47j z%l2qI$lYtrf^JmyJSnPtc{zm#(O{5@Q!HHCG=UE%lbXBCQ4e&y6LI}G+mNr_dyT`z zX=)dGaX&WGQ5t96sAyiquuhtHRvb%B*uMw2|M2SfKka%t0*qemTwWqO5NVTd_Q=vw z8CPa{Sc*&@#I}8$+Wpu)gMmFd%rde1U@fA)X~aZzxAXBJDkQ+ZwU?*e(k?|O^CCee zC4>1O&f@Mk0TV=}^dri80;rlv6p_F14YCiQ1*B)nBJbN_R@cqGcqtmDRgHFj5XW6= z<w}(g%)X?I7Sq^~KaJMxO1x&bmcv0@==Ex|FCVIT-hF{vI`4rZ>6)37NJ|-@rIRgw z?2pRI=m(*4K=szVvYouhm_MrJ)5c3nXiI5CvC`ZguPx?L(Y1#n)T`Q9KZhka6fafg zP?D{b=1`umh$jcqs4VTRakAW_Y3$?iq+9jOY;-E=!&4g}XRA&PON)ATir6d9Y@&Up z=5Tzf8tF1!>Axs8#C9nu5c83hSnb7`GYwJUOoRHck5-pS$MAvFJs+0sp{;4hhuF<# z-LUecISh+xx>Bi<rJ##;Z<LAZjl7RF4)VcpU<W}L{8CwKbm{D+r4OXhaZ2bDXXeQK zzR`@Tj88#l-_drHav=HgX7|i_u!n9&i$J=LTbb=@a|ENRVaSAgNAlw4MK+k7I19lW z1{@8m5*WEA!{RsyUv1xW&~}5&Yf_n6H<7cq^B8wYi!-Zp&a1fJ;85&b)a{P9w`{oY z*(m>JoyTY`DK~yl!wg>?EicQ~Y;(>rXI~5<jDL5!kG97V4r+`eBPr?hqHNjAXCs*m zUquG|4vKs!Nn>-zFu{P%$Ccbw8LC)4SM|QKakWR|K6cvEy{r8=XD7`mgV#X-kR%!Y z6{%D;QALZ_+D=uZ6HN`n;uV|;Q1EN*<m9BOr}ipnlM??Mb=PcL3Z2p{<sCF89NPCb zN1b{fO>jN2-J72>L70xl*c!*VhCOxDd@m}*(lZ*0W(>w4gd7b4!n|b|yjc%;(&?Fb z2NoMytcjVB&C6Wdp*hcuMIHIe5WuLxc~ZNK#E*E|_13tTVEJnsjSs=D`VkGINBoGf z(|&?HLoW!4TGnP*;&0$w&vw_csGoF3ZKat{^HukQ`PO@^WfTdZy<jz@i`ztPA*m@k zz~4tGjzT$<Z#u`g$LiU%%|%raqXP>OGU6$US*Ti0B!olGSG!)NGY%ViRY?WA7o)-! z;y<B)Bw5j&S->#hiAtJ%#DTm7$#O=QFs;oLb?>r+F@BCh8`gy#GB)U(6HV{&-7@mf z_}eae^%GW52q}>(<!%%uGO{XiV#$7#MaxXEaZi<e&QG2jKfaI;>iA8s3f_c1@>y6L zU<h)Q+{xy#Q9O1mPlwn|MIVcfh#8@{l*<#mG271fhycN=^kjVS)yHv?iZui30IdMv zxcuOO!$)RkLL7%ymy#e+0Vxs<G^zJu3c-yVqNuvfQuY&UH{7m6S#{OgZiY;R(kV7^ zsc>(Ya=zFHqKHh3%#$X_+P)Yj5RvVvDwLLh(C(L^shjICfqB+!9a4p%bBG=Ln2rW6 zklgUqNnz0I@g`@6M}d1QN}u)-lJf_n4s&t5Vp>&M+E%>@{6}5tPu{VOz8^0lT%|4q zt??t$))AT$)E2SYo%2)p0otSyGE$>9Xjlh{tO(^@WUY4Iy>yI=$=$HK6CpXh+-YoF ztrA;^l@r}~iC9-`b<PUWEL>ov?q$*+V9~H)`czn5@!%MdI{MWmG!7oEp593wpQQuN z=;3?ns<+cj?#!igF_KZF08`thz+91^AXc3?*qu1W?GQPcvbV9Qor?<vu@ao?w)kt( z#B8~obSJnsl@km3l-)9SWa20hpGHmW<0d*~cWm3SV`AHl6FY9SJFc7BwtZsTb=$UW zIfO-@SSX^bOm$(HvWJG9#O~UEWPTni(T^v)@!~C=wM8u%6_cI3e=}pU<sn97Vj+(D zQ$+cM*JbY}q_V8ISwpWEHh#*+<(AolvooXfZJ*q>Wg1fjktSqHrmXDJ+X&N=>?T=+ z0$T6Bb7B9)&QU+@p8NB}OxDTefv4=w#iZJD*TexXIqn`bWe-%%8SVAkSY<997EwB} zKQH>_l+6aNTJGL)ll8B=w`TUr-FExcTMWKo{Ta-Hb?F0_J?KX6#=8CmB?siXyD*d< zc!W*5;+t)ph8zNSUJavj<gy7&6_?yI%f#wxH_URpRev#Ae-atXv%HgZ2{7}1-b|h% z!v1=i<k#B%5N}yTMEw@2=tXu-uf3d4tz{?AIw=t=4z^InB8DMy9JzaE(#7ZmD@cLk zjwZ`AHBwbY8}_eoI6}fnMKC<WPi``k+e5Ve`JBP2l{4c8LEJ{3Lc810!fyOZ&d$08 zwK$T22is)a3+X*euBKpfWfJ$9R!m_R{b5z}FYH>U3&;1ljZOm38bL@g*d$TZi)gwc zD2>c?-dEH?WWx?~vqz*e2Q%c7?1%H0h}-DHz8I4BqS1$gr|%smanW_35K5v1_E!`> zbs~xJ+;pMBy+cGT@O@};9w{7wI-OzEE!Ll+?iu95Juw6c3v$<z3C}cQ<+u>XJZo$5 z*7E+#8O$cMFYE$Nj6SJ%w@scT$y={s%e7Lp<<@0Tirnl^vM6nlCt<fuwN|{8WKf!) zVBL~-uRW>qOHSA7R&jtp0r@>!4-99CaHh#=_-$G>pD2MDEme*&zSu%Pmq-x>YU+#2 z%8X>z;(6Uw$7xRLn|&6>8;0;{CM7LMf(HLj5|Q{=<KP#X;8d<&LJX@DHYnzrjTVuO zDk9l{kE#{B5e1)`VUG&r72$i96YQLb=;T>ha=)p+n7JbE#_*l{Dm~0G$cvqcx=IVS z8)gX368r*eC5_W#8)QzstW<HwOPRYK=rZn!<x@JYRXH7{bbMDI!8=32!0B;O#gB&! zPu}3U#OLVx69WvRnI-ryns?l~?XN$<g)V%Wk)sT>Rj#7V&$vY6FeMmM>1^zBLaa_& zpemBZhWDx8KZ^ww8ngJK!Py3c1K=OY9gh@zCQBpo(8|bScbyVpcVg_to=hi@R)r5C z7KGweE>4QY!336?oz<0laK|#U>rZjU+#qFTvWzw1P_-SF3<QgYnT9;hAr-{Ijj3*T z!H~$n5%0uVXUIe{md=T-Ka&zY=bOwsiJbbKOa9ukA?@A_HY=Zf7TGW@jZ<5HvL@i! z_Bm<hiI`k=&y%2SAsn&lbVx9Q<LwAWhbsbJ%jw8?Us4LTpJThY%|JY*`EebNBJ$+k z>bK`hEqNq!C~}FZTF~4_yY<M%q|?<eXnL+sLuao1ba0?vnJGzHZ8ou4*jzEqe7;B` zO$xo3aLpdoTr#UeGE0Yr&k}fN+$CN<=jF6kl2&j>gg3QSK--+mO&Yf99fkiJiH~ZI z#wB;Y%+9#50;6k#&GbpBF|Ut_C#Z3>mQ_U8oE4NZ;ABytvzyzE?am{#Cu<D5V{|>C zE=6v=I`K1N8f0e0aqjwWqg~X~xYZ@8XCVP%!=HE%p*nUUeON4u)VNAXpOrfgK~^pP z$XQ2GAhzBagAFR>ZIvdSA;eu?e=3qYBgtm=oZyPUF@psxo1jIJ&Jt#!2u9F%sC|h) z+)PS>8j~oaM*a=s<QTu1?WxZo%^8cLT&UV4;KtK&XSI|*G1pptBTE|M5w>Yh-4N%- z88@g1=j6jFZ|_ByBUzUy$XkVm{c2cNSX*<t(Wi0W4>g>AEAD2s3fDN^Ve?69bLH)Q zJD3<E0nJ=a7@8%#S@rbayZ#JLDQ2}9Os)>eh8OFPnjX&hsF;TK{UL;7YIkYB+E>x7 z4tn>rLIeC}b89$9&{#_&v$lPBBVLiW81O_FO}AfE_av7E<Swi*E*<RW%ov+HR3~*L z3T`J)o$ndyI(a(sCdXY&M335yA<y+(&V1M3xdN^~L4pxien{5a#Rymf_tr!R{=*DL z%LnpYgYXd{%^0j2Mp7|7l-8mr*PnFjoRM$btW%wM9NqR7@;=tHL*~Xi{YLbH)Xdgb zM~Hol-EzyRnHZE%<A*L_IolktBZS00K}n{NTZXr(&E2V<wZrX#8KLMVQN^Z0Hp8v0 zE!Be|M0IfpOeWw^WZb@*=$+HlF{zs6Kk@8@9}2HIBw>}N4W?MPCcmR|UFXiB2erqM zQL0*Z%3A0gDQSzk`csWudbqi>0VPNgT(+a6gZA<N-p-x^ZyR~3YTpB0EUXW;;c7m# z!o=XJy$xO*mc%M@v-J(l_>3xl{!>CVMP)o)8p{$QDXxbF;TwM2c@!>aSa~k2`VF$z zlA9*8z~7)<Al6Q*!ab)aig5}uWeOi9SEuXFJq5NdI}Y`{?0NgP6fVqiW_9pD@V2>k zBccldBY(wfB3am>xs+Rza3tI;>KK>|3X=}JRmZimtCWz$YmuEfmGIXom`<8CZ@%{Z zUt?vobQscqx+<83^{1*Kw3GnNyZ>6@8f%qo?$M~tv{xX1z)kzQ2*Z2Gc6$f}#v&R5 z`x$>BaYjZVkdK;pVXXz9jPYUC>0HrcEz%>C=;Mj5`k!t5v<oVN%!dWq^S8sB&H9dQ zroF-1`o`JGJk<fwq|s!~#Jqs>1rbKd&kQCvUrh$)93ITHM+G8=MUd}yvc%m$U7mr| z3RaG6%~<VRsxpVqmW0L23D+riTN=1<3<<?Ky3{haRdUL9;JUhmGI5~d?O};PmqR6< z2gG|D!ZhY-aux)68m(kF&Wcf-eH0y(T!rKwwEh{P1OAleGI2>J7IB@zZHB<x83KMc HHT(YuMBkP| diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/fr/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 306a63be811082a765f0d6818c7fad3bdbe077b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12653 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/gl/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 6a78ab448ea011d53d6d7d6f6b52e5f28092ea5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12451 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/it/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index b3c07fba8d8c483a66037081d5ee4135b8d7dcf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12210 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 CZTw&W diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ja/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index d4900147dbe97548ea70d58041da94b766e966f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13452 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ne/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 662e547e447535833e08ee4adb6caf54fb4ed2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17171 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/nl/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 60fb2fa88cd312105228a9e2f7e6af9f480c9e4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11281 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 AJ^%m! diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/pt_BR/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index b3682f00389175fcaf41433c9bf96e16ccc71567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12168 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/ru/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index a4fac19d37faf68df9f9aafa8b26bf85003eb93f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15024 zcmbuEeUM#ceaDX#6(YWXZ(yxHVnqVkWjCn6l7QKSKqP@B8xmeDdUo&G-OJv+=k}hv z*{skuBp}knL?S9vF%VxX;<$t?d4r{sj?;1Kbk5b*{?W>G#@5a_qn*But*vc8-`{i2 zz31*r$k;Rc-0ykLd7j_%dw%cF*_X~g>$3sZKH58Id(R4j7s3BNn;)+Kcx@1z5B?{( z0zCKJAUF@a8st%M6Zn2`8@LtRo4x-r=;;4D_?zHcUl#=L1XqIRfVYBg0Pg~|)HwKR zumSQH+{@20@L>=V!J}FK5O@{+r@=1pAHdgxZ{kOEE&|^QUIvO@KPWmIK+)Nf^+WJY z^ef=o!JVMSe*qMKUjh+D@O1Y68IZr=dl~)>*h~MX;5Fbo*vxCd+d)_gK9=>X;JfH= z2QL6W2Wp*fgOba0pw{_*_WZ9w(Rm4!K7Ine3Vh`oy}Zr=m(#xx)V#Hz-roqm8N3<P zzJ@^uPJyEL82DB2Nl<cFj}k?H5L^e=Ks}!Y`@mD++rVFe((_v|0?GH?;C0}oS^pmJ zE%Xymd^`+Z2<``AJ@^Kwb&i9g_d`%}{5dGS{0d}=;B1)II&TNB1uq8mJ_5ym4b;3H zpy)jW-U)sMTm}9wsP$JN1kLLQrPocM<UR(z2fQDAH~3Xhdib;K{a=7u{~xpdzk<E= z&t-F)!D~Uu`w>v{J_m}gFM{IhtDy9L1e9J+fv^<31ilyi7x4Yy1sG>HxCy)xybqK< zkAPb5rL6x(g!M}LeW3PpEvWT2faX7-*1aoxe-9|VOoAFW3$kSJ0=N?V0eC6+YJ{;K z>;>hIJ3#UKc~Ik@1tqudf~Y3=d(eTu0JYu)C|7!YAE@_Nf{+eA3?i~%2wVY9fuj2r zP;&SaQ1bmtkiX#X__-VWCAbm1gGE2{iXiwJcoqFVl>A{Z0Y!f<!ykgH>Hi$O3taJA zUZ0-?Meix_R`47)cRP3&h{*>>z~2VH1B&mTf|Bd6Ku85=<D^>Wy&0|sFQR`NSORx| zqWdFI`?}nDIyZq=)4v-$4}1)ieLa=o_dv=0=in;vLSD)awt_qg_JHE&X;AZD1Vyh2 zUIxAvCRj4K61*GS20jfw2a4Zej9PeahMxg%qW?`${Qd%z-ZrrL4}iCW^7DP5o__(< z{HH+ic`AGVGw^-%e+f!I7h%MbR}5<Y$3a*O9s(tgZ-Aoz9S{=^{tHaO^Dp-Fe+*u( z=b-d*8N{{T1K=Nk-v(hdxcm}NZxBQ^K@2_)?gO>{WjG7B!3RO{@ljCgRzOGxUjqBV z?}GdV=duW_1Rn%3wcsP5o^J<Nf=_}|;159U<0gbIxr~C^-*!;;_!#)7U=zF-{Ok(9 z{&`(qfA0i&6!e0U``zHR;0!nb{u8M6Kh*8lzY|pd0Z@D#1gl^Z{F%lfEZJ>$kEeef zDE>Bs^3y6P{vH4&*RO%n*AKzX;QxSoz*~F0{r(87)9+_7UInvY0{#TN2E6kMzn{;6 zlKYoI@plT8ef%wm$p!xgo)5kaBQArNg3`mIAg_W$;70JTz!C5wlq3B<3`%e3e9-G_ zC5R}4F_6FDQGTSSKL=qo_-9b#-*aUUTn}ypHSPeo7W^*A62a?G&Kj^E+yp)VO77nW z-v*v{weK$nWk+M+Q{b!mg5VXPV%=S|Ewp=RW3)HZMro3ZV#72|*N5yE9|Yf&-3vZW z+mZEg7mHhx)vIWmY0}r(G+lp4ll-JB=?!(8T?2M~f?rG}xWjjY-vPDXkoFri$$WyA zU$5mxa(XpQdc}<GdLTo|zIY+F1sAHZ>u!EuN89VW_Pd(jeOX_ABOe{2T|oOJP1o;x zFuSR6FT0fO-9l^7ewTI|Z9DBjnyxp{Zl%RE*~_PBj;5=h_Awf&vP*iLqRBr{n_V|& zxF*AgG8_gs(XPw-0{PABX|m6IX}WIkV83VayOk#UE79IXdn4_mG~C1D8DQ6i{60*R zP3n@ZjnmGhZJ_1XZf;0L!AEHK(I#mFG+l!pEUx?>_ljF9Xt!t26L1wx_I@6%M!S)w z>wcR2<~6j4b`I^8wEVh>n>uY5P5!ZyCVyH_yOTCTTSp7l3=c<1QXVQ-%8hBaDXLB` z^2n8|rSfpti0f`>veAgEJaDzJ8dVtFC~q$}%2DF_?NzX*G7%>YcXM2gxKCm?UX7=! zE=*i0Y(#E?C0sHVPi6hET5^r@L{uQDN%d$Xswb`yyQ#Q7p47tO$Th|$Cx)tFxx(|Y zu;Hd-C`C3i-X7Jrm!l~+0*^^liD0Wb>caMHcxkvT;gH)f4F7}WkBdA1WE<Oyr`$k2 zG7>L4Ae%fDPA6`Vow#i+76+%wjp4DV9;~UBC&ETKt_J<#@c3vwo@AdU-u`GT++L3B zL4S-WCo*trqiTbB{-L|RTFP$+8)3Z>^iPhu%~373+gt^uFd6frXvCwV6?72RY87dU zg%ejPqlfL~T)WW7Cz|dgTtCmX#8(_W&E}#?#cdgjCZb?%Sc$5ou->|n!iFpH@VKco z$oThQ{AahG|Ft&K1kk>9195`wAf!c}xm!j?lBf}^olGPq4^rDYc5OdyO|9lOPgbi^ z^@iL;{j0VTHQWtGwXiM&_HW1HN-1$8;r6&*#wKNhaV@GwrA`5sF_py6NOA&5wJKA@ z{<3F?y@o6hJtXV#gqy79{a{@*5>8ecIl94G6qV>D<Bhl$tScwsP$e?)SHfvG9!<MT zlF3?B*X{CPT|BARgZ2b%X}>qr%cbD@?O02aLBS^r`dA+(jX*ybl>yxw<AxiK>s9E7 zxqZ55WCU+X0!b_hZi=Rd;;>$F8$;ZyF~5JBNU$*)X#^X~)$t_Q7{}w%$qkh-N!*Q5 zd320d9S^saOO3H$Q@Eo%flghBolTh=CJy%;u1DT^HkHL^CAc}-(P;ZJLm59LHAHTt zT*u7YQDSN=s#<6W>lPX`20jWyx=rCVxqCdB6sH!*c204NQJuGPcW^T*%H>L@Q69;B z(e;N_Nxfz79WQHfZL;QSnJ@UIs)gB!#Y@K+M5FB_$S0}>w+yapQ&gvu1cUuRS1Knp z*_RKy3+WIKjiSRKZQvzPTOQm(P}MYS!tSxWsCA<l3?~*LxFdk$VU041oK|2l4Wd^! z;Wg+=nazu+!mJUpcsodNm$g_}9k8rozga?Y17WGu`Mwat{m7Q{FE+SC*0S=zPiiT{ zciYP=vbES8Fy*X^5Jceb&G+&4C?r93Xryf=!((A})Z1svGMPSw4R{Xf@kqH61-DL? z37~^fL+L8Xx<oze`drycwVR^};<T50N&Hx{ljkH^*1-U<BnAF)xm2U85e}_z!;N~S ztJNd0cn6074!**5cXtOlY43uroRELR(zGjDp*hV+JdDR=oA#rF&F0>l%cP#j^~XDc z%$PPu#2V9FOFj9k!LhI|l`eQuZ_ObXWF<#S02$pRo4nWvbTT{^3>r9MWPMu7L~P#X ziV4j!Hxad+FS7zhFD#R~Q7pc#(~^(IV`U<L9;3-2#8p3|rRcUkBI2|s5LfXFN}@uv znM}wxXl~4vrmNvZdAR*92?i_il>HFCbsuRNRRVY~*qCI9F_A||da4e{_aTm>QV!=^ z8x!0kjcmOe2pjbXAJ`INBVM9}g+?KXWaW_MY8#bUaF{o$QEs5_p|I}i(m$nuELqiE zu!X=tCQ5kiD-P@>vn&g`lxan!Xm|+@I`r8tZCDp|DA?e0W|}_Z+cL_~<l7Q{^)f4{ zgp|o8N;j$!nc1kv)RGfnH5`S&e4ZN0IWJF}JiaBa<@K9xRlEs(<+EkFMj(iBa<k2? z?Rso$T$v<ps`?l*Ayz5H<y>Cit*~vmM*_&A%9w%=xq2H(QnhA=+CZTI*rq&q!_BvB zx<0Gp@ajYsBq?A;l7Wc&ET$4Xuqmpliz<bmEOw*qyp+{Yt!)&l5|nnaNJ>R}lNI(C z`9c(vDTui{$ZTz0gc7L8)-)P8Ed`-luRxQ(&dUVoOuM|K%BBurcJQ$_tXUyB@2Oc~ z=GUFCEDW~`_d=Dv)>lZD5849;qG&uQbQNg}{Z`@M9+E%uiLL#7TRkLI>OfGK-xh6N zp_!o;gjF0I?;sEGP9C8k)qaNz^CFQIk-Sybde6PLj!rYV19cCFSk72%9vd~Ls4b+* zu2M8Ytt+)!vcfd$R#<6xQl6+0(THJsRChY!p)o3T{HsK1oMp6}yjdQP<pUP<$US-2 z$7zULxU>`_8^sC;wM7XG)Z=@oRl7Eny0&sU#7_F$70djwsB2R)S}t{QPD;AA#C>kr zz%5;ysqi$aYaJ)gKDV-G<;t#}4|Mfj<$AB`>sfhO&y_tr%Qh0hySCKBYEsbwq0epY z?{}*z<)J#88=p+B_`sD{_k3t{f^%p0a6EA>6RM+=M2xO2Q8>}Z0fh5&SZzJ-bM?t( zn>K8^zRhEAch9o5gc~;6rEt*a6k9H*)GAl6kyqD|*XrB0tna$2Jx&~P2JX7PIvgvD z_PMKu%8g|MmC1To=~^GxCz3u_tywo&eZ@7-->$x-`rh82)vJ5m#TPr>_Pl#_Z?C(~ z^*DypzjpP?{MD+}@7Jx(=vmd<<L<l9Phm{Ya_00hXXWy1mfhZU1E(W9K=n~_MkN$; zMR!kk@3J6$Je^HnXzp{(`_mWG+2$wGW9dwKvbmRsdzufr^l&<t9!;O;_qp_ibgp@S za~Cs?|JoBBRAwA&&2TfDo=lGg=^u$Qk51^#!SopxoNMk3(kFn2Snrr79cw<s_-E5O zd#<tR(dHibn}O|JE<KXYG<P+3JB>cv+{xJIoBJ1A?OSa11lwe`W84huu?+MdL<p=l z2UBzD;T4WibLuyDvd*li?vXr>vD7h1flh(lbhcZcB)asGB7IWaA+_1&PR9*fW(8P& z`4Nc5m_MSOac3)eg}@ct_XALbl){eLf#b~yEwTjp{}09V04quE$X9C9N-fE={9Zj| zn~XUDoBP-&dZ335old+#`e`YZP0X0lVFoQzY%9eS-d4+u*ZpD0AE9afY>*zXo1@L$ zg<E6QL0Q&~ko5A443`lfOOKmwxy9f+pPL0B_vWr3J;Y|`(r20vO9|R29e$dhgu*lI zmZdu^SB7n$D~i@#G$Xc(MPf$gRc1xr?~Wm31nX6M%<S*EY=3y#f<=n-W%wsWHq%1$ zK`5E74om#A>=+>z?Gzy%VhM>5GnclcDX9#5)oS>^EiRAR+1$IxBUyf1ws=BwH<UcZ z=d;;J*|b#{C?$MNq@@up<HO86bu2!jsF>D>CDy$>{W`4Q-`o?VI3lu@*~+PNp~7&> zGEmx5+#fOze%OS8rJdO%f|hNJ80MwRbT$eX3OdN-i^iKIFqa<JL;s1YtyGEpF^m%f z;kCSp5Y+aiT?#{T=?+7|1nkS2cH9m<A}|Lj8P@{SH0dx_u0$Medo2+c^0S^VGfjr@ z1XEI^&56RgI!AF4Y4e3VW$;vS^Mv9inzl5ufL}@C3(UqHoBO+rz|x#7bRsQad^h*Q z8cZF916E`!FJ=Zv0#l4$u(F(m=`AMx6wx7LEX^!>m7ypTo>Y)C&i7>|zQ}XwA<HZn zc%E5;^q@oo2}Q~*t`IopnP+RnjJt%XyEE@*9z#h%ib2bR^il3*L{jka>_a1BSv($` zXvdlp%99HOBb6xTJtMVAE%Ul(?Dda8fJ}-uNY?GntisDdwyg+2IMq6>VIA2(Dk9Zk zK>KaD(jG#1R@;|vc%zo<q~5{3V2<#DB-N6Ve5bivX1J6?nO91tnu^^nGIg;M!pBcy zClX={d*I8M`8<@4nyV;DD!gHU2eeJ|2!{VLa+T*QR}_bel=ocXC?j5gZ_7D{nG2CD z!Apgz#|X{dbCfmBiIhlfMVUQ{gcaok)d@b<EAKtujv^SJy6u989Ptb?mZ$I1GV?P; zW`fFI$GctnX;Jri|44qTcW1r?F@t4%Xr4j0mWW`;a#<(e$Gfp3%;u=``_^WO;1*83 z0eCVU5q^o3wA6U=vbZ_P9+VXKS=y&0T$GGAisq**<VY2>zA`zAdf|&b6yC`@t#Bj1 zqF5g@kZ%XKZBp}x```x!%jz<m0&STF&MK!xo<wM?hE0lvQ6kC6*81OS@eMf%TqcyK z8{=O|-(r;Qw8*T&!V{V1DcV`q7h}F=u!78IUxko|psR{?vGG~thI<8G0uq~`As42Z zH~L71S~^T#`zV+^tH_A6wM@_^3LkqH7LW&7B|BfVZk_V27-1&LPfxlOGhrAK^9K>r zvHZ&dxK>n9_9A^QJtFp1foG=}aj0Eqv$8mq)9W}9%o|2_Sd@5CK~@hy+ZM4v(y<a- zY3VX69Tv6WJa#U0ozrmMvC<Ry1{KYV<))0SC0vCz1;)IFuo%72*}SHZpg+khtbmF| zfP#=DH-`}&MlDtZnANlS`3_=<P9e?gAKp%DAD<TmEYR2E*wrrErKQ6sm^s&c0P{0T zXr(sTVaJ-6<+H4?YaMCYxsGJOsk%6ngOjA!DfBPP+w+b2>ZT<>8C#a*Ej!pTebL}$ z(xm<qaUZKmaK$qku6KNeihqhHwhCuTTql<L?}G%#LOx3_oo)SpCDJeZpk#S$(J-pu z<rBRk*kPpNzc1iBdA`Gskf}l&=R1e!c|mHtA7)X7MQYMyTl2W_BkA)&ddMP^Y9*}i z30C(dxMdARu!T;7cg`Rt9mQC)9gdm5a4>_kxWa>ij~w43yk?s}k@~X(059j|gGDJW zxx7y`oz}6CAsEm>HFF|Pc4mpH8&wb$_9Nqwi*yn^gpwpr^G$6)8=-?Bmw00)+xGF< zApMf!xG2L4trf?8W|UnaVKW9OXQ5KuELw+Jm8{AwSF!xpYsWh#>~@@gEFS1#M_s9t zufC+@MKWDBuQZ9)jxpH&3*(D&NifTyp35bCrn#3$B=6)j>0|(Gl~p@bkHJw!nOU-s zKM+#1N;XQfFBC(NK1Y}pF^n4r<rBu8>io>e;aYW_6<67j9#XbBs4;_Fpi0@aW?!<j zlkE60@57e=&_Vz~UyxOe{y4Yo2lMN6h0XR`Kio5n5#-++Ix72)1f3u9y&W8ZltPiI zKp!5&wQ7i?3;yq=?|+P5a(w>3u#OKTr@omU(iFDmjSZ1l=?kr*AEYy<$nu0;OA34d zW#U0^n5Ry5eslS?Nw#8;PG@bSm$m4m$r(-@NR*~$z9{)fPbiW5V7KOi?e9N~SCq<5 z)~I|xrdY^=zG{^jsHl^hH$UY~!hDbLE*H0i(D~_7-s{V*nJ(EU5-fgu5SJ>k(34+K zjOCwSZBeR7@`ygxW*;a!oip3mi-d0fIc1KDzHpASU8F}mf0;cmj4)4XQ46|!RfS7d zlkHf=rofXWMR;e^^4?vUby-Cqd-uw=Y@^Cvp+`9)t6e2D<f8ax6{4zoMYR)BQO;sf zqH?>_$n*fDVX*mNb9aDMwmL?t@HJ`vYjK}(rU+b^$Q$u$S<R?RQ4&LI^Buwa08)}B z^`%%=M)itMoq5f~RFgLbp;)1SnLZ0=gdW+EXzG!4P0rlUo7PkB?XqM-Wk<(szWw=a z>5qqBhdS2OK9#bfRM!!vy{TIc@y;O|Q|_8A{`XW4trTrXD2}Pl%uuIxJ1<Foxy0xB zs&!l5igb&i+aFv^42tn+`B9cRNpO?zd8uS4X}Hpn(x0~cYD86HI%kLMxvAX8Y#Sy! zR1`DK`LyOg2_WzzeuYkJ#iz0mhPy&-)?{a&$5dR&4qBfLS_9<)N4<&RQG9hU57s^x z`KYBjz8IZOXZ@!OTc>fFj;K%!R~>Fy3<WT1Uxqq0qk1gYj4beA?$w>c2+RdJr+iU5 zAooL?h3^0g-wUH+L0|L#c_f4PX>DG?t&As$FO`~$`?3%wEzYOG*M-y3KuPv-L}mIh z#R}7X$FXN2zr}^mM4$_!^BMkM&D=k)<t*iy^TKQUd&u!16+fAf@XlP3_8&NUh{ji_ znd5e58>T;Q*@_g38kw$tO4<Jd7Jq)mA?bh^@c#_OtrRx2fCVIl*S231gLp5=D~)HR z7DF*4ZMSuZ%!6l^vJ^#HCkLa*Ua?Q3rvI?`I*@e<FnTCj`C)S*a~h<rd)63fLYuET yQhHv+wn*CdmqISlg371687!+pHSJjtws@zygQXb4U}KR;Xi+CGM~uoN!T$j;)u*Qb diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/sv/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 2aa36565ca6611fc6888d4c8a07e52123e2196af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11188 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 W6UBtEgzJ*|)X_{iXG6i9<Nt3tD*izL diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_CN/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 72ac65e6cf23c51e81513ade649dceda3c7be647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10764 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 NaXqLl3eQmf@c(`#5D5SP diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/locale/zh_TW/LC_MESSAGES/just-perfection.mo deleted file mode 100644 index 67192c23a39757b231965074e4074e9e7cbd578e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10740 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/private_metadata.json deleted file mode 100644 index bec7eee8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/private_metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Tweak Tool to Customize GNOME Shell, Change the Behavior and Disable UI Elements", - "donations": { - "buymeacoffee": "justperfection", - "patreon": "justperfection" - }, - "gettext-domain": "just-perfection", - "name": "Just Perfection", - "settings-schema": "org.gnome.shell.extensions.just-perfection", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "https://gitlab.gnome.org/jrahmatzadeh/just-perfection", - "uuid": "just-perfection-desktop@just-perfection", - "version": 30 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/resources.gresource deleted file mode 100644 index a93f5c1b9ef40af78f9cdf9fed93056f4d64ff3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96880 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/executable_org.gnome.shell.extensions.just-perfection.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/executable_org.gnome.shell.extensions.just-perfection.gschema.xml deleted file mode 100644 index b732d5fa..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/executable_org.gnome.shell.extensions.just-perfection.gschema.xml +++ /dev/null @@ -1,409 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist> - - <schema id="org.gnome.shell.extensions.just-perfection" - path="/org/gnome/shell/extensions/just-perfection/"> - - <key type="b" name="panel"> - <default>true</default> - <summary>Panel</summary> - <description>Panel Visibility Status</description> - </key> - - <key type="b" name="panel-in-overview"> - <default>false</default> - <summary>Panel in Overview</summary> - <description>Panel in Overview Visibility Status</description> - </key> - - <key type="b" name="background-menu"> - <default>true</default> - <summary>Background Menu</summary> - <description>Background Menu Status</description> - </key> - - <key type="b" name="search"> - <default>true</default> - <summary>Search Box</summary> - <description>Search Box Visibility Status</description> - </key> - - <key type="b" name="workspace"> - <default>true</default> - <summary>Workspace Switcher</summary> - <description>Workspace Switcher Visibility Status</description> - </key> - - <key type="b" name="dash"> - <default>true</default> - <summary>Dash</summary> - <description>Dash Visibility Status</description> - </key> - - <key type="b" name="osd"> - <default>true</default> - <summary>OSD</summary> - <description>OSD Visibility Status</description> - </key> - - <key type="b" name="workspace-popup"> - <default>true</default> - <summary>Workspace Popup</summary> - <description>Workspace Popup Visibility Status</description> - </key> - - <key type="b" name="theme"> - <default>false</default> - <summary>Theme</summary> - <description>Theme Status</description> - </key> - - <key type="b" name="activities-button"> - <default>true</default> - <summary>Activities Button</summary> - <description>Activities Button Visibility Status</description> - </key> - - <key type="b" name="clock-menu"> - <default>true</default> - <summary>Clock Menu</summary> - <description>Clock Menu Visibility Status</description> - </key> - - <key type="b" name="panel-notification-icon"> - <default>true</default> - <summary>Panel Notification Icon</summary> - <description>Panel Notification Icon Visibility Status</description> - </key> - - <key type="b" name="keyboard-layout"> - <default>true</default> - <summary>Keyboard Layout</summary> - <description>Keyboard Layout Visibility Status</description> - </key> - - <key type="b" name="accessibility-menu"> - <default>true</default> - <summary>Accessibility Menu</summary> - <description>Accessibility Menu Visibility Status</description> - </key> - - <key type="b" name="quick-settings"> - <default>true</default> - <summary>Quick Settings Menu</summary> - <description>Quick Settings Visibility Status</description> - </key> - - <key type="b" name="power-icon"> - <default>true</default> - <summary>Power Icon</summary> - <description>Power Icon Visibility Status</description> - </key> - - <key type="b" name="window-picker-icon"> - <default>true</default> - <summary>Window Picker Icon</summary> - <description>Window Picker Icon Visiblity</description> - </key> - - <key type="b" name="type-to-search"> - <default>true</default> - <summary>Type to Search</summary> - <description>Type to Search Behavior</description> - </key> - - <key type="i" name="panel-corner-size"> - <default>0</default> - <range min="0" max="61"/> - <summary>0 means use Shell theme, 1 means no border, 2 - 61 means border size</summary> - <description>Panel Corner Size</description> - </key> - - <key type="i" name="workspace-switcher-size"> - <default>0</default> - <range min="0" max="30"/> - <summary>Workspace Switcher Size in percent, 0 means use default size</summary> - <description>Workspace Switcher Size</description> - </key> - - <key type="i" name="top-panel-position"> - <default>0</default> - <range min="0" max="1"/> - <summary>Top Panel Position</summary> - <description>Top Panel Position Status</description> - </key> - - <key type="i" name="clock-menu-position"> - <default>0</default> - <range min="0" max="2"/> - <summary>0 means center, 1 means right, 2 means left</summary> - <description>Clock Menu Position Status</description> - </key> - - <key type="i" name="clock-menu-position-offset"> - <default>0</default> - <range min="0" max="20"/> - <summary>0 means start of the position</summary> - <description>Clock Menu Position Offset</description> - </key> - - <key type="b" name="show-apps-button"> - <default>true</default> - <summary>Show Apps Button Visiblity</summary> - <description>Show Apps Button Visiblity Status</description> - </key> - - <key type="i" name="animation"> - <default>1</default> - <range min="0" max="7"/> - <summary>0 means disabled, 1 means default speed, animation speed otherwise</summary> - <description>Animation Status</description> - </key> - - <key type="b" name="window-demands-attention-focus"> - <default>false</default> - <summary>Window Demands Attention Focus</summary> - <description>Window Demands Attention Focus Status</description> - </key> - - <key type="b" name="window-maximized-on-create"> - <default>false</default> - <summary>Window Maximized on Create</summary> - <description>Window Maximized on Create Status</description> - </key> - - <key type="i" name="dash-icon-size"> - <default>0</default> - <range min="0" max="64"/> - <summary>0 means default, 16, 22, 24, 32, 40, 48, 56, 64</summary> - <description>Dash Icon Size</description> - </key> - - <key type="i" name="startup-status"> - <default>1</default> - <range min="0" max="1"/> - <summary>0 means desktop, 1 means overview</summary> - <description>Startup Status</description> - </key> - - <key type="b" name="workspaces-in-app-grid"> - <default>true</default> - <summary>Workspaces Visiblity in App Grid</summary> - <description>Workspaces Visiblity in App Grid Status</description> - </key> - - <key type="i" name="notification-banner-position"> - <default>1</default> - <range min="0" max="5"/> - <summary>0: top start, 1: top center, 2: top end, 3: bottom start, 4: bottom center, 5: bottom end</summary> - <description>Notification Banner Position</description> - </key> - - <key type="b" name="workspace-switcher-should-show"> - <default>false</default> - <summary>Always Show Workspaces Switcher</summary> - <description>Always Show Workspace Switcher Status</description> - </key> - - <key type="i" name="panel-size"> - <default>0</default> - <range min="0" max="64"/> - <summary>0 means use Shell theme, 1 - 64 means size in pixels</summary> - <description>Panel Size</description> - </key> - - <key type="i" name="panel-button-padding-size"> - <default>0</default> - <range min="0" max="61"/> - <summary>0 means use Shell theme, 1 means no padding, 2 - 61 means padding size</summary> - <description>Panel Button Padding Size</description> - </key> - - <key type="i" name="panel-indicator-padding-size"> - <default>0</default> - <range min="0" max="61"/> - <summary>0 means use Shell theme, 1 means no padding, 2 - 61 means padding size</summary> - <description>Panel Indicator Padding Size</description> - </key> - - <key type="b" name="window-preview-caption"> - <default>true</default> - <summary>Window Preview Caption</summary> - <description>Window Preview Caption Status</description> - </key> - - <key type="b" name="window-preview-close-button"> - <default>true</default> - <summary>Window Preview Close Button</summary> - <description>Window Preview Close Button Status</description> - </key> - - <key type="i" name="workspace-background-corner-size"> - <default>0</default> - <range min="0" max="61"/> - <summary>0 means use default shell size, 1 means no radius, 2 - 61 means radius size</summary> - <description>Workspace Background Corner Size</description> - </key> - - <key type="b" name="workspace-wrap-around"> - <default>false</default> - <summary>Workspace Wrap Around</summary> - <description>Workspace Wrap Around Status</description> - </key> - - <key type="b" name="ripple-box"> - <default>true</default> - <summary>Ripple Box</summary> - <description>Ripple Box Status</description> - </key> - - <key type="b" name="double-super-to-appgrid"> - <default>true</default> - <summary>Double Supper To App Grid</summary> - <description>Double Supper To App Grid Status</description> - </key> - - <key type="b" name="overlay-key"> - <default>true</default> - <summary>Overlay Key</summary> - <description>Overlay Key to Overview Status</description> - </key> - - <key type="b" name="switcher-popup-delay"> - <default>true</default> - <summary>Switcher Popup Delay</summary> - <description>Removes the delay for all switcher popups like alt-tab, ctrl-alt-tab, keyboard layout, ...</description> - </key> - - <key type="b" name="world-clock"> - <default>true</default> - <summary>World Clock Visibility in Clock Menu</summary> - <description>World Clock Visibility Status</description> - </key> - - <key type="b" name="weather"> - <default>true</default> - <summary>Weather Visibility in Clock Menu</summary> - <description>Weather Visibility Status</description> - </key> - - <key type="b" name="events-button"> - <default>true</default> - <summary>Events Button Visibility in Clock Menu</summary> - <description>Events Button Visibility Status</description> - </key> - - <key type="b" name="calendar"> - <default>true</default> - <summary>Calendar Visibility in Clock Menu</summary> - <description>Calendar Visibility Status</description> - </key> - - <key type="i" name="panel-icon-size"> - <default>0</default> - <range min="0" max="60"/> - <summary>0 means use Shell theme, 1 - 60 means panel icon size</summary> - <description>Panel Icon Size</description> - </key> - - <key type="b" name="dash-separator"> - <default>true</default> - <summary>Dash Separator Visibility</summary> - <description>Dash Separator Visibility Status</description> - </key> - - <key type="b" name="workspace-peek"> - <default>true</default> - <summary>Workspace Peek</summary> - <description>Workspace Peek Status</description> - </key> - - <key type="i" name="looking-glass-width"> - <default>0</default> - <range min="0" max="9"/> - <summary>Width Size in percent, 0 means use default size</summary> - <description>Looking Glass Width size</description> - </key> - - <key type="i" name="looking-glass-height"> - <default>0</default> - <range min="0" max="9"/> - <summary>Height Size in percent, 0 means use default size</summary> - <description>Looking Glass Height size</description> - </key> - - <key type="i" name="osd-position"> - <default>0</default> - <range min="0" max="9"/> - <summary>OSD Position</summary> - <description>OSD Position Status</description> - </key> - - <key type="b" name="window-menu-take-screenshot-button"> - <default>true</default> - <summary>Window Menu Take Screenshot Button Visibility</summary> - <description>Window Menu Take Screenshot Button Visibility Status</description> - </key> - - <key type="i" name="alt-tab-window-preview-size"> - <default>0</default> - <range min="0" max="512"/> - <summary>0 means default size</summary> - <description>Alt Tab Window Preview Size</description> - </key> - - <key type="i" name="alt-tab-small-icon-size"> - <default>0</default> - <range min="0" max="512"/> - <summary>0 means default size</summary> - <description>Alt Tab Small Icon Size (Window Preview Icon Size)</description> - </key> - - <key type="i" name="alt-tab-icon-size"> - <default>0</default> - <range min="0" max="512"/> - <summary>0 means default size</summary> - <description>Alt Tab Icon Size</description> - </key> - - <key type="b" name="screen-sharing-indicator"> - <default>true</default> - <summary>Screen Sharing Indicator Visibility in Panel</summary> - <description>Screen Sharing Indicator Visibility Status</description> - </key> - - <key type="b" name="screen-recording-indicator"> - <default>true</default> - <summary>Screen Recording Indicator Visibility in Panel</summary> - <description>Screen Recording Indicator Visibility Status</description> - </key> - - <key type="i" name="controls-manager-spacing-size"> - <default>0</default> - <range min="0" max="150"/> - <summary>0 means default size</summary> - <description>Controls manager spacing Size (overview spacing)</description> - </key> - - <key type="b" name="dash-app-running"> - <default>true</default> - <summary>Dash app running dot</summary> - <description>Dash app running dot visibility status</description> - </key> - - <key type="i" name="max-displayed-search-results"> - <default>1</default> - <range min="0" max="40"/> - <summary>0 means default, max displayed search results otherwise</summary> - <description>Max Displayed Search Results</description> - </key> - - <key type="b" name="quick-settings-dark-mode"> - <default>true</default> - <summary>Dark Mode Toggle Button Visibility In Quick Settings</summary> - <description>Dark Mode Toggle Button Visibility Status</description> - </key> - - </schema> - -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/just-perfection-desktop@just-perfection/schemas/gschemas.compiled deleted file mode 100644 index c75050fe2acb5b09c10e447e7d7b4c667723bf3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4405 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 MX|6gZUu*jR0fSJACjbBd diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index f390ccb9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2013 Gabriel Rossetti <rossetti.gabriel@gmail.com> -// SPDX-FileCopyrightText: 2013 Florian Müllner <fmuellner@gnome.org> -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import {AppIcon} from 'resource:///org/gnome/shell/ui/appDisplay.js'; -import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js'; - -export default class Extension { - constructor() { - this._injectionManager = new InjectionManager(); - } - - enable() { - this._injectionManager.overrideMethod(AppIcon.prototype, 'activate', - originalMethod => { - return function () { - // eslint-disable-next-line no-invalid-this - originalMethod.call(this, 2); - }; - }); - } - - disable() { - this._injectionManager.clear(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index 73d3a634..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/launch-new-instance@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Always launch a new instance when clicking in the dash or the application view.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.", - "extension-id": "launch-new-instance", - "gettext-domain": "gnome-shell-extension-launch-new-instance", - "name": "Launch new instance", - "settings-schema": "org.gnome.shell.extensions.launch-new-instance", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "launch-new-instance@gnome-shell-extensions.gcampax.github.com", - "version": 42 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/mprisNode.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/mprisNode.xml deleted file mode 100644 index 1b7ad0b2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/mprisNode.xml +++ /dev/null @@ -1,74 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<!-- GDBus 2.76.6 --> -<node> - <interface name="org.freedesktop.DBus.Properties"> - <method name="Get"> - <arg type="s" name="interface_name" direction="in"/> - <arg type="s" name="property_name" direction="in"/> - <arg type="v" name="value" direction="out"/> - </method> - <method name="GetAll"> - <arg type="s" name="interface_name" direction="in"/> - <arg type="a{sv}" name="properties" direction="out"/> - </method> - <method name="Set"> - <arg type="s" name="interface_name" direction="in"/> - <arg type="s" name="property_name" direction="in"/> - <arg type="v" name="value" direction="in"/> - </method> - <signal name="PropertiesChanged"> - <arg type="s" name="interface_name"/> - <arg type="a{sv}" name="changed_properties"/> - <arg type="as" name="invalidated_properties"/> - </signal> - </interface> - <interface name="org.mpris.MediaPlayer2"> - <method name="Raise"/> - <method name="Quit"/> - <property type="b" name="CanQuit" access="read"/> - <property type="b" name="CanSetFullscreen" access="read"/> - <property type="b" name="CanRaise" access="read"/> - <property type="b" name="HasTrackList" access="read"/> - <property type="s" name="Identity" access="read"/> - <property type="s" name="DesktopEntry" access="read"/> - <property type="as" name="SupportedUriSchemes" access="read"/> - <property type="as" name="SupportedMimeTypes" access="read"/> - </interface> - <interface name="org.mpris.MediaPlayer2.Player"> - <method name="Next"/> - <method name="Previous"/> - <method name="Pause"/> - <method name="PlayPause"/> - <method name="Stop"/> - <method name="Play"/> - <method name="Seek"> - <arg type="x" name="Offset" direction="in"/> - </method> - <method name="SetPosition"> - <arg type="o" name="TrackId" direction="in"/> - <arg type="x" name="Position" direction="in"/> - </method> - <method name="OpenUri"> - <arg type="s" name="Uri" direction="in"/> - </method> - <signal name="Seeked"> - <arg type="x" name="Position"/> - </signal> - <property type="s" name="PlaybackStatus" access="read"/> - <property type="s" name="LoopStatus" access="readwrite"/> - <property type="d" name="Rate" access="readwrite"/> - <property type="b" name="Shuffle" access="readwrite"/> - <property type="a{sv}" name="Metadata" access="read"/> - <property type="d" name="Volume" access="readwrite"/> - <property type="x" name="Position" access="read"/> - <property type="d" name="MinimumRate" access="read"/> - <property type="d" name="MaximumRate" access="read"/> - <property type="b" name="CanGoNext" access="read"/> - <property type="b" name="CanGoPrevious" access="read"/> - <property type="b" name="CanPlay" access="read"/> - <property type="b" name="CanPause" access="read"/> - <property type="b" name="CanSeek" access="read"/> - <property type="b" name="CanControl" access="read"/> - </interface> -</node> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/watchNode.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/watchNode.xml deleted file mode 100644 index 30dcc3d6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/dbus/watchNode.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" -"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> -<node> - <interface name="org.freedesktop.DBus"> - <method name="ListNames"> - <arg direction="out" type="as"/> - </method> - <signal name="NameOwnerChanged"> - <arg type="s"/> - <arg type="s"/> - <arg type="s"/> - </signal> - <signal name="NameLost"> - <arg type="s"/> - </signal> - <signal name="NameAcquired"> - <arg type="s"/> - </signal> - </interface> -</node> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/extension.js deleted file mode 100644 index 19abbdfb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/extension.js +++ /dev/null @@ -1,496 +0,0 @@ -import Gio from "gi://Gio"; -import GLib from "gi://GLib"; -import Meta from "gi://Meta"; -import Shell from "gi://Shell"; -import * as Main from "resource:///org/gnome/shell/ui/main.js"; -import * as Mpris from "resource:///org/gnome/shell/ui/mpris.js"; -import { Extension } from "resource:///org/gnome/shell/extensions/extension.js"; -import PanelButton from "./helpers/shell/PanelButton.js"; -import PlayerProxy from "./helpers/shell/PlayerProxy.js"; -import { debugLog, enumValueByIndex, errorLog, handleError } from "./utils/common.js"; -import { getAppByIdAndEntry, createDbusProxy } from "./utils/shell_only.js"; -import { PlaybackStatus, WidgetFlags, MPRIS_PLAYER_IFACE_NAME, DBUS_PROPERTIES_IFACE_NAME, MPRIS_IFACE_NAME, DBUS_OBJECT_PATH, DBUS_IFACE_NAME, ExtensionPositions, } from "./types/enums/common.js"; - -Gio._promisify(Gio.File.prototype, "load_contents_async", "load_contents_finish"); - -export default class MediaControls extends Extension { - labelWidth; - isFixedLabelWidth; - scrollLabels; - hideMediaNotification; - showLabel; - showPlayerIcon; - showControlIcons; - showControlIconsPlay; - showControlIconsNext; - showControlIconsPrevious; - showControlIconsSeekForward; - showControlIconsSeekBackward; - coloredPlayerIcon; - extensionPosition; - extensionIndex; - elementsOrder; - labelsOrder; - shortcutShowMenu; - mouseActionLeft; - mouseActionMiddle; - mouseActionRight; - mouseActionDouble; - mouseActionScrollUp; - mouseActionScrollDown; - cacheArt; - blacklistedPlayers; - settings; - panelBtn; - watchProxy; - playerProxies; - watchIfaceInfo; - mprisIfaceInfo; - mprisPlayerIfaceInfo; - propertiesIfaceInfo; - mediaSectionAddFunc; - enable() { - this.playerProxies = new Map(); - this.initSettings(); - this.initProxies().catch(handleError); - this.updateMediaNotificationVisiblity(); - - Main.wm.addKeybinding("mediacontrols-show-popup-menu", this.settings, Meta.KeyBindingFlags.NONE, Shell.ActionMode.NORMAL, () => { - this.panelBtn?.menu.toggle(); - }); - - debugLog("Enabled"); - } - disable() { - this.playerProxies = null; - this.destroySettings(); - this.watchIfaceInfo = null; - this.mprisIfaceInfo = null; - this.mprisPlayerIfaceInfo = null; - this.propertiesIfaceInfo = null; - this.watchProxy = null; - this.removePanelButton(); - this.updateMediaNotificationVisiblity(true); - Main.wm.removeKeybinding("mediacontrols-show-popup-menu"); - debugLog("Disabled"); - } - getPlayers() { - const players = []; - - for (const player of this.playerProxies.values()) { - if (player.isInvalid) { - continue; - } - - players.push(player); - } - - return players; - } - initSettings() { - this.settings = this.getSettings(); - this.labelWidth = this.settings.get_uint("label-width"); - this.isFixedLabelWidth = this.settings.get_boolean("fixed-label-width"); - this.scrollLabels = this.settings.get_boolean("scroll-labels"); - this.hideMediaNotification = this.settings.get_boolean("hide-media-notification"); - this.showLabel = this.settings.get_boolean("show-label"); - this.showPlayerIcon = this.settings.get_boolean("show-player-icon"); - this.showControlIcons = this.settings.get_boolean("show-control-icons"); - this.showControlIconsPlay = this.settings.get_boolean("show-control-icons-play"); - this.showControlIconsNext = this.settings.get_boolean("show-control-icons-next"); - this.showControlIconsPrevious = this.settings.get_boolean("show-control-icons-previous"); - this.showControlIconsSeekForward = this.settings.get_boolean("show-control-icons-seek-forward"); - this.showControlIconsSeekBackward = this.settings.get_boolean("show-control-icons-seek-backward"); - this.coloredPlayerIcon = this.settings.get_boolean("colored-player-icon"); - this.extensionPosition = enumValueByIndex(ExtensionPositions, this.settings.get_enum("extension-position")); - this.extensionIndex = this.settings.get_uint("extension-index"); - this.elementsOrder = this.settings.get_strv("elements-order"); - this.labelsOrder = this.settings.get_strv("labels-order"); - this.mouseActionLeft = this.settings.get_enum("mouse-action-left"); - this.mouseActionMiddle = this.settings.get_enum("mouse-action-middle"); - this.mouseActionRight = this.settings.get_enum("mouse-action-right"); - this.mouseActionDouble = this.settings.get_enum("mouse-action-double"); - this.mouseActionScrollUp = this.settings.get_enum("mouse-action-scroll-up"); - this.mouseActionScrollDown = this.settings.get_enum("mouse-action-scroll-down"); - this.cacheArt = this.settings.get_boolean("cache-art"); - this.blacklistedPlayers = this.settings.get_strv("blacklisted-players"); - - this.settings.connect("changed::label-width", () => { - this.labelWidth = this.settings.get_uint("label-width"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_LABEL | WidgetFlags.MENU_LABELS | WidgetFlags.MENU_IMAGE); - }); - - this.settings.connect("changed::fixed-label-width", () => { - this.isFixedLabelWidth = this.settings.get_boolean("fixed-label-width"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_LABEL | WidgetFlags.MENU_LABELS | WidgetFlags.MENU_IMAGE); - }); - - this.settings.connect("changed::scroll-labels", () => { - this.scrollLabels = this.settings.get_boolean("scroll-labels"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_LABEL | WidgetFlags.MENU_LABELS); - }); - - this.settings.connect("changed::hide-media-notification", () => { - this.hideMediaNotification = this.settings.get_boolean("hide-media-notification"); - this.updateMediaNotificationVisiblity(); - }); - - this.settings.connect("changed::show-label", () => { - this.showLabel = this.settings.get_boolean("show-label"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_LABEL); - }); - - this.settings.connect("changed::show-player-icon", () => { - this.showPlayerIcon = this.settings.get_boolean("show-player-icon"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_ICON); - }); - - this.settings.connect("changed::show-control-icons", () => { - this.showControlIcons = this.settings.get_boolean("show-control-icons"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS); - }); - - this.settings.connect("changed::show-control-icons-play", () => { - this.showControlIconsPlay = this.settings.get_boolean("show-control-icons-play"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS_PLAYPAUSE); - }); - - this.settings.connect("changed::show-control-icons-next", () => { - this.showControlIconsNext = this.settings.get_boolean("show-control-icons-next"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS_NEXT); - }); - - this.settings.connect("changed::show-control-icons-previous", () => { - this.showControlIconsPrevious = this.settings.get_boolean("show-control-icons-previous"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS_PREVIOUS); - }); - - this.settings.connect("changed::show-control-icons-seek-forward", () => { - this.showControlIconsSeekForward = this.settings.get_boolean("show-control-icons-seek-forward"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS_SEEK_FORWARD); - }); - - this.settings.connect("changed::show-control-icons-seek-backward", () => { - this.showControlIconsSeekBackward = this.settings.get_boolean("show-control-icons-seek-backward"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_CONTROLS_SEEK_BACKWARD); - }); - - this.settings.connect("changed::colored-player-icon", () => { - this.coloredPlayerIcon = this.settings.get_boolean("colored-player-icon"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_ICON); - }); - - this.settings.connect("changed::extension-position", () => { - const enumIndex = this.settings.get_enum("extension-position"); - this.extensionPosition = enumValueByIndex(ExtensionPositions, enumIndex); - this.removePanelButton(); - this.setActivePlayer(); - }); - - this.settings.connect("changed::extension-index", () => { - this.extensionIndex = this.settings.get_uint("extension-index"); - this.removePanelButton(); - this.setActivePlayer(); - }); - - this.settings.connect("changed::elements-order", () => { - this.elementsOrder = this.settings.get_strv("elements-order"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_NO_REPLACE); - }); - - this.settings.connect("changed::labels-order", () => { - this.labelsOrder = this.settings.get_strv("labels-order"); - this.panelBtn?.updateWidgets(WidgetFlags.PANEL_LABEL); - }); - - this.settings.connect("changed::mouse-action-left", () => { - this.mouseActionLeft = this.settings.get_enum("mouse-action-left"); - }); - - this.settings.connect("changed::mouse-action-middle", () => { - this.mouseActionMiddle = this.settings.get_enum("mouse-action-middle"); - }); - - this.settings.connect("changed::mouse-action-right", () => { - this.mouseActionRight = this.settings.get_enum("mouse-action-right"); - }); - - this.settings.connect("changed::mouse-action-double", () => { - this.mouseActionDouble = this.settings.get_enum("mouse-action-double"); - }); - - this.settings.connect("changed::mouse-action-scroll-up", () => { - this.mouseActionScrollUp = this.settings.get_enum("mouse-action-scroll-up"); - }); - - this.settings.connect("changed::mouse-action-scroll-down", () => { - this.mouseActionScrollDown = this.settings.get_enum("mouse-action-scroll-down"); - }); - - this.settings.connect("changed::cache-art", () => { - this.cacheArt = this.settings.get_boolean("cache-art"); - }); - - this.settings.connect("changed::blacklisted-players", () => { - this.blacklistedPlayers = this.settings.get_strv("blacklisted-players"); - - for (const playerProxy of this.playerProxies.values()) { - if (this.isPlayerBlacklisted(playerProxy.identity, playerProxy.desktopEntry)) { - this.removePlayer(playerProxy.busName); - } - } - - this.addRunningPlayers(); - }); - } - async initProxies() { - const mprisXmlFile = Gio.File.new_for_path(`${this.path}/dbus/mprisNode.xml`); - const watchXmlFile = Gio.File.new_for_path(`${this.path}/dbus/watchNode.xml`); - const mprisResult = mprisXmlFile.load_contents_async(null); - const watchResult = watchXmlFile.load_contents_async(null); - const readResults = await Promise.all([mprisResult, watchResult]).catch(handleError); - - if (readResults == null) { - errorLog("Failed to read xml files"); - return; - } - - const mprisBytes = readResults[0]; - const watchBytes = readResults[1]; - const textDecoder = new TextDecoder(); - const watchNodeXml = textDecoder.decode(watchBytes[0]); - const mprisNodeXml = textDecoder.decode(mprisBytes[0]); - const watchNodeInfo = Gio.DBusNodeInfo.new_for_xml(watchNodeXml); - const watchInterface = watchNodeInfo.interfaces.find((iface) => iface.name === DBUS_IFACE_NAME); - this.watchIfaceInfo = watchInterface; - const mprisNodeInfo = Gio.DBusNodeInfo.new_for_xml(mprisNodeXml); - const mprisInterface = mprisNodeInfo.interfaces.find((iface) => iface.name === MPRIS_IFACE_NAME); - const mprisPlayerInterface = mprisNodeInfo.interfaces.find((iface) => iface.name === MPRIS_PLAYER_IFACE_NAME); - const propertiesInterface = mprisNodeInfo.interfaces.find((iface) => iface.name === DBUS_PROPERTIES_IFACE_NAME); - const mprisInterfaceString = new GLib.String(""); - mprisInterface.generate_xml(4, mprisInterfaceString); - const mprisPlayerInterfaceString = new GLib.String(""); - mprisPlayerInterface.generate_xml(4, mprisPlayerInterfaceString); - const propertiesInterfaceString = new GLib.String(""); - propertiesInterface.generate_xml(4, propertiesInterfaceString); - this.mprisIfaceInfo = mprisInterface; - this.mprisPlayerIfaceInfo = mprisPlayerInterface; - this.propertiesIfaceInfo = propertiesInterface; - const initWatchSuccess = await this.initWatchProxy().catch(handleError); - - if (initWatchSuccess === false) { - errorLog("Failed to init watch proxy"); - return; - } - - await this.addRunningPlayers(); - } - async initWatchProxy() { - this.watchProxy = await createDbusProxy(this.watchIfaceInfo, DBUS_IFACE_NAME, DBUS_OBJECT_PATH).catch(handleError); - - if (this.watchProxy == null) { - return false; - } - - this.watchProxy.connectSignal("NameOwnerChanged", (proxy, senderName, [busName, oldOwner, newOwner]) => { - if (busName.startsWith(MPRIS_IFACE_NAME) === false) { - return; - } - - if (newOwner === "") { - this.removePlayer(busName); - } - else if (oldOwner === "") { - this.addPlayer(busName); - } - }); - - return true; - } - async addRunningPlayers() { - const namesResult = await this.watchProxy.ListNamesAsync().catch(handleError); - - if (namesResult == null) { - errorLog("Failed to get bus names"); - return; - } - - const busNames = namesResult[0]; - const promises = []; - - for (const busName of busNames) { - if (busName.startsWith(MPRIS_IFACE_NAME) === false) - continue; - if (this.playerProxies.has(busName)) - continue; - promises.push(this.addPlayer(busName)); - } - - await Promise.all(promises).catch(handleError); - } - async addPlayer(busName) { - debugLog("Adding player:", busName); - - try { - const playerProxy = new PlayerProxy(busName); - const initSuccess = await playerProxy - .initPlayer(this.mprisIfaceInfo, this.mprisPlayerIfaceInfo, this.propertiesIfaceInfo) - .catch(handleError); - - if (initSuccess == null || initSuccess === false) { - errorLog("Failed to init player:", busName); - return; - } - - const isPlayerBlacklisted = this.isPlayerBlacklisted(playerProxy.identity, playerProxy.desktopEntry); - - if (isPlayerBlacklisted) { - return; - } - - playerProxy.onChanged("IsPinned", this.setActivePlayer.bind(this)); - playerProxy.onChanged("PlaybackStatus", this.setActivePlayer.bind(this)); - - playerProxy.onChanged("IsInvalid", () => { - this.setActivePlayer(); - this.panelBtn?.updateWidgets(WidgetFlags.MENU_PLAYERS); - }); - - this.playerProxies.set(busName, playerProxy); - this.panelBtn?.updateWidgets(WidgetFlags.MENU_PLAYERS); - this.setActivePlayer(); - } - catch (e) { - errorLog("Failed to add player:", busName, e); - } - } - removePlayer(busName) { - debugLog("Removing player:", busName); - this.playerProxies.get(busName)?.onDestroy(); - this.playerProxies.delete(busName); - this.panelBtn?.updateWidgets(WidgetFlags.MENU_PLAYERS); - this.setActivePlayer(); - } - setActivePlayer() { - if (this.playerProxies.size === 0) { - if (this.panelBtn != null) { - this.removePanelButton(); - } - - return; - } - - let chosenPlayer = null; - - for (const [, playerProxy] of this.playerProxies) { - if (playerProxy.isInvalid) { - continue; - } - - if (playerProxy.isPlayerPinned()) { - chosenPlayer = playerProxy; - break; - } - - if (chosenPlayer == null) { - chosenPlayer = playerProxy; - continue; - } - - if (chosenPlayer?.playbackStatus !== PlaybackStatus.PLAYING) { - if (playerProxy.playbackStatus === PlaybackStatus.PLAYING) { - chosenPlayer = playerProxy; - } - else if (this.panelBtn?.isSamePlayer(playerProxy)) { - chosenPlayer = playerProxy; - } - } - } - - debugLog("Chosen player:", chosenPlayer?.busName); - - if (chosenPlayer == null) { - this.removePanelButton(); - } - else { - if (this.panelBtn == null) { - this.addPanelButton(chosenPlayer.busName); - } - else { - this.panelBtn.updateProxy(chosenPlayer); - } - } - } - isPlayerBlacklisted(id, entry) { - const app = getAppByIdAndEntry(id, entry); - - if (app == null) { - return false; - } - - const appId = app.get_id(); - return this.blacklistedPlayers.includes(appId); - } - updateMediaNotificationVisiblity(shouldReset = false) { - if (this.mediaSectionAddFunc && (shouldReset || this.hideMediaNotification === false)) { - Mpris.MediaSection.prototype._addPlayer = this.mediaSectionAddFunc; - this.mediaSectionAddFunc = null; - Main.panel.statusArea.dateMenu._messageList._mediaSection._onProxyReady(); - } - else { - this.mediaSectionAddFunc = Mpris.MediaSection.prototype._addPlayer; - - Mpris.MediaSection.prototype._addPlayer = function () { }; - - if (Main.panel.statusArea.dateMenu._messageList._mediaSection._players != null) { - for (const player of Main.panel.statusArea.dateMenu._messageList._mediaSection._players.values()) { - player._close(); - } - } - } - } - addPanelButton(busName) { - debugLog("Adding panel button"); - const playerProxy = this.playerProxies.get(busName); - - if (playerProxy == null) { - return; - } - - this.panelBtn = new PanelButton(playerProxy, this); - Main.panel.addToStatusArea("Media Controls", this.panelBtn, this.extensionIndex, this.extensionPosition); - } - removePanelButton() { - debugLog("Removing panel button"); - this.panelBtn?.destroy(); - this.panelBtn = null; - } - destroySettings() { - this.settings = null; - this.labelWidth = null; - this.hideMediaNotification = null; - this.scrollLabels = null; - this.showLabel = null; - this.showPlayerIcon = null; - this.showControlIcons = null; - this.showControlIconsPlay = null; - this.showControlIconsNext = null; - this.showControlIconsPrevious = null; - this.showControlIconsSeekForward = null; - this.showControlIconsSeekBackward = null; - this.coloredPlayerIcon = null; - this.extensionPosition = null; - this.extensionIndex = null; - this.elementsOrder = null; - this.labelsOrder = null; - this.shortcutShowMenu = null; - this.mouseActionLeft = null; - this.mouseActionMiddle = null; - this.mouseActionRight = null; - this.mouseActionDouble = null; - this.mouseActionScrollUp = null; - this.mouseActionScrollDown = null; - this.cacheArt = null; - this.blacklistedPlayers = null; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/AppChooser.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/AppChooser.js deleted file mode 100644 index f546cd6f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/AppChooser.js +++ /dev/null @@ -1,46 +0,0 @@ -import Adw from "gi://Adw"; -import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; -class AppChooser extends Adw.Window { - listBox; - selectBtn; - cancelBtn; - constructor(params = {}) { - super(params); - // @ts-expect-error Typescript doesn't know about the internal children - this.listBox = this._list_box; - // @ts-expect-error Typescript doesn't know about the internal children - this.selectBtn = this._select_btn; - // @ts-expect-error Typescript doesn't know about the internal children - this.cancelBtn = this._cancel_btn; - const apps = Gio.AppInfo.get_all(); - - for (const app of apps) { - if (app.should_show() === false) - continue; - const row = new Adw.ActionRow(); - row.title = app.get_display_name(); - row.subtitle = app.get_id(); - row.subtitleLines = 1; - const icon = new Gtk.Image({ gicon: app.get_icon() }); - row.add_prefix(icon); - this.listBox.append(row); - } - - this.cancelBtn.connect("clicked", () => { - this.close(); - }); - } - showChooser() { - return new Promise((resolve) => { - const signalId = this.selectBtn.connect("clicked", () => { - this.close(); - this.selectBtn.disconnect(signalId); - const row = this.listBox.get_selected_row(); - resolve(row.subtitle); - }); - this.present(); - }); - } -} -export default AppChooser; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/BlacklistedPlayers.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/BlacklistedPlayers.js deleted file mode 100644 index b7aadab9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/BlacklistedPlayers.js +++ /dev/null @@ -1,77 +0,0 @@ -import Adw from "gi://Adw"; -import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; -import { AppChooser } from "../../prefs.js"; -import { handleError } from "../../utils/common.js"; -class BlacklistedPlayers extends Adw.PreferencesGroup { - players; - appChooser; - listBox; - addBtn; - constructor(params = {}) { - super(params); - // @ts-expect-error Typescript doesn't know about the internal children - this.listBox = this._list_box; - // @ts-expect-error Typescript doesn't know about the internal children - this.addBtn = this._add_btn; - // @ts-expect-error Typescript doesn't know about the internal children - this.appChooser = this._app_chooser; - this.appChooser = new AppChooser(); - - this.addBtn.connect("clicked", async () => { - const appId = await this.appChooser.showChooser().catch(handleError); - if (appId == null) - return; - this.players.unshift(appId); - this.notify("players"); - this.addElements(); - }); - } - initPlayers(players) { - this.players = players; - this.addElements(); - } - addElements() { - this.listBox.remove_all(); - - if (this.players.length === 0) { - const row = new Adw.ActionRow(); - const label = new Gtk.Label(); - label.label = _("<span size='x-large' weight='bold' color='#ccc'>No players are blacklisted</span>"); - label.useMarkup = true; - label.halign = Gtk.Align.CENTER; - label.marginTop = 20; - label.marginBottom = 20; - row.set_child(label); - this.listBox.append(row); - return; - } - - const apps = Gio.AppInfo.get_all(); - - for (const player of this.players) { - const row = new Adw.ActionRow(); - const app = apps.find((app) => app.get_id() === player); - row.title = app.get_display_name(); - const icon = new Gtk.Image({ gicon: app.get_icon(), iconSize: Gtk.IconSize.LARGE }); - row.add_prefix(icon); - const deleteBtn = new Gtk.Button({ icon_name: "user-trash-symbolic" }); - deleteBtn.marginTop = 10; - deleteBtn.marginBottom = 10; - deleteBtn.add_css_class("flat"); - deleteBtn.add_css_class("circular"); - row.add_suffix(deleteBtn); - - deleteBtn.connect("clicked", () => { - const index = this.players.indexOf(player); - this.players.splice(index, 1); - this.notify("players"); - this.addElements(); - }); - - this.listBox.append(row); - } - } -} -export default BlacklistedPlayers; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/ElementList.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/ElementList.js deleted file mode 100644 index b63337bb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/ElementList.js +++ /dev/null @@ -1,117 +0,0 @@ -import Adw from "gi://Adw"; -import GObject from "gi://GObject"; -import Gdk from "gi://Gdk"; -import Graphene from "gi://Graphene"; -import Gtk from "gi://Gtk"; -import { PanelElements } from "../../types/enums/common.js"; -class ElementList extends Adw.PreferencesGroup { - elements; - listBox; - iconRow; - labelRow; - controlsRow; - constructor(params = {}) { - super(params); - // @ts-expect-error Typescript doesn't know about the internal children - this.listBox = this._list_box; - // @ts-expect-error Typescript doesn't know about the internal children - this.iconRow = this._icon_row; - this.iconRow.elementKey = "ICON"; - // @ts-expect-error Typescript doesn't know about the internal children - this.labelRow = this._label_row; - this.labelRow.elementKey = "LABEL"; - // @ts-expect-error Typescript doesn't know about the internal children - this.controlsRow = this._controls_row; - this.controlsRow.elementKey = "CONTROLS"; - this.elements = []; - const dropTarget = Gtk.DropTarget.new(GObject.TYPE_UINT, Gdk.DragAction.MOVE); - - dropTarget.connect("drop", (_, sourceIndex, x, y) => { - const targetRow = this.listBox.get_row_at_y(y); - if (targetRow == null || sourceIndex == null) - return; - const sourceValue = this.elements[sourceIndex]; - const targetIndex = targetRow.get_index(); - this.elements.splice(targetIndex > sourceIndex ? targetIndex + 1 : targetIndex, 0, sourceValue); - this.elements.splice(sourceIndex > targetIndex ? sourceIndex + 1 : sourceIndex, 1); - this.notify("elements"); - this.listBox.drag_unhighlight_row(); - this.listBox.invalidate_sort(); - }); - - this.listBox.add_controller(dropTarget); - - this.listBox.set_sort_func((firstRow, secondRow) => { - const firstIndex = this.elements.indexOf(firstRow.elementKey); - const secondIndex = this.elements.indexOf(secondRow.elementKey); - return firstIndex - secondIndex; - }); - } - initElements(elements) { - for (let i = 0; i < elements.length; i++) { - let dragX = 0; - let dragY = 0; - const dragSource = new Gtk.DragSource({ actions: Gdk.DragAction.MOVE }); - const dropController = new Gtk.DropControllerMotion(); - - dragSource.connect("prepare", (dragSource, x, y) => { - dragX = x; - dragY = y; - const row = dragSource.widget; - const index = row.get_index(); - const value = new GObject.Value(); - value.init(GObject.TYPE_UINT); - value.set_uint(index); - const content = Gdk.ContentProvider.new_for_value(value); - return content; - }); - - dragSource.connect("drag-begin", (dragSource) => { - const row = dragSource.widget; - const icon = this.snapshotRow(row); - dragSource.set_icon(icon, dragX, dragY); - }); - - dropController.connect("enter", (dropController) => { - const row = dropController.widget; - this.listBox.drag_highlight_row(row); - }); - - dropController.connect("leave", () => { - this.listBox.drag_unhighlight_row(); - }); - - const element = PanelElements[elements[i]]; - - if (element === PanelElements.ICON) { - this.iconRow.add_controller(dragSource); - this.iconRow.add_controller(dropController); - } - else if (element === PanelElements.LABEL) { - this.labelRow.add_controller(dragSource); - this.labelRow.add_controller(dropController); - } - else if (element === PanelElements.CONTROLS) { - this.controlsRow.add_controller(dragSource); - this.controlsRow.add_controller(dropController); - } - } - - this.elements = elements; - this.listBox.invalidate_sort(); - } - snapshotRow(row) { - const paintable = new Gtk.WidgetPaintable({ widget: row }); - const width = row.get_allocated_width(); - const height = row.get_allocated_height(); - const snapshot = new Gtk.Snapshot(); - paintable.snapshot(snapshot, width, height); - const node = snapshot.to_node(); - const renderer = row.get_native().get_renderer(); - const rect = new Graphene.Rect(); - rect.init(0, 0, width, height); - const texture = renderer.render_texture(node, rect); - return texture; - } -} -export default ElementList; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/LabelList.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/LabelList.js deleted file mode 100644 index e373e05f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/prefs/LabelList.js +++ /dev/null @@ -1,170 +0,0 @@ -import Adw from "gi://Adw"; -import GObject from "gi://GObject"; -import Gdk from "gi://Gdk"; -import Graphene from "gi://Graphene"; -import Gtk from "gi://Gtk"; -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; -import { LabelTypes } from "../../types/enums/common.js"; -class LabelList extends Adw.PreferencesGroup { - labels; - labelsList; - listBox; - addItemBtn; - addTextBtn; - constructor(params = {}) { - super(params); - // @ts-expect-error Typescript doesn't know about internal children - this.listBox = this._list_box; - // @ts-expect-error Typescript doesn't know about internal children - this.addItemBtn = this._add_item_btn; - // @ts-expect-error Typescript doesn't know about internal children - this.addTextBtn = this._add_text_btn; - - this.labelsList = new Gtk.StringList({ - strings: Object.values(LabelTypes).map(_), - }); - - const dropTarget = Gtk.DropTarget.new(GObject.TYPE_UINT, Gdk.DragAction.MOVE); - - dropTarget.connect("drop", (_, sourceIndex, x, y) => { - const targetRow = this.listBox.get_row_at_y(y); - if (targetRow == null || sourceIndex == null) - return; - const sourceValue = this.labels[sourceIndex]; - const targetIndex = targetRow.get_index(); - this.labels.splice(targetIndex > sourceIndex ? targetIndex + 1 : targetIndex, 0, sourceValue); - this.labels.splice(sourceIndex > targetIndex ? sourceIndex + 1 : sourceIndex, 1); - this.notify("labels"); - this.listBox.drag_unhighlight_row(); - this.addElements(); - }); - - this.addItemBtn.connect("clicked", () => { - this.labels.push("ALBUM"); - this.notify("labels"); - this.addElements(); - }); - - this.addTextBtn.connect("clicked", () => { - this.labels.push(""); - this.notify("labels"); - this.addElements(); - }); - - this.listBox.add_controller(dropTarget); - } - initLabels(labels) { - this.labels = labels; - this.addElements(); - } - addElements() { - this.listBox.remove_all(); - - if (this.labels.length === 0) { - const row = new Adw.ActionRow(); - const label = new Gtk.Label(); - label.label = "<span size='x-large' weight='bold' color='#ccc'>No labels added</span>"; - label.useMarkup = true; - label.halign = Gtk.Align.CENTER; - label.marginTop = 20; - label.marginBottom = 20; - row.set_child(label); - this.listBox.append(row); - return; - } - - for (let i = 0; i < this.labels.length; i++) { - const element = this.labels[i]; - - if (Object.keys(LabelTypes).includes(element)) { - const row = new Adw.ComboRow(); - row.title = _(LabelTypes[element]); - row.model = this.labelsList; - row.selected = Object.keys(LabelTypes).indexOf(element); - this.handleComboBoxChange(row); - this.completeRowCreation(row, i); - } - else { - const row = new Adw.EntryRow(); - row.title = _("Custom text"); - row.text = element; - this.handleEntryChange(row); - this.completeRowCreation(row, i); - } - } - } - completeRowCreation(row, index) { - const dragIcon = new Gtk.Image({ icon_name: "list-drag-handle-symbolic" }); - row.add_prefix(dragIcon); - const deleteBtn = new Gtk.Button({ icon_name: "user-trash-symbolic" }); - deleteBtn.marginTop = 10; - deleteBtn.marginBottom = 10; - deleteBtn.add_css_class("flat"); - deleteBtn.add_css_class("circular"); - row.add_suffix(deleteBtn); - - deleteBtn.connect("clicked", () => { - this.labels.splice(index, 1); - this.notify("labels"); - this.addElements(); - }); - - const value = new GObject.Value(); - value.init(GObject.TYPE_UINT); - value.set_uint(index); - const content = Gdk.ContentProvider.new_for_value(value); - const dragSource = new Gtk.DragSource({ actions: Gdk.DragAction.MOVE, content }); - const dropController = new Gtk.DropControllerMotion(); - - dragSource.connect("prepare", (dragSource, x, y) => { - const row = dragSource.widget; - const snapshot = this.snapshotRow(row); - dragSource.set_icon(snapshot, x, y); - return dragSource.content; - }); - - dropController.connect("enter", (dropController) => { - const row = dropController.widget; - this.listBox.drag_highlight_row(row); - }); - - dropController.connect("leave", () => { - this.listBox.drag_unhighlight_row(); - }); - - row.add_controller(dragSource); - row.add_controller(dropController); - this.listBox.append(row); - } - handleComboBoxChange(row) { - row.connect("notify::selected", () => { - const rowIndex = row.get_index(); - const labelListKeys = Object.keys(LabelTypes); - const labelKey = labelListKeys[row.selected]; - this.labels.splice(rowIndex, 1, labelKey); - this.notify("labels"); - this.addElements(); - }); - } - handleEntryChange(row) { - row.connect("notify::text", () => { - const rowIndex = row.get_index(); - this.labels.splice(rowIndex, 1, row.text); - this.notify("labels"); - }); - } - snapshotRow(row) { - const paintable = new Gtk.WidgetPaintable({ widget: row }); - const width = row.get_allocated_width(); - const height = row.get_allocated_height(); - const snapshot = new Gtk.Snapshot(); - paintable.snapshot(snapshot, width, height); - const node = snapshot.to_node(); - const renderer = row.get_native().get_renderer(); - const rect = new Graphene.Rect(); - rect.init(0, 0, width, height); - const texture = renderer.render_texture(node, rect); - return texture; - } -} -export default LabelList; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/MenuSlider.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/MenuSlider.js deleted file mode 100644 index 55be97aa..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/MenuSlider.js +++ /dev/null @@ -1,161 +0,0 @@ -import Clutter from "gi://Clutter"; -import GObject from "gi://GObject"; -import St from "gi://St"; -import * as Slider from "resource:///org/gnome/shell/ui/slider.js"; -import { msToHHMMSS } from "../../utils/common.js"; -class MenuSlider extends St.BoxLayout { - transition; - slider; - textBox; - elapsedLabel; - durationLabel; - dragPaused; - disabled; - rate; - constructor() { - super({ vertical: true }); - this.rate = 1.0; - this.slider = new Slider.Slider(0); - this.textBox = new St.BoxLayout(); - - this.elapsedLabel = new St.Label({ - text: "00:00", - xExpand: true, - xAlign: Clutter.ActorAlign.START, - }); - - this.durationLabel = new St.Label({ - text: "00:00", - xExpand: true, - xAlign: Clutter.ActorAlign.END, - }); - - this.slider.connect("drag-begin", () => { - if (this.transition.is_playing() && this.disabled === false) { - this.transition.pause(); - this.dragPaused = true; - } - - return Clutter.EVENT_PROPAGATE; - }); - - this.slider.connect("drag-end", () => { - const ms = this.slider.value * this.transition.duration; - this.emit("seeked", Math.floor(ms * 1000)); - - if (this.dragPaused) { - this.transition.advance(ms); - this.transition.start(); - this.dragPaused = false; - } - - return Clutter.EVENT_PROPAGATE; - }); - - this.slider.connect("scroll-event", () => { - return Clutter.EVENT_STOP; - }); - - this.transition = new Clutter.PropertyTransition({ - propertyName: "value", - progressMode: Clutter.AnimationMode.LINEAR, - repeatCount: 1, - interval: new Clutter.Interval({ - valueType: GObject.TYPE_DOUBLE, - initial: 0, - final: 1, - }), - }); - - this.transition.connect("marker-reached", (_, name) => { - this.elapsedLabel.text = name; - }); - - this.textBox.add_child(this.elapsedLabel); - this.textBox.add_child(this.durationLabel); - this.add_child(this.textBox); - this.add_child(this.slider); - this.slider.add_transition("progress", this.transition); - this.connect("destroy", this.onDestroy.bind(this)); - this.setDisabled(true); - } - updateSlider(position, length, rate) { - this.rate = rate || 1.0; - this.setLength(length); - this.setPosition(position); - } - setRate(rate) { - const oldRate = this.rate; - this.rate = rate || 1.0; - this.setPosition(this.transition.get_elapsed_time() * oldRate * 1000); - this.setLength(this.transition.duration * oldRate * 1000); - } - setPosition(position) { - position = position / 1000; - this.elapsedLabel.text = msToHHMMSS(position); - this.slider.value = position / this.rate / this.transition.duration; - this.transition.advance(position / this.rate); - } - setLength(length) { - length = length / 1000; - this.durationLabel.text = msToHHMMSS(length); - this.slider.value = 0; - this.transition.set_duration(length / this.rate); - this.transition.rewind(); - this.updateMarkers(); - } - pauseTransition() { - if (this.disabled === false) { - this.transition.pause(); - } - } - resumeTransition() { - if (this.disabled === false) { - this.transition.start(); - } - } - setDisabled(disabled) { - this.disabled = disabled; - this.slider.reactive = !disabled; - this.opacity = disabled ? 127 : 255; - - if (disabled) { - this.durationLabel.text = "00:00"; - this.elapsedLabel.text = "00:00"; - this.transition.set_duration(1); - this.transition.stop(); - this.slider.value = 0; - } - else { - this.updateMarkers(); - } - } - updateMarkers() { - const noOfSecs = Math.floor(this.transition.duration / (1000 / this.rate)); - const markers = this.transition.list_markers(-1); - - for (const marker of markers) { - this.transition.remove_marker(marker); - } - - for (let i = 0; i <= noOfSecs; i++) { - const ms = i * 1000; - const elapsedText = msToHHMMSS(ms); - this.transition.add_marker_at_time(elapsedText, ms / this.rate); - } - } - onDestroy() { - this.slider.remove_transition("progress"); - this.slider.destroy(); - this.textBox.destroy(); - } -} -const GMenuSlider = GObject.registerClass({ - GTypeName: "MenuSlider", - Signals: { - seeked: { - param_types: [GObject.TYPE_INT], - }, - }, -}, MenuSlider); -export default GMenuSlider; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PanelButton.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PanelButton.js deleted file mode 100644 index 2e88f003..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PanelButton.js +++ /dev/null @@ -1,953 +0,0 @@ -import GObject from "gi://GObject"; -import Clutter from "gi://Clutter"; -import GdkPixbuf from "gi://GdkPixbuf"; -import GLib from "gi://GLib"; -import Cogl from "gi://Cogl"; -import Gio from "gi://Gio"; -import St from "gi://St"; -import * as PanelMenu from "resource:///org/gnome/shell/ui/panelMenu.js"; -import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"; -import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js"; -import ScrollingLabel from "./ScrollingLabel.js"; -import MenuSlider from "./MenuSlider.js"; -import { debugLog, handleError } from "../../utils/common.js"; -import { getAppByIdAndEntry, getImage } from "../../utils/shell_only.js"; -import { ControlIconOptions } from "../../types/enums/shell_only.js"; -import { LabelTypes, PanelElements, MouseActions, LoopStatus, PlaybackStatus, WidgetFlags, } from "../../types/enums/common.js"; - -Gio._promisify(GdkPixbuf.Pixbuf, "new_from_stream_async", "new_from_stream_finish"); -Gio._promisify(Gio.File.prototype, "query_info_async", "query_info_finish"); - -function find_child_by_name(parent, name) { - if (Clutter.Container === undefined) { - const children = parent.get_children(); - - for (const child of children) { - if (child.get_name() === name) { - return child; - } - } - } - else { - return parent.find_child_by_name(name); - } -} - -class PanelButton extends PanelMenu.Button { - playerProxy; - extension; - buttonIcon; - buttonLabel; - buttonControls; - buttonBox; - menuBox; - menuPlayers; - menuImage; - menuLabels; - menuSlider; - menuControls; - menuPlayersTextBox; - menuPlayersTextBoxIcon; - menuPlayersTextBoxLabel; - menuPlayersTextBoxPin; - menuPlayerIcons; - menuLabelTitle; - menuLabelSubtitle; - doubleTapSourceId; - changeListenerIds; - constructor(playerProxy, extension) { - super(0.5, "Media Controls", false); - this.playerProxy = playerProxy; - this.extension = extension; - this.changeListenerIds = new Map(); - this.updateWidgets(WidgetFlags.ALL); - this.addProxyListeners(); - this.initActions(); - this.menu.box.add_style_class_name("popup-menu-container"); - this.connect("destroy", this.onDestroy.bind(this)); - } - updateProxy(playerProxy) { - if (this.isSamePlayer(playerProxy) === false) { - debugLog(`Updating proxy to ${playerProxy.busName}`); - this.playerProxy = playerProxy; - this.updateWidgets(WidgetFlags.ALL); - this.addProxyListeners(); - } - } - isSamePlayer(playerProxy) { - return this.playerProxy.busName === playerProxy.busName; - } - updateWidgets(flags) { - if (this.buttonBox == null) { - this.buttonBox = new St.BoxLayout({ - styleClass: "panel-button-box", - }); - } - else if (flags & WidgetFlags.PANEL_NO_REPLACE) { - this.buttonBox.remove_all_children(); - } - - if (this.menuBox == null) { - this.menuBox = new PopupMenu.PopupBaseMenuItem({ - style_class: "no-padding popup-menu-box", - activate: false, - }); - - this.menuBox.set_vertical(true); - this.menuBox.remove_style_class_name("popup-menu-item"); - this.menuBox.remove_all_children(); - } - - for (let i = 0; i < this.extension.elementsOrder.length; i++) { - const element = PanelElements[this.extension.elementsOrder[i]]; - - if (element === PanelElements.ICON && - (flags & WidgetFlags.PANEL_ICON || flags & WidgetFlags.PANEL_NO_REPLACE)) { - if (this.extension.showPlayerIcon) { - this.addButtonIcon(i); - } - else if (this.buttonIcon != null) { - this.buttonBox.remove_child(this.buttonIcon); - this.buttonIcon = null; - } - } - - if (element === PanelElements.LABEL && - (flags & WidgetFlags.PANEL_LABEL || flags & WidgetFlags.PANEL_NO_REPLACE)) { - if (this.extension.showLabel) { - this.addButtonLabel(i); - } - else if (this.buttonLabel != null) { - this.buttonBox.remove_child(this.buttonLabel); - this.buttonLabel = null; - } - } - - if (element === PanelElements.CONTROLS && - (flags & WidgetFlags.PANEL_CONTROLS || flags & WidgetFlags.PANEL_NO_REPLACE)) { - if (this.extension.showControlIcons) { - this.addButtonControls(i, flags); - } - else if (this.buttonControls != null) { - this.buttonBox.remove_child(this.buttonControls); - this.buttonControls = null; - } - } - } - - if (flags & WidgetFlags.MENU_PLAYERS) { - this.addMenuPlayers(); - } - - if (flags & WidgetFlags.MENU_IMAGE) { - this.addMenuImage().catch(handleError); - } - - if (flags & WidgetFlags.MENU_LABELS) { - this.addMenuLabels(); - } - - if (flags & WidgetFlags.MENU_SLIDER) { - this.addMenuSlider().catch(handleError); - } - - if (flags & WidgetFlags.MENU_CONTROLS) { - this.addMenuControls(flags); - } - - if (this.buttonBox.get_parent() == null) { - this.add_child(this.buttonBox); - } - - if (this.menuBox.get_parent() == null) { - this.menu.addMenuItem(this.menuBox); - } - } - addMenuPlayers() { - if (this.menuPlayers == null) { - this.menuPlayers = new St.BoxLayout({ - vertical: true, - }); - } - - if (this.menuPlayersTextBox == null) { - this.menuPlayersTextBox = new St.BoxLayout({ - marginBottom: 3, - }); - } - - if (this.menuPlayersTextBoxIcon == null) { - this.menuPlayersTextBoxIcon = new St.Icon({ - styleClass: "popup-menu-icon", - yAlign: Clutter.ActorAlign.END, - xAlign: Clutter.ActorAlign.END, - xExpand: true, - yExpand: true, - }); - } - - if (this.menuPlayersTextBoxLabel == null) { - this.menuPlayersTextBoxLabel = new St.Label({ - styleClass: "popup-menu-player-label", - yAlign: Clutter.ActorAlign.END, - yExpand: true, - }); - } - - if (this.menuPlayersTextBoxPin == null) { - this.menuPlayersTextBoxPin = new St.Icon({ - iconName: "view-pin-symbolic", - styleClass: "popup-menu-icon", - yAlign: Clutter.ActorAlign.END, - xAlign: Clutter.ActorAlign.START, - yExpand: true, - xExpand: true, - reactive: true, - }); - - const tapAction = new Clutter.TapAction(); - - tapAction.connect("tap", () => { - if (this.playerProxy.isPlayerPinned()) { - this.playerProxy.unpinPlayer(); - } - else { - this.playerProxy.pinPlayer(); - } - }); - - this.menuPlayersTextBoxPin.add_action(tapAction); - } - - const players = this.extension.getPlayers(); - - if (players.length > 1 && this.menuPlayerIcons == null) { - this.menuPlayerIcons = new St.BoxLayout({ - styleClass: "popup-menu-player-icons", - }); - } - else if (players.length === 1 && this.menuPlayerIcons != null) { - this.menuPlayers.remove_child(this.menuPlayerIcons); - this.menuPlayerIcons = null; - } - else { - this.menuPlayerIcons?.remove_all_children(); - } - - const isPinned = this.playerProxy.isPlayerPinned(); - this.menuPlayersTextBoxPin.opacity = isPinned ? 255 : 160; - - if (this.menuPlayerIcons != null) { - this.menuPlayerIcons.opacity = isPinned ? 160 : 255; - } - - for (let i = 0; i < players.length; i++) { - const player = players[i]; - const app = getAppByIdAndEntry(player.identity, player.desktopEntry); - const isSamePlayer = this.isSamePlayer(player); - const appName = app?.get_name() ?? (player.identity || _("Unknown player")); - const appIcon = app?.get_icon() ?? Gio.Icon.new_for_string("audio-x-generic-symbolic"); - - if (isSamePlayer) { - this.menuPlayersTextBoxLabel.text = appName; - - if (this.menuPlayersTextBoxIcon?.get_parent() != null) { - this.menuPlayersTextBox.remove_child(this.menuPlayersTextBoxIcon); - } - - if (this.menuPlayersTextBoxPin.get_parent() != null) { - this.menuPlayersTextBox.remove_child(this.menuPlayersTextBoxPin); - } - - if (players.length > 1) { - this.menuPlayersTextBoxIcon.gicon = null; - this.menuPlayersTextBoxLabel.xAlign = Clutter.ActorAlign.END; - this.menuPlayersTextBoxLabel.xExpand = true; - this.menuPlayersTextBox.insert_child_at_index(this.menuPlayersTextBoxPin, 1); - } - else { - this.menuPlayersTextBoxIcon.gicon = appIcon; - this.menuPlayersTextBox.insert_child_at_index(this.menuPlayersTextBoxIcon, 0); - this.menuPlayersTextBoxLabel.xAlign = Clutter.ActorAlign.START; - this.menuPlayersTextBoxLabel.xExpand = true; - } - } - - if (players.length > 1) { - const icon = new St.Icon({ - styleClass: "popup-menu-icon popup-menu-player-icons-icon", - gicon: appIcon, - reactive: isPinned === false, - trackHover: isPinned === false, - xAlign: Clutter.ActorAlign.FILL, - xExpand: true, - }); - - if (i === 0) { - icon.add_style_class_name("popup-menu-player-icons-icon-first"); - } - else if (i === players.length - 1) { - icon.add_style_class_name("popup-menu-player-icons-icon-last"); - } - - if (isSamePlayer) { - icon.add_style_class_name("popup-menu-player-icons-icon-active"); - } - else { - const tapAction = new Clutter.TapAction(); - tapAction.connect("tap", this.updateProxy.bind(this, player)); - icon.add_action(tapAction); - } - - this.menuPlayerIcons.add_child(icon); - } - } - - if (this.menuPlayersTextBoxLabel.get_parent() == null) { - this.menuPlayersTextBox.add_child(this.menuPlayersTextBoxLabel); - } - - if (this.menuPlayersTextBox.get_parent() == null) { - this.menuPlayers.add_child(this.menuPlayersTextBox); - } - - if (this.menuPlayerIcons && this.menuPlayerIcons.get_parent() == null) { - this.menuPlayers.add_child(this.menuPlayerIcons); - } - - if (this.menuPlayers.get_parent() == null) { - this.menuBox.add_child(this.menuPlayers); - } - - debugLog("Added menu players"); - } - async addMenuImage() { - if (this.menuImage == null) { - this.menuImage = new St.Icon({ - xExpand: false, - yExpand: false, - xAlign: Clutter.ActorAlign.CENTER, - }); - } - - let artSet = false; - let stream = await getImage(this.playerProxy.metadata["mpris:artUrl"]); - - if (stream == null && this.playerProxy.metadata["xesam:url"] != null) { - const trackUri = GLib.uri_parse(this.playerProxy.metadata["xesam:url"], GLib.UriFlags.NONE); - - if (trackUri != null && trackUri.get_scheme() === "file") { - const file = Gio.File.new_for_uri(trackUri.to_string()); - const info = await file - .query_info_async(Gio.FILE_ATTRIBUTE_THUMBNAIL_PATH, Gio.FileQueryInfoFlags.NONE, null, null) - .catch(handleError); - - if (info != null) { - const path = info.get_attribute_byte_string(Gio.FILE_ATTRIBUTE_THUMBNAIL_PATH); - - if (path == null) { - this.menuImage.gicon = info.get_icon(); - } - else { - const thumb = Gio.File.new_for_path(path); - stream = await getImage(thumb.get_uri()); - } - } - } - } - - const width = this.extension.labelWidth > 0 ? this.getMenuItemWidth() : this.menuLabels.width; - - if (stream != null) { - // @ts-expect-error Types are wrong - const pixbufPromise = GdkPixbuf.Pixbuf.new_from_stream_async(stream, null); - const pixbuf = await pixbufPromise.catch(handleError); - - if (pixbuf != null) { - const aspectRatio = pixbuf.width / pixbuf.height; - const height = width / aspectRatio; - const format = pixbuf.hasAlpha ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888; - const image = St.ImageContent.new_with_preferred_size(width, height); - image.set_bytes(pixbuf.pixelBytes, format, pixbuf.width, pixbuf.height, pixbuf.rowstride); - this.menuImage.iconSize = -1; - this.menuImage.gicon = null; - this.menuImage.width = width; - this.menuImage.height = height; - this.menuImage.content = image; - artSet = true; - } - } - - if (artSet === false) { - this.menuImage.content = null; - this.menuImage.gicon = Gio.ThemedIcon.new("audio-x-generic-symbolic"); - this.menuImage.width = width; - this.menuImage.height = width; - this.menuImage.iconSize = width; - } - - if (this.menuImage.get_parent() == null) { - this.menuBox.insert_child_above(this.menuImage, this.menuPlayers); - } - - debugLog("Added menu image"); - } - addMenuLabels() { - if (this.menuLabels == null) { - this.menuLabels = new St.BoxLayout({ - vertical: true, - }); - } - - if (this.menuLabelTitle != null) { - this.menuLabels.remove_child(this.menuLabelTitle); - } - - if (this.menuLabelSubtitle != null) { - this.menuLabels.remove_child(this.menuLabelSubtitle); - } - - const width = this.extension.labelWidth > 0 ? this.getMenuItemWidth() : 0; - - this.menuLabelTitle = new ScrollingLabel({ - text: this.playerProxy.metadata["xesam:title"], - isScrolling: this.extension.scrollLabels, - initPaused: this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING, - width, - }); - - const artistText = this.playerProxy.metadata["xesam:artist"]?.join(", ") || _("Unknown artist"); - const albumText = this.playerProxy.metadata["xesam:album"] || ""; - - this.menuLabelSubtitle = new ScrollingLabel({ - text: albumText === "" ? artistText : `${artistText} / ${albumText}`, - isScrolling: this.extension.scrollLabels, - initPaused: this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING, - direction: Clutter.TimelineDirection.BACKWARD, - width, - }); - - this.menuLabelTitle.label.add_style_class_name("popup-menu-label-title"); - this.menuLabelTitle.box.xAlign = Clutter.ActorAlign.CENTER; - this.menuLabelSubtitle.box.xAlign = Clutter.ActorAlign.CENTER; - this.menuLabels.add_child(this.menuLabelTitle); - this.menuLabels.add_child(this.menuLabelSubtitle); - - if (this.menuLabels.get_parent() == null) { - this.menuBox.add_child(this.menuLabels); - } - - debugLog("Added menu labels"); - } - async addMenuSlider() { - const position = await this.playerProxy.position.catch(handleError); - const length = this.playerProxy.metadata["mpris:length"]; - const rate = this.playerProxy.rate; - - if (this.menuSlider == null) { - this.menuSlider = new MenuSlider(); - - this.menuSlider.connect("seeked", (_, position) => { - this.playerProxy.setPosition(this.playerProxy.metadata["mpris:trackid"], position); - }); - } - - if (position != null && length != null && length > 0) { - this.menuSlider.setDisabled(false); - this.menuSlider.updateSlider(position, length, rate); - - if (this.playerProxy.playbackStatus === PlaybackStatus.PLAYING) { - this.menuSlider.resumeTransition(); - } - else { - this.menuSlider.pauseTransition(); - } - } - else { - this.menuSlider.setDisabled(true); - } - - if (this.menuSlider.get_parent() == null) { - this.menuBox.insert_child_above(this.menuSlider, this.menuLabels); - } - - debugLog("Added menu slider"); - } - addMenuControls(flags) { - if (this.menuControls == null) { - this.menuControls = new St.BoxLayout(); - } - - if (flags & WidgetFlags.MENU_CONTROLS_LOOP) { - this.addMenuControlIcon(this.playerProxy.loopStatus === LoopStatus.NONE - ? ControlIconOptions.LOOP_NONE - : this.playerProxy.loopStatus === LoopStatus.TRACK - ? ControlIconOptions.LOOP_TRACK - : ControlIconOptions.LOOP_PLAYLIST, this.playerProxy.loopStatus != null, this.playerProxy.toggleLoop.bind(this.playerProxy)); - } - - if (flags & WidgetFlags.MENU_CONTROLS_PREV) { - this.addMenuControlIcon(ControlIconOptions.PREVIOUS, this.playerProxy.canGoPrevious && this.playerProxy.canControl, this.playerProxy.previous.bind(this.playerProxy)); - } - - if (flags & WidgetFlags.MENU_CONTROLS_PLAYPAUSE) { - if (this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING) { - this.addMenuControlIcon(ControlIconOptions.PLAY, this.playerProxy.canPlay && this.playerProxy.canControl, this.playerProxy.play.bind(this.playerProxy)); - } - else { - this.addMenuControlIcon(ControlIconOptions.PAUSE, this.playerProxy.canPause && this.playerProxy.canControl, this.playerProxy.pause.bind(this.playerProxy)); - } - } - - if (flags & WidgetFlags.MENU_CONTROLS_NEXT) { - this.addMenuControlIcon(ControlIconOptions.NEXT, this.playerProxy.canGoNext && this.playerProxy.canControl, this.playerProxy.next.bind(this.playerProxy)); - } - - if (flags & WidgetFlags.MENU_CONTROLS_SHUFFLE) { - this.addMenuControlIcon(this.playerProxy.shuffle ? ControlIconOptions.SHUFFLE_OFF : ControlIconOptions.SHUFFLE_ON, this.playerProxy.shuffle != null, this.playerProxy.toggleShuffle.bind(this.playerProxy)); - } - - if (this.menuControls.get_parent() == null) { - this.menuBox.add_child(this.menuControls); - } - - debugLog("Added menu controls"); - } - addMenuControlIcon(options, reactive, onClick) { - const icon = new St.Icon({ - name: options.name, - iconName: options.iconName, - styleClass: "popup-menu-icon popup-menu-control-icon", - trackHover: reactive, - opacity: reactive ? 255 : 160, - reactive, - ...options.menuProps.options, - }); - const tapAction = new Clutter.TapAction(); - tapAction.connect("tap", onClick); - icon.add_action(tapAction); - const oldIcon = find_child_by_name(this.menuControls, options.name); - - if (oldIcon?.get_parent() === this.menuControls) { - this.menuControls.replace_child(oldIcon, icon); - } - else { - this.menuControls.insert_child_at_index(icon, options.menuProps.index); - } - } - addButtonIcon(index) { - const app = getAppByIdAndEntry(this.playerProxy.identity, this.playerProxy.desktopEntry); - const appIcon = app?.get_icon() ?? Gio.Icon.new_for_string("audio-x-generic-symbolic"); - const coloredClass = this.extension.coloredPlayerIcon ? "colored-icon" : "symbolic-icon"; - const icon = new St.Icon({ - gicon: appIcon, - styleClass: `system-status-icon no-margin ${coloredClass}`, - }); - - if (this.buttonIcon?.get_parent() === this.buttonBox) { - this.buttonBox.replace_child(this.buttonIcon, icon); - } - else { - this.buttonBox.insert_child_at_index(icon, index); - } - - this.buttonIcon = icon; - debugLog("Added icon"); - } - addButtonLabel(index) { - const label = new ScrollingLabel({ - text: this.getButtonLabelText(), - width: this.extension.labelWidth, - isFixedWidth: this.extension.isFixedLabelWidth, - isScrolling: this.extension.scrollLabels, - initPaused: this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING, - }); - - if (this.buttonLabel?.get_parent() === this.buttonBox) { - this.buttonBox.replace_child(this.buttonLabel, label); - } - else { - this.buttonBox.insert_child_at_index(label, index); - } - - this.buttonLabel = label; - debugLog("Added label"); - } - addButtonControls(index, flags) { - if (this.buttonControls == null) { - this.buttonControls = new St.BoxLayout({ - name: "controls-box", - styleClass: "panel-controls-box", - }); - } - - if (flags & WidgetFlags.PANEL_CONTROLS_SEEK_BACKWARD) { - if (this.extension.showControlIconsSeekBackward) { - this.addButtonControlIcon(ControlIconOptions.SEEK_BACKWARD, this.playerProxy.seek.bind(this.playerProxy, -5000000), this.playerProxy.canSeek && this.playerProxy.canControl); - } - else { - this.removeButtonControlIcon(ControlIconOptions.SEEK_BACKWARD); - } - } - - if (flags & WidgetFlags.PANEL_CONTROLS_PREVIOUS) { - if (this.extension.showControlIconsPrevious) { - this.addButtonControlIcon(ControlIconOptions.PREVIOUS, this.playerProxy.previous.bind(this.playerProxy), this.playerProxy.canGoPrevious && this.playerProxy.canControl); - } - else { - this.removeButtonControlIcon(ControlIconOptions.PREVIOUS); - } - } - - if (flags & WidgetFlags.PANEL_CONTROLS_PLAYPAUSE) { - if (this.extension.showControlIconsPlay) { - if (this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING) { - this.addButtonControlIcon(ControlIconOptions.PLAY, this.playerProxy.play.bind(this.playerProxy), this.playerProxy.canPlay && this.playerProxy.canControl); - } - else { - this.addButtonControlIcon(ControlIconOptions.PAUSE, this.playerProxy.pause.bind(this.playerProxy), this.playerProxy.canPause && this.playerProxy.canControl); - } - } - else { - this.removeButtonControlIcon(ControlIconOptions.PLAY); - } - } - - if (flags & WidgetFlags.PANEL_CONTROLS_NEXT) { - if (this.extension.showControlIconsNext) { - this.addButtonControlIcon(ControlIconOptions.NEXT, this.playerProxy.next.bind(this.playerProxy), this.playerProxy.canGoNext && this.playerProxy.canControl); - } - else { - this.removeButtonControlIcon(ControlIconOptions.NEXT); - } - } - - if (flags & WidgetFlags.PANEL_CONTROLS_SEEK_FORWARD) { - if (this.extension.showControlIconsSeekForward) { - this.addButtonControlIcon(ControlIconOptions.SEEK_FORWARD, this.playerProxy.seek.bind(this.playerProxy, 5000000), this.playerProxy.canSeek && this.playerProxy.canControl); - } - else { - this.removeButtonControlIcon(ControlIconOptions.SEEK_FORWARD); - } - } - - if (this.buttonControls.get_parent() == null) { - this.buttonBox.insert_child_at_index(this.buttonControls, index); - } - - debugLog("Added controls"); - } - addButtonControlIcon(options, onClick, reactive) { - const icon = new St.Icon({ - name: options.name, - iconName: options.iconName, - styleClass: "system-status-icon no-margin", - opacity: reactive ? 255 : 160, - reactive, - }); - const tapAction = new Clutter.TapAction(); - tapAction.connect("tap", onClick); - icon.add_action(tapAction); - const oldIcon = find_child_by_name(this.buttonControls, options.name); - - if (oldIcon != null) { - this.buttonControls.replace_child(oldIcon, icon); - } - else { - this.buttonControls.insert_child_at_index(icon, options.panelProps.index); - } - } - removeButtonControlIcon(options) { - const icon = find_child_by_name(this.buttonControls, options.name); - - if (icon != null) { - this.buttonControls.remove_child(icon); - } - } - getButtonLabelText() { - const labelTextElements = []; - - for (const labelElement of this.extension.labelsOrder) { - if (LabelTypes[labelElement] === LabelTypes.TITLE) { - labelTextElements.push(this.playerProxy.metadata["xesam:title"]); - } - else if (LabelTypes[labelElement] === LabelTypes.ARTIST) { - labelTextElements.push(this.playerProxy.metadata["xesam:artist"]?.join(", ") || _("Unknown artist")); - } - else if (LabelTypes[labelElement] === LabelTypes.ALBUM) { - labelTextElements.push(this.playerProxy.metadata["xesam:album"] || _("Unknown album")); - } - else if (LabelTypes[labelElement] === LabelTypes.DISC_NUMBER) { - labelTextElements.push(this.playerProxy.metadata["xesam:discNumber"]); - } - else if (LabelTypes[labelElement] === LabelTypes.TRACK_NUMBER) { - labelTextElements.push(this.playerProxy.metadata["xesam:trackNumber"]); - } - else { - labelTextElements.push(labelElement); - } - } - - return labelTextElements.join(" "); - } - getMenuItemWidth() { - const menuContainer = this.menu.box.get_parent().get_parent(); - const minWidth = menuContainer.get_theme_node().get_min_width() - 24; - return Math.max(minWidth, this.extension.labelWidth); - } - addProxyListeners() { - this.removeProxyListeners(); - - this.addProxyListener("Metadata", () => { - this.updateWidgets(WidgetFlags.PANEL_LABEL | WidgetFlags.MENU_IMAGE | WidgetFlags.MENU_LABELS | WidgetFlags.MENU_SLIDER); - }); - - this.addProxyListener("PlaybackStatus", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_PLAYPAUSE | WidgetFlags.MENU_CONTROLS_PLAYPAUSE); - - if (this.playerProxy.playbackStatus !== PlaybackStatus.PLAYING) { - this.buttonLabel?.pauseScrolling(); - this.menuLabelTitle.pauseScrolling(); - this.menuLabelSubtitle.pauseScrolling(); - this.menuSlider.pauseTransition(); - } - else { - this.buttonLabel?.resumeScrolling(); - this.menuLabelTitle.resumeScrolling(); - this.menuLabelSubtitle.resumeScrolling(); - this.menuSlider.resumeTransition(); - } - }); - - this.addProxyListener("CanPlay", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_PLAYPAUSE | WidgetFlags.MENU_CONTROLS_PLAYPAUSE); - }); - - this.addProxyListener("CanPause", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_PLAYPAUSE | WidgetFlags.MENU_CONTROLS_PLAYPAUSE); - }); - - this.addProxyListener("CanSeek", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_SEEK_FORWARD | WidgetFlags.PANEL_CONTROLS_SEEK_BACKWARD); - }); - - this.addProxyListener("CanGoNext", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_NEXT | WidgetFlags.MENU_CONTROLS_NEXT); - }); - - this.addProxyListener("CanGoPrevious", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS_PREVIOUS | WidgetFlags.MENU_CONTROLS_PREV); - }); - - this.addProxyListener("CanControl", () => { - this.updateWidgets(WidgetFlags.PANEL_CONTROLS | WidgetFlags.MENU_CONTROLS); - }); - - this.addProxyListener("Shuffle", () => { - this.updateWidgets(WidgetFlags.MENU_CONTROLS_SHUFFLE); - }); - - this.addProxyListener("LoopStatus", () => { - this.updateWidgets(WidgetFlags.MENU_CONTROLS_LOOP); - }); - - this.addProxyListener("IsPinned", () => { - this.updateWidgets(WidgetFlags.MENU_PLAYERS); - }); - - this.addProxyListener("Rate", () => { - this.menuSlider.setRate(this.playerProxy.rate); - }); - - this.playerProxy.onSeeked((position) => { - this.menuSlider.setPosition(position); - }); - } - removeProxyListeners() { - for (const [property, id] of this.changeListenerIds.entries()) { - this.playerProxy.removeListener(property, id); - } - } - addProxyListener(property, callback) { - const safeCallback = () => { - if (this.playerProxy != null) { - callback(); - } - }; - - const id = this.playerProxy.onChanged(property, safeCallback); - this.changeListenerIds.set(property, id); - } - initActions() { - const tapAction = new Clutter.TapAction(); - const swipeAction = new Clutter.SwipeAction(); - - tapAction.connect("tap", () => { - const device = tapAction.get_device(tapAction.nTouchPoints - 1); - const event = tapAction.get_last_event(tapAction.nTouchPoints - 1); - const button = event.get_button(); - - if (this.doubleTapSourceId != null) { - GLib.source_remove(this.doubleTapSourceId); - this.doubleTapSourceId = null; - this.doMouseAction(this.extension.mouseActionDouble); - return; - } - - this.doubleTapSourceId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 250, () => { - this.doubleTapSourceId = null; - - if (device.deviceType !== Clutter.InputDeviceType.POINTER_DEVICE) { - this.doMouseAction(this.extension.mouseActionLeft); - return GLib.SOURCE_REMOVE; - } - - if (button === Clutter.BUTTON_PRIMARY) { - this.doMouseAction(this.extension.mouseActionLeft); - } - - if (button === Clutter.BUTTON_MIDDLE) { - this.doMouseAction(this.extension.mouseActionMiddle); - } - - if (button === Clutter.BUTTON_SECONDARY) { - this.doMouseAction(this.extension.mouseActionRight); - } - - return GLib.SOURCE_REMOVE; - }); - }); - - swipeAction.connect("swipe", (_, __, direction) => { - if (direction === Clutter.SwipeDirection.RIGHT) { - this.doMouseAction(this.extension.mouseActionScrollUp); - } - - if (direction === Clutter.SwipeDirection.LEFT) { - this.doMouseAction(this.extension.mouseActionScrollDown); - } - }); - - this.connect("scroll-event", (_, event) => { - const direction = event.get_scroll_direction(); - - if (direction === Clutter.ScrollDirection.UP) { - this.doMouseAction(this.extension.mouseActionScrollUp); - } - - if (direction === Clutter.ScrollDirection.DOWN) { - this.doMouseAction(this.extension.mouseActionScrollDown); - } - }); - - // Tap action is added last to prevent it from blocking button press events - this.add_action(swipeAction); - this.add_action(tapAction); - } - doMouseAction(action) { - switch (action) { - case MouseActions.PLAY_PAUSE: { - this.playerProxy.playPause(); - break; - } - - case MouseActions.PLAY: { - this.playerProxy.play(); - break; - } - - case MouseActions.PAUSE: { - this.playerProxy.pause(); - break; - } - - case MouseActions.NEXT_TRACK: { - this.playerProxy.next(); - break; - } - - case MouseActions.PREVIOUS_TRACK: { - this.playerProxy.previous(); - break; - } - - case MouseActions.VOLUME_UP: { - this.playerProxy.volume = Math.min(this.playerProxy.volume + 0.05, 1); - break; - } - - case MouseActions.VOLUME_DOWN: { - this.playerProxy.volume = Math.max(this.playerProxy.volume - 0.05, 0); - break; - } - - case MouseActions.TOGGLE_LOOP: { - this.playerProxy.toggleLoop(); - break; - } - - case MouseActions.TOGGLE_SHUFFLE: { - this.playerProxy.toggleShuffle(); - break; - } - - case MouseActions.SHOW_POPUP_MENU: { - this.menu.toggle(); - break; - } - - case MouseActions.RAISE_PLAYER: { - this.playerProxy.raise(); - break; - } - - case MouseActions.QUIT_PLAYER: { - this.playerProxy.quit(); - break; - } - - case MouseActions.OPEN_PREFERENCES: { - this.extension.openPreferences(); - break; - } - - default: - break; - } - } - onDestroy() { - this.removeProxyListeners(); - this.playerProxy = null; - this.buttonIcon?.destroy(); - this.buttonLabel?.destroy(); - this.buttonControls?.destroy(); - this.buttonBox?.destroy(); - this.buttonIcon = null; - this.buttonLabel = null; - this.buttonControls = null; - this.buttonBox = null; - this.menuBox = null; - this.menuPlayers = null; - this.menuImage = null; - this.menuLabels = null; - this.menuSlider = null; - this.menuControls = null; - this.menuPlayersTextBox = null; - this.menuPlayersTextBoxIcon = null; - this.menuPlayersTextBoxLabel = null; - this.menuPlayersTextBoxPin = null; - this.menuPlayerIcons = null; - this.menuLabelTitle = null; - this.menuLabelSubtitle = null; - - if (this.doubleTapSourceId != null) { - GLib.source_remove(this.doubleTapSourceId); - this.doubleTapSourceId = null; - } - } -} -const GPanelButton = GObject.registerClass({ - GTypeName: "PanelButton", - Properties: {}, -}, PanelButton); -export default GPanelButton; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PlayerProxy.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PlayerProxy.js deleted file mode 100644 index d9b9d36f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/PlayerProxy.js +++ /dev/null @@ -1,292 +0,0 @@ -import { MPRIS_PLAYER_IFACE_NAME, MPRIS_OBJECT_PATH, LoopStatus } from "../../types/enums/common.js"; -import { errorLog, handleError } from "../../utils/common.js"; -import { createDbusProxy } from "../../utils/shell_only.js"; -import GLib from "gi://GLib"; -export default class PlayerProxy { - isPinned; - mprisProxy; - mprisPlayerProxy; - propertiesProxy; - changeListeners; - pollSourceId; - busName; - isInvalid; - constructor(busName) { - this.busName = busName; - this.isPinned = false; - this.isInvalid = true; - this.changeListeners = new Map(); - } - async initPlayer(mprisIface, mprisPlayerIface, propertiesIface) { - const mprisProxy = createDbusProxy(mprisIface, this.busName, MPRIS_OBJECT_PATH).catch(handleError); - const mprisPlayerProxy = createDbusProxy(mprisPlayerIface, this.busName, MPRIS_OBJECT_PATH).catch(handleError); - const propertiesProxy = createDbusProxy(propertiesIface, this.busName, MPRIS_OBJECT_PATH).catch(handleError); - const proxies = await Promise.all([mprisProxy, mprisPlayerProxy, propertiesProxy]).catch(handleError); - - if (proxies == null) { - errorLog("Failed to create proxies"); - return false; - } - - this.mprisProxy = proxies[0]; - this.mprisPlayerProxy = proxies[1]; - this.propertiesProxy = proxies[2]; - - this.propertiesProxy.connectSignal("PropertiesChanged", (proxy, senderName, [, changedProperties]) => { - for (const [property, value] of Object.entries(changedProperties)) { - this.callOnChangedListeners(property, value.recursiveUnpack()); - } - }); - - this.onChanged("Metadata", this.validatePlayer.bind(this)); - this.onChanged("Identity", this.validatePlayer.bind(this)); - this.onChanged("DesktopEntry", this.validatePlayer.bind(this)); - this.validatePlayer(); - this.pollTillInitialized(); - return true; - } - pinPlayer() { - this.isPinned = true; - this.callOnChangedListeners("IsPinned", this.isPinned); - } - unpinPlayer() { - this.isPinned = false; - this.callOnChangedListeners("IsPinned", this.isPinned); - } - isPlayerPinned() { - return this.isPinned; - } - /** - * Some players don't set the initial position and metadata immediately on startup - */ - pollTillInitialized() { - const timeout = 5000; - const interval = 250; - let count = Math.ceil(timeout / interval); - - this.pollSourceId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, interval, () => { - count--; - const positionPromise = this.propertiesProxy.GetAsync(MPRIS_PLAYER_IFACE_NAME, "Position"); - const metadataPromise = this.propertiesProxy.GetAsync(MPRIS_PLAYER_IFACE_NAME, "Metadata"); - - Promise.all([positionPromise, metadataPromise]) - .then(([positionVariant, metadataVariant]) => { - const unpackedPosition = positionVariant[0].recursiveUnpack(); - const unpackedMetadata = metadataVariant[0].recursiveUnpack(); - - if (unpackedPosition > 0 && unpackedMetadata["mpris:length"] > 0) { - this.mprisPlayerProxy.set_cached_property("Position", positionVariant[0]); - this.mprisPlayerProxy.set_cached_property("Metadata", metadataVariant[0]); - this.callOnChangedListeners("Metadata", unpackedMetadata); - GLib.source_remove(this.pollSourceId); - } - else if (count <= 0) { - GLib.source_remove(this.pollSourceId); - } - }) - .catch(() => { - GLib.source_remove(this.pollSourceId); - }); - - return GLib.SOURCE_CONTINUE; - }); - } - validatePlayer() { - const isValidName = this.mprisProxy.Identity || this.mprisProxy.DesktopEntry; - const isValidMetadata = this.metadata && this.metadata["xesam:title"]; - this.isInvalid = !isValidName || !isValidMetadata; - this.callOnChangedListeners("IsInvalid", this.isInvalid); - } - unpackMetadata(metadata) { - const unpackedMetadata = {}; - - for (const [key, value] of Object.entries(metadata)) { - unpackedMetadata[key] = value.recursiveUnpack(); - } - - return unpackedMetadata; - } - callOnChangedListeners(property, value) { - const listeners = this.changeListeners.get(property); - - if (listeners == null) { - return; - } - - for (const listener of listeners) { - try { - listener(value); - } - catch (error) { - errorLog(`Failed to call listener for property ${property}:`, error); - } - } - } - get playbackStatus() { - return this.mprisPlayerProxy.PlaybackStatus; - } - get loopStatus() { - return this.mprisPlayerProxy.LoopStatus; - } - get rate() { - return this.mprisPlayerProxy.Rate; - } - get shuffle() { - return this.mprisPlayerProxy.Shuffle; - } - get metadata() { - return this.unpackMetadata(this.mprisPlayerProxy.Metadata); - } - get volume() { - return this.mprisPlayerProxy.Volume; - } - get position() { - return this.propertiesProxy - .GetAsync(MPRIS_PLAYER_IFACE_NAME, "Position") - .then((result) => { - return result[0].get_int64(); - }) - .catch(() => { - return null; - }); - } - get minimumRate() { - return this.mprisPlayerProxy.MinimumRate; - } - get maximumRate() { - return this.mprisPlayerProxy.MaximumRate; - } - get canGoNext() { - return this.mprisPlayerProxy.CanGoNext; - } - get canGoPrevious() { - return this.mprisPlayerProxy.CanGoPrevious; - } - get canPlay() { - return this.mprisPlayerProxy.CanPlay; - } - get canPause() { - return this.mprisPlayerProxy.CanPause; - } - get canSeek() { - return this.mprisPlayerProxy.CanSeek; - } - get canControl() { - return this.mprisPlayerProxy.CanControl; - } - get canQuit() { - return this.mprisProxy.CanQuit; - } - get canRaise() { - return this.mprisProxy.CanRaise; - } - get canSetFullscreen() { - return this.mprisProxy.CanSetFullscreen; - } - get desktopEntry() { - return this.mprisProxy.DesktopEntry; - } - get hasTrackList() { - return this.mprisProxy.HasTrackList; - } - get identity() { - return this.mprisProxy.Identity; - } - get supportedMimeTypes() { - return this.mprisProxy.SupportedMimeTypes; - } - get supportedUriSchemes() { - return this.mprisProxy.SupportedUriSchemes; - } - set loopStatus(loopStatus) { - this.mprisPlayerProxy.LoopStatus = loopStatus; - } - set rate(rate) { - this.mprisPlayerProxy.Rate = rate; - } - set shuffle(shuffle) { - this.mprisPlayerProxy.Shuffle = shuffle; - } - set volume(volume) { - this.mprisPlayerProxy.Volume = volume; - } - set fullscreen(fullscreen) { - this.mprisProxy.Fullscreen = fullscreen; - } - async next() { - await this.mprisPlayerProxy.NextAsync().catch(handleError); - } - async previous() { - await this.mprisPlayerProxy.PreviousAsync().catch(handleError); - } - async pause() { - await this.mprisPlayerProxy.PauseAsync().catch(handleError); - } - async playPause() { - await this.mprisPlayerProxy.PlayPauseAsync().catch(handleError); - } - async stop() { - await this.mprisPlayerProxy.StopAsync().catch(handleError); - } - async play() { - await this.mprisPlayerProxy.PlayAsync().catch(handleError); - } - async seek(offset) { - await this.mprisPlayerProxy.SeekAsync(offset).catch(handleError); - } - async setPosition(trackId, position) { - await this.mprisPlayerProxy.SetPositionAsync(trackId, position).catch(handleError); - } - async openUri(uri) { - await this.mprisPlayerProxy.OpenUriAsync(uri).catch(handleError); - } - async raise() { - await this.mprisProxy.RaiseAsync().catch(handleError); - } - async quit() { - await this.mprisProxy.QuitAsync().catch(handleError); - } - toggleLoop() { - const loopStatuses = Object.values(LoopStatus); - const currentIndex = loopStatuses.findIndex((loop) => loop === this.loopStatus); - const nextIndex = (currentIndex + 1 + loopStatuses.length) % loopStatuses.length; - this.loopStatus = loopStatuses[nextIndex]; - } - toggleShuffle() { - this.shuffle = !this.shuffle; - } - onSeeked(callback) { - const signalId = this.mprisPlayerProxy.connectSignal("Seeked", () => { - this.position.then(callback); - }); - return this.mprisPlayerProxy.disconnectSignal.bind(this.mprisPlayerProxy, signalId); - } - onChanged(property, callback) { - const listeners = this.changeListeners.get(property); - let id; - - if (listeners == null) { - id = 0; - this.changeListeners.set(property, [callback]); - } - else { - id = listeners.push(callback); - } - - return id; - } - removeListener(property, id) { - const listeners = this.changeListeners.get(property); - - if (listeners == null) { - return; - } - - listeners.splice(id, 1); - } - onDestroy() { - if (this.pollSourceId != null) { - GLib.source_remove(this.pollSourceId); - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/ScrollingLabel.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/ScrollingLabel.js deleted file mode 100644 index 52e9c417..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/helpers/shell/ScrollingLabel.js +++ /dev/null @@ -1,134 +0,0 @@ -import Clutter from "gi://Clutter"; -import GObject from "gi://GObject"; -import Pango from "gi://Pango"; -import St from "gi://St"; -const SCROLL_ANIMATION_SPEED = 0.04; -class ScrollingLabel extends St.ScrollView { - label; - box; - onAdjustmentChangedId; - onShowChangedId; - isScrolling; - isFixedWidth; - initPaused; - labelWidth; - direction; - transition; - constructor(params) { - super({ - hscrollbarPolicy: St.PolicyType.NEVER, - vscrollbarPolicy: St.PolicyType.NEVER, - }); - - const defaultParams = { - direction: Clutter.TimelineDirection.FORWARD, - isFixedWidth: true, - }; - const { text, width, direction, isFixedWidth, isScrolling, initPaused } = { - ...defaultParams, - ...params, - }; - this.isScrolling = isScrolling; - this.isFixedWidth = isFixedWidth; - this.initPaused = initPaused; - this.labelWidth = width; - this.direction = direction; - - this.box = new St.BoxLayout({ - xExpand: true, - yExpand: true, - }); - - this.label = new St.Label({ - text, - yAlign: Clutter.ActorAlign.CENTER, - xAlign: Clutter.ActorAlign.START, - }); - - this.onShowChangedId = this.label.connect("show", this.onShowChanged.bind(this)); - this.box.add_child(this.label); - - if (Clutter.Container === undefined) { - this.add_child(this.box); - } - else { - this.add_actor(this.box); - } - } - pauseScrolling() { - this.transition?.pause(); - this.initPaused = true; - } - resumeScrolling() { - this.transition?.start(); - this.initPaused = false; - } - initScrolling() { - const adjustment = this.hscroll.adjustment; - const origText = this.label.text; - this.onAdjustmentChangedId = adjustment.connect("changed", this.onAdjustmentChanged.bind(this, adjustment, origText)); - this.label.text = `${origText} `; - this.label.clutterText.ellipsize = Pango.EllipsizeMode.NONE; - } - onAdjustmentChanged(adjustment, origText) { - if (adjustment.upper <= adjustment.pageSize) { - return; - } - - const initial = adjustment.value; - const final = adjustment.upper; - const duration = adjustment.upper / SCROLL_ANIMATION_SPEED; - const pspec = adjustment.find_property("value"); - const interval = new Clutter.Interval({ - valueType: pspec.value_type, - initial, - final, - }); - - this.transition = new Clutter.PropertyTransition({ - propertyName: "value", - progressMode: Clutter.AnimationMode.LINEAR, - direction: this.direction, - repeatCount: -1, - duration, - interval, - }); - - this.label.text = `${origText} ${origText}`; - adjustment.add_transition("scroll", this.transition); - adjustment.disconnect(this.onAdjustmentChangedId); - - if (this.initPaused) { - this.transition.pause(); - } - } - onShowChanged() { - if (this.label.visible === false) { - return; - } - - const isLabelWider = this.label.width > this.labelWidth && this.labelWidth > 0; - - if (isLabelWider && this.isScrolling) { - this.initScrolling(); - } - - if (this.isFixedWidth && this.labelWidth > 0) { - this.box.width = this.labelWidth; - this.label.xAlign = Clutter.ActorAlign.CENTER; - this.label.xExpand = true; - } - else if (isLabelWider) { - this.box.width = Math.min(this.label.width, this.labelWidth); - } - - this.label.disconnect(this.onShowChangedId); - } - vfunc_scroll_event() { - return Clutter.EVENT_PROPAGATE; - } -} -const GScrollingLabel = GObject.registerClass({ - GTypeName: "ScrollingLabel", -}, ScrollingLabel); -export default GScrollingLabel; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/ca/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/ca/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo deleted file mode 100644 index 32295d52bef0dd9f12913c2ea8c3ec8f8a9a327c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6398 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/cs/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/cs/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo deleted file mode 100644 index eb38c403e5d3b4246aa9847e13ee4fa08720465b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmZvbO^6&t6vv-2@ncN<h|&0MsUSq@&CG5NVT|JLW;LrjnQ?b^5p%J&yJouVo~ow1 zdUThZ1dlm*PzZuBpocvK;z<-X9%ko|n|M$`^eE`TgWy3>@c+7d+z1v^^_zPA`hEPX z`lq7@KOl_9F(1J^b`#MF@bCdF7+1kV;Ah}1;OF2y;I+#Bb!Gn+yaV<h!F$19z+1t; z!H2;^Hxu0kJ^>yCp8*epC&44&nachO$obk8*DL!4@GjWj1UXLva=eSx{ymW6y$|yH zA6NEIz}vCE3f>8R339&c)&4t><NXY>-|yhl(BLnS<2;3h?I%F)V-95hHdq5MfcJqt zkoCI=a^IK1N5K(z6#NRrkG{de`h5@b`@e!nMSp<Y&!3h30L13JN5BWc;~?wW0P&+G zEbPAm^7Hk|Zb7bZ2(tgX;FI8oAnW%9$oa2>T-Og3e*@8WF}UvO;Mgds82mntvlx$I z<vhnRIS$v#eX|z#W3m<xVDjL6tUc>@43qoi@lc7PA3hWAhwlatK1<ez@8#W?+)FX$ z<IQ|P^QqIBqlH-dQH*~giRG3`Gg_2>sAy3cr&3ysl}v?Snrv)S6;zHw`_|CQ%BWPv zbWR6KxKN3K3bYi)I^EO0bQ(VA>_8>5uV_W}9JO>1#7g+F_9JT9JX1pY?3dAbYZSE+ zC8dtU1L~lpVo|8U8kgEQo9>JB9h>PQ$7{Ksc0j9ABWT$Ut?GX0%C*Y57TVPLxyz_) z`+by>g?X<RD_S>^v2Pn83w{3Gl{#(MI3Fkxz=5j&c|x7kzNLKUEeGBPv_lt7QCn3B zGI*`5uLEx(?`K}u!rW<lt7@p($vZ2ZYKqzV>?yC_@EUWX(P+*#o~<|P_1cQeoYzgI z$zthj+7ydniu2LZh!vS@(}x&m{Hg85xUzYEEX_=yUO)iT&!M;1RdRsD(|uF;S*^9) zTH3F*F;lNCLRcKO*WF4`lT+`wlh96^=Y${1G*j;R_3lgF>3u>*26N$@n%vJxy_X zQ@h&hUU?acnmZQvz=^q;Q!}$QDsS8}->4*2jyjXeDon?tq1?Nqgpp!%dJA)EscoIe z!QMxcPiZ|#ZRX${(8ku@C04=VhV45n$W#r@cqDXW5hl4YF10t6Z^k>c7Nz4|C+s#H z2g;1E2rCBToj{MT_#vIO13Szj#K;^<GLfW>SPd<oZJC?jz$X&XeB|STZ%sy;JkO(c z=A^?z>ey|ZnH=i<&K$Le@pu#<Am09OUCaMdD?(@=R}hcTXBj6kHg_VB@nnP;Srp4) zGpCItl|^-OINmMmdKH<5Dzn4!j@XV;=^}hJkfIELu0tC@i2X8(s_48b6v2b?#!vUV dB8U93@@WmlPp(1pFqZhxpa;EytPtQv(?6*>)9(NP diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/de/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/de/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo deleted file mode 100644 index 2c806ff054e37b43757e620c19a56f0f811815e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6429 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/es/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/es/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo deleted file mode 100644 index 96d22c2d8d4d1f43da7eb010ea35c7af3d4b1de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6539 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/pt_BR/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/locale/pt_BR/LC_MESSAGES/mediacontrols@cliffniff.github.com.mo deleted file mode 100644 index f19cd21ebdfdbd1d2d254cd3996565ab20dba60e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6476 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 Onr3LX*Dd?&J@Oy%hTdiX diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/org.gnome.shell.extensions.mediacontrols.gresource b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/org.gnome.shell.extensions.mediacontrols.gresource deleted file mode 100644 index 82318d008eb15c8df78c63898225dd40bad77d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24412 zcmeHP&5s;M6`y<nVI4wF5r`Z*BNPQGy<;aRAhNrOz1}!hoOt7P97RGxJ>4}ko$cxF z^vA9@Cl34pIdS3u|3MVO#{r=rK#CAYAMzJ)MjYS>zgN{gTVMS#vunpjJ5q1=c2~Ws z_ffCjd-bZW-14%}i;F?^`xfr$L;RoT9<N{GPOl!p^{94z75_hmYYo>qT;KlVzwgj9 z!FXbDZSYgve}?N{PdSf2jQ8~X*x+FB5$+#f9t{5RN%<?h=Fg9y{HJ*LIj&!S@ab=< zJUu^w@?YTo$s2>g51vnd@in}s=dYst?{WVFt~Yi+I!Aq>=ST7WGu;1z>&|Z;9{d+S zdVUD+Kga#=xIX^fch7$X<>{H=+`;_|Tz`7$&s)?kJwJtZ|B3t4Zx054y|bOtdwTvR z-k-;P@ZMl>>zCj8&!c#x=W~GbIPOp4dim#<uTgn={sziBxc~SkgTb5yq30)YktI<+ z8VsmRnz2c~UWNqb$!+>O7;L<9dmcFlEX%_r-W*<7KR<L>>?c7OPdA6}+<eXb;qaBM zwT)+7ckS|Z=dJ5Eot?{9Z$7hja~9^#B#fAI=;h9<Qx>z#D_G!+kDPH-vNQ|h!u6AR ziZa={b2ZKj<^|6?=vd(tGq&a@S;q1-iK#7TeH^6%o)-sB#%h2lx@agYW;WPsu8SU` zIhIX4pE*G?_d+0}(BM@+3MZ2o*ZLH2%JDk-Hr!fsoQ;fqP=@G=6NTf=;k4Kv9uwsI zAjpW9O2+Rqzi|A>%k$0Q#o%xk<YXC$#qwQm%7#uDYz|XAxuWk8hYt8@mZU5zj-1$= zv&~@<77<DpnHT4gS9s$HFOOJ0+`7Vv7;TK|8q}}}AOv4sf;HSCmR5am^CM7rj@x{k zM4@j$@n>Na2#A2$hR&5NDbuR=whlC7u$|23Nvt=`VJOY>H%1qBZl_>A%WfoxQtQk0 z;F>pPQEuyj4NhK;TaYR9BAJIDG7?uO;((nn=KrCiEOJOx>06qlW$MgXT=s342~>mO zR*{vgv6ewJJK^@yFeajL5zMn%0A1c^_b?2KnMP0>F`6myE<tGOqzzOnUC%p3;uPLK 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 AVgLXD diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/prefs.js deleted file mode 100644 index dde15d1a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/prefs.js +++ /dev/null @@ -1,326 +0,0 @@ -import Adw from "gi://Adw"; -import GLib from "gi://GLib"; -import Gdk from "gi://Gdk"; -import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; -import GObject from "gi://GObject"; -import { ExtensionPreferences, gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; -import BlacklistedPlayersOrig from "./helpers/prefs/BlacklistedPlayers.js"; -import ElementListOrig from "./helpers/prefs/ElementList.js"; -import LabelListOrig from "./helpers/prefs/LabelList.js"; -import AppChooserorig from "./helpers/prefs/AppChooser.js"; -import { isValidBinding, isValidAccelerator } from "./utils/prefs_only.js"; -import { handleError } from "./utils/common.js"; -export let BlacklistedPlayers; -export let ElementList; -export let LabelList; -export let AppChooser; -Gio._promisify(Gio.File.prototype, "trash_async", "trash_finish"); -Gio._promisify(Gio.File.prototype, "query_info_async", "query_info_finish"); -Gio._promisify(Gio.File.prototype, "enumerate_children_async", "enumerate_children_finish"); -Gio._promisify(Gio.FileEnumerator.prototype, "next_files_async", "next_files_finish"); - -export default class MediaControlsPreferences extends ExtensionPreferences { - window; - settings; - builder; - generalPage; - panelPage; - positionsPage; - shortcutsPage; - otherPage; - fillPreferencesWindow(window) { - const resourcePath = GLib.build_filenamev([this.path, "org.gnome.shell.extensions.mediacontrols.gresource"]); - Gio.resources_register(Gio.resource_load(resourcePath)); - - if (AppChooser == null) { - AppChooser = GObject.registerClass({ - GTypeName: "AppChooser", - Template: "resource:///org/gnome/shell/extensions/mediacontrols/ui/app-chooser.ui", - InternalChildren: ["list-box", "select-btn", "cancel-btn"], - }, AppChooserorig); - } - - if (BlacklistedPlayers == null) { - BlacklistedPlayers = GObject.registerClass({ - GTypeName: "BlacklistedPlayers", - Template: "resource:///org/gnome/shell/extensions/mediacontrols/ui/blacklisted-players.ui", - Properties: { - players: GObject.ParamSpec.jsobject("players", "Blacklisted players", "Blacklisted players", GObject.ParamFlags.READABLE), - }, - InternalChildren: ["list-box", "add-btn"], - }, BlacklistedPlayersOrig); - } - - if (LabelList == null) { - LabelList = GObject.registerClass({ - GTypeName: "LabelList", - Template: "resource:///org/gnome/shell/extensions/mediacontrols/ui/label-list.ui", - InternalChildren: ["list-box", "add-item-btn", "add-text-btn"], - Properties: { - labels: GObject.ParamSpec.jsobject("labels", "Labels", "Labels", GObject.ParamFlags.READABLE), - }, - }, LabelListOrig); - } - - if (ElementList == null) { - ElementList = GObject.registerClass({ - GTypeName: "ElementList", - Template: "resource:///org/gnome/shell/extensions/mediacontrols/ui/element-list.ui", - InternalChildren: ["list-box", "icon-row", "label-row", "controls-row"], - Properties: { - elements: GObject.ParamSpec.jsobject("elements", "Elements", "Elements", GObject.ParamFlags.READABLE), - }, - }, ElementListOrig); - } - - GObject.type_ensure(AppChooser.$gtype); - GObject.type_ensure(BlacklistedPlayers.$gtype); - GObject.type_ensure(LabelList.$gtype); - GObject.type_ensure(ElementList.$gtype); - this.window = window; - this.settings = this.getSettings(); - this.builder = Gtk.Builder.new_from_resource("/org/gnome/shell/extensions/mediacontrols/ui/prefs.ui"); - this.generalPage = this.builder.get_object("page-general"); - this.panelPage = this.builder.get_object("page-panel"); - this.positionsPage = this.builder.get_object("page-positions"); - this.shortcutsPage = this.builder.get_object("page-shortcuts"); - this.otherPage = this.builder.get_object("page-other"); - this.window.add(this.generalPage); - this.window.add(this.panelPage); - this.window.add(this.positionsPage); - this.window.add(this.shortcutsPage); - this.window.add(this.otherPage); - this.initWidgets(); - this.bindSettings(); - - this.window.connect("close-request", () => { - this.window = null; - this.settings = null; - this.builder = null; - this.generalPage = null; - this.panelPage = null; - this.positionsPage = null; - this.shortcutsPage = null; - this.otherPage = null; - }); - } - initWidgets() { - const elementsOrder = this.settings.get_strv("elements-order"); - const elementsGroup = this.builder.get_object("gp-positions-elements"); - elementsGroup.initElements(elementsOrder); - - elementsGroup.connect("notify::elements", () => { - this.settings.set_strv("elements-order", elementsGroup.elements); - }); - - const labelsGroup = this.builder.get_object("gp-positions-labels"); - const labelsOrder = this.settings.get_strv("labels-order"); - labelsGroup.initLabels(labelsOrder); - - labelsGroup.connect("notify::labels", () => { - this.settings.set_strv("labels-order", labelsGroup.labels); - }); - - const shortcutRow = this.builder.get_object("row-shortcuts-popup"); - const shortcutLabel = this.builder.get_object("sl-shortcuts-popup"); - const shortcutEditorWindow = this.builder.get_object("win-shortcut-editor"); - const shortcutEditorLabel = this.builder.get_object("sl-shortcut-editor"); - - shortcutRow.connect("activated", () => { - const controller = new Gtk.EventControllerKey(); - shortcutEditorWindow.add_controller(controller); - const currentShortcut = this.settings.get_strv("mediacontrols-show-popup-menu"); - shortcutEditorLabel.accelerator = currentShortcut[0]; - - controller.connect("key-pressed", (_, keyval, keycode, state) => { - let mask = state & Gtk.accelerator_get_default_mod_mask(); - mask &= ~Gdk.ModifierType.LOCK_MASK; - - if (!mask && keyval === Gdk.KEY_Escape) { - shortcutEditorWindow.close(); - return Gdk.EVENT_STOP; - } - - if (!mask && keyval === Gdk.KEY_BackSpace) { - shortcutEditorLabel.accelerator = ""; - return Gdk.EVENT_STOP; - } - - if (!mask && keyval === Gdk.KEY_Return) { - const shortcut = shortcutEditorLabel.accelerator; - shortcutLabel.accelerator = shortcut; - this.settings.set_strv("mediacontrols-show-popup-menu", [shortcut]); - shortcutEditorWindow.close(); - return Gdk.EVENT_STOP; - } - - if (isValidBinding(mask, keycode, keyval) && isValidAccelerator(mask, keyval)) { - shortcutEditorLabel.accelerator = Gtk.accelerator_name_with_keycode(null, keyval, keycode, mask); - } - - return Gdk.EVENT_STOP; - }); - - shortcutEditorWindow.present(); - }); - - const cacheClearRow = this.builder.get_object("row-other-cache-clear"); - const cacheClearBtn = this.builder.get_object("btn-other-cache-clear"); - - cacheClearBtn.connect("clicked", () => { - const dialog = Adw.MessageDialog.new(this.window, "", _("Are you sure you want to clear the cache?")); - dialog.add_response("cancel", _("Cancel")); - dialog.add_response("clear", _("Clear cache")); - dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE); - - dialog.connect("response", (self, response) => { - if (response === "cancel") - return; - - this.clearCache().then(() => { - cacheClearRow.subtitle = _("Cache size: %s").format(GLib.format_size(0)); - }); - }); - - dialog.present(); - }); - - this.getCacheSize().then((size) => { - const sizeReadable = GLib.format_size(size); - cacheClearRow.subtitle = _("Cache size: %s").format(sizeReadable); - }); - - const blacklistedGrp = this.builder.get_object("gp-other-blacklist"); - const blacklistedPlayers = this.settings.get_strv("blacklisted-players"); - blacklistedGrp.initPlayers(blacklistedPlayers); - - blacklistedGrp.connect("notify::players", () => { - this.settings.set_strv("blacklisted-players", blacklistedGrp.players); - }); - } - bindSettings() { - this.bindSetting("label-width", "sr-general-label-width", "value"); - this.bindSetting("fixed-label-width", "sr-general-label-fixed", "active"); - this.bindSetting("scroll-labels", "sr-general-scroll-labels", "active"); - this.bindSetting("hide-media-notification", "sr-general-hide-media-notification", "active"); - this.bindSetting("show-label", "sr-panel-show-label", "active"); - this.bindSetting("show-control-icons", "sr-panel-show-controls", "active"); - this.bindSetting("show-control-icons-play", "sr-panel-show-play", "active"); - this.bindSetting("show-control-icons-next", "sr-panel-show-next", "active"); - this.bindSetting("show-control-icons-previous", "sr-panel-show-prev", "active"); - this.bindSetting("show-control-icons-seek-forward", "sr-panel-show-seek-forward", "active"); - this.bindSetting("show-control-icons-seek-backward", "sr-panel-show-seek-backward", "active"); - this.bindSetting("show-player-icon", "sr-panel-show-player", "active"); - this.bindSetting("colored-player-icon", "sr-panel-colored-player", "active"); - this.bindSetting("extension-position", "cr-positions-extension-position", "selected"); - this.bindSetting("extension-index", "sr-positions-extension-index", "value"); - this.bindSetting("mediacontrols-show-popup-menu", "sl-shortcuts-popup", "accelerator"); - this.bindSetting("mouse-action-left", "cr-shortcuts-mouse-left", "selected"); - this.bindSetting("mouse-action-middle", "cr-shortcuts-mouse-middle", "selected"); - this.bindSetting("mouse-action-right", "cr-shortcuts-mouse-right", "selected"); - this.bindSetting("mouse-action-double", "cr-shortcuts-mouse-double", "selected"); - this.bindSetting("mouse-action-scroll-up", "cr-shortcuts-mouse-scroll-up", "selected"); - this.bindSetting("mouse-action-scroll-down", "cr-shortcuts-mouse-scroll-down", "selected"); - this.bindSetting("cache-art", "sr-other-cache", "active"); - } - bindSetting(key, widgetName, property) { - if (property === "selected") { - const widget = this.builder.get_object(widgetName); - widget[property] = this.settings.get_enum(key); - - widget.connect(`notify::${property}`, () => { - this.settings.set_enum(key, widget[property]); - }); - - this.settings.connect(`changed::${key}`, () => { - widget[property] = this.settings.get_enum(key); - }); - } - else if (property === "accelerator") { - const widget = this.builder.get_object(widgetName); - widget[property] = this.settings.get_strv(key)[0]; - - widget.connect(`notify::${property}`, () => { - this.settings.set_strv(key, [widget[property]]); - }); - - this.settings.connect(`changed::${key}`, () => { - widget[property] = this.settings.get_strv(key)[0]; - }); - } - else { - const widget = this.builder.get_object(widgetName); - widget[property] = this.settings.get_value(key).recursiveUnpack(); - const bindingFlags = Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.NO_SENSITIVITY; - this.settings.bind(key, widget, property, bindingFlags); - } - } - sendToast(title) { - const toast = new Adw.Toast({ title, timeout: 3 }); - this.window.add_toast(toast); - } - async clearCache() { - const cacheDir = GLib.build_pathv("/", [GLib.get_user_cache_dir(), "mediacontrols@cliffniff.github.com"]); - - if (GLib.file_test(cacheDir, GLib.FileTest.EXISTS)) { - const folder = Gio.File.new_for_path(cacheDir); - const success = await folder.trash_async(null, null).catch(handleError); - - if (success) { - this.sendToast(_("Cache cleared successfully!")); - } - else { - this.sendToast(_("Failed to clear cache!")); - } - } - } - async getCacheSize() { - const cacheDir = GLib.build_pathv("/", [GLib.get_user_cache_dir(), "mediacontrols@cliffniff.github.com"]); - - if (GLib.file_test(cacheDir, GLib.FileTest.EXISTS)) { - const folder = Gio.File.new_for_path(cacheDir); - const enumerator = await folder - .enumerate_children_async("standard::*", Gio.FileQueryInfoFlags.NONE, 0, null) - .catch(handleError); - - if (enumerator == null) { - return 0; - } - - let size = 0; - let retries = 0; - - while (true) { - const fileInfos = await enumerator.next_files_async(10, null, null).catch(handleError); - - if (fileInfos == null) { - if (retries < 3) { - retries++; - continue; - } - else { - break; - } - } - - if (fileInfos.length === 0) { - break; - } - - for (const fileInfo of fileInfos) { - const file = enumerator.get_child(fileInfo); - const info = await file - .query_info_async("standard::size", Gio.FileQueryInfoFlags.NONE, 0, null) - .catch(handleError); - const fileSize = info?.get_size() ?? 0; - size += fileSize; - } - } - - return size; - } - - return 0; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/private_metadata.json deleted file mode 100644 index b79fbbef..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/private_metadata.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Show controls and information of the currently playing media in the panel.", - "gettext-domain": "mediacontrols@cliffniff.github.com", - "name": "Media Controls", - "settings-schema": "org.gnome.shell.extensions.mediacontrols", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "https://github.com/cliffniff/media-controls", - "uuid": "mediacontrols@cliffniff.github.com", - "version": 37, - "version-name": "2.0.2" -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/gschemas.compiled deleted file mode 100644 index 67bd5f0b37eb3dc48106d552444b1376b1ae3999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3645 zcmeHK&2Jk;9G#Rpl(=q6652pOL`bO4VPnx#FA=!OCb8IhU4NuORC3q$Bwo7lTDx|W z9D)ELwTKH65(fkbE+B*iy&x3?0uh9O6H;iXKvcQ(P*tjc9^e37-Wz`;PSgJ&BR#*j zZ)a!6Gr#%G?9`0q*;b_{nq?3?+tATHEfXAiK!^aPanDe7PQ(BE)=R6bMjaK?;$`q# z_XyDicD?!0`HH(BNBy#NoKd+{lNH}~EB@$$EZJ7kt<*f%@%iY(_+jC5d@q4!6z&BR z`<mzh?{6XkKG4KLa39bQpu6JG4tNM2F$8=&@x<v6nEmY&=fp+uZ+nIK^PQV-)2F^4 z{vY6>ZXsU3`r#h>)IIQ{U=8?v<&&%QsoBm`U>)e{U;B(c^?vxXU>9hOCAAQSsDiHm z@BR4rH>^+H&-aq?r^Cj?=k%!$@V(#(;Cf^|pig}m{u!_YR?`25=~J_vC3?WozfQXJ zsl)IufL{Y{zrS{qKJ_sCi{MXzcW-}GrccfGe*#|yA~$}B)2F@<{s#COaQ^t(tMsXd z;NzwU0Y@%fzCoY57ycl47<eK6i|Ri$+dl>#1Agwk^(O06KMMa0SOU3cKVGL#t^ODI z0|dhx=hwUGQy)bAOW-eoUnA8G`qYE)uYiLvVrlWKqx7i{!5>60J&8d2dgb{rW1Kn! ze;Ql|_P+APW2{fj`Mm)C4ydiJj?t%Pe>T9^fPv?(zet}t0{<WIe?U*)z%+g8N8k@5 zaE}1J?sAAeHRJ6Vcnnx@>%P>iVhu}1^X&ODR%tq($msc$5r0Nc;}IeGgAydoqz>Zx z33xl7isv$LaLKi#JP_AZP*t}Agf*ViXS4ZiIzIk1u7sM8AeGi<5@s&5#YZTLV8%3Z zC-i(SB?7L;*7byWD#=Ssy9l!8)Rdv;4bx2V5>wRnGSj)qNu$vxOoa$C)8?ss%1q@_ z`4f6FM+;LTg3dn~aIFU?bBXNc{|+#OA}~{WGLOzq>S;YWu4iDukNVMNt3EQ)F?^1k zQ#o$?D|g4QbNrA)TjS@K-9^o@3ev$?cZq0WL^;i@t=SNM!&jAj&GkysLtU0^B8!>U zL_D2MWU``rU$2N-{s`6~*Mv$9DyR2C9|o9@InRs>#wBw!V~+96oX#=;Ft0xdFpe2- z%=uU<$Y)$TjeUdpzhm-CZoS|%X1cLVcGu1Jbrag0cj?FlS*dl-XJXt;3L}18Hw08R zZ5kO73J<7By)!Jd3if);LNjiPuH$;Lq*WbjS$ZmRR6MD;(H8Aet^7SJN9#L;nC44) zRx4P=vx}BjQqPs`lGM}@LaVqnd(JLe%#oY#vx;RTP7htUOWbNzPoA@pU)BBg!9=qw zCAq|QRN1*d{1<m^S9NyI_1IUoq1x{V#s#}na^#(<Yd0ph$0XKsM=shDK0A!7U&L9` z(Ms+j1EIN9sjX=@$9Lv<<k{A^c0^`#1nbq!@xxZX8<*ST5_?o@{6?!*t&AZOF?{UA z)W=RteeA^AImM54eC))8@Z0yas_WY-b&VtAa`SA*s-X@njq_aVCeAnNESFYiL7c%_ z-6%LnkB;rv+DVolRjP2;ZBA@sn{L>RytMTzOjBvR>Q?Jj<km{P`8+D3g*kf(O>fE9 I7=psc|Jet7l>h($ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/org.gnome.shell.extensions.mediacontrols.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/org.gnome.shell.extensions.mediacontrols.gschema.xml deleted file mode 100644 index bfd2debb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/schemas/org.gnome.shell.extensions.mediacontrols.gschema.xml +++ /dev/null @@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist> - <enum id="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <value nick="NONE" value="0" /> - <value nick="PLAY_PAUSE" value="1" /> - <value nick="PLAY" value="2" /> - <value nick="pAUSE" value="3" /> - <value nick="NEXT_TRACK" value="4" /> - <value nick="PREVIOUS_TRACK" value="5" /> - <value nick="VOLUME_UP" value="6" /> - <value nick="VOLUME_DOWN" value="7" /> - <value nick="TOGGLE_LOOP" value="8" /> - <value nick="TOGGLE_SHUFFLE" value="9" /> - <value nick="SHOW_POPUP_MENU" value="10" /> - <value nick="RAISE_PLAYER" value="11" /> - <value nick="QUIT_PLAYER" value="12" /> - <value nick="OPEN_PREFERENCES" value="13" /> - </enum> - <enum id="org.gnome.shell.extensions.mediacontrols.positions"> - <value nick="Left" value="0" /> - <value nick="Center" value="1" /> - <value nick="Right" value="2" /> - </enum> - <schema id="org.gnome.shell.extensions.mediacontrols" path="/org/gnome/shell/extensions/mediacontrols/"> - <key name="label-width" type="u"> - <default>200</default> - </key> - <key name="fixed-label-width" type="b"> - <default>false</default> - </key> - <key name="scroll-labels" type="b"> - <default>true</default> - </key> - <key name="hide-media-notification" type="b"> - <default>true</default> - </key> - <key name="show-label" type="b"> - <default>true</default> - </key> - <key name="show-player-icon" type="b"> - <default>true</default> - </key> - <key name="show-control-icons" type="b"> - <default>true</default> - </key> - <key name="show-control-icons-play" type="b"> - <default>true</default> - </key> - <key name="show-control-icons-next" type="b"> - <default>true</default> - </key> - <key name="show-control-icons-previous" type="b"> - <default>true</default> - </key> - <key name="show-control-icons-seek-forward" type="b"> - <default>true</default> - </key> - <key name="show-control-icons-seek-backward" type="b"> - <default>true</default> - </key> - <key name="colored-player-icon" type="b"> - <default>true</default> - </key> - <key name="extension-position" enum="org.gnome.shell.extensions.mediacontrols.positions"> - <default>'Center'</default> - </key> - <key name="extension-index" type="u"> - <default>0</default> - </key> - <key name="elements-order" type="as"> - <default>['ICON', 'LABEL', 'CONTROLS']</default> - </key> - <key name="labels-order" type="as"> - <default>['TITLE', '-', 'ARTIST']</default> - </key> - <key name="mouse-action-left" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'SHOW_POPUP_MENU'</default> - </key> - <key name="mouse-action-middle" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'OPEN_PREFERENCES'</default> - </key> - <key name="mouse-action-right" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'RAISE_PLAYER'</default> - </key> - <key name="mouse-action-double" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'NONE'</default> - </key> - <key name="mouse-action-scroll-up" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'VOLUME_UP'</default> - </key> - <key name="mouse-action-scroll-down" enum="org.gnome.shell.extensions.mediacontrols.mouseactions"> - <default>'VOLUME_DOWN'</default> - </key> - <key name="cache-art" type="b"> - <default>true</default> - </key> - <key name="blacklisted-players" type="as"> - <default>[]</default> - </key> - <key name="mediacontrols-show-popup-menu" type="as"> - <default><![CDATA[['']]]></default> - </key> - </schema> -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/stylesheet.css deleted file mode 100644 index 4dcc2f03..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/stylesheet.css +++ /dev/null @@ -1,100 +0,0 @@ -.colored-icon { - -st-icon-style: requested; -} - -.symbolic-icon { - -st-icon-style: symbolic; -} - -.no-margin { - margin: 0; -} - -.no-padding { - padding: 0; -} - -.panel-button { - padding-left: 6px; - padding-right: 6px; -} - -.panel-button-box > * { - padding-left: 6px; - padding-right: 6px; -} - -.panel-button-box > *:last-child:not(.controls-box) { - padding-left: 6px; - padding-right: 6px; -} - -.panel-controls-box { - padding-left: 0px; - padding-right: 0px; -} - -.panel-controls-box > * { - padding-left: 6px; - padding-right: 6px; -} - -.popup-menu-container { - padding: 12px; -} - -.popup-menu-box { - border-width: 0px; -} - -.popup-menu-box > * { - margin-top: 6px; - margin-bottom: 6px; -} - -.popup-menu-player-icons { - margin-top: 6px; - border-radius: 6px; -} - -.popup-menu-player-icons-icon { - padding: 6px; - background-color: rgba(0, 0, 0, 0.125); - transition-property: background-color; - transition-duration: 200ms; -} - -.popup-menu-player-icons-icon-last { - border-radius: 0px 6px 6px 0px; -} - -.popup-menu-player-icons-icon-first { - border-radius: 6px 0px 0px 6px; -} - -.popup-menu-player-icons-icon:hover { - background-color: rgba(160, 160, 160, 0.25); -} - -.popup-menu-player-icons-icon-active { - background-color: rgba(160, 160, 160, 0.25); -} - -.popup-menu-player-label { - font-size: small; - margin-right: 6px; - margin-left: 6px; -} - -.popup-menu-label-title { - font-size: large; -} - -.popup-menu-control-icon { - padding: 6px; - border-radius: 99px; -} - -.popup-menu-control-icon:hover { - background-color: rgba(160, 160, 160, 0.25); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/common.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/common.js deleted file mode 100644 index 3fb076b4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/common.js +++ /dev/null @@ -1,73 +0,0 @@ -export const DBUS_IFACE_NAME = "org.freedesktop.DBus"; -export const MPRIS_OBJECT_PATH = "/org/mpris/MediaPlayer2"; -export const DBUS_OBJECT_PATH = "/org/freedesktop/DBus"; -export const MPRIS_IFACE_NAME = "org.mpris.MediaPlayer2"; -export const DBUS_PROPERTIES_IFACE_NAME = "org.freedesktop.DBus.Properties"; -export const MPRIS_PLAYER_IFACE_NAME = "org.mpris.MediaPlayer2.Player"; -export const PlaybackStatus = { - PLAYING: "Playing", - PAUSED: "Paused", - STOPPED: "Stopped", -}; -export const LoopStatus = { - NONE: "None", - TRACK: "Track", - PLAYLIST: "Playlist", -}; -export const ExtensionPositions = { - LEFT: "left", - CENTER: "center", - RIGHT: "right", -}; -export const LabelTypes = { - ARTIST: "Artist", - TITLE: "Title", - ALBUM: "Album", - DISC_NUMBER: "Disc Number", - TRACK_NUMBER: "Track Number", -}; -export const PanelElements = { - ICON: 0, - LABEL: 1, - CONTROLS: 2, -}; -export const MouseActions = { - NONE: 0, - PLAY_PAUSE: 1, - PLAY: 2, - PAUSE: 3, - NEXT_TRACK: 4, - PREVIOUS_TRACK: 5, - VOLUME_UP: 6, - VOLUME_DOWN: 7, - TOGGLE_LOOP: 8, - TOGGLE_SHUFFLE: 9, - SHOW_POPUP_MENU: 10, - RAISE_PLAYER: 11, - QUIT_PLAYER: 12, - OPEN_PREFERENCES: 13, -}; -export const WidgetFlags = { - PANEL_ICON: 1 << 0, - PANEL_LABEL: 1 << 1, - PANEL_CONTROLS_SEEK_BACKWARD: 1 << 2, - PANEL_CONTROLS_PREVIOUS: 1 << 3, - PANEL_CONTROLS_PLAYPAUSE: 1 << 4, - PANEL_CONTROLS_NEXT: 1 << 5, - PANEL_CONTROLS_SEEK_FORWARD: 1 << 6, - PANEL_CONTROLS: (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6), - PANEL: (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6), - PANEL_NO_REPLACE: 1 << 7, - MENU_PLAYERS: 1 << 8, - MENU_IMAGE: 1 << 9, - MENU_LABELS: 1 << 10, - MENU_SLIDER: 1 << 11, - MENU_CONTROLS_LOOP: 1 << 12, - MENU_CONTROLS_PREV: 1 << 13, - MENU_CONTROLS_PLAYPAUSE: 1 << 14, - MENU_CONTROLS_NEXT: 1 << 15, - MENU_CONTROLS_SHUFFLE: 1 << 16, - MENU_CONTROLS: (1 << 12) | (1 << 13) | (1 << 14) | (1 << 15) | (1 << 16), - MENU: (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | (1 << 15) | (1 << 16), - ALL: ~(-1 << 17), -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/shell_only.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/shell_only.js deleted file mode 100644 index 748e0e48..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/types/enums/shell_only.js +++ /dev/null @@ -1,131 +0,0 @@ -import Clutter from "gi://Clutter"; -export const ControlIconOptions = { - LOOP_NONE: { - name: "loop", - iconName: "media-playlist-repeat-symbolic", - menuProps: { - index: 0, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.START, - opacity: 160, - }, - }, - }, - LOOP_TRACK: { - name: "loop", - iconName: "media-playlist-repeat-song-symbolic", - menuProps: { - index: 0, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.START, - }, - }, - }, - LOOP_PLAYLIST: { - name: "loop", - iconName: "media-playlist-repeat-symbolic", - menuProps: { - index: 0, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.START, - }, - }, - }, - SEEK_BACKWARD: { - name: "seekbackward", - iconName: "media-seek-backward-symbolic", - panelProps: { - index: 0, - }, - }, - PREVIOUS: { - name: "previous", - iconName: "media-skip-backward-symbolic", - menuProps: { - index: 1, - options: { - xExpand: true, - xAlign: Clutter.ActorAlign.END, - marginRight: 5, - }, - }, - panelProps: { - index: 1, - }, - }, - PLAY: { - name: "playpause", - iconName: "media-playback-start-symbolic", - menuProps: { - index: 2, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.CENTER, - }, - }, - panelProps: { - index: 2, - }, - }, - PAUSE: { - name: "playpause", - iconName: "media-playback-pause-symbolic", - menuProps: { - index: 2, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.CENTER, - }, - }, - panelProps: { - index: 2, - }, - }, - NEXT: { - name: "next", - iconName: "media-skip-forward-symbolic", - menuProps: { - index: 3, - options: { - xExpand: true, - xAlign: Clutter.ActorAlign.START, - marginLeft: 5, - }, - }, - panelProps: { - index: 3, - }, - }, - SEEK_FORWARD: { - name: "seekforward", - iconName: "media-seek-forward-symbolic", - panelProps: { - index: 4, - }, - }, - SHUFFLE_ON: { - name: "shuffle", - iconName: "media-playlist-shuffle-symbolic", - menuProps: { - index: 4, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.END, - }, - }, - }, - SHUFFLE_OFF: { - name: "shuffle", - iconName: "media-playlist-no-shuffle-symbolic", - menuProps: { - index: 4, - options: { - xExpand: false, - xAlign: Clutter.ActorAlign.END, - }, - }, - }, -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/common.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/common.js deleted file mode 100644 index 9b9a7985..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/common.js +++ /dev/null @@ -1,40 +0,0 @@ -const DEBUG = false; - -export const enumValueByIndex = (enumObject, index) => { - return Object.values(enumObject)[index]; -}; - -export const enumKeyByValue = (enumObject, value) => { - return Object.keys(enumObject).find((key) => enumObject[key] === value); -}; - -export const debugLog = (...args) => { - if (DEBUG) { - console.log("[Media Controls]", ...args); - } -}; - -export const errorLog = (...args) => { - console.error("[Media Controls]", "Error:", ...args); -}; - -export const handleError = (error) => { - errorLog(error); - return null; -}; - -export const msToHHMMSS = (ms) => { - const seconds = Math.floor(ms / 1000); - const minutes = Math.floor(ms / 60000); - const hours = Math.floor(ms / 3600000); - const secondsString = String(seconds % 60).padStart(2, "0"); - const minutesString = String(minutes % 60).padStart(2, "0"); - const hoursString = String(hours).padStart(2, "0"); - - if (hours > 0) { - return `${hoursString}:${minutesString}:${secondsString}`; - } - else { - return `${minutesString}:${secondsString}`; - } -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/prefs_only.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/prefs_only.js deleted file mode 100644 index b1c5c05a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/prefs_only.js +++ /dev/null @@ -1,64 +0,0 @@ -import Gdk from "gi://Gdk"; -import Gtk from "gi://Gtk"; -export const FORBIDDEN_KEYVALS = [ - Gdk.KEY_Home, - Gdk.KEY_Left, - Gdk.KEY_Up, - Gdk.KEY_Right, - Gdk.KEY_Down, - Gdk.KEY_Page_Up, - Gdk.KEY_Page_Down, - Gdk.KEY_End, - Gdk.KEY_Tab, - Gdk.KEY_KP_Enter, - Gdk.KEY_Return, - Gdk.KEY_Mode_switch, -]; - -export const isValidAccelerator = (mask, keyval) => { - return Gtk.accelerator_valid(keyval, mask) || (keyval === Gdk.KEY_Tab && mask !== 0); -}; - -export const isValidBinding = (mask, keycode, keyval) => { - if (mask === 0) { - return false; - } - - if (mask === Gdk.ModifierType.SHIFT_MASK && keycode !== 0) { - if (keyval >= Gdk.KEY_a && keyval <= Gdk.KEY_z) { - return false; - } - else if (keyval >= Gdk.KEY_A && keyval <= Gdk.KEY_Z) { - return false; - } - else if (keyval >= Gdk.KEY_0 && keyval <= Gdk.KEY_9) { - return false; - } - else if (keyval >= Gdk.KEY_kana_fullstop && keyval <= Gdk.KEY_semivoicedsound) { - return false; - } - else if (keyval >= Gdk.KEY_Arabic_comma && keyval <= Gdk.KEY_Arabic_sukun) { - return false; - } - else if (keyval >= Gdk.KEY_Serbian_dje && keyval <= Gdk.KEY_Cyrillic_HARDSIGN) { - return false; - } - else if (keyval >= Gdk.KEY_Greek_ALPHAaccent && keyval <= Gdk.KEY_Greek_omega) { - return false; - } - else if (keyval >= Gdk.KEY_hebrew_doublelowline && keyval <= Gdk.KEY_hebrew_taf) { - return false; - } - else if (keyval >= Gdk.KEY_Thai_kokai && keyval <= Gdk.KEY_Thai_lekkao) { - return false; - } - else if (keyval >= Gdk.KEY_Hangul_Kiyeog && keyval <= Gdk.KEY_Hangul_J_YeorinHieuh) { - return false; - } - else if (FORBIDDEN_KEYVALS.includes(keyval)) { - return false; - } - } - - return true; -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/shell_only.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/shell_only.js deleted file mode 100644 index f56eb41b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/mediacontrols@cliffniff.github.com/utils/shell_only.js +++ /dev/null @@ -1,130 +0,0 @@ -// Utils only used in the extension. Do not import this file in the preferences window because Shell is not available there. -import GLib from "gi://GLib"; -import Soup from "gi://Soup"; -import Shell from "gi://Shell"; -import Gio from "gi://Gio"; -import { errorLog, handleError } from "./common.js"; - -Gio._promisify(Gio.DBusProxy, "new", "new_finish"); -Gio._promisify(Gio.File.prototype, "replace_contents_bytes_async", "replace_contents_finish"); -Gio._promisify(Gio.File.prototype, "read_async", "read_finish"); -Gio._promisify(Soup.Session.prototype, "send_and_read_async", "send_and_read_finish"); - -export const getAppByIdAndEntry = (id, entry) => { - const appSystem = Shell.AppSystem.get_default(); - const runningApps = appSystem.get_running(); - const idResults = Shell.AppSystem.search(id ?? ""); - const entryResults = Shell.AppSystem.search(entry ?? ""); - - if (entryResults?.length > 0) { - const app = runningApps.find((app) => entryResults[0].includes(app.get_id())); - - if (app != null) { - return app; - } - } - - if (idResults?.length > 0) { - const app = runningApps.find((app) => idResults[0].includes(app.get_id())); - - if (app != null) { - return app; - } - } - - return null; -}; - -export const getImage = async (url) => { - if (url == null || url == "") { - return null; - } - - const encoder = new TextEncoder(); - const urlBytes = encoder.encode(url); - const encodedUrl = GLib.base64_encode(urlBytes); - const path = GLib.build_filenamev([GLib.get_user_cache_dir(), "mediacontrols@cliffniff.github.com", encodedUrl]); - const exitCode = GLib.mkdir_with_parents(GLib.path_get_dirname(path), 493); - - if (exitCode === -1) { - errorLog(`Failed to create cache directory: ${path}`); - return null; - } - - const file = Gio.File.new_for_path(path); - - if (file.query_exists(null)) { - const stream = await file.read_async(null, null).catch(handleError); - - if (stream == null) { - errorLog(`Failed to load image from cache: ${encodedUrl}`); - return null; - } - - return stream; - } - else { - const uri = GLib.Uri.parse(url, GLib.UriFlags.NONE); - - if (uri == null) { - return null; - } - - const scheme = uri.get_scheme(); - - if (scheme === "file") { - const file = Gio.File.new_for_uri(uri.to_string()); - - if (file.query_exists(null) === false) { - return null; - } - - const stream = await file.read_async(null, null).catch(handleError); - - if (stream == null) { - errorLog(`Failed to load local image: ${encodedUrl}`); - return null; - } - - return stream; - } - else if (scheme === "http" || scheme === "https") { - const session = new Soup.Session(); - const message = new Soup.Message({ method: "GET", uri }); - const bytes = await session.send_and_read_async(message, null, null).catch(handleError); - - if (bytes == null) { - errorLog(`Failed to load image: ${url}`); - return null; - } - - // @ts-expect-error Types are wrong - const resultPromise = file.replace_contents_bytes_async(bytes, null, false, Gio.FileCreateFlags.NONE, null); - const result = await resultPromise.catch(handleError); - - if (result?.[0] === false) { - errorLog(`Failed to cache image: ${url}`); - return null; - } - - const stream = await file.read_async(null, null).catch(handleError); - - if (stream == null) { - errorLog(`Failed to load cached image: ${url}`); - return null; - } - - return stream; - } - else { - errorLog(`Invalid scheme: ${scheme}`); - return null; - } - } -}; - -export const createDbusProxy = async (ifaceInfo, name, object) => { - // @ts-expect-error Types have not been promisified yet - const proxy = Gio.DBusProxy.new(Gio.DBus.session, Gio.DBusProxyFlags.NONE, ifaceInfo, name, object, ifaceInfo.name, null); - return proxy; -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index 03935275..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,306 +0,0 @@ -// SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org> -// SPDX-FileCopyrightText: 2011 Stefano Facchini <stefano.facchini@gmail.com> -// SPDX-FileCopyrightText: 2011 Wepmaschda <wepmaschda@gmx.de> -// SPDX-FileCopyrightText: 2015 Florian Müllner <fmuellner@gnome.org> -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -import Clutter from 'gi://Clutter'; - -import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js'; - -// testing settings for natural window placement strategy: -const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20) -const WINDOW_PLACEMENT_NATURAL_GAPS = 5; // half of the minimum gap between windows -const WINDOW_PLACEMENT_NATURAL_MAX_TRANSLATIONS = 5000; // safety limit for preventing endless loop if something is wrong in the algorithm - -class Rect { - constructor(x, y, width, height) { - [this.x, this.y, this.width, this.height] = [x, y, width, height]; - } - - // used in _calculateWindowTransformationsNatural to replace Meta.Rectangle that is too slow. - copy() { - return new Rect(this.x, this.y, this.width, this.height); - } - - union(rect2) { - let dest = this.copy(); - if (rect2.x < dest.x) { - dest.width += dest.x - rect2.x; - dest.x = rect2.x; - } - if (rect2.y < dest.y) { - dest.height += dest.y - rect2.y; - dest.y = rect2.y; - } - if (rect2.x + rect2.width > dest.x + dest.width) - dest.width = rect2.x + rect2.width - dest.x; - if (rect2.y + rect2.height > dest.y + dest.height) - dest.height = rect2.y + rect2.height - dest.y; - - return dest; - } - - adjusted(dx, dy, dx2, dy2) { - let dest = this.copy(); - dest.x += dx; - dest.y += dy; - dest.width += -dx + dx2; - dest.height += -dy + dy2; - return dest; - } - - overlap(rect2) { - return !(this.x + this.width <= rect2.x || - rect2.x + rect2.width <= this.x || - this.y + this.height <= rect2.y || - rect2.y + rect2.height <= this.y); - } - - center() { - return [this.x + this.width / 2, this.y + this.height / 2]; - } - - translate(dx, dy) { - this.x += dx; - this.y += dy; - } -} - -class NaturalLayoutStrategy extends Workspace.LayoutStrategy { - constructor(params, settings) { - super(params); - this._settings = settings; - } - - computeLayout(windows, _params) { - return { - windows, - }; - } - - /* - * Returns clones with matching target coordinates and scales to arrange windows in a natural way that no overlap exists and relative window size is preserved. - * This function is almost a 1:1 copy of the function - * PresentWindowsEffect::calculateWindowTransformationsNatural() from KDE, see: - * https://projects.kde.org/projects/kde/kdebase/kde-workspace/repository/revisions/master/entry/kwin/effects/presentwindows/presentwindows.cpp - */ - computeWindowSlots(layout, area) { - // As we are using pseudo-random movement (See "slot") we need to make sure the list - // is always sorted the same way no matter which window is currently active. - - let areaRect = new Rect(area.x, area.y, area.width, area.height); - let bounds = areaRect.copy(); - let clones = layout.windows; - - let direction = 0; - let directions = []; - let rects = []; - for (let i = 0; i < clones.length; i++) { - // save rectangles into 4-dimensional arrays representing two corners of the rectangular: [left_x, top_y, right_x, bottom_y] - let rect = clones[i].boundingBox; - rects[i] = new Rect(rect.x, rect.y, rect.width, rect.height); - bounds = bounds.union(rects[i]); - - // This is used when the window is on the edge of the screen to try to use as much screen real estate as possible. - directions[i] = direction; - direction++; - if (direction === 4) - direction = 0; - } - - let loopCounter = 0; - let overlap; - do { - overlap = false; - for (let i = 0; i < rects.length; i++) { - for (let j = 0; j < rects.length; j++) { - let adjustments = [-1, -1, 1, 1] - .map(v => (v *= WINDOW_PLACEMENT_NATURAL_GAPS)); - let iAdjusted = rects[i].adjusted(...adjustments); - let jAdjusted = rects[j].adjusted(...adjustments); - if (i !== j && iAdjusted.overlap(jAdjusted)) { - loopCounter++; - overlap = true; - - // TODO: something like a Point2D would be nicer here: - - // Determine pushing direction - let iCenter = rects[i].center(); - let jCenter = rects[j].center(); - let diff = [jCenter[0] - iCenter[0], jCenter[1] - iCenter[1]]; - - // Prevent dividing by zero and non-movement - if (diff[0] === 0 && diff[1] === 0) - diff[0] = 1; - // Try to keep screen/workspace aspect ratio - if (bounds.height / bounds.width > areaRect.height / areaRect.width) - diff[0] *= 2; - else - diff[1] *= 2; - - // Approximate a vector of between 10px and 20px in magnitude in the same direction - let length = Math.sqrt(diff[0] * diff[0] + diff[1] * diff[1]); - diff[0] = diff[0] * WINDOW_PLACEMENT_NATURAL_ACCURACY / length; - diff[1] = diff[1] * WINDOW_PLACEMENT_NATURAL_ACCURACY / length; - - // Move both windows apart - rects[i].translate(-diff[0], -diff[1]); - rects[j].translate(diff[0], diff[1]); - - - if (this._settings.get_boolean('use-more-screen')) { - // Try to keep the bounding rect the same aspect as the screen so that more - // screen real estate is utilised. We do this by splitting the screen into nine - // equal sections, if the window center is in any of the corner sections pull the - // window towards the outer corner. If it is in any of the other edge sections - // alternate between each corner on that edge. We don't want to determine it - // randomly as it will not produce consistant locations when using the filter. - // Only move one window so we don't cause large amounts of unnecessary zooming - // in some situations. We need to do this even when expanding later just in case - // all windows are the same size. - // (We are using an old bounding rect for this, hopefully it doesn't matter) - let xSection = Math.round((rects[i].x - bounds.x) / (bounds.width / 3)); - let ySection = Math.round((rects[i].y - bounds.y) / (bounds.height / 3)); - - iCenter = rects[i].center(); - diff[0] = 0; - diff[1] = 0; - if (xSection !== 1 || ySection !== 1) { // Remove this if you want the center to pull as well - if (xSection === 1) - xSection = directions[i] / 2 ? 2 : 0; - if (ySection === 1) - ySection = directions[i] % 2 ? 2 : 0; - } - if (xSection === 0 && ySection === 0) { - diff[0] = bounds.x - iCenter[0]; - diff[1] = bounds.y - iCenter[1]; - } - if (xSection === 2 && ySection === 0) { - diff[0] = bounds.x + bounds.width - iCenter[0]; - diff[1] = bounds.y - iCenter[1]; - } - if (xSection === 2 && ySection === 2) { - diff[0] = bounds.x + bounds.width - iCenter[0]; - diff[1] = bounds.y + bounds.height - iCenter[1]; - } - if (xSection === 0 && ySection === 2) { - diff[0] = bounds.x - iCenter[0]; - diff[1] = bounds.y + bounds.height - iCenter[1]; - } - if (diff[0] !== 0 || diff[1] !== 0) { - length = Math.sqrt(diff[0] * diff[0] + diff[1] * diff[1]); - diff[0] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2; // /2 to make it less influencing than the normal center-move above - diff[1] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2; - rects[i].translate(diff[0], diff[1]); - } - } - - // Update bounding rect - bounds = bounds.union(rects[i]); - bounds = bounds.union(rects[j]); - } - } - } - } while (overlap && loopCounter < WINDOW_PLACEMENT_NATURAL_MAX_TRANSLATIONS); - - // Work out scaling by getting the most top-left and most bottom-right window coords. - let scale; - scale = Math.min( - areaRect.width / bounds.width, - areaRect.height / bounds.height, - 1.0); - - // Make bounding rect fill the screen size for later steps - bounds.x -= (areaRect.width - bounds.width * scale) / 2; - bounds.y -= (areaRect.height - bounds.height * scale) / 2; - bounds.width = areaRect.width / scale; - bounds.height = areaRect.height / scale; - - // Move all windows back onto the screen and set their scale - for (let i = 0; i < rects.length; i++) - rects[i].translate(-bounds.x, -bounds.y); - - - // rescale to workspace - let slots = []; - for (let i = 0; i < rects.length; i++) { - rects[i].x = rects[i].x * scale + areaRect.x; - rects[i].y = rects[i].y * scale + areaRect.y; - rects[i].width *= scale; - rects[i].height *= scale; - - slots.push([rects[i].x, rects[i].y, rects[i].width, rects[i].height, clones[i]]); - } - - return slots; - } -} - -export default class NativeWindowPlacementExtension extends Extension { - constructor(metadata) { - super(metadata); - - this._injectionManager = new InjectionManager(); - } - - enable() { - const settings = this.getSettings(); - - const layoutProto = Workspace.WorkspaceLayout.prototype; - const previewProto = WindowPreview.prototype; - - this._injectionManager.overrideMethod(layoutProto, '_createBestLayout', () => { - /* eslint-disable no-invalid-this */ - return function () { - this._layoutStrategy = new NaturalLayoutStrategy({ - monitor: Main.layoutManager.monitors[this._monitorIndex], - }, settings); - return this._layoutStrategy.computeLayout(this._sortedWindows); - }; - /* eslint-enable no-invalid-this */ - }); - - // position window titles on top of windows in overlay - this._injectionManager.overrideMethod(previewProto, '_init', originalMethod => { - /* eslint-disable no-invalid-this */ - return function (...args) { - originalMethod.call(this, ...args); - - if (!settings.get_boolean('window-captions-on-top')) - return; - - const alignConstraint = this._title.get_constraints().find( - c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS); - alignConstraint.factor = 0; - - const bindConstraint = this._title.get_constraints().find( - c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y); - bindConstraint.offset = 0; - }; - /* eslint-enable no-invalid-this */ - }); - - this._injectionManager.overrideMethod(previewProto, '_adjustOverlayOffsets', originalMethod => { - /* eslint-disable no-invalid-this */ - return function (...args) { - originalMethod.call(this, ...args); - - if (settings.get_boolean('window-captions-on-top')) - this._title.translation_y = -this._title.translation_y; - }; - /* eslint-enable no-invalid-this */ - }); - } - - disable() { - this._injectionManager.clear(); - global.stage.queue_relayout(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index 36e99bda..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Arrange windows in overview in a more compact way.", - "extension-id": "native-window-placement", - "gettext-domain": "gnome-shell-extension-native-window-placement", - "name": "Native Window Placement", - "original-authors": [ - "wepmaschda@gmx.de" - ], - "settings-schema": "org.gnome.shell.extensions.native-window-placement", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "native-window-placement@gnome-shell-extensions.gcampax.github.com", - "version": 59 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled deleted file mode 100644 index b14b04905c7b98663e741ff75d65bb7e98f884c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmZ`#yG{c!5ZsVNLQ0V|L5MFn3fmGtkrXMY5Cx4nR=Jbz?Bnb_8XgTjpTtj4@FO5W z0kd~TRII$3(RggndU0Xf(z-~gj)9jw&klY?;CN2-jq3MSo#zVr{PX=oY{JiINzcH; z0TCAYcCFXW*Q`UqRi$|!*@e=(pq-87mesCwH-4v@%H~{iN|B9lR!Z&|rhd7*pUC@i z_n5Xc11^N8T*8S~v;>}`UvE!_A_+f&zW~<ghyB}^=)$MaAAwJ3-Pl+_HwbOI(54G* s{z997LK~vc<&^(Q6XmvvGN|%SMc>FQ+4boru&RB_D&#G*gT2>(0H5Ali~s-t diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.native-window-placement.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.native-window-placement.gschema.xml deleted file mode 100644 index 7f25aab2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/native-window-placement@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.native-window-placement.gschema.xml +++ /dev/null @@ -1,22 +0,0 @@ -<!-- -SPDX-FileCopyrightText: 2016 Florian Müllner <fmuellner@gnome.org> - -SPDX-License-Identifier: GPL-2.0-or-later ---> - -<schemalist gettext-domain="gnome-shell-extensions"> - <schema id="org.gnome.shell.extensions.native-window-placement" path="/org/gnome/shell/extensions/native-window-placement/"> - <key name="use-more-screen" type="b"> - <default>true</default> - <summary>Use more screen for windows</summary> - <description>Try to use more screen for placing window thumbnails by adapting to screen aspect ratio, and consolidating - them further to reduce the bounding box. This setting applies only with the natural placement strategy.</description> - </key> - <key name="window-captions-on-top" type="b"> - <default>true</default> - <summary>Place window captions on top</summary> - <description>If true, place window captions on top the respective thumbnail, overriding shell default of placing it at - the bottom. Changing this setting requires restarting the shell to have any effect.</description> - </key> - </schema> -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/LICENSE b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/LICENSE deleted file mode 100644 index 9cecc1d4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - 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 <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/extension.js deleted file mode 100644 index 38ee10b1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/extension.js +++ /dev/null @@ -1,417 +0,0 @@ -//Imports -import Clutter from 'gi://Clutter'; -import St from 'gi://St'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import { Extension, gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js'; -const schema = 'org.gnome.shell.extensions.netspeedsimplified', - ButtonName = "ShowNetSpeedButton", - rCConst = 4; //Right Click 4 times to toggle Vertical Alignment - -let settings, timeout, - lastCount = 0, - lastSpeed = 0, - lastCountUp = 0, - resetNextCount = false, - resetCount = 0, - hideCount = 8, - B_UNITS; - -// Settings -var currentSettings; //Initialized in enable() - -function fetchSettings() { - currentSettings = { - refreshTime: settings.get_double('refreshtime'), - mode: settings.get_int('mode'), - fontmode: settings.get_int('fontmode'), - showTotalDwnld: settings.get_boolean('togglebool'), - isVertical: settings.get_boolean('isvertical'), - chooseIconSet: settings.get_int('chooseiconset'), - limitunit: settings.get_int('limitunit'), - revIndicator: settings.get_boolean('reverseindicators'), - lckMuseAct: settings.get_boolean('lockmouseactions'), - minWidth: settings.get_double('minwidth'), - iconsToRight: settings.get_boolean('iconstoright'), - textAlign: settings.get_int('textalign'), - cusFont: settings.get_string('customfont'), - hideInd: settings.get_boolean('hideindicator'), - shortenUnits: settings.get_boolean('shortenunits'), - nsPos: settings.get_int('wpos'), - systemColr: settings.get_boolean('systemcolr'), - nsPosAdv: settings.get_int('wposext'), - usColor: settings.get_string('uscolor'), - dsColor: settings.get_string('dscolor'), - tsColor: settings.get_string('tscolor'), - tdColor: settings.get_string('tdcolor') - }; - - B_UNITS = (currentSettings.shortenUnits) ? ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z'] : [' B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB']; - - initNs(); -} - -function pushSettings() { - settings.set_int('mode', currentSettings.mode); - settings.set_int('fontmode', currentSettings.fontmode); - settings.set_boolean('togglebool', currentSettings.showTotalDwnld); - settings.set_boolean('isvertical', currentSettings.isVertical); - - initNs(); -} - -//Helper Functions -function DIcons(iNum) { - return [ - ["⬇", "⬆"], - ["🡳", "🡱"], - ["↓", "↑"] - ][currentSettings.chooseIconSet][iNum]; -} - -function nsPos() { - return ["right", "left", "center"][currentSettings.nsPos]; -} - -function nsPosAdv() { - return [3, 0][currentSettings.nsPosAdv]; -} - -function speedToString(amount, rMode = 0) { - - let speed_map = B_UNITS.map( - (rMode == 1 && (currentSettings.mode == 1 || currentSettings.mode == 3 || currentSettings.mode == 4)) ? v => v : //KB - (rMode == 1 && (currentSettings.mode == 0 || currentSettings.mode == 2)) ? v => v.toLowerCase() : //kb - (currentSettings.mode == 0 || currentSettings.mode == 2) ? v => v.toLowerCase() + "/s" : //kb/s - (currentSettings.mode == 1 || currentSettings.mode == 3) ? v => v + "/s" : //KB/s - v => v); // Others - - if (amount === 0) return " 0.0 " + speed_map[0]; - if (currentSettings.mode == 0 || currentSettings.mode == 2) amount = amount * 8; - - let unit = 0; - while (amount >= 1000) { // 1M=1024K, 1MB/s=1000MB/s - if (currentSettings.limitunit != 0 && unit >= currentSettings.limitunit) { - break; - } - amount /= 1000; - unit++; - } - - let digits = (currentSettings.mode == 4 || rMode != 0) ? 2 /* For floats like 21.11 and total speed mode */ : 1 //For floats like 21.2 - - let spaceNum = 3 - Math.ceil(Math.log10(amount + 1)); - spaceNum < 0 ? spaceNum = 0 : null - - return " ".repeat(spaceNum) + amount.toFixed(digits) + " " + speed_map[unit]; -} - -// NetSpeed Components -var usLabel, dsLabel, tsLabel, tdLabel, usIcon, dsIcon, tsIcon, tdIcon; - -function getStyle(isIcon = false) { - return (isIcon) ? 'size-' + (String(currentSettings.fontmode)) : ('forall size-' + String(currentSettings.fontmode)) -} - -function byteArrayToString(bytes) { - return new TextDecoder().decode(bytes); -} - -function initNsLabels() { - let extraInfo = currentSettings.cusFont ? "font-family: " + currentSettings.cusFont + "; " : ""; - let extraLabelInfo = extraInfo + "min-width: " + currentSettings.minWidth + "em; "; - extraLabelInfo += "text-align: " + ["left", "right", "center"][currentSettings.textAlign] + "; "; - - - usLabel = new St.Label({ - text: '--', - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(), - style: extraLabelInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.usColor) - }); - - dsLabel = new St.Label({ - text: '--', - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(), - style: extraLabelInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.dsColor) - }); - - tsLabel = new St.Label({ - text: '--', - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(), - style: extraLabelInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.tsColor) - }); - - tdLabel = new St.Label({ - text: '--', - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(), - style: extraLabelInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.tdColor) - }); - usIcon = new St.Label({ - text: DIcons(1), - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(true), - style: extraInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.usColor) - }); - - dsIcon = new St.Label({ - text: DIcons(0), - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(true), - style: extraInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.dsColor) - }); - - tsIcon = new St.Label({ - text: "⇅", - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(true), - style: extraInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.tsColor) - }); - - tdIcon = new St.Label({ - text: "Σ", - y_align: Clutter.ActorAlign.CENTER, - style_class: getStyle(true), - style: extraInfo + (currentSettings.systemColr ? "" : "color: " + currentSettings.tdColor) - }); -} - -function updateNsLabels(up, down, up_down, total) { - usLabel.set_text(up); - dsLabel.set_text(down); - tsLabel.set_text(up_down); - tdLabel.set_text(total); -} - -// Initalize NetSpeed -var nsButton = null, - nsActor = null, - nsLayout = null; - -function initNs() { - - //Destroy the existing button. - nsDestroy(); - - //Initialize component Labels - initNsLabels(); - - //Allocate 3 * 3 grid (suited for all modes) - nsLayout = new Clutter.GridLayout(); - nsLayout.insert_row(1); - nsLayout.insert_row(2); - nsLayout.insert_column(1); - nsLayout.insert_column(2); - - nsActor = new Clutter.Actor({ - layout_manager: nsLayout, - y_align: Clutter.ActorAlign.CENTER - }) - - let verticalConstant = (currentSettings.isVertical) ? 1 : 0; - let heightConstant = 1 + verticalConstant; - let widthConstant = 2 * (1 - verticalConstant); - - //Attach the components to the grid. - if (currentSettings.mode == 0 || currentSettings.mode == 1) { - nsLayout.attach(!currentSettings.iconsToRight ? tsIcon : tsLabel, 0, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? tsLabel : tsIcon, 1, 1, 1, 1); - - if (currentSettings.showTotalDwnld) { - nsLayout.attach(!currentSettings.iconsToRight ? tdIcon : tdLabel, widthConstant, heightConstant, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? tdLabel : tdIcon, 1 + widthConstant, heightConstant, 1, 1); - } - } else if (currentSettings.mode == 2 || currentSettings.mode == 3) { - if (currentSettings.revIndicator) { - nsLayout.attach(!currentSettings.iconsToRight ? usIcon : usLabel, 0, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? usLabel : usIcon, 1, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? dsIcon : dsLabel, widthConstant, heightConstant, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? dsLabel : dsIcon, 1 + widthConstant, heightConstant, 1, 1); - } else { - nsLayout.attach(!currentSettings.iconsToRight ? dsIcon : dsLabel, 0, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? dsLabel : dsIcon, 1, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? usIcon : usLabel, widthConstant, heightConstant, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? usLabel : usIcon, 1 + widthConstant, heightConstant, 1, 1); - } - - if (currentSettings.showTotalDwnld) { - nsLayout.attach(!currentSettings.iconsToRight ? tdIcon : tdLabel, 2 + widthConstant, heightConstant, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? tdLabel : tdIcon, 3 + widthConstant, heightConstant, 1, 1); - } - } else { - nsLayout.attach(!currentSettings.iconsToRight ? tdIcon : tdLabel, 0, 1, 1, 1); - nsLayout.attach(!currentSettings.iconsToRight ? tdLabel : tdIcon, 1, 1, 1, 1); - } - - //Create the button and add to Main.panel - nsButton = new PanelMenu.Button(0.0, ButtonName); - - (!currentSettings.lckMuseAct) ? nsButton.connect('button-press-event', mouseEventHandler) : null; - nsButton.add_child(nsActor); - - Main.panel.addToStatusArea(ButtonName, nsButton, nsPosAdv(), nsPos()); -} - -function nsDestroy() { - nsButton != null ? nsButton.destroy() : null - nsButton = null; -} - -// Mouse Event Handler -var startTime = null, - rClickCount = 0; - -function mouseEventHandler(widget, event) { - if (event.get_button() == 3) { - if (currentSettings.mode == 4) - resetNextCount = true; // right click: reset downloaded sum - else - currentSettings.showTotalDwnld = !(currentSettings.showTotalDwnld); // right click on other modes brings total downloaded sum - - // Logic to toggle crStng.isVertical after rCConstant consequent right clicks. - if (startTime == null) { - startTime = new Date(); - } - - if (((new Date() - startTime) / 1000) <= currentSettings.refreshTime * 2) { - if (rClickCount == rCConst - 1) { - currentSettings.isVertical = !(currentSettings.isVertical); - startTime = null; - rClickCount = 0; - } else rClickCount++; - } else { - startTime = new Date(); - rClickCount = 1; - } - } else if (event.get_button() == 2) { // change font - currentSettings.fontmode++; - if (currentSettings.fontmode > 4) currentSettings.fontmode = 0; - } else if (event.get_button() == 1) { - currentSettings.mode++; - if (currentSettings.mode > 4) currentSettings.mode = 0; - } - - pushSettings(); - parseStat(); -} - -function parseStat() { - try { - let input_file = Gio.file_new_for_path('/proc/net/dev'); - let [, contents, etag] = input_file.load_contents(null); - contents = byteArrayToString(contents); - let lines = contents.split('\n'); - - let count = 0; - let countUp = 0; - let line; - - for (let i = 0; i < lines.length; i++) { - line = lines[i]; - line = line.trim(); - let fields = line.split(/\W+/); - if (fields.length <= 2) break; - - if (fields[0] != "lo" && - !fields[0].match(/^ifb[0-9]+/) && - !fields[0].match(/^lxdbr[0-9]+/) && - !fields[0].match(/^virbr[0-9]+/) && - !fields[0].match(/^br[0-9]+/) && - !fields[0].match(/^vnet[0-9]+/) && - !fields[0].match(/^veth[0-9a-zA-Z]+/) && - !fields[0].match(/^docker[0-9]+/) && - !fields[0].match(/^tun[0-9]+/) && - !fields[0].match(/^tap[0-9]+/) && - !fields[0].match(/^wg[0-9]+/) && - !fields[0].match(/^waydroid[0-9]+/) && - !isNaN(parseInt(fields[1]))) { - count = count + parseInt(fields[1]) + parseInt(fields[9]); - countUp = countUp + parseInt(fields[9]); - } - } - - if (lastCount === 0) lastCount = count; - if (lastCountUp === 0) lastCountUp = countUp; - - let speed = (count - lastCount) / currentSettings.refreshTime, - speedUp = (countUp - lastCountUp) / currentSettings.refreshTime; - - if (resetNextCount == true) { - resetNextCount = false; - resetCount = count; - } - - (speed || speedUp) ? hideCount = 0 : hideCount <= 8 ? hideCount++ : null - - if (hideCount <= 8) { - nsButton == null ? initNs() : null - - updateNsLabels(" " + speedToString(speedUp), - " " + speedToString(speed - speedUp), - " " + speedToString(speed), - " " + speedToString(count - resetCount, 1)); - } else { - if (currentSettings.hideInd) { - nsDestroy(); - } else { - nsButton == null ? initNs() : null - updateNsLabels('--', '--', '--', speedToString(count - resetCount, 1)); - } - } - - lastCount = count; - lastCountUp = countUp; - lastSpeed = speed; - - } catch (e) { - usLabel.set_text(e.message); - tsLabel.set_text(e.message); - tdLabel.set_text(e.message); - } - return true; -} - - -export default class NetSpeedSimplifiedExtension extends Extension { - _settingsChanged() { - if (settings.get_boolean('restartextension')) { - settings.set_boolean('restartextension', false); - this.disable(); - this.enable(); - parseStat(); - } - } - - enable() { - settings = this.getSettings(schema); - - fetchSettings(); // Automatically creates the netSpeed Button. - this._settingsChangedId = settings.connect('changed', () => this._settingsChanged()); - parseStat(); - - //Run infinite loop. - timeout = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, currentSettings.refreshTime, parseStat); - } - - disable() { - currentSettings = null; - settings = null; - - usLabel = null; - dsLabel = null; - tsLabel = null; - tdLabel = null; - usIcon = null; - dsIcon = null; - tsIcon = null; - tdIcon = null; - - GLib.source_remove(timeout); - nsDestroy(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/prefs.js deleted file mode 100644 index 2f80d643..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/prefs.js +++ /dev/null @@ -1,382 +0,0 @@ -import Gtk from 'gi://Gtk' -import Gdk from 'gi://Gdk' -import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js' -// import * as Config from 'resource:///org/gnome/Shell/Extensions/js/misc/config.js' -// const ShellVersion = parseFloat(Config.PACKAGE_VERSION) - -const schema = "org.gnome.shell.extensions.netspeedsimplified" - -let settings, currentSettings, vbox - -function fetchSettings() { - currentSettings = { - refreshtime: settings.get_double('refreshtime'), - mode: settings.get_int('mode'), - fontmode: settings.get_int('fontmode'), - togglebool: settings.get_boolean('togglebool'), - isvertical: settings.get_boolean('isvertical'), - chooseiconset: settings.get_int('chooseiconset'), - limitunit: settings.get_int('limitunit'), - reverseindicators: settings.get_boolean('reverseindicators'), - lockmouseactions: settings.get_boolean('lockmouseactions'), - minwidth: settings.get_double('minwidth'), - iconstoright: settings.get_boolean('iconstoright'), - textalign: settings.get_int('textalign'), - customfont: settings.get_string('customfont'), - hideindicator: settings.get_boolean('hideindicator'), - shortenunits: settings.get_boolean('shortenunits'), - wpos: settings.get_int('wpos'), - systemcolr: settings.get_boolean('systemcolr'), - wposext: settings.get_int('wposext'), - uscolor: settings.get_string('uscolor'), - dscolor: settings.get_string('dscolor'), - tscolor: settings.get_string('tscolor'), - tdcolor: settings.get_string('tdcolor') - } -} - -function addIt(element, child) { - element.append(child) -} - -function newGtkBox() { - return new Gtk.Box({ - orientation: Gtk.Orientation.HORIZONTAL, - margin_top: 10, - margin_bottom: 10 - }) -} - -class NssSpinBtn { - constructor(name, whichHbox, getLbl = "", getTooTip = "", lwer, uper, stpInc = 1, digs = 0, nume = true, pgeInc = 1, pgeSiz = 0, clmrate = 1) { - let boolComp = (currentSettings[name] === settings.get_default_value(name).unpack()) - getLbl = boolComp ? getLbl : - `<i>${getLbl}</i>` - let whichLbl = new Gtk.Label({ - label: getLbl, - use_markup: true, - xalign: 0, - tooltip_text: getTooTip - }) - let whichSpinBtn = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: lwer, - upper: uper, - step_increment: stpInc, - page_increment: pgeInc, - page_size: pgeSiz - }), - climb_rate: clmrate, - digits: digs, - numeric: nume, - }) - whichSpinBtn.set_value(currentSettings[name]) - whichSpinBtn.connect('value-changed', () => { - this.rTValue = parseFloat(whichSpinBtn.get_value().toFixed(1)) - if (currentSettings[name] !== this.rTValue) { - settings.set_double(name, this.rTValue) - settings.set_boolean('restartextension', true) - } - - currentSettings[name] = this.rTValue - }) - whichLbl.set_hexpand(true) - addIt(whichHbox, whichLbl) - addIt(whichHbox, whichSpinBtn) - - addIt(vbox, whichHbox) - } -} - -class NssComboBox { - constructor(name, whichHbox, getLbl, aRray = [], getTooTip = "") { - let boolComp = (currentSettings[name] == settings.get_default_value(name).unpack()) - getLbl = boolComp ? getLbl : - `<i>${getLbl}</i>` - let tootext = boolComp ? "" : "The Value is Changed" - - let whichLbl = new Gtk.Label({ - label: getLbl, - use_markup: true, - xalign: 0, - tooltip_text: getTooTip - }) - let whichVlue = new Gtk.ComboBoxText({ - halign: Gtk.Align.END, - tooltip_text: tootext - }) - - aRray.forEach((val, _, __) => whichVlue.append_text(val)) - - - whichVlue.set_active(currentSettings[name]) - whichVlue.connect('changed', (widget) => { - let valueMode = widget.get_active() - settings.set_int(name, valueMode) - settings.set_boolean('restartextension', true) - - currentSettings[name] = valueMode - }) - whichLbl.set_hexpand(true) - addIt(whichHbox, whichLbl) - addIt(whichHbox, whichVlue) - - addIt(vbox, whichHbox) - } -} - -class NssToggleBtn { - constructor(whichHbox, getLbl, name, getTooTip = "", func) { - let boolComp = true - if (func == undefined) { - boolComp = (currentSettings[name] == settings.get_default_value(name).unpack()) - getLbl = boolComp ? getLbl : - `<i>${getLbl}</i>` - } - let tootext = boolComp ? "" : "The Value is Changed" - let whichLbl = new Gtk.Label({ - label: getLbl, - use_markup: true, - xalign: 0, - tooltip_text: getTooTip - }) - let whichVlue = new Gtk.Switch({ - active: name ? currentSettings[name] : false, - tooltip_text: tootext - }) - whichVlue.connect('notify::active', (widget) => { - if (func != undefined) - func(widget.active) - else { - settings.set_boolean(name, widget.active) - settings.set_boolean('restartextension', true) - } - - currentSettings[name] = widget.active - }) - - whichLbl.set_hexpand(true) - addIt(whichHbox, whichLbl) - addIt(whichHbox, whichVlue) - - addIt(vbox, whichHbox) - } -} - -class NssColorBtn { - constructor(whichHbox, getLbl, name, getToolTip = "") { - //Deterime whether the option value is changed from default value - let boolComp = (currentSettings[name] == settings.get_default_value(name).unpack()) - getLbl = boolComp ? getLbl : `<i>${getLbl}</i>` - let tootext = boolComp ? "" : "The Value is Changed" - - //Create the option name - let whichLbl = new Gtk.Label({ - label: getLbl, - use_markup: true, - xalign: 0, - tooltip_text: getToolTip - }) - - //Create RGBA - let rgba = new Gdk.RGBA() - rgba.parse(currentSettings[name]) - - //Create ColorButton - let colorButton = new Gtk.ColorButton({ - tooltip_text: tootext - }) - colorButton.set_rgba(rgba) - colorButton.connect('color-set', (widget) => { - rgba = widget.get_rgba() - settings.set_string(name, rgba.to_string()) - settings.set_boolean('restartextension', true) - - currentSettings[name] = rgba.to_string() - }) - - whichLbl.set_hexpand(true) - addIt(whichHbox, whichLbl) - addIt(whichHbox, colorButton) - - addIt(vbox, whichHbox) - } -} - -class NssEntry { - constructor(whichHbox, getLbl, name, getTooTip = "", func) { - let boolComp = (currentSettings[name] == settings.get_default_value(name).unpack()) - getLbl = boolComp ? getLbl : - `<i>${getLbl}</i>` - let tootext = boolComp ? "" : "The Value is Changed" - let whichLbl = new Gtk.Label({ - label: getLbl, - use_markup: true, - xalign: 0, - tooltip_text: getTooTip - }) - let whichVlue = new Gtk.Entry({ - text: currentSettings[name], - tooltip_text: tootext, - placeholder_text: "Press Enter to apply" - }) - whichVlue.connect('activate', (widget) => { - settings.set_string(name, widget.get_text()) - if (func != undefined) { - func(widget.active) - } else { - settings.set_boolean('restartextension', true) - } - - currentSettings[name] = widget.get_text() - }) - - whichLbl.set_hexpand(true) - addIt(whichHbox, whichLbl) - addIt(whichHbox, whichVlue) - - addIt(vbox, whichHbox) - } -} - -export default class NetSpeedSimplifiedPreferences extends ExtensionPreferences { - async getPreferencesWidget() { - settings = this.getSettings(schema) - window._settings = settings - - await fetchSettings() - - let frame = new Gtk.ScrolledWindow() - let label = new Gtk.Label({ - label: "<b>General Settings</b>", - use_markup: true, - xalign: 0, - margin_top: 15 - }) - vbox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - margin_start: 25, - margin_end: 25, - vexpand: true, - }) - let resetBtn = new Gtk.Button({ - label: "Restore Defaults", - margin_bottom: 15 - }) - - resetBtn.connect("clicked", async () => { - let strArray = ["customfont", "uscolor", "dscolor", "tscolor", "tdcolor"] - let intArray = ["wpos", "wposext", "mode", "fontmode", "chooseiconset", "textalign"] - let doubleArray = ["refreshtime", "minwidth"] - let boolArray = ["isvertical", "togglebool", "reverseindicators", "lockmouseactions", "hideindicator", "shortenunits", "iconstoright"] - for (const i in strArray) { - settings.set_string(strArray[i], settings.get_default_value(strArray[i]).unpack()) - } - for (const j in intArray) { - settings.set_int(intArray[j], settings.get_default_value(intArray[j]).unpack()) - } - for (const k in doubleArray) { - settings.set_double(doubleArray[k], settings.get_default_value(doubleArray[k]).unpack()) - } - for (const l in boolArray) { - settings.set_boolean(boolArray[l], settings.get_default_value(boolArray[l]).unpack()) - } - settings.set_boolean('restartextension', true) - await fetchSettings() - }) - - addIt(vbox, label) - // For Position - let hboxWPos = newGtkBox() - new NssComboBox("wpos", hboxWPos, "Position on the Panel", ["Right", "Left", "Center"], "Choose where to Place the extension on the Panel") - - // For Position Extras - let hboxWPosExt = newGtkBox() - new NssComboBox("wposext", hboxWPosExt, "Position(Advanced)", ["Prefer Right Side", "Prefer Left Side"], "Choose further where to Place the extension") - - // Refresh time - let hboxRTime = newGtkBox() - new NssSpinBtn("refreshtime", hboxRTime, "Refresh Time", "Change Refresh time value from anywhere b/w 1 to 10", 1.0, 10.0, .1, 1) - - // For Modes - let hboxMode = newGtkBox() - new NssComboBox("mode", hboxMode, "Mode", ["Mode 1", "Mode 2", "Mode 3", "Mode 4", "Mode 5"], "Choose which mode to load") - - // For FontModes - let hboxFontMode = newGtkBox() - new NssComboBox("fontmode", hboxFontMode, "Font Mode", ["Default", "Smallest", "Smaller", "Small", "Large"], "Choose which font to display") - - // For Vertical Alignment - let hboxVertical = newGtkBox() - new NssToggleBtn(hboxVertical, "Vertical Align", "isvertical", "Changing it will toggle Vertical Alignment") - - // For Default sigma View - let hboxToggleBool = newGtkBox() - new NssToggleBtn(hboxToggleBool, "Show Total Data Transfer", "togglebool", "Enabling it will always show the sigma") - - // For Toggling Old Icons - let hboxIconset = newGtkBox() - new NssComboBox("chooseiconset", hboxIconset, "Choose Icons Set", [" ⬇, ⬆", " 🡳, 🡱", " ↓, ↑"], "Choose which icon set to display") - - // Text align for net speed - let hboxText = newGtkBox() - new NssComboBox("textalign", hboxText, "Text Align", ["Left", "Right", "Center"], "Align Text of net speed") - - // Toggle icon to right - let hboxIconsRight = newGtkBox() - new NssToggleBtn(hboxIconsRight, "Move icons to the right", "iconstoright", "Move icons to the right") - - // For Limiting upper limit of speed - let hboxLimitUnit = newGtkBox() - new NssComboBox("limitunit", hboxLimitUnit, "Limit Unit", ["(None)", 'K', 'M', 'G', 'T', 'P', 'E', 'Z'], "Choose unit limitation set to display") - - // For Hide When Disconnected - let hboxHideInd = newGtkBox() - new NssToggleBtn(hboxHideInd, "Hide When Disconnected", "hideindicator", "Enabling it will Hide Indicator when disconnected") - - // For Shorten Units - let hboxShUni = newGtkBox() - new NssToggleBtn(hboxShUni, "Shorten Units", "shortenunits", "Enabling it will result in shorten units like K instead of KB") - - // For Reversing the download and upload indicators - let hboxRevInd = newGtkBox() - new NssToggleBtn(hboxRevInd, "Show Upload First", "reverseindicators", "Enabling it will reverse the upload and download speed indicators") - - // For Lock Mouse Actions - let hboxLckMuseAct = newGtkBox() - new NssToggleBtn(hboxLckMuseAct, "Lock Mouse Actions", "lockmouseactions", "Enabling it will Lock Mouse Actions") - - // Minimum Width - let hboxMinWidth = newGtkBox() - new NssSpinBtn("minwidth", hboxMinWidth, "Minimum Width", "Change Minimum Width value from anywhere b/w 3em to 10em", 3.0, 10.0, .5, 1) - - // For Custom Font name - let hboxCustFont = newGtkBox() - new NssEntry(hboxCustFont, "Custom Font Name", "customfont", "Enter the font name you want, you can also write style here for all elements except indicators") - - // For Custom Font name - let hboxSysColr = newGtkBox() - new NssToggleBtn(hboxSysColr, "Use System Color Scheme", "systemcolr", "Enabling it will allow changing font color dynamically based on panel color") - - // Upload Speed Color - let usColorButton = newGtkBox() - new NssColorBtn(usColorButton, "Upload Speed Color", "uscolor", "Select the upload speed color") - - // Download Speed Color - let dsColorButton = newGtkBox() - new NssColorBtn(dsColorButton, "Download Speed Color", "dscolor", "Select the download speed color") - - // Total Speed Color - let tsColorButton = newGtkBox() - new NssColorBtn(tsColorButton, "Total Speed Color", "tscolor", "Select the total speed color") - - // Total Download Color - let tdColorButton = newGtkBox() - new NssColorBtn(tdColorButton, "Total Download Color", "tdcolor", "Select the total download color") - - addIt(vbox, resetBtn) - frame.child = vbox - - return frame - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/private_metadata.json deleted file mode 100644 index f7b780c9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/private_metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "A Net Speed extension With Loads of Customization. Fork of simplenetspeed\n\nFull CHANGELOG can be found on github releases page\n\nFeatures \n1. Clean UI \n2. Adjustable Refresh rate \n3. Preferences to manage extension \n4. Vertical Alignment Support \n5. Two Icon sets for Indicators \n\nFeature Highlights for Preferences \n1. Lock Mouse Actions option \n2. Advance Position options to pinpoint where to place the indicator on the Panel. \n3. Refresh time option by which you can change refresh rate value between 1.0 and 10.0 seconds. \n4. Option to show upload speed first \n5. Color Customizations for speed indicators \n6. Option to Hide when Disconnected \n7. Option to use shorter units like K/s instead of KB/s \n8. Limit Unit option and more... \n\nModes \n1. Total net speed in terms of bits per second \n2. Total net speed in terms of bytes per second \n3. Combined Up & down speed in terms of bits per second \n4. Combined Up & down speed in terms of bytes per second \n5. Total transferred data in terms of bytes (Right click to reset counter) \n\nMouse Events \n- Left click to change modes \n- Right click(in 1-4 modes): Toggle the visibility of total transfer data. \n- Right click(in 5th mode): Reset total transfer data. \n- Right Click(Four consecutive times): Toggle through horizontal/vertical alignment. \n- Middle click: Cycle through the font sizes.", - "name": "Net speed Simplified", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "https://github.com/prateekmedia/netspeedsimplified", - "uuid": "netspeedsimplified@prateekmedia.extension", - "version": 43 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/gschemas.compiled deleted file mode 100644 index b744b162fe43d5a4c789655c7a5dc3a8965c1c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 zcmaJ>NoW*76fKvSF^eXy5j}YD&<)898iPU*b5L9lxhNtYoSCl7ly-NGT|IG);4PvD zFYbcD<sc{uxo8yJE{eDu^dNfhDxwHp1VMeTCY=syY<TnDy!y4*|LeBqBb5(hG5WQE zx7D;WIWfU?bA|YYuhzEN#_WK9<lBz(45RK4>&0<!?-U^>fpt{MmO>rKtSL+1&&qwV z42{yE$%ZmE6)8QVf{L&Dl=Kjf&sk7o+aJRSVk%G%Oa~f)W?;rRv_j7UW&`s^F&|8D zKjXpiiG_Ez9&G?~tqr1I>;y~T(e=T1^r@TR?*k72*M6S8NuN3ce-Jzj6y5FL=~Fkt ze*pdjyyzY}M4x&p{I6`sMw(t<SWBO}9)26R6L>IixRK{eT?c<9co)$9a@|?RQ`_}` z2Y@|SK0c;T-HP}V;FG|n)0gaes5$-+_%4v#AGHvh#XWFa9by_@9pE_BEr@r(9l&t= zhg0;ac|I$_tAI?a`9hzX@x9<J!27PNZ|GBV-ksosK=-qs4t;9+gW$_R^|M(>pL#m{ zTj1Nkikoo@eQM781pFL$cmLxMed=cTAHY9=MgHWc^r`7*rh$QrGlIADsqHy~JArc> zMjGi;bNn9gTHxW0{(Ab<yx(5%ZeZicIeU-PyvGXo7_esfv4@PO=K9ZohXG~!WfZGo z-bbVToPw*0c=NH2RH;0cXaatq!oA9i%Soun^h9HtBGXg*yQD`rp0nTaJlAz2*%wJu zj#VIQt@!<;-`Cau=(o3`jkS|GY<@cm<0^%5tEQ-ZJ=z$R3VCN)S6BPu^k=Dy1T}89 zl8?(dBzMjxcg`kvE=}&--^ra5!kDs-kpI<C#daCke<X2OMyk-mf#G}-KTcQjpLN)r zXYS7gnD@+o)*XJ#dDaQ;k#zv+XKP0W%vyqSW@|_bxCvlw!4tBzW)2u99Otp#q-0^| z1vl2Ek}nHd`<Ms+eO=rg=&F(VV$8CJeziDn>?HrQelOi6=9~Duxrn^4N+CzL`*W0A ztl~iheLAh&xS3*EYaAzEn@k^?nBcz4%1e*l?uRb~lW`t?Nx#uKlXqhFn^*?eVXYnK lz-0v5OP*uW&z73>ec1?(H9@<t0u}Rl*vZGm@xDYl&Tr8#J0So7 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/org.gnome.shell.extensions.netspeedsimplified.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/org.gnome.shell.extensions.netspeedsimplified.gschema.xml deleted file mode 100644 index 96ed2a08..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/schemas/org.gnome.shell.extensions.netspeedsimplified.gschema.xml +++ /dev/null @@ -1,82 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist gettext-domain="netspeedsimplified@prateekmedia.extension"> - <schema path="/org/gnome/shell/extensions/netspeedsimplified/" id="org.gnome.shell.extensions.netspeedsimplified"> - <key name="mode" type="i"> - <range min="0" max="4" /> - <default>1</default> - </key> - <key name="fontmode" type="i"> - <range min="0" max="4" /> - <default>0</default> - </key> - <key name="wpos" type="i"> - <range min="0" max="2" /> - <default>0</default> - </key> - <key name="wposext" type="i"> - <range min="0" max="1" /> - <default>0</default> - </key> - <key name="refreshtime" type="d"> - <range min="1.0" max="10.0" /> - <default>2.0</default> - </key> - <key name="iconstoright" type="b"> - <default>false</default> - </key> - <key name="textalign" type="i"> - <default>1</default> - </key> - <key name="togglebool" type="b"> - <default>true</default> - </key> - <key name="isvertical" type="b"> - <default>false</default> - </key> - <key name="restartextension" type="b"> - <default>false</default> - </key> - <key name="chooseiconset" type="i"> - <range min="0" max="2" /> - <default>0</default> - </key> - <key name="limitunit" type="i"> - <range min="0" max="7" /> - <default>0</default> - </key> - <key name="lockmouseactions" type="b"> - <default>false</default> - </key> - <key name="minwidth" type="d"> - <range min="3.0" max="10.0" /> - <default>3.0</default> - </key> - <key name="reverseindicators" type="b"> - <default>false</default> - </key> - <key name="hideindicator" type="b"> - <default>true</default> - </key> - <key name="shortenunits" type="b"> - <default>false</default> - </key> - <key name="customfont" type="s"> - <default>""</default> - </key> - <key name="systemcolr" type="b"> - <default>false</default> - </key> - <key name="uscolor" type="s"> - <default>"rgba(255, 255, 255, 1)"</default> - </key> - <key name="dscolor" type="s"> - <default>"rgba(255, 255, 255, 1)"</default> - </key> - <key name="tdcolor" type="s"> - <default>"rgba(255, 255, 255, 1)"</default> - </key> - <key name="tscolor" type="s"> - <default>"rgba(255, 255, 255, 1)"</default> - </key> - </schema> -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/stylesheet.css deleted file mode 100644 index 872808a1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/netspeedsimplified@prateekmedia.extension/stylesheet.css +++ /dev/null @@ -1,27 +0,0 @@ -/* For all elements */ -.forall { - text-align: right; - margin: 0 8px; - min-width: 6.5em; -} - -/* Font change on middle click*/ -.size-0 { - font-size: 1em; -} - -.size-1 { - font-size: .65em; -} - -.size-2 { - font-size: .7em; -} - -.size-3 { - font-size: .9em; -} - -.size-4 { - font-size: 1.1em; -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/AUTHORS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/AUTHORS deleted file mode 100644 index b996a1c0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/AUTHORS +++ /dev/null @@ -1,25 +0,0 @@ -# This is the list of OpenWeather (Refined)'s significant contributors. -# -# This does not necessarily list everyone who has contributed -# code. To see the full list of contributors, see the revision -# history in source control. - -# Current Author - -2023-2024 - TealPenguin - -# The individuals below have contributed to the project prior -# to the projects current fork: - - 2023 - Kenneth Topp -2021-2023 - Jason Oickle -2013-2021 - Jens Lody - 2018 - Taylor Raack -2011-2013 - Christian Metzler - Elad Alfassa - Mark Benjamin - Simon Claessens - Ecyrbe - Timur Kristóf - Simon Legner - Mattia Meneguzzo diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/COPYING deleted file mode 100644 index f288702d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 <https://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<https://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/constants.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/constants.js deleted file mode 100644 index 34c1020a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/constants.js +++ /dev/null @@ -1,69 +0,0 @@ -const WeatherUnits = { - CELSIUS: 0, - FAHRENHEIT: 1, - KELVIN: 2, - RANKINE: 3, - REAUMUR: 4, - ROEMER: 5, - DELISLE: 6, - NEWTON: 7, -}; - -const WeatherWindSpeedUnits = { - KPH: 0, - MPH: 1, - MPS: 2, - KNOTS: 3, - FPS: 4, - BEAUFORT: 5, -}; - -const WeatherPressureUnits = { - HPA: 0, - INHG: 1, - BAR: 2, - PA: 3, - KPA: 4, - ATM: 5, - AT: 6, - TORR: 7, - PSI: 8, - MMHG: 9, - MBAR: 10, -}; - -const HiContrastStyle = { - NONE: 0, - WHITE: 1, - BLACK: 2 -}; - -const ClockFormat = { - _24H: 0, - _12H: 1, - SYSTEM: 2 -}; - -const WeatherPosition = { - CENTER: 0, - RIGHT: 1, - LEFT: 2, -}; - -// Keep enums in sync with GSettings schemas -const GeolocationProvider = { - OPENSTREETMAPS: 0, - /* Geocode.Farm is no longer valid but kept here for migration. */ - GEOCODE: 1, - MAPQUEST: 2, -}; - -export { - WeatherUnits, - WeatherWindSpeedUnits, - WeatherPressureUnits, - HiContrastStyle, - ClockFormat, - WeatherPosition, - GeolocationProvider, -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/extension.js deleted file mode 100644 index e1f8aa03..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/extension.js +++ /dev/null @@ -1,2000 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ -import Clutter from "gi://Clutter"; -import Gio from "gi://Gio"; -import GLib from "gi://GLib"; -import GObject from "gi://GObject"; -import St from "gi://St"; - -import { - Extension, - gettext as _, -} from "resource:///org/gnome/shell/extensions/extension.js"; - -import * as Main from "resource:///org/gnome/shell/ui/main.js"; -import * as PanelMenu from "resource:///org/gnome/shell/ui/panelMenu.js"; -import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"; - -import * as GnomeSession from "resource:///org/gnome/shell/misc/gnomeSession.js"; - -import * as OpenWeatherMap from "./openweathermap.js"; -import { - WeatherUnits, - WeatherWindSpeedUnits, - WeatherPressureUnits, - WeatherPosition, - HiContrastStyle, - ClockFormat -} from "./constants.js"; - -import { - freeSoup, - setLocationRefreshIntervalM, - getLocationInfo, - getCachedLocInfo, - MyLocProv, - geoclueGetLoc -} from "./myloc.js" - -import { Loc, settingsGetKeys, settingsGetLocs, settingsSetLocs } from "./locs.js"; -import { tryImportAndMigrate, tryMigrateFromOldVersion } from "./migration.js"; -import { - getWeatherProviderName, - getWeatherProviderUrl, - getWeatherProvider, - DEFAULT_KEYS -} from "./getweather.js"; - -let _firstBoot = 1; -let _timeCacheCurrentWeather; -let _timeCacheForecastWeather; -let _isFirstRun = null; -let _freezeSettingsChanged = false; -let _systemClockFormat = 1; - -function toYYYYMMDD(date) -{ - let d = date.getUTCDate(); - let m = date.getUTCMonth(); - let y = date.getUTCFullYear(); - return `${y}/${m < 10 ? '0' + m : m}/${d < 10 ? '0' + d : d}`; -} - -function hscroll(scrollView) -{ - return scrollView.hadjustment ?? scrollView.hscroll.adjustment; -} - -function vscroll(scrollView) -{ - return scrollView.vadjustment ?? scrollView.vscroll.adjustment; -} - -function st13AddActor(parent, child) -{ - // Online it seems like add_actor and add_child should be synonymous - // But in GNOME 45 add_child seems to cause GitHub issues #16, #17, and #18 - - // This function is needed for backwards GNOME 45 compatibility from 46 - if(parent.add_actor) parent.add_actor(child); - else parent.add_child(child); -} - -function st13AddActors(parent, ...children) -{ - for(let c of children) st13AddActor(parent, c); -} - -function st13RemoveActor(parent, child) -{ - // Because St 13 is weird (see st13AddActor function above) - if(parent.remove_actor) parent.remove_actor(child); - else parent.remove_child(child); -} - -class OpenWeatherMenuButton extends PanelMenu.Button { - static { - GObject.registerClass(this); - } - - _addWeatherToBox(topBox) - { - this._weatherIcon = new St.Icon({ - icon_name: "view-refresh-symbolic", - style_class: "system-status-icon openweather-icon", - }); - this._weatherInfo = new St.Label({ - style_class: "openweather-label", - text: "...", - y_align: Clutter.ActorAlign.CENTER, - y_expand: true, - }); - - topBox.add_child(this._weatherIcon); - topBox.add_child(this._weatherInfo); - } - - _addSunToBox(topBox) - { - let timeHrs = new Date().getHours(); - let isProbDay = timeHrs >= 6 && timeHrs <= 19; - - this.topBoxSunIcon = new St.Icon({ - icon_name: isProbDay ? "daytime-sunset-symbolic" : "daytime-sunrise-symbolic", - style_class: "system-status-icon openweather-icon" - }); - this.topBoxSunInfo = new St.Label({ - text: "...", - y_align: Clutter.ActorAlign.CENTER, - y_expand: true - }); - if(!this._show_sunriseset_in_panel) - { - this.topBoxSunIcon.hide(); - this.topBoxSunInfo.hide(); - } - - topBox.add_child(this.topBoxSunIcon); - topBox.add_child(this.topBoxSunInfo); - } - - _init(metadata, settings) { - super._init(0, "OpenWeatherMenuButton", false); - this.settings = settings; - this.metadata = metadata; - this.gSettings = Gio.Settings.new("org.gnome.desktop.interface"); - - // Putting the panel item together - let topBox = new St.BoxLayout({ - style_class: "panel-status-menu-box", - }); - - if(this._sun_in_panel_first) - { - this._addSunToBox(topBox); - this._addWeatherToBox(topBox); - } - else - { - this._addWeatherToBox(topBox); - this._addSunToBox(topBox); - } - - this.add_child(topBox); - if (Main.panel._menus === undefined) - Main.panel.menuManager.addMenu(this.menu); - else Main.panel._menus.addMenu(this.menu); - - this.loadConfig().then(() => - { - // Setup network things - this._idle = false; - this._connected = false; - this._network_monitor = Gio.network_monitor_get_default(); - - // Bind signals - this._presence = new GnomeSession.Presence((proxy, _error) => { - this._onStatusChanged(proxy.status); - }); - this._presence_connection = this._presence.connectSignal( - "StatusChanged", - (_proxy, _senderName, [status]) => { - this._onStatusChanged(status); - } - ); - this._network_monitor_connection = this._network_monitor.connect( - "network-changed", - this._onNetworkStateChanged.bind(this) - ); - - this.menu.connect("open-state-changed", this.recalcLayout.bind(this)); - - let _firstBootWait = this._startupDelay; - if (_firstBoot && _firstBootWait !== 0) - { - // Delay popup initialization and data fetch on the first - // extension load, ie: first log in / restart gnome shell - this._timeoutFirstBoot = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - _firstBootWait, - () => { - try - { - this._checkConnectionState(); - this.initOpenWeatherUI(); - _firstBoot = 0; - this._timeoutFirstBoot = null; - } - catch(e) - { - console.log("OpenWeather Refined: Error in first boot timeout."); - console.error(e); - } - return false; // run timer once then destroy - } - ); - } - else - { - try - { - this._checkConnectionState(); - this.initOpenWeatherUI(); - } - catch(e) - { - console.log("OpenWeather Refined: Error in immediate first boot."); - console.error(e); - } - } - }, (e) => - { - console.error(`OpenWeather Refined: Error '${e}' in loadConfig.`); - console.error(e); - Main.notify("OpenWeather Refined", _("Failed to initialize.")); - let now = new Date(); - this.settings.set_string("last-init-error", `(${toYYYYMMDD(now)}) ${e}`); - }); - } - - initOpenWeatherUI() { - this.owmCityId = 0; - this.useOpenWeatherMap(); - this.checkPositionInPanel(); - - this._currentWeather = new PopupMenu.PopupBaseMenuItem({ - reactive: false, - }); - if (!this._isForecastDisabled) { - this._currentForecast = new PopupMenu.PopupBaseMenuItem({ - reactive: false, - }); - if (this._forecastDays !== 0) { - this._forecastExpander = new PopupMenu.PopupSubMenuMenuItem(""); - } - } - this._buttonMenu = new PopupMenu.PopupBaseMenuItem({ - reactive: false, - style_class: "openweather-menu-button-container", - }); - this._selectCity = new PopupMenu.PopupSubMenuMenuItem(""); - this._selectCity.actor.set_height(0); - this._selectCity._triangle.set_height(0); - - this.rebuildCurrentWeatherUi(); - this.rebuildFutureWeatherUi(); - this.rebuildButtonMenu(); - this.rebuildSelectCityItem(); - - this.menu.addMenuItem(this._currentWeather); - if (!this._isForecastDisabled) { - this.menu.addMenuItem(this._currentForecast); - if (this._forecastDays !== 0) { - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addMenuItem(this._forecastExpander); - } - } - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addMenuItem(this._buttonMenu); - this.menu.addMenuItem(this._selectCity); - this.checkAlignment(); - } - - _onStatusChanged(status) { - this._idle = false; - - if (status === GnomeSession.PresenceStatus.IDLE) { - this._idle = true; - } - } - - stop() - { - freeSoup(); - - if (this._timeoutCurrent) { - GLib.source_remove(this._timeoutCurrent); - this._timeoutCurrent = null; - } - if (this._timeoutFirstBoot) { - GLib.source_remove(this._timeoutFirstBoot); - this._timeoutFirstBoot = null; - } - - if (this._timeoutMenuAlignent) { - GLib.source_remove(this._timeoutMenuAlignent); - this._timeoutMenuAlignent = null; - } - - if (this._timeoutCheckConnectionState) { - GLib.source_remove(this._timeoutCheckConnectionState); - this._timeoutCheckConnectionState = null; - } - - if (this._presence_connection) { - this._presence.disconnectSignal(this._presence_connection); - this._presence_connection = undefined; - } - - if (this._network_monitor_connection) { - this._network_monitor.disconnect(this._network_monitor_connection); - this._network_monitor_connection = undefined; - } - - if (this._settingsC) - { - this.settings.disconnect(this._settingsC); - this._settingsC = undefined; - } - - if (this._gSettingsC) - { - this.gSettings.disconnect(this._gSettingsC); - this._gSettingsC = undefined; - } - - if (this._settingsInterfaceC) { - this._settingsInterface.disconnect(this._settingsInterfaceC); - this._settingsInterfaceC = undefined; - } - - if (this._globalThemeChangedId) { - let context = St.ThemeContext.get_for_stage(global.stage); - context.disconnect(this._globalThemeChangedId); - this._globalThemeChangedId = undefined; - } - } - - get weatherProvider() - { - return getWeatherProvider(this.settings); - } - - useOpenWeatherMap() { - this.initWeatherData = OpenWeatherMap.initWeatherData; - this.reloadWeatherCache = OpenWeatherMap.reloadWeatherCache; - this.refreshWeatherData = OpenWeatherMap.refreshWeatherData; - this.populateCurrentUI = OpenWeatherMap.populateCurrentUI; - - if (!this._isForecastDisabled) { - this.populateTodaysUI = OpenWeatherMap.populateTodaysUI; - this.populateForecastUI = OpenWeatherMap.populateForecastUI; - } - - if (this.getWeatherKey().trim() === "") - Main.notify( - "OpenWeather Refined", - _( - "%s does not work without an api-key.\nEither set the switch to use the extensions default key in the preferences dialog to on or register at %s and paste your personal key into the preferences dialog." - ).format(getWeatherProviderName(this.weatherProvider), getWeatherProviderUrl(this.weatherProvider)) - ); - } - - isFirstRun(forceRecalc = false) - { - if(_isFirstRun === null || forceRecalc) - { - _isFirstRun = !this.settings.get_boolean("has-run"); - if(_isFirstRun) - { - this.freezeSettingsChanged(); - this.settings.set_boolean("has-run", true); - this.unfreezeSettingsChanged(); - } - } - return _isFirstRun; - } - - freezeSettingsChanged() - { - _freezeSettingsChanged = true; - } - - unfreezeSettingsChanged() - { - _freezeSettingsChanged = false; - } - - hasBattery() - { - let batt = Gio.File.new_for_path("/sys/class/power_supply/BAT0"); - return batt.query_exists(null); - } - - async getDefaultCity() - { - if(this.hasBattery()) return Loc.myLoc(); - else - { - let info = await getLocationInfo(this.settings); - if(!info || info.countryShort === "Unknown") return Loc.myLoc(); - - return Loc.fromNameCoords(info.name, info.lat, info.lon); - } - } - - async firstRunSetDefaults() - { - if(this.isFirstRun(true)) - { - this.freezeSettingsChanged(); - - let migrated = tryImportAndMigrate(this.settings); - if(migrated) - { - Main.notify("OpenWeather Refined", _("OpenWeather Refined: Imported settings from old extension.")); - } - - if(this.settings.get_enum("my-loc-prov") === MyLocProv.GEOCLUE) - { - try - { - // Don't use Nominatim to ensure it is Geoclue that failed - // and not Nominatim, the Internet connection, etc. - await geoclueGetLoc(false); - } - catch(e) - { - console.warn(`OpenWeather Refined: Geoclue failed ('${e}'); changing provider to ipinfo.io.`); - this.settings.set_enum("my-loc-prov", MyLocProv.INFOIPIO); - } - } - - if(!migrated) - { - let locInfo = await getLocationInfo(this.settings, true); - - if(locInfo && locInfo.countryShort === "US") - { - this.settings.set_enum("unit", WeatherUnits.FAHRENHEIT); - this.settings.set_enum("wind-speed-unit", WeatherWindSpeedUnits.MPH); - this.settings.set_enum("pressure-unit", WeatherPressureUnits.INHG); - } - - let defCity = await this.getDefaultCity(); - if(!defCity.equals(Loc.myLoc())) - { - settingsSetLocs(this.settings, [ defCity ]); - } - } - } - else - { - tryMigrateFromOldVersion(this.settings); - } - - this.unfreezeSettingsChanged(); - } - - toggleSunriseSunset() - { - if(this._show_sunriseset_in_panel) - { - this.topBoxSunIcon.show(); - this.topBoxSunInfo.show(); - } - else - { - this.topBoxSunIcon.hide(); - this.topBoxSunInfo.hide(); - } - } - - updateForecast() - { - if (this.disableForecastChanged()) - { - let _children = this._isForecastDisabled ? 4 : 7; - if (this._forecastDays === 0) { - _children = this.menu.box.get_children().length - 1; - } - for (let i = 0; i < _children; i++) { - this.menu.box.get_child_at_index(0).destroy(); - } - this._isForecastDisabled = this._disable_forecast; - this.initOpenWeatherUI(); - this._clearWeatherCache(); - this.initWeatherData(); - } - } - - async settingsHandler() - { - if(_freezeSettingsChanged || this.settings.get_boolean("frozen")) return; - - try - { - await this.firstRunSetDefaults(); - } - catch(e) - { - console.error(`OpenWeather Refined: Error '${e}' in firstRunSetDefaults.`); - throw e; - } - - try - { - this._cities = settingsGetLocs(this.settings); - if (!this._cities.length) - { - this._cities = [ await this.getDefaultCity() ]; - } - - setLocationRefreshIntervalM(this.settings.get_double("loc-refresh-interval")); - - this.toggleSunriseSunset(); - - _systemClockFormat = this.gSettings.get_enum("clock-format"); - - this.updateForecast(); - - if (await this.locationChanged()) - { - this.showRefreshing(); - if (this._selectCity._getOpenState()) this._selectCity.menu.toggle(); - this._currentLocation = await this._city.getCoords(this.settings); - this.rebuildSelectCityItem(); - this._clearWeatherCache(); - this.initWeatherData(); - } - - if (this.menuAlignmentChanged()) - { - if (this._timeoutMenuAlignent) - GLib.source_remove(this._timeoutMenuAlignent); - // Use 1 second timeout to avoid crashes and spamming - // the logs while changing the slider position in prefs - this._timeoutMenuAlignent = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - 1000, - () => { - this.checkAlignment(); - this._currentAlignment = this._menu_alignment; - this._timeoutMenuAlignent = null; - return false; // run once then destroy - } - ); - } - - if (this._forecastDays !== this._days_forecast) - { - let _oldDays = this._forecastDays; - let _newDays = this._days_forecast; - this._forecastDays = _newDays; - - if (_oldDays >= 1 && _newDays === 0) { - this._forecastExpander.destroy(); - return; - } else if (_oldDays === 0 && _newDays >= 1) { - let _children = this.menu.box.get_children().length - 1; - for (let i = 0; i < _children; i++) { - this.menu.box.get_child_at_index(0).destroy(); - } - this._clearWeatherCache(); - this.initOpenWeatherUI(); - this.initWeatherData(); - } else { - this.forecastJsonCache = undefined; - this.rebuildFutureWeatherUi(); - await this.reloadWeatherCache(); - } - } - - if (this._providerTranslations !== this._provider_translations) - { - this._providerTranslations = this._provider_translations; - if (this._providerTranslations) { - this.showRefreshing(); - this._clearWeatherCache(); - this.initWeatherData(); - } else { - await this.reloadWeatherCache(); - } - } - this.checkAlignment(); - this.checkPositionInPanel(); - this.rebuildCurrentWeatherUi(); - this.rebuildFutureWeatherUi(); - this.rebuildButtonMenu(); - await this.reloadWeatherCache(); - } - catch(e) - { - console.error(e); - throw e; - } - } - - async settingsChangedHandlerWrapper() - { - try - { - await this.settingsHandler(); - } - catch(e) - { - console.log("OpenWeather Refined Error in settings listener."); - console.error(e); - } - } - - bindSettingsChanged() - { - this._settingsC = this.settings.connect("changed", this.settingsChangedHandlerWrapper.bind(this)); - - this._gSettingsC = this.gSettings.connect("changed", this.settingsChangedHandlerWrapper.bind(this)); - } - - async loadConfig() - { - await this.firstRunSetDefaults(); - this._cities = settingsGetLocs(this.settings); - if (!this._cities.length) - { - this._cities = [ await this.getDefaultCity() ]; - } - - setLocationRefreshIntervalM(this.settings.get_double("loc-refresh-interval")); - - _systemClockFormat = this.gSettings.get_enum("clock-format"); - - this._currentLocation = await this._city.getCoords(this.settings); - this._isForecastDisabled = this._disable_forecast; - this._forecastDays = this._days_forecast; - this._currentAlignment = this._menu_alignment; - this._providerTranslations = this._provider_translations; - - // Get locale - this.locale = GLib.get_language_names()[0]; - if (this.locale.indexOf("_") !== -1) - this.locale = this.locale.split("_")[0]; - // Fallback for 'C', 'C.UTF-8', and unknown locales. - else this.locale = "en"; - - this.bindSettingsChanged(); - } - - loadConfigInterface() - { - this._settingsInterfaceC = this.settings.connect("changed", async () => { - if(this.settings.get_boolean("frozen")) return; - - try - { - this.rebuildCurrentWeatherUi(); - this.rebuildFutureWeatherUi(); - if (await this.locationChanged()) { - this.rebuildSelectCityItem(); - this._clearWeatherCache(); - this.initWeatherData(); - } else { - await this.reloadWeatherCache(); - } - } - catch(e) - { - console.error(`OpenWeather Refined: Error in settings changed listener '${e}'.\n\t${e.trace}`); - } - }); - } - - /** - * @property {(Weather | null)} - */ - currentWeatherCache = null; - - _clearWeatherCache() { - this.currentWeatherCache = undefined; - this.todaysWeatherCache = undefined; - this.forecastWeatherCache = undefined; - this.forecastJsonCache = undefined; - } - - _onNetworkStateChanged() { - this._checkConnectionState(); - } - - _checkConnectionState() { - this._checkConnectionStateRetries = 3; - this._oldConnected = this._connected; - this._connected = false; - - this._checkConnectionStateWithRetries(1250); - } - - _checkConnectionStateRetry() { - if (this._checkConnectionStateRetries > 0) { - let timeout; - if (this._checkConnectionStateRetries === 3) timeout = 10000; - else if (this._checkConnectionStateRetries === 2) timeout = 30000; - else if (this._checkConnectionStateRetries === 1) timeout = 60000; - - this._checkConnectionStateRetries -= 1; - this._checkConnectionStateWithRetries(timeout); - } - } - - _checkConnectionStateWithRetries(interval) { - if (this._timeoutCheckConnectionState) { - GLib.source_remove(this._timeoutCheckConnectionState); - this._timeoutCheckConnectionState = null; - } - - this._timeoutCheckConnectionState = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - interval, - () => { - // Nullify the variable holding the timeout-id, otherwise we can get errors, if we try to delete - // it manually, the timeout will be destroyed automatically if we return false. - // We just fetch it for the rare case, where the connection changes or the extension will be stopped during - // the timeout. - this._timeoutCheckConnectionState = null; - let url = getWeatherProviderUrl(this.weatherProvider); - let address = Gio.NetworkAddress.parse_uri(url, 80); - let cancellable = Gio.Cancellable.new(); - try { - this._network_monitor.can_reach_async( - address, - cancellable, - this._asyncReadyCallback.bind(this) - ); - } catch (err) { - let title = _("Can not connect to %s").format(url); - console.warn(title + "\n" + err.message); - this._checkConnectionStateRetry(); - } - return false; - } - ); - } - - _asyncReadyCallback(nm, res) { - try { - this._connected = this._network_monitor.can_reach_finish(res); - } catch (err) { - let title = _("Can not connect to %s").format( - getWeatherProviderUrl(this.weatherProvider) - ); - console.warn(title + "\n" + err.message); - this._checkConnectionStateRetry(); - return; - } - if (!this._oldConnected && this._connected) { - let now = new Date(); - if ( - _timeCacheCurrentWeather && - Math.floor(new Date(now - _timeCacheCurrentWeather).getTime() / 1000) > - this._refresh_interval_current - ) { - this.currentWeatherCache = undefined; - } - if ( - !this._isForecastDisabled && - _timeCacheForecastWeather && - Math.floor(new Date(now - _timeCacheForecastWeather).getTime() / 1000) > - this._refresh_interval_forecast - ) { - this.forecastWeatherCache = undefined; - this.todaysWeatherCache = undefined; - } - this.forecastJsonCache = undefined; - this.rebuildCurrentWeatherUi(); - this.initWeatherData(); - } - } - - disableForecastChanged() { - if (this._isForecastDisabled !== this._disable_forecast) { - return true; - } - return false; - } - - async locationChanged() - { - let location = await this._city?.getCoords(this.settings); - return this._currentLocation !== location; - } - - menuAlignmentChanged() { - if (this._currentAlignment !== this._menu_alignment) { - return true; - } - return false; - } - - get _units() { - return this.settings.get_enum("unit"); - } - - get _wind_speed_units() { - return this.settings.get_enum("wind-speed-unit"); - } - - get _wind_direction() { - return this.settings.get_boolean("wind-direction"); - } - - get _pressure_units() { - return this.settings.get_enum("pressure-unit"); - } - - get _actual_city() - { - let i = this.settings.get_int("actual-city"); - if(i > this._cities.length - 1) - { - console.warn("OpenWeather Refined: Got actual city too high."); - i = this._cities.length - 1; - } - - return i; - } - - getHiConrastClass() - { - let m = this.settings.get_enum("hi-contrast"); - switch(m) - { - case HiContrastStyle.WHITE: - return "openweather-white"; - case HiContrastStyle.BLACK: - return "openweather-black"; - default: - return null; - } - } - - _cities = [ ]; - - set _actual_city(i) - { - if(i > this._cities.length - 1) - { - console.warn("OpenWeather Refined: Set actual city too high."); - i = this._cities.length; - } - - this.settings.set_int("actual-city", i); - } - - get _city() - { - return this._cities[this._actual_city]; - } - - get _translate_condition() { - return this.settings.get_boolean("translate-condition"); - } - - get _provider_translations() { - return this.settings.get_boolean("owm-api-translate"); - } - - get _getUseSysIcons() { - return this.settings.get_boolean("use-system-icons") ? 1 : 0; - } - - get _startupDelay() { - return this.settings.get_int("delay-ext-init"); - } - - get _text_in_panel() { - return this.settings.get_boolean("show-text-in-panel"); - } - - get _position_in_panel() { - return this.settings.get_enum("position-in-panel"); - } - - get _position_index() { - return this.settings.get_int("position-index"); - } - - get _menu_alignment() { - return this.settings.get_double("menu-alignment"); - } - - get _comment_in_panel() { - return this.settings.get_boolean("show-comment-in-panel"); - } - - get _show_sunriseset_in_panel() - { - return this.settings.get_boolean("show-sunsetrise-in-panel"); - } - - get _sun_in_panel_first() - { - return this.settings.get_boolean("sun-in-panel-first"); - } - - get _disable_forecast() { - return this.settings.get_boolean("disable-forecast"); - } - - get _comment_in_forecast() { - return this.settings.get_boolean("show-comment-in-forecast"); - } - - get _refresh_interval_current() { - let v = this.settings.get_int("refresh-interval-current"); - return v >= 600 ? v : 600; - } - - get _refresh_interval_forecast() { - let v = this.settings.get_int("refresh-interval-forecast"); - return v >= 3600 ? v : 3600; - } - - get _loc_len_current() { - let v = this.settings.get_int("location-text-length"); - return v > 0 ? v : 0; - } - - get _center_forecast() { - return this.settings.get_boolean("center-forecast"); - } - - get _days_forecast() { - return this.settings.get_int("days-forecast"); - } - - get _decimal_places() { - return this.settings.get_int("decimal-places"); - } - - get _pressure_decimal_places() - { - let s = this.settings.get_int("pressure-decimal-places"); - switch(s) - { - case -2: - switch(this._pressure_units) - { - case WeatherPressureUnits.MBAR: - case WeatherPressureUnits.PA: - return 0; - case WeatherPressureUnits.KPA: - case WeatherPressureUnits.MMHG: - case WeatherPressureUnits.HPA: - case WeatherPressureUnits.TORR: - return 1; - case WeatherPressureUnits.INHG: - case WeatherPressureUnits.PSI: - return 2; - case WeatherPressureUnits.ATM: - case WeatherPressureUnits.AT: - case WeatherPressureUnits.BAR: - return 3; - } - case -1: - return this._decimal_places; - default: - return s; - } - } - - get _speed_decimal_places() - { - let s = this.settings.get_int("speed-decimal-places"); - if(s === -1) return this._decimal_places; - else return s; - } - - getWeatherKey() - { - let keys = settingsGetKeys(this.settings); - let selected = keys[this.weatherProvider - 1]; - return selected ? selected : DEFAULT_KEYS[this.weatherProvider - 1]; - } - - createButton(iconName, accessibleName) - { - let a11yClasses = this.getHiConrastClass() ?? ""; - let button; - - button = new St.Button({ - reactive: true, - can_focus: true, - track_hover: true, - accessible_name: accessibleName, - style_class: this.cssConcatClass("message-list-clear-button button openweather-button-action", a11yClasses), - }); - - button.child = new St.Icon({ - icon_name: iconName, - }); - - return button; - } - - usesNominatim() - { - return this._city.isMyLoc() && this.settings.get_enum("my-loc-prov") === MyLocProv.GEOCLUE; - } - - rebuildButtonMenu() { - this._buttonMenu.actor.destroy_all_children(); - - this._buttonBox1 = new St.BoxLayout({ - style_class: "openweather-button-box", - }); - this._buttonBox2 = new St.BoxLayout({ - style_class: "openweather-button-box", - }); - - this._locationButton = this.createButton( - "find-location-symbolic", - _("Locations") - ); - this._reloadButton = this.createButton( - "view-refresh-symbolic", - _("Reload Weather Information") - ); - this._provUrlButton = this.createButton( - "", - getWeatherProviderName(this.weatherProvider) - ); - this._provUrlButton.set_label(this._provUrlButton.get_accessible_name()); - if(this.usesNominatim()) - { - this._nominatimBtn = this.createButton( - "", - "Nominatim/OSM" - ); - this._nominatimBtn.set_label(this._nominatimBtn.get_accessible_name()); - } - - this._seeOnlineUrlBtn = this.createButton( - this.getGIcon("internet-web-browser-symbolic").to_string(), - _("See Online") - ); - - this._prefsButton = this.createButton( - "preferences-system-symbolic", - _("Weather Settings") - ); - - st13AddActors( - this._buttonBox1, - // Children: - this._locationButton, - this._reloadButton, - ); - - st13AddActor(this._buttonBox2, this._seeOnlineUrlBtn); - if(this.usesNominatim()) st13AddActor(this._buttonBox2, this._nominatimBtn); - st13AddActors( - this._buttonBox2, - // Children: - this._provUrlButton, - this._prefsButton, - ); - - this._locationButton.connect("clicked", () => { - this._selectCity._setOpenState(!this._selectCity._getOpenState()); - }); - this._reloadButton.connect("clicked", () => { - if (this._lastRefresh) { - let _twoMinsAgo = Date.now() - new Date(0).setMinutes(2.0); - if (this._lastRefresh > _twoMinsAgo) { - Main.notify( - "OpenWeather Refined", - _("Manual refreshes less than 2 minutes apart are ignored!") - ); - return; - } - } - this.showRefreshing(); - this.initWeatherData(true); - }); - this._provUrlButton.connect("clicked", () => { - this.menu.close(); - let url = getWeatherProviderUrl(this.weatherProvider); - this.openUrl(url); - }); - if(this.usesNominatim()) - { - this._nominatimBtn.connect("clicked", () => { - this.menu.close(); - this.openUrl("https://nominatim.org/"); - }); - } - this._seeOnlineUrlBtn.connect("clicked", async () => { - this.menu.close(); - let c = await this._city.getCoords(this.settings); - let url = `https://weather.com/weather/today/l/${c[0]},${c[1]}`; - this.openUrl(url); - }); - this._prefsButton.connect( - "clicked", - this._onPreferencesActivate.bind(this) - ); - - st13AddActors(this._buttonMenu, this._buttonBox1, this._buttonBox2); - } - - openUrl(url) - { - try - { - Gio.AppInfo.launch_default_for_uri(url, null); - } - catch(e) - { - let title = _("Cannot open %s").format(url); - Main.notifyError(title, String(e)); - } - } - - rebuildSelectCityItem() - { - this._selectCity.menu.removeAll(); - let item = null; - - let cities = this._cities; - if (!cities) return; - - for (let i = 0; cities.length > i; i++) - { - let locName = cities[i].getName(_); - if(cities[i].isMyLoc()) - { - locName += ` (${getCachedLocInfo().city})`; - } - - item = new PopupMenu.PopupMenuItem(locName); - item.location = i; - if (i === this._actual_city) { - item.setOrnament(PopupMenu.Ornament.DOT); - } - - this._selectCity.menu.addMenuItem(item); - // override the items default onActivate-handler, to keep the ui open while choosing the location - item.activate = this._onActivate.bind(this, item.location); - } - - if (cities.length === 1) this._selectCity.actor.hide(); - else this._selectCity.actor.show(); - } - - _onActivate(locIndex) - { - this._actual_city = locIndex; - } - - _onPreferencesActivate() { - this.menu.close(); - let extensionObject = Extension.lookupByUUID( - "openweather-extension@penguin-teal.github.io" - ); - extensionObject.openPreferences(); - return 0; - } - - recalcLayout() { - if (!this.menu.isOpen) return; - - if (!this._isForecastDisabled && this._currentForecast !== undefined) - this._currentForecast.set_width(this._currentWeather.get_width()); - - if ( - !this._isForecastDisabled && - this._forecastDays !== 0 && - this._forecastExpander !== undefined - ) { - this._forecastScrollBox.set_width( - this._forecastExpanderBox.get_width() - this._daysBox.get_width() - ); - this._forecastScrollBox.show(); - this._forecastScrollBox.hscrollbar_policy = St.PolicyType.ALWAYS; - - let expanded = this.settings.get_boolean("expand-forecast"); - this._forecastExpander.setSubmenuShown(expanded); - } - this._buttonBox1.set_width( - this._currentWeather.get_width() - this._buttonBox2.get_width() - ); - } - - _simplifyDegrees() - { - return this.settings.get_boolean("simplify-degrees"); - } - - unit_to_unicode() - { - if(this._units !== 2 && this._simplifyDegrees()) return "\u00B0"; - switch(this._units) - { - case WeatherUnits.CELSIUS: - // Don't use U+2013 because it looks weird - return _("\u00B0C"); - case WeatherUnits.FAHRENHEIT: - // Don't use U+2109 because it looks weird - return _("\u00B0F"); - case WeatherUnits.KELVIN: - return _("K"); - case WeatherUnits.RANKINE: - return _("\u00B0Ra"); - case WeatherUnits.REAUMUR: - return _("\u00B0R\u00E9"); - case WeatherUnits.ROEMER: - return _("\u00B0R\u00F8"); - case WeatherUnits.DELISLE: - return _("\u00B0De"); - case WeatherUnits.NEWTON: - return _("\u00B0N"); - default: - console.warn("OpenWeather Refined: Invalid tempeature unit."); - return "\u00B0"; - } - } - - toBeaufort(w, t) { - if (w < 0.3) return !t ? "0" : "(" + _("Calm") + ")"; - else if (w >= 0.3 && w <= 1.5) return !t ? "1" : "(" + _("Light air") + ")"; - else if (w > 1.5 && w <= 3.4) - return !t ? "2" : "(" + _("Light breeze") + ")"; - else if (w > 3.4 && w <= 5.4) - return !t ? "3" : "(" + _("Gentle breeze") + ")"; - else if (w > 5.4 && w <= 7.9) - return !t ? "4" : "(" + _("Moderate breeze") + ")"; - else if (w > 7.9 && w <= 10.7) - return !t ? "5" : "(" + _("Fresh breeze") + ")"; - else if (w > 10.7 && w <= 13.8) - return !t ? "6" : "(" + _("Strong breeze") + ")"; - else if (w > 13.8 && w <= 17.1) - return !t ? "7" : "(" + _("Moderate gale") + ")"; - else if (w > 17.1 && w <= 20.7) - return !t ? "8" : "(" + _("Fresh gale") + ")"; - else if (w > 20.7 && w <= 24.4) - return !t ? "9" : "(" + _("Strong gale") + ")"; - else if (w > 24.4 && w <= 28.4) return !t ? "10" : "(" + _("Storm") + ")"; - else if (w > 28.4 && w <= 32.6) - return !t ? "11" : "(" + _("Violent storm") + ")"; - else return !t ? "12" : "(" + _("Hurricane") + ")"; - } - - getLocaleDay(abr) { - let days = [ - _("Sunday"), - _("Monday"), - _("Tuesday"), - _("Wednesday"), - _("Thursday"), - _("Friday"), - _("Saturday"), - ]; - return days[abr]; - } - - getWindDirection(deg) { - let arrows = [ - "\u2193", - "\u2199", - "\u2190", - "\u2196", - "\u2191", - "\u2197", - "\u2192", - "\u2198", - ]; - let letters = [ - _("N"), - _("NE"), - _("E"), - _("SE"), - _("S"), - _("SW"), - _("W"), - _("NW"), - ]; - let idx = Math.round(deg / 45) % arrows.length; - return this._wind_direction ? arrows[idx] : letters[idx]; - } - - systemHasIcon(iconName) - { - return new St.IconTheme().has_icon(iconName); - } - - getPackagedIconName(iconName) - { - return `${this.metadata.path}/media/status/${iconName}.svg` - } - - getGIcon(iconName) - { - let noSystemIcon = false; - if (this._getUseSysIcons) - { - if(this.systemHasIcon(iconName)) return Gio.icon_new_for_string(iconName); - else noSystemIcon = true; - } - - let name = this.getPackagedIconName(iconName); - - // If a packaged icon is requested check if it even has it - let file = Gio.File.new_for_path(name); - if(!file.query_exists(null)) - { - name = iconName; - if(noSystemIcon) console.warn(`No icon packaged or on system for ${iconName}.`); - } - - return Gio.icon_new_for_string(name); - } - - checkAlignment() { - let menuAlignment = 1.0 - this._menu_alignment / 100; - if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL) - menuAlignment = 1.0 - menuAlignment; - this.menu._arrowAlignment = menuAlignment; - } - - checkPositionInPanel() { - if ( - this._old_position_in_panel === undefined || - this._old_position_in_panel !== this._position_in_panel || - this._is_first_run_cycle || - this._old_position_index !== this._position_index - ) { - st13RemoveActor(this.get_parent(), this); - - let children = null; - switch (this._position_in_panel) { - case WeatherPosition.LEFT: - children = Main.panel._leftBox.get_children(); - Main.panel._leftBox.insert_child_at_index(this, this._position_index); - break; - case WeatherPosition.CENTER: - children = Main.panel._centerBox.get_children(); - Main.panel._centerBox.insert_child_at_index( - this, - this._position_index - ); - break; - case WeatherPosition.RIGHT: - children = Main.panel._rightBox.get_children(); - Main.panel._rightBox.insert_child_at_index( - this, - this._position_index - ); - break; - } - this._old_position_in_panel = this._position_in_panel; - this._old_position_index = this._position_index; - this._is_first_run_cycle = 1; - } - } - - formatPressure(pressure) - { - let pressure_unit; - switch (this._pressure_units) - { - - case WeatherPressureUnits.INHG: - pressure *= 0.029528744; - pressure_unit = _("inHg"); - break; - - case WeatherPressureUnits.BAR: - pressure *= 0.001; - pressure_unit = _("bar"); - break; - - case WeatherPressureUnits.PA: - pressure *= 100; - pressure_unit = _("Pa"); - break; - - case WeatherPressureUnits.KPA: - pressure *= 0.1; - pressure_unit = _("kPa"); - break; - - case WeatherPressureUnits.ATM: - pressure *= 0.000986923267; - pressure_unit = _("atm"); - break; - - case WeatherPressureUnits.AT: - pressure *= 0.00101971621298; - pressure_unit = _("at"); - break; - - case WeatherPressureUnits.TORR: - pressure *= 0.750061683; - pressure_unit = _("Torr"); - break; - - case WeatherPressureUnits.PSI: - pressure *= 0.0145037738; - pressure_unit = _("psi"); - break; - - case WeatherPressureUnits.MMHG: - pressure *= 0.750061683; - pressure_unit = _("mmHg"); - break; - - case WeatherPressureUnits.MBAR: - pressure_unit = _("mbar"); - break; - - default: - throw new Error("Invalid pressure unit."); - } - - return (pressure - .toFixed(this._pressure_decimal_places) - .toLocaleString(this.locale) + - " " + pressure_unit); - } - - formatTemperature(tempC) - { - let isDegrees = true; - let tLocal; - switch (this._units) - { - case WeatherUnits.FAHRENHEIT: - tLocal = tempC * 1.8 + 32; - break; - - case WeatherUnits.CELSIUS: - tLocal = tempC; - break; - - case WeatherUnits.KELVIN: - tLocal = tempC + 273.15; - isDegrees = false; - break; - - case WeatherUnits.RANKINE: - tLocal = tempC * 1.8 + 491.67; - break; - - case WeatherUnits.REAUMUR: - tLocal = tempC / 1.25; - break; - - case WeatherUnits.ROEMER: - tLocal = tempC / 1.9047619 + 7.5; - break; - - case WeatherUnits.DELISLE: - tLocal = tempC * 1.5 - 100; - break; - - case WeatherUnits.NEWTON: - tLocal = tempC / 3.03030303; - break; - } - - let string = tLocal.toLocaleString(this.locale, { maximumFractionDigits: this._decimal_places }); - // - // turn a rounded '-0' into '0' - if(string === "-0") string = "0"; - - string = string.replace("-", "\u2212") - - return string + (isDegrees ? "" : " ") + this.unit_to_unicode(); - } - - formatWind(speed, direction) { - let conv_MPSinMPH = 2.23693629; - let conv_MPSinKPH = 3.6; - let conv_MPSinKNOTS = 1.94384449; - let conv_MPSinFPS = 3.2808399; - let unit = _("m/s"); - - switch (this._wind_speed_units) { - case WeatherWindSpeedUnits.MPH: - speed = (speed * conv_MPSinMPH).toFixed(this._speed_decimal_places); - unit = _("mph"); - break; - - case WeatherWindSpeedUnits.KPH: - speed = (speed * conv_MPSinKPH).toFixed(this._speed_decimal_places); - unit = _("km/h"); - break; - - case WeatherWindSpeedUnits.MPS: - speed = speed.toFixed(this._speed_decimal_places); - break; - - case WeatherWindSpeedUnits.KNOTS: - speed = (speed * conv_MPSinKNOTS).toFixed(this._speed_decimal_places); - unit = _("kn"); - break; - - case WeatherWindSpeedUnits.FPS: - speed = (speed * conv_MPSinFPS).toFixed(this._speed_decimal_places); - unit = _("ft/s"); - break; - - case WeatherWindSpeedUnits.BEAUFORT: - speed = this.toBeaufort(speed); - unit = this.toBeaufort(speed, true); - break; - } - - if (!speed) return "\u2013"; - else if (speed === 0 || !direction) - return parseFloat(speed).toLocaleString(this.locale) + " " + unit; - // i.e. speed > 0 && direction - else - return ( - direction + - " " + - parseFloat(speed).toLocaleString(this.locale) + - " " + - unit - ); - } - - formatTime(date) - { - let isHr12; - switch(this.settings.get_enum("clock-format")) - { - case ClockFormat._24H: - isHr12 = false; - break; - case ClockFormat._12H: - isHr12 = true; - break; - default: - console.warn("OpenWeather Refined invalid clock format."); - // FALL THRU - case ClockFormat.SYSTEM: - isHr12 = _systemClockFormat === ClockFormat._12H; - break; - } - return date.toLocaleTimeString(this.locale, { - // 12/24 hour and hide seconds - hour12: isHr12, - hour: "numeric", - minute: "numeric" - }); - } - - reloadWeatherCurrent(interval) { - if (this._timeoutCurrent) { - GLib.source_remove(this._timeoutCurrent); - this._timeoutCurrent = null; - } - _timeCacheCurrentWeather = new Date(); - this._timeoutCurrent = GLib.timeout_add_seconds( - GLib.PRIORITY_DEFAULT, - interval, - () => { - this.refreshWeatherData().catch((e) => console.error(e)); - - let intervalSetting = this._refresh_interval_current; - if(intervalSetting !== interval) this.reloadWeatherCurrent(intervalSetting); - return true; - } - ); - } - - showRefreshing() - { - this._currentWeatherSummary.text = _("Loading ..."); - this._currentWeatherIcon.icon_name = "view-refresh-symbolic"; - } - - cssConcatClass(left, right) - { - if(!left) return right; - else if(!right) return left; - else return `${left} ${right}`; - } - - rebuildCurrentWeatherUi() - { - this._currentWeather.actor.destroy_all_children(); - if (!this._isForecastDisabled) - this._currentForecast.actor.destroy_all_children(); - - let a11yClasses = this.getHiConrastClass() ?? ""; - - this._weatherInfo.text = "..."; - this._weatherIcon.icon_name = "view-refresh-symbolic"; - - // This will hold the icon for the current weather - this._currentWeatherIcon = new St.Icon({ - icon_size: 96, - icon_name: "view-refresh-symbolic", - style_class: "system-menu-action openweather-current-icon", - }); - - this._sunriseIcon = new St.Icon({ - icon_size: 15, - style_class: "openweather-sunrise-icon", - }); - this._sunsetIcon = new St.Icon({ - icon_size: 15, - style_class: "openweather-sunset-icon", - }); - this._sunriseIcon.set_gicon( - this.getGIcon("daytime-sunrise-symbolic") - ); - this._sunsetIcon.set_gicon(this.getGIcon("daytime-sunset-symbolic")); - - this._buildIcon = new St.Icon({ - icon_size: 15, - icon_name: "view-refresh-symbolic", - style_class: "openweather-build-icon", - }); - - // The summary of the current weather - this._currentWeatherSummary = new St.Label({ - text: _("Loading ..."), - style_class: this.cssConcatClass("openweather-current-summary", a11yClasses), - }); - this._currentWeatherLocation = new St.Label({ - text: _("Please wait"), - style_class: a11yClasses - }); - - let bb = new St.BoxLayout({ - vertical: true, - x_expand: true, - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - style_class: "system-menu-action openweather-current-summarybox", - }); - st13AddActors(bb, this._currentWeatherLocation, this._currentWeatherSummary); - - this._currentWeatherSunrise = new St.Label({ - text: "-", - style_class: a11yClasses - }); - this._currentWeatherSunset = new St.Label({ - text: "-", - style_class: a11yClasses - }); - this._currentWeatherBuild = new St.Label({ - text: "-", - style_class: a11yClasses - }); - - let ab = new St.BoxLayout({ - x_expand: true, - style_class: "openweather-current-infobox", - }); - - st13AddActors(ab, - this._sunriseIcon, this._currentWeatherSunrise, - this._sunsetIcon, this._currentWeatherSunset, - this._buildIcon, this._currentWeatherBuild); - st13AddActor(bb, ab); - - // Other labels - let rb = new St.BoxLayout({ - x_expand: true, - style_class: "openweather-current-databox", - }); - let rb_captions = new St.BoxLayout({ - x_expand: true, - vertical: true, - style_class: - "popup-menu-item popup-status-menu-item openweather-current-databox-captions", - }); - let rb_values = new St.BoxLayout({ - x_expand: true, - vertical: true, - style_class: "system-menu-action openweather-current-databox-values", - }); - st13AddActors(rb, rb_captions, rb_values); - - let sideStats = - [ - _("Feels Like:"), - _("Humidity:"), - _("Pressure:"), - _("Wind:"), - _("Gusts") + ":" - ]; - - this.detailsRbCaptions = rb_captions; - this.detailsRbValues = rb_values; - - const labelCss = this.cssConcatClass("openweather-current-databox-captions", a11yClasses); - const valueCss = this.cssConcatClass("openweather-current-databox-values", a11yClasses); - for(let i = 0; i < 5; i++) - { - let l = new St.Label({ - text: sideStats[i], - style_class: labelCss - }); - - let v = new St.Label({ - text: "\u2026", - style_class: valueCss - }); - - switch(i) - { - case 0: - this._currentWeatherFeelsLike = v; - break; - case 1: - this._currentWeatherHumidity = v; - break; - case 2: - this._currentWeatherPressure = v; - break; - case 3: - this._currentWeatherWind = v; - break; - case 4: - this._currentWeatherWindGustsLabel = l; - this._currentWeatherWindGusts = v; - break; - } - - st13AddActor(rb_captions, l); - st13AddActor(rb_values, v); - } - - let xb = new St.BoxLayout({ - x_expand: true, - }); - st13AddActors(xb, bb, rb); - - let box = new St.BoxLayout({ - x_expand: true, - style_class: "openweather-current-iconbox", - }); - - st13AddActors(box, this._currentWeatherIcon, xb); - this._currentWeather.actor.add_child(box); - - // Today's forecast if not disabled by user - if (this._isForecastDisabled) return; - - this._todays_forecast = []; - this._todaysBox = new St.BoxLayout({ - x_expand: true, - x_align: this._center_forecast - ? Clutter.ActorAlign.END - : Clutter.ActorAlign.START, - style_class: "openweather-today-box", - }); - - for (let i = 0; i < 4; i++) { - let todaysForecast = {}; - - todaysForecast.Time = new St.Label({ - style_class: this.cssConcatClass("openweather-forecast-time", a11yClasses), - }); - todaysForecast.Icon = new St.Icon({ - icon_size: 24, - icon_name: "view-refresh-symbolic", - style_class: "openweather-forecast-icon", - }); - todaysForecast.Temperature = new St.Label({ - style_class: this.cssConcatClass("openweather-forecast-temperature", a11yClasses), - }); - todaysForecast.Summary = new St.Label({ - style_class: this.cssConcatClass("openweather-forecast-summary", a11yClasses), - }); - todaysForecast.Summary.clutter_text.line_wrap = true; - - let fb = new St.BoxLayout({ - vertical: true, - x_expand: true, - style_class: "openweather-today-databox", - }); - let fib = new St.BoxLayout({ - x_expand: true, - x_align: Clutter.ActorAlign.CENTER, - style_class: "openweather-forecast-iconbox", - }); - - st13AddActors(fib, todaysForecast.Icon, todaysForecast.Temperature); - - st13AddActors(fb, todaysForecast.Time, fib); - if (this._comment_in_forecast) st13AddActor(fb, todaysForecast.Summary); - - this._todays_forecast[i] = todaysForecast; - st13AddActor(this._todaysBox, fb); - } - this._currentForecast.actor.add_child(this._todaysBox); - } - - setGustsPanelVisibility(isVisible) - { - let rb_captions = this.detailsRbCaptions; - let rb_values = this.detailsRbValues; - if(!isVisible) - { - st13RemoveActor(rb_captions, this._currentWeatherWindGustsLabel); - st13RemoveActor(rb_values, this._currentWeatherWindGusts); - } - else - { - st13AddActor(rb_captions, this._currentWeatherWindGustsLabel); - st13AddActor(rb_values, this._currentWeatherWindGusts); - } - } - - scrollForecastBy(delta) { - if (this._forecastScrollBox === undefined) return; - hscroll(this._forecastScrollBox).value += delta; - } - - rebuildFutureWeatherUi(cnt) { - if (this._isForecastDisabled || this._forecastDays === 0) return; - this._forecastExpander.menu.box.destroy_all_children(); - - let a11yClasses = this.getHiConrastClass() ?? ""; - - this._forecast = []; - this._forecastExpanderBox = new St.BoxLayout({ - x_expand: true, - opacity: 150, - style_class: this.cssConcatClass("openweather-forecast-expander", a11yClasses), - }); - st13AddActor(this._forecastExpander.menu.box, this._forecastExpanderBox); - - this._daysBox = new St.BoxLayout({ - vertical: true, - y_expand: true, - style_class: "openweather-forecast-box", - }); - this._forecastBox = new St.BoxLayout({ - vertical: true, - x_expand: true, - style_class: "openweather-forecast-box", - }); - this._forecastScrollBox = new St.ScrollView({ - x_expand: true, - style_class: "openweather-forecasts", - }); - let pan = new Clutter.PanAction({ - interpolate: true, - }); - pan.connect("pan", (action) => { - let [dist, dx, dy] = action.get_motion_delta(0); - - this.scrollForecastBy( - -1 * - ((dy + dx) / this._forecastScrollBox.width) * - hscroll(this._forecastScrollBox).page_size - ); - return false; - }); - this._forecastScrollBox.add_action(pan); - this._forecastScrollBox.connect("scroll-event", this._onScroll.bind(this)); - this._forecastScrollBox.vscrollbar_policy = St.PolicyType.NEVER; - this._forecastScrollBox.hscrollbar_policy = St.PolicyType.AUTOMATIC; - this._forecastScrollBox.enable_mouse_scrolling = true; - this._forecastScrollBox.hide(); - - if (cnt === undefined) cnt = this._days_forecast; - - let nDayForecast; - if (cnt === 1) nDayForecast = _("Tomorrow's Forecast"); - else nDayForecast = _("%s Day Forecast").format(cnt); - - this._forecastExpander.label.set_text(nDayForecast); - - for (let i = 0; i < cnt; i++) { - let forecastWeather = {}; - - forecastWeather.Day = new St.Label({ - style_class: "openweather-forecast-day", - }); - st13AddActor(this._daysBox, forecastWeather.Day); - - let forecastWeatherBox = new St.BoxLayout({ - x_expand: true, - x_align: Clutter.ActorAlign.CENTER, - }); - - for (let j = 0; j < 8; j++) { - forecastWeather[j] = {}; - - forecastWeather[j].Time = new St.Label({ - style_class: "openweather-forecast-time", - }); - forecastWeather[j].Icon = new St.Icon({ - icon_size: 24, - style_class: "openweather-forecast-icon", - }); - forecastWeather[j].Temperature = new St.Label({ - style_class: "openweather-forecast-temperature", - }); - forecastWeather[j].Summary = new St.Label({ - style_class: "openweather-forecast-summary", - }); - forecastWeather[j].Summary.clutter_text.line_wrap = true; - - let by = new St.BoxLayout({ - vertical: true, - x_expand: true, - style_class: "openweather-forecast-databox", - }); - let bib = new St.BoxLayout({ - x_expand: true, - x_align: Clutter.ActorAlign.CENTER, - style_class: "openweather-forecast-iconbox", - }); - - st13AddActors(bib, forecastWeather[j].Icon, forecastWeather[j].Temperature); - st13AddActors(by, forecastWeather[j].Time, bib); - - if (this._comment_in_forecast) st13AddActor(by, forecastWeather[j].Summary); - st13AddActor(forecastWeatherBox, by); - } - this._forecast[i] = forecastWeather; - st13AddActor(this._forecastBox, forecastWeatherBox); - } - - st13AddActor(this._forecastScrollBox, this._forecastBox); - st13AddActors(this._forecastExpanderBox, this._daysBox, this._forecastScrollBox); - } - - _onScroll(actor, event) { - if (this._isForecastDisabled) return; - - let dx = 0; - let dy = 0; - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - case Clutter.ScrollDirection.RIGHT: - dy = -1; - break; - case Clutter.ScrollDirection.DOWN: - case Clutter.ScrollDirection.LEFT: - dy = 1; - break; - default: - return true; - } - - this.scrollForecastBy( - dy * hscroll(this._forecastScrollBox).stepIncrement - ); - return false; - } -} - -export default class OpenWeatherExtension extends Extension { - enable() { - console.log(`enabling ${this.metadata.name}`); - this.openWeatherMenu = new OpenWeatherMenuButton( - this.metadata, - this.getSettings() - ); - Main.panel.addToStatusArea("openWeatherMenu", this.openWeatherMenu); - } - - disable() { - console.log(`disabling ${this.metadata.name}`); - this.openWeatherMenu.stop(); - this.openWeatherMenu.destroy(); - this.openWeatherMenu = null; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/getweather.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/getweather.js deleted file mode 100644 index 451cc08b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/getweather.js +++ /dev/null @@ -1,861 +0,0 @@ -/* - Copyright 2024 Teal Penguin - - 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 <http://www.gnu.org/licenses/>. -*/ - -import GLib from "gi://GLib"; -import Soup from "gi://Soup"; -import { getSoupSession } from "./myloc.js" -import { getIconName, gettextCondition } from "./weathericons.js" - -export const DEFAULT_KEYS = -[ - "b4d6a638dd4af5e668ccd8574fd90cec", - "7a4baea97ef946c7864221259240804", - "ES25QFD3CP93EZ9DMSJ72MAX7" -]; - -export class TooManyReqError extends Error -{ - provider; - constructor(provider) - { - super(`Provider ${getWeatherProviderName(provider)} has received too many requests.`); - this.provider = provider; - this.name = "TooManyReqError"; - } -} - -/** - * @enum {number} - */ -export const WeatherProvider = -{ - DEFAULT: 0, - OPENWEATHERMAP: 1, - WEATHERAPICOM: 2, - VISUALCROSSING: 3, - OPENMETEO: 4, - - // Open-Meteo not ready - /** Count of usable providers (excludes Adaptive). */ - COUNT: 3 -}; - -// Corresponds to Weather providers -export const ForecastDaysSupport = -{ - 0: 0, - 1: 4, - 2: 2, - 3: 14, - 4: 15 -} - -export function getWeatherProviderName(prov) -{ - switch(prov) - { - case WeatherProvider.OPENWEATHERMAP: - return "OpenWeatherMap"; - case WeatherProvider.WEATHERAPICOM: - return "WeatherAPI.com"; - case WeatherProvider.VISUALCROSSING: - return "Visual Crossing"; - case WeatherProvider.OPENMETEO: - return "Open-Meteo"; - default: - return null; - } -} - -export function getWeatherProviderUrl(prov) -{ - switch(prov) - { - case WeatherProvider.OPENWEATHERMAP: - return "https://openweathermap.org/"; - case WeatherProvider.WEATHERAPICOM: - return "https://www.weatherapi.com/"; - case WeatherProvider.VISUALCROSSING: - return "https://www.visualcrossing.com/"; - case WeatherProvider.OPENMETEO: - return "https://open-meteo.com/"; - default: - return null; - } -} - -/** - * Convert a string in the form of '00:00 AM/PM' to milliseconds since - * 12:00 AM (0:00). - * @param {string} timeString - * @returns {number} - */ -function timeToMs(timeString) -{ - let isPm = timeString.endsWith("PM"); - let m = timeString.match(/^([0-9]{2}):([0-9]{2})/); - return m[1] * 3600000 + m[2] * 60000 + (isPm ? 12 * 3600000 : 0); -} - -// Choose a random provider each time to try to avoid rate limiting -let randomProvider = 0; -function chooseRandomProvider(settings) -{ - // WeatherAPI.com doesn't support as many forecast days as OpenWeatherMap - let forecastDays = settings.get_int("days-forecast"); - let rand = Math.floor(Math.random() * WeatherProvider.COUNT + 1); - - // Should be OpenMeteo in the future - if(ForecastDaysSupport[rand] < forecastDays) rand = WeatherProvider.OPENWEATHERMAP; - - randomProvider = rand; - // Visual Crossing doesn't work right now (blocked if reached rate limit) - if(rand === WeatherProvider.VISUALCROSSING) weatherProviderNotWorking(settings); -} - -export function getWeatherProvider(settings) -{ - let prov = settings.get_enum("weather-provider"); - if(prov === WeatherProvider.DEFAULT) - { - if(!randomProvider) chooseRandomProvider(settings); - return randomProvider; - } - else return prov; -} - -let providerNotWorking = 0; -/** - * Cycles the weather provider if weather provider is in random mode. - * @returns {boolean} `true` if the weather provider changed and the operation - * should be tried again, otherwise `false` if nothing changed. - */ -export function weatherProviderNotWorking(settings) -{ - let prov = settings.get_enum("weather-provider"); - if(prov === WeatherProvider.DEFAULT) - { - if(!providerNotWorking) providerNotWorking = randomProvider; - // if we've already cycled through them all, give up - else if(randomProvider === providerNotWorking) return false; - - randomProvider++; - - // Visual Crossing doesn't work right now (blocked if reached rate limit) - if(randomProvider === WeatherProvider.VISUALCROSSING) randomProvider++; - - if(randomProvider > WeatherProvider.COUNT) randomProvider = 1; - - console.log("inc rand " + typeof randomProvider + randomProvider); - - return true; - } - else return false; -} - -export class Weather -{ - #iconName; - #condition; - - #tempC; - #feelsLikeC; - #humidityPercent; - #pressureMBar; - #windMps; - #windDirDeg; - #gustsMps; - - #sunrise; - #sunset; - - #forecasts; - - /** - * @param {number} tempC - * @param {number} feelsLikeC - * @param {number} humidityPercent - * @param {number} pressureMBar - * @param {number} windMps - * @param {number} windDirDeg - * @param {number} gustsMps - * @param {string} iconName - * @param {string} condition - * @param {Date} sunrise - * @param {Date} sunset - * @param {(Forecast[][] | null)} forecasts - */ - constructor(tempC, feelsLikeC, humidityPercent, pressureMBar, windMps, windDirDeg, gustsMps, iconName, condition, sunrise, sunset, forecasts = null) - { - this.#tempC = tempC; - this.#feelsLikeC = feelsLikeC; - this.#humidityPercent = humidityPercent; - this.#pressureMBar = pressureMBar; - this.#windMps = windMps; - this.#windDirDeg = windDirDeg; - this.#gustsMps = gustsMps; - this.#iconName = iconName; - this.#sunrise = sunrise; - this.#sunset = sunset; - this.#forecasts = forecasts ? forecasts.length > 0 ? forecasts : null : null; - - if(typeof condition === "string") this.#condition = condition; - else throw new Error(`OpenWeather Refined Weather Condition '${condition}' was type '${typeof condition}' not string.`); - } - - /** - * @returns {string} - */ - getIconName() - { - return this.#iconName; - } - - /** - * @returns {string} - */ - displayCondition() - { - return this.#condition; - } - - /** - * @returns {string} - */ - displayTemperature(extension) - { - return extension.formatTemperature(this.#tempC); - } - - /** - * @returns {string} - */ - displayFeelsLike(extension) - { - return extension.formatTemperature(this.#feelsLikeC); - } - - /** - * @returns {string} - */ - displayHumidity() - { - return `${this.#humidityPercent}%`; - } - - /** - * @returns {string} - */ - displayPressure(extension) - { - return extension.formatPressure(this.#pressureMBar); - } - - /** - * @returns {string} - */ - displayWind(extension) - { - let dir = extension.getWindDirection(this.#windDirDeg); - return extension.formatWind(this.#windMps, dir); - } - - /** - * @returns {string} - */ - displayGusts(extension) - { - return extension.formatWind(this.#gustsMps); - } - - /** - * @returns {boolean} - */ - gustsAvailable() - { - return typeof this.#gustsMps === "number"; - } - - /** - * @returns {string} - */ - displaySunrise(extension) - { - return extension.formatTime(this.#sunrise); - } - - /** - * @returns {Date} - */ - getSunriseDate() - { - return this.#sunrise; - } - - /** - * @returns {string} - */ - displaySunset(extension) - { - return extension.formatTime(this.#sunset); - } - - /** - * @returns {Date} - */ - getSunsetDate() - { - return this.#sunset; - } - - hasForecast() - { - return this.#forecasts !== null; - } - - forecastDayCount() - { - return this.#forecasts.length; - } - - forecastHourCount(dayIndex) - { - return this.#forecasts[dayIndex].length; - } - - forecastDayHour(dayIndex, hourIndex) - { - return this.#forecasts[dayIndex][hourIndex]; - } - - forecastAtHour(dayIndex, hoursFromNow) - { - let day = this.#forecasts[dayIndex]; - return day[hoursFromNow / day[0].getDurationHours()]; - } - - forecastHoursFromNow(hoursFromNow) - { - let future = new Date().getTime() + 3600000 * hoursFromNow; - let days = this.#forecasts.length; - for(let i = 0; i < days; i++) - { - let d = this.#forecasts[i]; - let h = d[d.length - 1]; - let endTime = h.getEnd().getTime(); - - if(future > endTime) continue; - - let distanceHrs = (future - d[0].getStart().getTime()) / 3600000; - let index = Math.ceil(distanceHrs / h.getDurationHours()); - if(index >= this.#forecasts[i].length) index = this.#forecasts[i].length - 1; - return this.#forecasts[i][index]; - } - - let lastDay = this.#forecasts[days - 1]; - return lastDay[lastDay.length - 1]; - } - -} - -export class Forecast -{ - #start; - #end; - #weather; - - /** - * @param {Date} start - * @param {Date} end - * @param {Weather} weather - */ - constructor(start, end, weather) - { - this.#start = start; - this.#end = end; - this.#weather = weather; - } - - getStart() - { - return this.#start; - } - - getEnd() - { - return this.#end; - } - - getDurationHours() - { - return (this.#end - this.#start) / 3600000; - } - - displayTime(extension) - { - return extension.formatTime(this.#start); - } - - weather() - { - return this.#weather; - } -} - -async function loadJsonAsync(url, params) -{ - return new Promise((resolve, reject) => - { - let httpSession = getSoupSession(); - let paramsHash = Soup.form_encode_hash(params); - let message = Soup.Message.new_from_encoded_form("GET", url, paramsHash); - - httpSession.send_and_read_async( - message, - GLib.PRIORITY_DEFAULT, - null, - (sess, result) => - { - let bytes = sess.send_and_read_finish(result); - - let jsonString = bytes.get_data(); - if (jsonString instanceof Uint8Array) - { - jsonString = new TextDecoder().decode(jsonString); - } - - try - { - if (!jsonString) - { - reject("No data in response body."); - } - resolve([message.status_code, JSON.parse(jsonString)]); - } - catch(e) - { - sess.abort(); - reject(e); - } - } - ); - }); -} - -function isSuccess(httpStatusCode) -{ - return httpStatusCode >= 200 && httpStatusCode < 300; -} - -function clamp(lo, x, hi) -{ - return Math.min(Math.max(lo, x), hi); -} - -function getCondit(extension, code, condition, gettext) -{ - if(!extension._translate_condition || extension._providerTranslations || !gettext) - { - return condition; - } - else - { - return gettextCondition(getWeatherProvider(extension.settings), code, gettext); - } -} - -/** - * @returns {Promise<Weather | null>} - */ -export async function getWeatherInfo(extension, gettext) -{ - const settings = extension.settings; - - let location = await extension._city.getCoords(settings); - let lat = String(location[0]); - let lon = String(location[1]); - - let params; - switch(getWeatherProvider(extension.settings)) - { - case WeatherProvider.OPENWEATHERMAP: - { - params = - { - lat, - lon, - units: "metric" - }; - if(extension._providerTranslations) params.lang = extension.locale; - let apiKey = extension.getWeatherKey(); - if(apiKey) params.appid = apiKey; - - let response; - let forecastResponse; - try - { - let cur = loadJsonAsync("https://api.openweathermap.org/data/2.5/weather", params); - let fore = loadJsonAsync("https://api.openweathermap.org/data/2.5/forecast", params); - let allResp = await Promise.all([ cur, fore ]); - response = allResp[0]; - forecastResponse = allResp[1]; - } - catch(e) - { - console.error(`OpenWeather Refined: Failed to fetch weather from OpenWeatherMap ('${e.message}').`); - return null; - } - - if(!isSuccess(response[0]) || !isSuccess(forecastResponse[0])) - { - console.error(`OpenWeather Refined: Invalid API Response from OpenWeatherMap ` + - `${response[0]}/${forecastResponse[0]}: '${response[1]?.message}'` + - `/'${forecastResponse[1]?.message}'.`); - - if(response[0] === 429 || forecastResponse[0] === 429) throw new TooManyReqError(WeatherProvider.OPENWEATHERMAP); - else return null; - } - - let json = response[1]; - let m = json.main; - let iconId = json.weather[0].icon; - - // OpenWeatherMap bug? Sunrise/sunset seconds seems to always return - // for same day even if sunrise is tomorrow morning. Therefore just - // subtract today and we'll decide if it's tomorrow or not - let thisMorningMs = new Date().setHours(0, 0, 0, 0); - let midnightMs = thisMorningMs + 3600000 * 24; - let sunriseMs = json.sys.sunrise * 1000 - thisMorningMs; - let sunsetMs = json.sys.sunset * 1000 - thisMorningMs; - - let sunrise, sunset; - // "pod" = Part of Day, "d" = day, "n" = night - if(forecastResponse[1].list[0].sys.pod === "d") - { - sunrise = new Date(sunriseMs + midnightMs); - sunset = new Date(sunsetMs + thisMorningMs); - } - else - { - sunrise = new Date(sunriseMs + thisMorningMs); - sunset = new Date(sunsetMs + midnightMs); - } - - let forecastDays = clamp(1, extension._days_forecast + 1, 5); - extension._forecastDays = forecastDays - 1; - - let forecasts = [ ]; - for(let i = 0; i < forecastDays; i++) - { - let day = [ ]; - for(let j = 0; j < 8; j++) - { - let h = forecastResponse[1].list[i * 8 + j]; - let fIconId = h.weather[0].icon; - let isFNight = fIconId[fIconId.length - 1] === "n"; - - // Create Date from UTC timestamp - let match = h.dt_txt.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):/); - let dt = new Date(Date.UTC(match[1], match[2] - 1, match[3], match[4])); - - day.push(new Forecast( - dt, - new Date(dt.getTime() + 3600000 * 3), - new Weather( - h.main.temp, - h.main.feels_like, - h.main.humidity, - h.main.pressure, - h.wind?.speed, - h.wind?.deg, - h.wind?.gust, - getIconName(WeatherProvider.OPENWEATHERMAP, fIconId, isFNight, true), - getCondit(extension, h.weather[0].id, h.weather[0].description, gettext), - sunrise, - sunset - ) - )); - } - forecasts.push(day); - } - - return new Weather( - m.temp, - m.feels_like, - m.humidity, - m.pressure, - json.wind?.speed, - json.wind?.deg, - json.wind?.gust, - getIconName(WeatherProvider.OPENWEATHERMAP, iconId, iconId[iconId.length - 1] === "n", true), - getCondit(extension, json.weather[0].id, json.weather[0].description, gettext), - sunrise, - sunset, - forecasts - ); - } - - case WeatherProvider.WEATHERAPICOM: - { - params = - { - q: `${lat},${lon}`, - days: String(extension._days_forecast + 2) - }; - if(extension._providerTranslations) params.lang = extension.locale; - let apiKey = extension.getWeatherKey(); - if(apiKey) params.key = apiKey; - - let response; - try - { - response = await loadJsonAsync("https://api.weatherapi.com/v1/forecast.json", params); - } - catch(e) - { - console.error(`OpenWeather Refined: Failed to fetch weather from weatherapi.com ('${e.message}').`); - return null; - } - - let statusCode = response[0]; - let json = response[1]; - if(!isSuccess(statusCode)) - { - let f; - if(json && json.error) f = json.error.message; - else f = `Status Code ${statusCode}`; - console.error(`OpenWeather Refined: Invalid API Response from WeatherAPI.com '${f}'.`); - - if(statusCode === 403 && json?.error?.code === 2007) throw new TooManyReqError(WeatherProvider.WEATHERAPICOM); - return null; - } - - let m = json.current; - let astro; - try - { - astro = json.forecast.forecastday[0].astro; - } - catch(e) - { - console.log(m); - console.log(json.forecast); - console.log(json.forecast.forecastday); - throw e; - } - - const KPH_TO_MPS = 1.0 / 3.6; - - // Just a time is returned, we need to figure out if that time is - // today or tomorrow - let thisMorningMs = new Date().setHours(0, 0, 0, 0); - let midnightMs = thisMorningMs + 3600000 * 24; - let sunriseMs = timeToMs(astro.sunrise); - let sunsetMs = timeToMs(astro.sunset); - - let sunrise, sunset; - if(m.is_day) - { - sunrise = new Date(sunriseMs + midnightMs); - sunset = new Date(sunsetMs + thisMorningMs); - } - else - { - sunrise = new Date(sunriseMs + thisMorningMs); - sunset = new Date(sunsetMs + midnightMs); - } - - let gotDaysForecast = json.forecast.forecastday.length; - let forecastDays = clamp(1, extension._days_forecast + 1, gotDaysForecast); - extension._forecastDays = forecastDays - 1; - - let forecasts = [ ]; - for(let i = 0; i < forecastDays; i++) - { - let day = [ ]; - let d = json.forecast.forecastday[i]; - for(let j = 0; j < d.hour.length; j++) - { - let h = d.hour[j]; - let dt = new Date(h.time); - day.push(new Forecast( - dt, - new Date(dt.getTime() + 3600000), - new Weather( - h.temp_c, - h.feelslike_c, - h.humidity, - h.pressure_mb, - h.wind_kph * KPH_TO_MPS, - h.wind_degree, - h.gust_kph * KPH_TO_MPS, - getIconName(WeatherProvider.WEATHERAPICOM, h.condition.code, !h.is_day, true), - getCondit(extension, h.condition.code, h.condition.text, gettext), - sunrise, - sunset - ) - )); - } - forecasts.push(day); - } - - return new Weather( - m.temp_c, - m.feelslike_c, - m.humidity, - m.pressure_mb, - m.wind_kph * KPH_TO_MPS, - m.wind_degree, - m.gust_kph * KPH_TO_MPS, - getIconName(WeatherProvider.WEATHERAPICOM, m.condition.code, !m.is_day, true), - getCondit(extension, m.condition.code, m.condition.text, gettext), - sunrise, - sunset, - forecasts - ); - } - - case WeatherProvider.VISUALCROSSING: - { - params = - { - unitGroup: "metric", - contentType: "json", - timezone: "Z", - days: String(extension._days_forecast + 2) - }; - if(extension._providerTranslations) params.lang = extension.locale; - let apiKey = extension.getWeatherKey(); - if(apiKey) params.key = apiKey; - - let response; - try - { - // %2C = "," (comma) - response = await loadJsonAsync(`https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/${lat}%2C${lon}`, params); - } - catch(e) - { - console.error(`OpenWeather Refined: Failed to fetch weather from visualcrossing.com ('${e.message}').`); - return null; - } - - const KPH_TO_MPS = 1.0 / 3.6; - - let statusCode = response[0]; - let json = response[1]; - if(!isSuccess(statusCode)) - { - let f; - if(json && json.error) f = json.error.message; - else f = `Status Code ${statusCode}`; - console.error(`OpenWeather Refined: Invalid API Response from VisualCrossing.com '${f}'.`); - - if(statusCode === 429) throw new TooManyReqError(WeatherProvider.VISUALCROSSING); - return null; - } - - let gotDaysForecast = json.days.length; - let forecastDays = clamp(1, extension._days_forecast + 1, gotDaysForecast); - extension._forecastDays = forecastDays - 1; - - let forecasts = [ ]; - for(let i = 0; i < forecastDays; i++) - { - let day = [ ]; - let d = json.days[i]; - for(let j = 0; j < d.hours.length; j++) - { - let h = d.hours[j]; - let dt = new Date(h.datetimeEpoch * 1000); - let hSunriseDt = new Date(h.sunriseEpoch * 1000); - let hSunsetDt = new Date(h.sunsetEpoch * 1000); - day.push(new Forecast( - dt, - new Date(dt.getTime() + 3600000), - new Weather( - h.temp, - h.feelslike, - h.humidity, - h.pressure, - h.windspeed * KPH_TO_MPS, - h.winddir, - h.windgust * KPH_TO_MPS, - // Only partly cloudy and clear have "-day" or "-night" at the end but those are - // also the only icons with night variants - getIconName(WeatherProvider.VISUALCROSSING, h.icon, !h.icon.endsWith("-night"), true), - gettext(h.conditions), - hSunriseDt, - hSunsetDt - ) - )); - } - forecasts.push(day); - } - - let m = json.currentConditions; - let sunriseDt = new Date(m.sunriseEpoch * 1000); - let sunsetDt = new Date(m.sunsetEpoch * 1000); - - return new Weather( - m.temp, - m.feelslike, - m.humidity, - m.pressure, - m.windspeed * KPH_TO_MPS, - m.winddir, - m.windgust * KPH_TO_MPS, - // See comment in forecast - getIconName(WeatherProvider.VISUALCROSSING, m.icon, !m.icon.endsWith("-night"), true), - gettext(m.conditions), - sunriseDt, - sunsetDt, - forecasts - ); - } - - case WeatherProvider.OPENMETEO: - { - params = - { - latitude: lat, - longitude: lon, - forecast_days: String(extension._days_forecast + 2), - wind_speed_unit: "ms" - }; - if(extension._providerTranslations) params.lang = extension.locale; - let apiKey = extension.getWeatherKey(); - if(apiKey) params.key = apiKey; - - let response; - try - { - response = await loadJsonAsync("https://api.weatherapi.com/v1/forecast.json", params); - } - catch(e) - { - console.error(`OpenWeather Refined: Failed to fetch weather from weatherapi.com ('${e.message}').`); - return null; - } - } - - default: - console.error("OpenWeather Refined: Invalid weather provider."); - return null; - } -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ar/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ar/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 2d0e256075b8bc889e5c0bc8a9e56a5e99a0634d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3773 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 NlGV4batN=}>VMevu~z^9 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/be/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/be/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 154bb1a7a944853ed66bb574778dc2d29326b509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5584 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 Z&;|Xr8C`A0{d)2CBKVlH<=p@L`!Dac?Gyk2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/bg/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/bg/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 7c68702b6fbec81c59a95613610ac55fff2bb7e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4317 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 N0wv7leVzYd{0l}NiMs#* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ca/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ca/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 94f458c10a953b5b314f1394cc4eafca3dfdccc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2502 zcmZ9MOKe;<6ow5H+76UQOM&uq%A+stbdpk~nvjYnlhR0eH8V}18|1myGvn6xda!+` zow9@l>IOE5hq@>Tp{zjA1*l?ym<1ao*dbK{2?@jk6(JT#Y%2b9<0J@c?9b2R|D5YH zKW*Ri7DK6^K8$+lCdMYIe+wFvy_*=j72F5n#}1;o4SXhW47>y539tmthxyasHjD+h z6*PhUu>LBDAG;Xl-vG(ZyWs8MM`8Xm@GgwM1j*jFAl-iryczsC%>M#Di1A+_o!<u0 z_kg=Vy8i&U1w0JWzM~+1>_s$W=OvKVn;=ZEvmkz~i-zv)fn@hJknVpIyc>KQq;o5Q zpMv*dd==abeh1>men3NZegqL>_B%-DuY;uT2KWHD1;){3L!iaRJs{b64-L(K08*S+ zK+<sqq_|xLNyj%J+4~-(eb>VLuONQx4>Yv?cbKO`<kwb^?Cb<d|89`ZkAioC6Cmk5 z36h;ANO3y@l3yvv!B@iiC6Mm<Fz{oL?0o?~4h}%_=Qoh-TnF)Ef1;uI{}aYHK+?Av z#^|0MAnh9hN$-A;;xG!5y`$i6um+OOcAx=C|2dH2|2jzaE`nt59q>``eUR*Y1=2pc zg9@bs>EBO-P-s8JilauT6;vu@cW=>K^<_KyFjwfLZ~O!*-AQ^Vw&dR))E%f4oBL58 zL8bB-D)~c&^5DLrx6zP~RQ91#9G^x#h)U%E>Mm5uga4PO!bCanNs#=evJ-U(mGXrC z6COfk$C@VhY*OeHO%_YdCS~TOWyh^_9p1E3UXWqX7Mi*$5q<VNc4@h`ej-m*qI|!~ zPUP0ASY(pTh(4K~ku5Z;-SJ!~8+yU)j1h^-+PqvYvl$Z$uT19HtVyI5e%<)`xVV4T zWOV=BGMh6n*%L~OCUni^X;WHmS{%!ctBkjdm9cQ1Eodp6<mZG!-#A6r(1r!b)NBEc zy4=btdZwpvH(Qh%%J{Mrz5|=n8BC>xI<`oju=+Bq3!ht3QWrhR>K;4LS_5~2cVSeh zuIGj7hD^KU8?NK0GRSFka_h)S!=%PqbB;Bv$ebqkC*f(K)v-n{i(Pcau_a|R!p~iC z=`vf>S(n};oDLI7wt8S$WeKk-1fp=d+2_aT7Hq*n;qe(PMbk;NB&|bSs{By7Qd*Q< zV|_I1+A4`A^0tc_rpikT^U<R0DcTp+AhF6vD#IgD<#057h>wg^4~-tE3|A_p8ALr= zbHvyxpX^xWyb>9ooobw(nOfw}X3`qpdG5SCE0c0;(xW()wR6#yQA3Kf%Il`(@g#&E zTwY(Q@>rB+r)Q@&<PJkFBIOZ~sL}62lb7fH!LAl68{=_DSSS7XsmAf>$i_a3aZB20 zDvJ%hz$!n|RKB#Jb1QUo9N*GadDbn4ZhT~nuXe}xW_)Oz5APc*y$~S-=u?t=OUim7 zG_RCL%azE+!&t^+DneWLeGO5GY>8a^5<8g-d^%C29JQ2lUw^LAg$Gu$2}DZp79M3R z7`+z*Nvx)NGD|QS)?F@g<XWn{@I}&zcyJjH9k!K*u_^a*F0B=8i5^NaSZOL9j)p;f zk92-;83DCcwsDS<@Kh7I8y8u)sv|9OG1*YUS7$sFX`Lfm=jM@!JW;M|GF2p^Ns$0> z7?aWwHPE%;;W%hR4#>Pn#aIol&@)5|hMwuk!6%8a>{#q`p_RWNxE4s)A_r+dOlo}O zwCh;SN-tP_9%`HuO)ptZx>d38POJqJZ}~qSz!1sLQ<=485#rU96jjWgF*(f26wxg5 zuLuT@wZe>72&&`WiX?|de2kh(g+)eEUJ9_tZ(Izyc#u#sPrl)$4OX%k(Vzn|rq5X9 X<hnQbxOfw3lee_==dnzmt;+rd34=NX diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/cs/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/cs/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 4accf5d527e23b7973bc35ee6f4dd97abf6e5f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19078 zcmb`O3!G$Cedmw7)Ik9uAfV!<ap)Q7?s+i4*f2oPbkB?Fo_4xtMg~`MyXtn=?W(%B ztXtJR)iF^_Oo)M?ZekY6CU$n0b=-_-5_hw~VH3N1RZQGSaMwkXjk-xTl9-1?7x9tr z@0@e1s%HjJck9EyfA^kyp8xkbXZW)V&-!J<?^)>8(9<tA<_#}0<`2(TsWBH^Y>XaX z0e%v^5_|>t*Wg9qvmVdC#F#U9zY3(ex!U78kJo^7ZTkHC7LPah@~z-Y`F<OCHn<l& z6C4LG04KrqU<AGfydTuOj)QB#6W~k0uYzm9zX8tzzXdWy^BwRU@WNLba~^mZsP}as z|CtT^(Ry})74S~*T<}vMP0bVj`&0h?``|T{UvjB2J>U>H1Qz}KL!ie0G<YHSS&$~? z%iy)(GhhI&z09p^C%BIH8mM_a0BYSI@Z}!`ujl<qa1VIF<&MusK=JiWpz0Sv@v#YR z0N(}<gAaqZfKP*E@VZwyzWq8V{;Yt5;1@xy`x2Bv{q=w^1Fr+c-`ha-y9e9>w*2=K zp!oh6sQG^$d^z|fZ~*)osCiz7@Kk;!_+#J(P~#1QlKZ&-ehA#hdl3x4kAgRWkAqs@ zc~>~R6g<d#4>%4U1;xitgVKwC1f`FczSha{a!~Wz1WG<zLG`x{)H-*8lGh}tdCh>D zX9h}s_kgPZ0Z?}EA@D}<<KR``)8KaS(!iLF;GN($@LupX@G<aK@Z2k%{@xCXA9sS9 zR}6~pHBjT<4N5QX1AD<m@I~OKLD}19Jbo6GetZs;9A1o4s-FwN_25;Y#u)`s0dprP z`<eq0xmf@u|M!7sfS&^;k0(I&^CZ{@J_Sl&E@iQr-vFrf4}z*+2W4MJLGkD3K-uX7 z{{0vzJ$eKbKbJwx>r0^c`ZfRkX)xgZyC6fFD_)1rfI}V&pyvHfQ0rL)HU7sz&G!?a z<o_rB{Tcs#4TUeF`~vU{@IsFlgPPZ+;9206pyY8iDEsdRHU2QD`A&m7!3L=HKLU#H z-vFiO-via(IafQmoexT%Zv@rP&w%~lL!k8a2~hL?E+~CF4`H7TUIl8r^`Q8DBX|zD z1LQxmmp|fT-Iu=$lpenaRQ+EA#h(v>>URaS@&skaPl1}xtC)n|w}BO~3cdt<5>!85 z1>X+-oiDGURMN{9D1O}sicjwaHO?_me0dby4t^7aCFb=wP2pYO5%8U$`0(f8i^21* zb@RUjwCe{|z8;iaZUS)uW*EE$oC3w4MNo2m7!1IVg1A`oIH>hL<?%ZpuE@L`Wqv7m z4Y&r}0!puM1=a4LFHb<VZ-JW6yTHxhyTOg%5-2@-8axyHmd9s7t?T>X%fNnK#HT@z zw}Pra?B92T>SxrKkNfgTk9YX;H+!7&IPJgB`uEgh=F8_n&HJq$-vPb}M%@ESUVnje z{v!AtQ1<!-lt6O*8Ynq_57fLaVzJ`yB_1#JcsZzbyxPA99(#QG>p<~&9Vk9;1|`pJ zAfe2RfK0{Q1;Q$GA1FEe9*D}AKL(|T-v-t0%uP-o&jlr?SAr_v2x{J2L5;Hy48X&n z>Kz5|0pA0j4_=NCr3cr5;=?Zg{$>zWG(Q1iism6udi+Nqs$<T+&h@_uRQsDjOv2m& z%Fn+8ya@b#@JjFrum}7mC_Y@a#qsqjQ2u%=sCbZo6X1tI@%aosz5+Z8ya>DmlwZ9D z)OfE44}eqPF7RXEPl4YBHP5%+;QZqUL498a#g~_{m;ihwD81b3aRlT)bAUgp|1MB` zdK|m}{0b<)^9}G^@Y^6NW6s&??DBf><-G3(#m_^a)>{Q7pLtOIybU}Ez8jSP{!8#S z@Ql|xIqv{9&OY#s-~@OW{7q2yeilKBkYILz;?oQ$y@^51>wTc~{Wn1M^FdJSd>GXH zJ`QSKkAbfPp9Dz}%=banzv3pRe``TlW^MviuMVOD=2tvE1~PT?U67{chMQeJ^cL{P zc>frv@g4)khcAGy1iu1G4&Me<?`)Jt^S>O_dUk=bw>=*BfqQu04{F{IfST_yuowIk zC_VXm@N)1Bm?V374JbZb4N9JUp!#k2@_Fz=-hUF*`0oZazZ0PP`#i|f%wPHUt58z) ze?53HI1Wml)Bb%Pv~d7@E#>b8rLVsQY94<8N)Dd{uLhq0F$wdm#|^i+xKIGEp#0~- zSA!n})qVxkygmbN0{;}${Lde9a_a%bzxANjd9B9*P;%V_N)NY!lE-b}rQlvr_EZ2h zzk9*Ezz4wF!Dm2?GqT;adm||MO@UfR72F5@5-9$C8I)Z-1HJ}ax5JnK+zCo=XF&1o z7eI~otDxp{4AlI78<d_s0*Vh`_vJ4icI&?wRJ~sC8gK)s{*HJogKGa)um^k?lpG%i ze;Pb*#OcR-LFwm%pw@c~6rWzY)5-S&@GRc12CoFK1up|fLG?caN`CJLHP6q2TL0gI zcYtT_a{Rdq)O>#y6d!*PlzuLPTK9)Q$@zCcjq^Eh9Q+2T`op`OTn~fS@_q-n4tysl zJ^U~z|F{f_-(LV<41N<l2mBr=IiJ19;T53l=tfZM*#)Xz2p#}Spw{;Ycn0`&@J#R@ zJpL0X{d)$K{I1>W__WpIHc<7q`}duo`nlbgkNNTg9uNESH+lSVk468z<ln0v-{Q-g z;Mw%M;PLI?i+H~mYC)fYBzMW=UqRA^*FiD#N$9^qzYfVp{|L%|zt01%#OmxiUl@A) zg2&$lrQ`a&9TGn@7yarGDqw$A{vL(?8d`xq0o@8ATKhvKt?d5`_$>4i=%vsaNW7I? zeiFh2%(tP}LrYKvk}gQz@}ZLVG$j2gL-#;G4e3WXG*kA;{XxwQtg^Z12Yq=1{4(_K zpkIXk8}vTt|3Lo{dIwa1^c#i#mwoE|k>30)ltI4*)u8<M$Nu3Lz}q3&+<T#a4duVL z<qzO`=u6P=L2rOQ1br2H2-5GTppQX+1N|oSD(G(^{qBTrgKmKaq5lp^*S`t<TS&jZ zb724O<L_bU70|Ci-+-Qi^qX{W%HL1>k~f3P{`m~>t&r?#7J3t;-y;spKY|CLKY%_3 z{cq?mp!Y!f{S|Z#^fS=Egnk8DfQF#Uq2GXB3q1ktht@)mLn)-+|8!vgew@Gm0s7C- z9nddBH$o3X`h5|43-oi)7^L3~(9`ybycgUGoeO;!dItI@=wCn^pf^JQ2HFU9|Nfqr z2Ytc&yFUCG&%2>_`Latro&bNsKmVae!4~M>`}g1Wn8TAijQf{g1t*}pp$B}K;1XyC z`cr5T>WB3EA5a8+L@)d<c3@-wA^-fS$Fsl-pdW|shkhQq87e~hoeA9qeGB>kbPW1B z^jS#1tD$#7^Uz13{{+1o((iYm?e@w2`J8|LyvMJAP3R)%mweeC@Xw*gpevxOpg(~w zgz{gBhrjeM_ksTxn)C0+!CwEo8T<$T+zr?9lBi&977T~2U}sv73SrjJdohi&AW0j+ zd|EFD^Kqk;HXA{h1Ys@iFGsC`H6xTo^&pEH0S`e&okA&Sq(L)_Y)N#q5hYoiCiE6f zhs{bOpkWXv_G_&kO-J=8DKJhk4lC)5+NMd6)`NO96K4%N4;uk<36o+_V_s3vN}Khd z7S*#f2`j!gT50@K`y0?YN?{gEMG^BZ7Ng>-l44Ye8Yh)CYsFAyeF56OiKw`FOFt{G z6Zf~6q0wMNFg|LA#`gpx^?F)2LsM|Y3>Ax_U@V#s_N9fe!J5rbC7wyDQPK#~X*a>N z)~p57^|TsPqG_0x2K9KRMDxmg*veQ<#Ah#pAUaxO+0109R=XXp9f;o2jO%)@TQ&q) z(?86Ij6r8^IYH0btmjs<Jqnxj)iB#DVWAvMA`7!4tW^1vSg{t;B#8>P;o3~4g{UHs z$kQ79QYo{K>K=m0v>3K}vyPUy&+REsrAG(Mj#8R>@i&vWkx3bfs)7n3#jF-Z#era` zQc342p9?EZ#2>Pf-g2$f+ZXg!J#5JIR%SZ(VY)$qRHHXvSucZCqOcw?$$HD|NRwhL z#%IBvq-&0=ipRr5tL&7ai*2Q+xKWR%ny4A$H0oiJRnP^mT<NU1g?g^d7&uMq#W>+> z7EH%cr5F?(=cb|{s@58<(^aW9vj(b|>pwiHqTVP+?^?GsX>kKV*#h-Yi{TOW)rgas zEZ94-e@t>NRN~rH8rF-pidJ501ry!1%#LOq%W4FNqtM#ufoQrOWu<ocyf4QDRnC-< zGs4i^s&N7fGBZ3feqdzB(B#N)U$7%?v@|rcFUDD|61GspVQ<r=NLp-Ve6k%%=IMO9 z=6qail%Bt$EYb|eSvXaRI-<!7n1Y;34V4aO;0^YjFC|8ynY3$(N>wVsbc92Kb<Tg( zQ#?(kS6B}7t)~mH_E4>~rcPgp6As#BXB#H1pyKUXDlih(S%>#yyT<m9jsz2>s8Sg) zBW46Gl<ipT(i2xO7FHuOA`P)RhQKTMHM&A|!%DnhT}Kefw**zD%PQ$KvD|2s;w*@# z<pc3*bKV)I^GP6oB+qJn3p|m(w5A&{m#GL_TiuD22xp#7JIB<sqpv6E*~uRmHsE?G zMl<yY?XHBhN8`KakV~PS&c(%uiQ?Jg3Y=}CL0Pj_!|!OKQoRU=k)SxuxYFns$Gllt zLxs!EqgO&To?%H*qcaxKU=CI=M&Ov7iOE4Bt)%tL><r@yD!^pg+=Ev;!wL#w2Zvkj z2xP-R649Lt2Aw8F3ZxA*jaX^0FD^%eW@lVSEZb9@;c$d%n4PIy7Jjr^qh=l_^9KUf za~hH+6Ilrs%}#i_09R!vZM!a%SUoGLDC8wk{U+%+ah0%xW0600HE0zh3Hrcdr)*FD zWhSgdJjVEE<2ZGQ5UC)vYwTdKOPwN_@#a(|F0jA?Q90@hV20`ho282Kbamsa3LDs; zA7obq$6Ztl#=X$ZE>x>M3Z5-9yKw`7b)rfk>>D<Tz~N-pXwjcjoW7uzVu&*EZvUU8 zNhFs)Uy2)gU{bwP3SKz+-Dy2upf6TITkGa!#YER;zYROPkxe=c`}(?ESf2*0NB!0h z1f#8XY?eqef`5TXPv^~QjM26Rc|zOp<dNCaWoB`fDM%>=a@v};5L7j=9w+yQ@+*ZD zuUlwTS}N?AER&dyk79~>uhqy$?2Pb5%0yNW1_`-Co6A$JAi-1g1vgLKLf&%ohN)Yq z(*7JLOdw?Hd&m%uiW5?(f_KskZoL_u__RwEVRc-z?k<=w5#HU{nzpP^Ny7kpwcC}0 zw6%I9&q4NuIGu*sN7`ccS#KZ4b^qj*WFOkAndFm1Q}?AIL2@P-7|^p<AY~%Kz9^Y# zlsbjE2{h6{`Ods@W=2Co6NGt8wd}XiFp-<_1}6`Nn`Hf@HJkI;MUIMxwrK@97{*$> zlAeyn)uvJ}4W08WpRJ9%KS&*Nm)vsINAJeo06)`ADsdIHEw;Nzn$;<cm@371MtM+( zc9K;fr(#ryt5%a)+YjBqii=zqrL0FkT5FV-6gq7D$Q^W2IWw9P0hA?qHE6$EpEOFQ zg->#(H_&k&UAE{yy1<v`DSU5B=6PHzo7u4uGj`Z0tacJHLNqp*r(!bpLRY?KlT9+N z0i$$%!kVBNOM}snYyo}RnKqN63g9t;jRa2x&uuhgIOuSWU?ht-V;#9GrzhfJUT#yh ze|p;NC$sKK%B*7NUi38I27^6SMN`zj9WHE;Pl*ie;5J~!L;h20JDzWiloGIQIHe$u z?sH@XD8WEAti1*A))*+H)lTKnu=WO(x-Q7FiK+7;9&Ehx3`YpSC;5?FYFR*T>yj_I z7BjBBkNX>pdk@a5cjbGMz)wFffmbZJQv*Kw8oB0=`v>B)GpBK4MU<I#`9X53_S+y& zE?a3oSVNj|X>)gQ=u~jw%GT@Y(%1o(lczrI-A%r5&ky4@83pi}^}4XokmK_C>iW~v z$TdaZD)`QJ`o5==kMc>3;co-IV)1rgowW;;_qJ7q1vrP}Dh;TXS83<+%>lasoiGz4 zX5z4!kWY}oPLN(2ZyFAQc2n(N@zK7RAhR!b?ZlDpgxA%`1HeQ?GEl@*+l?y8cFk^w z+liQS0LomIlDphpxwaNCZL=}4gkgX9ZkPh?qF_H>n%J&KdIjCa%1o5V9(q3UkshRF z1FPIN?=~&|#7FYP*wxc~vL*=>8`5S{kFgAwK-!shxz-JusN0baz&*Qr&*W4Z#HN8x zXI)L?F4TX`+OnONUK=sqjVbx@G%mxhs@&CIz9H%izpAF0h^w_qJl#TfY>ICtv?o8= zj3!X8s+nliQv$g6?f%Vr_6dBV6veS%1E?vvw0WJhQvo<Xvsiy}y|%$m*i_0m2=*}N z%uIHLr>^IdXW0Fz-CuX1bpVrMXYN(%r1FiJofAr!!r3}WSyZ)NT6`vxG?R9dMYxvP zm&J8LMb}1Rz}2YL)0ui$C9tqdbE)Cb_KE%b4o;5jyCWFe9~>S!aA0U`@(y1g=4cb| zB2!pH05tRF>9pGlS+i)nbtM+kc^#On%S~WL!rYLnk-8+oK|So&Xg!l_)-wraQaVE- zhZ}a!EQe?7%ygcW5sgomg>T+cs`uJj{@{z_hO|&7FW<B||1vbXVSKdD?lOB_F5IiN zOuH?T*5J2mZqcwHt&$pZ5RgA~pCV22i4V%{hZQoBCG&P6bFzI1v!iWHX0qP25?r-~ z-PxlJL(h($Rf(1qJjhzrsg%8W-Y(CNZ5C7HOs$|}BMh&eHrc_1nkk0rPEKrM$)N;Z zoQyW_g1y;1vd`^%m4Tg93kA!QtyR@l_a&w|vu=A8<g8Nb3trg8bnP-vp1|{WO>H8* zR7UoKk=a;bUo!r305_kQgLt_eZ1QmZd19fWuyYjKK7v3BM2Ca+pam;&Cj_f@{axyR z8egT{%^ZqT@^oz*<%JHL!x8%<B|)e<yI`~)eaqbL3B|sW3Qk<P=HPnlhP?eDkJ#;k ziQN0=O>NlmGj8uT4oAhrap$nMrR@JXM?I{Q%;C1;3|WOaxs<@z{lPj}SI7BVaXYgG zgXRuSbnN=r#Q5W0)<<qZQtA@1zJN>x?*Y#nb{j;Ku7hyj$fkxxPB~7K+u;YoM%7G( zbrTKD3=p+Bnq#{>lFV@WQk3;vziHt5jW=%Da{Uc`{Tl~1ZNBlw8?L|3z+bj3Y{GO5 zq+?hUC%b1%nVhp+-B2>+#8fG)s^@BzFPz|-S{54uC^Q`LXD2iU9SHSj>6rcdyGo;U zs@lJ&*zc3z!Qi@qjcX1>N_zW8vzfTqzr8t=^-r=fTr<AE|3EYs>(HWqm_5f}uz4e1 zYUB0&8*d0U-8i^$^R*i{Z``<MA14m|x$8*lgTcOLF)9a#TE%)8++3NHHs018C~qDp zEZjnEclOjj8HH6w$=?TqLbhgf&*(^JZkw1Jj)-Fh`ft^kfR1Z7u-lH4n{-N3$Iov& zIJvWbYp0%E7#AJ=BS|6Ec6cz@Iu$q8j8~c*%JieK)od_GYW6kTcHK>Zd)&4z*|u%d z`ry`JV=x%3OK#b=Ik@`jAh~(l78P!yaPv)T-q`PsY_O9-9D1a~$Lj{R3~XLw*6P+J zNtTWWwUq~=VlACpesKAI6(`YjlQqvOb6IeQhn1z{%lAbCYqmF+?++HjTC)5g+CIlA z1d)6$%6q9T9Z$mL`?zaKIX=>-<p-0c6G7Rw59;Z{%Hq;-hND3r<4nm)30AtzsW)fo zG6``HIF7kWy7H)oSXx|J4ALx}(ipy<bwjmSTaWeJLTUC($FoXvWieSgR^lDkz|7p0 z5q8s_p}p>zYE^8LxVW^Kq*|>lNsCM%WL535AS^2%=U9m;B;EHtC41LHxZ^UTH5H0M zW<N&?mAD)hVl%$-00(VsErii52Xu2w$AV^+NjAid<K{?+-%IF~70tD>a#&91!ot#V zCZCpJz(OUO3t3vN&c4wcEY?>ZZO(c}-;q@@#{DfVvRK$U#R(sbHhWomYvs|fXlL!6 zh1pBi8f0-W3!CG<VC7K`gGvQX(gVM4wBn>|q2+s{x;oq*Eg-{&c+7sdnwFZ97_*3L z=`794h|3(Q!+myBzCzlF=G4HRb00((GTL+YafoD24>ZGTN?s@FURQ<AI+yPspe2VT zOm`M{n>NbY95h!RjT<mls<x0$)x!m=h4ogURAIn4(6sAKr7?2~7E~>zYTXKEGyLff zbf083wEISBq8f4rFC9ZY%S{sCaE`a-`@&4Z>@uZdeCkJ~?Jv+qT9eh5AGEe0`w%0% zEwI$tsN8Ti!lqt|&Qew$2#W~^w*(@TESOq4!366|iwi{-eQGtXnW#lgo9tDW7M<*! zHQMVXci1=9HXL`ev`|hlZ!}kiBg4xIB}PfgTxQ+wKcV(VTs0K7V|l8r+bOdr-|b?~ zoZU+SWM*hFkJfe_Cr_$q$2_^Nyi2p2_x56HX|Yf;N31?zRFZmi`9abIb7<*Ap_DGr z%iPk5mBn)CY^}4(t{Tosou<lu=O$3~L#<k(3-4|{#jwk;-RcMGxpZ8tVnFJ|-at9c z#pT3h^2uClTr1h+95zvo>daYA6al&BI0QUFA!h=<rE65w%&nGjVs{Ksz^vQ7Tl<)0 zUdPI5C6?G>hBPRXeJnpHowaJ|b8>%Ab;w}1;T)EVpIV6KWaW8DN9Ce+nX83LX56`G z%>`VeW~{j{E#l7D$QRrdR)M>eBY6m^rR8RkX)Ve_&8<8<+xGP~V{~ytHoht<%;Hz& z`egx(2J@un&d!fl1N?&a8_lFFULZ3BP)e-7TM%ol;$@9yZRMVohqWo_<9dsoL8Hh? zwC#u4Xi(>5q%y|~(QLTTTE0&zRZ9t%b$Owz+-jg_4K52hEKeeNn10w@w#WbJ0!#0T zhjf5Zmn&hBE)*$kj8pezKRkR_m0IRBfYb>QP}TWQ*lRaXSV@Pca?44yPz+gXCG;0v zx=Im$8!7x)6@6vy3WZ5r)-2?f8%waREhcB@nh*B|$_)n1ks3~~Xk!?YA%e+dvl_nN z2e!RLGE$yeh25IsUni?rZTPt=+hJ|uK`_hh0gdcf@(+3;Mli5aAey_yCJ}aDk@1s9 z4;Y2BtbyfAl#ROCF1J~UI|bv?z_M{0Q*OQ%BA$P!yRrRKQ2{gPa(iYJf2s7xjfruz zwS{z@5JJAdFbLZXIF3%uam_>+Ov}oe{OuTlq{XS7as`!F+aIE8Ur<FRrv$g2l@m*g z*x?Cj_V%UY6`q`f@9}}1+nhsbF?ERuyhlZqd`&GKFUp})tC65?t36TG>V73HwYr6r zD;fFXTx&`p0rfjnDV1qIX!h6fi3w`dv2zr8s<L#f+LF#@);}=SYF8MqvMDFIIaWne zaNE{lav_P&wRvZwnVUE1mJFy>!tFR)vFR3i*_CjyyrOj!iwi`ISu_~)=H?9X5Jc?d znY~FvW0kq7Aip}Z!6WPo%Ixo1JoCj>`H5P&AzL3;s$G)T-2qvDL;66E?1Sk#=u9%d zPWz#9y94Qh5&=0c*c;6$rY$BY?F3f~Z7rLKaB)@V=$S@WAo<GMA9D9WF5CvirDGLh zoI-xHn_cFhjS|kzS@D83BKeBY-LP4<aV#juj@BSfr6o=K@jz29@_1kad>AO4;~ZvV zv~T6n{05E`j5~PUyjf2W`rEe`nwPzzdx1*9x{VCQF#zdcx_;Gq<zUz(E3#&~=w2Yl z)?s<fziDc!c(Gnio6p;%Q3=b<AE}{rime}|>B$-GbM-N7vtE{1&$`@Ny;+ni$vsel z@)J`r$1Y#gF>5^5BG!V1hgNmi$s)_H@2B_UoeJH4fq#lQamY*@VKA((y7I7coYmPW zV>K7FTf;t<j@LqF=e8$ZIfhTy-HjajLLQ$RJ61*z<8GYY5AqJ#*;u!?sDB($3{CC@ zWu!_>*yNwq5XbB?yMi@Swz^VG$PZ4+>hn$wM-oJd{ioj8<+pM+0qqV50c*wM;7M>$ ztHLpHHov0V@AtZ${KuSHL{@|Hp7tOouk82AqyB_Qj*`Tmh{4Lr5&H|fNc&_{3q}8v zxT7=&%_)Yn<UjmZa&AS*ATg@FZ?%~;z1bK-kZONmmD<p*awtg2C7d+iM6*fO;ls~! zRGY-++Vb%BYJ-CHQh_x|_Pusvh&Pjk8nxj{uS>~Sy|e>{PtZI1ySkd)Ws=6Tk2oP7 zo!rh^3U{bo<4B`z>i+_5RvS_)Sl8JH(S_Rutv_iSL@fl=PO8?M{n|wlhEA9G8!lP6 z2+XUr!;~w5>2oWKQK5u5y7p<jwJYY^Wny{9df<V*uRWyQLCXI$u=kMJd&EqnQ%d;` zDn79}+TAwLPSdv01`E<3Rk0f-Mdt2U?GA<7yV_1)3SSdZnR_LdH7|5!qwTDfgbE>@ zqJbPJDergg%x|E`IBgEAxa~jvzxLnWvM~f&QABmvs3<WHgTv93HNi%+*qp_=YWr$K zx!b-WMSH_&l^P~<II7%@qfxgn@w>cWVQCRJxxq<^1Mf<cf0!$~<@DQS-f43K`40Ug z<**tD>kirTAf4v<yT$cvzw8FtH)zVk**#!hF7@+@P;72+Lvrrp#%ddIyBjT~t+ZX8 z+0&Y$JsRrD?eKtZ;{}JDlRed_+cA&ZNR9>;gSog+B84Jdwgq`WJJc>7ixk-+zlksU zN#}EB1I%vGikqX-CVAP3HaDK5Nt-9Sdn6OJcaSb4J!bP!?$Gj`&U3EANkrMQXRvS5 zDd;#Zmm$CuMc-g<K?W0%>$4$lD3g?XcE?Uji&Z)x`>ICE_u=i-2RuU0bjil8<f_nu zwJ8ro*a=xPUd&!hN-3kcg+^GCX860wvE}y%gtxng$CmC6jx61M;Na~;-2Z6v*ySXY z*jlHp&}}2eDTcIq23${i-m7-0qV2AYxb1sNn+B@St}X7Wd&}i}8*>~0mW|HCbz~(K zZMNSQItPFR{x}&3cDu8_!JwBL%U*Xq*{l8odpn6k==FkirCsZjN3#1s6kMA{{{8Q1 zPb=-k<c_Gq>8-*;SH{rs(j3o>W1Ga{MY)|-mXaTv1{|wp{8L4&9%HxuPxq9hr|xDF zC6LLm_32m~DS6$Wa58c=B{~Nj!PYn$^&Z4`s<Ren?5oCZD`5MxQ`J*^ft8c@02|sq zA-AixFL)jg)JL+fvk+1Vox`T>5xo!Vm})FnmYd3eS$e-VT_?PK>g3Kkltwws!+nbc zZ~@h?QfpjsH=gC<0N1LlwUa+Z#(rYcm)|3FzFCzZ9=YaLudTeoBAH*UE3lKfF}d7e zi1H}Eman6cMqPVl4Vrsi{!JT4<rH<hE@i?x0H4C-xP3>Ug|v@rVh$}hnq<$Gmf(}@ zK5SfhQtY>K=+-NSa#;eMcIEQz(oTfw)Ew4URL5qnB@b%JZ0y!;!XD0t#+?_KiEbUU z4%8|b=hx5m;ebDT_lnt;QqXqi`IkeoD<x<-JGy1#{(lykYA0ua(|ID>M+`ikxx7{9 zfP4yzgf_Pbw!~fcMcjMlcSg^hFn8U2CLt_#cb`iqxcnUA@-vpF<RJd^x1XA(yZz+U K<p1yO=RX6XBD44a diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/da/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/da/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index f4cb59826f359b23c66179255ca1ee5395ae3d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmYk3&ubJ(6vv;xb#(px>mW-lC@9inXA~1Ui7uK61~OyJv=i_m<#eS}rl%@YRVU8H zi{MQJK~_P;%X-}FdK1ZUPkR^t7Qe5jMIZh8Q?Kg#Uf1jQ?fCB31Um~q2mcDc0Drdw zFIc>jh?f)KUhpb-08DDmfd>(H>+=U7>m`VX1~pf~-w<n%^;;m<c?Pon1&D`U)_eu- zNBkP(@4m0&zia*j?!*4SAm@Jux!xCW5BMKAiG%+^Jal09xXvN4f%pW-y5H;ge0_ce z<a*b^UEmbR`7_`#@FvK8+ygoPA;@|KvOWh{zYg;KOwG-jPeJbMc^$t5IsY$^`+N&> z-4FFXmQ`J@#d&Ne#;A1M%b_}EoQ5B+W3KnB@r>E{KcPIGgdc_fup?M-k8Ee)+{bbF zDLBuJ`=&O{JDtf9-6@AU(_xfg<(wW!qiE5}Oq*OZn@#Fi!?G@Q+tgj5t_?zNN?piD zg`%ZGNw36~)Pa_q^1gH`p&s?x)LWsR45j1bURl*h*GlI(PVLY-XSXOVRkg7~D=IVf zTAM6EHTzf%LbQ-YedWBiCJ__OYt2?;S#4MsqK?mX7TqdyAEh=CjitNMvf9+FjOJue ziD<<Wtth@0#gihwn#7Zr<5nCu7NrkS>ZI|74Av#0qX%nJ6=GTXVd=dxVrHn_pP3BO z*kRMCa05vuFJ-QxRLNl?=A_YnP0ai}NJJ(ZorO;O*W1R8+tvhS@V(InE)>+0aAl*A z+Dr?4(|HwU@2B(8)K4AXYgM_ZZ3dP{kcg>AIy9Dw(#ay4w{GYYVK%DJ&$gz;csYB~ z{4qOmX}Uq%Z!lPu$(-iPJm`E);b*3!Rcq)DZlc_Hs1gIod8p8L`?RpWu0+s9zWveU zs?a(0Ar_m;VC@5?ZnR#_74lx67PmiPt~vF#KUH;7%X7_XL13=AGL-7^MxXAQ>ZD%{ F^*d@z>mL9B diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/de/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/de/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index b364ff8c4881fb638ee0803433d97fb53f6a6f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11413 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 F`9Ic}5F-Ep diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/el/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/el/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 28a833d95b176d8131c7ca9fb3b3b696326aab96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2894 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/en/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/en/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index ed83c80dc8b68e5c981cf3c47a86ba2733eced08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcma)(&r4h}5XWO{FX>I%TMyHNU=Q<rZ&6vYZYi~^2re$Nl^zNu-5uXc`*!k7vi<QF zc=09$|2qE`Co9xbp#vYj$>bX{leybi|Dz<<g;&D9@J#qD<miN#!lm$BxDvAWMz~&6 z>Q?lHu=zwOEowxcijG9(c;(Ie9FkJ%z%sB;F!RhbOOQNlMs?!t+;I&>QK;{W?M6+4 z|0c(HJjZhi(RnsdvtJO#hT0bCS0c`7^d0d}vZ<jE=)y70^%-?OBpk=u&GG%RjyUxO z^yC!J=!aX~`d||o=#{-4EcdY2hpIBWC6>EosZVT7I1QF#Ym*NKres@~5Z6n`u>VCK z%&T{4nQY<wTe%<!TN8?L@&9%M#Cm)@9zC{L6{SA#EWJquzdI>0NvGRgYaI_@*4Pj! z4L?o~vH$4Hm0nQ55zl=7MFah>F6l|T47SBX9~RL7cdKn2_6G2<9BwhZ9zykIpg-Xe aF@=Y2kJ8`PVP~(Xbe`EiN4A<+*Qk2|K%|BM diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/es/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/es/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 484aa95d037f59411cb547f7f12658e2bbad8239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14091 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/eu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/eu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 612bdd70f43a4bcf523413130b350edcf40ef8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3677 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 B{Y3x( diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 8dc1770d9c4bfd186157a3bec3c06063ab6bde66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4521 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/fr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 564de0c5d193bf316a1e9665a0aa5730272f1d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20239 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/he/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/he/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 2fcab7662d3c94787be1855a5cad345bc3d7d33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 zcmZ9MTWnNC7{@;aZ!6wFMZDnPl?rFs76jZ<qn2_>x}~-YRiiPd-RbVp?K#akXMuWo z(3t3pu`MlaLs?2i+HQ;wCcf}&qKOZLgk%yE@yR!0d^7RM|NrcC7ntmv-+c3Z^WA3J zYwOoe3q}U>NzD1%L^`=%gAc~mwIcXQ3qE&(X%HszGPn-h1E#?JR(}M%5Area9<X5P zgZRlwD}M^|{FmUp;FR5803U!{1L@}y$hg0PjC&cp9lT<B6{MX39|!*e=}+zuc?ehs zQok8wKHEXs?FR9aH}Rq00g!&*wtN@78}j=gep14ReteMrKLMH7SKx!-Hz4g7ELXsX zA^!;81^xo^{AG~w{s4LIPmp>213m`+2jV9i;QSpJZUPx6h7<b#*zyaI{=NpOKLgUw zqTT=A%9lX)`Dc*luYl~!@8AaTI+*keO4_Xhso!L|4W!==5I;F+_j@e|LFN&I3jEye ze+xbW`6s*o8~7;X>mcK<fm1AHqoo2Fx5cs@WL-I{&x4Hf9>{z@1o4v-_&foAX63UW z&n<z^gFo2)t03RiHIQ-t23haFR=*aH_&Lb;gJ_BD1bI&{Vd6<8Zv&>u;QQfFnCrQ~ zU`_lR;$VI)n42kJ@SYiy_sTnFUW{=+CUZb2*^0^fnZriRr!YCTU_P6y>h-gSHxAay zu^p4|jble0vJKpX$+~YHFWQZ#!L(iTPu{`gy*-1;zVd&<3z*XBmPe#h`>_tCOAdrO zDyhLx>yNY*if)-pui%c!LD-e`s{T-A#4C95SXK^I!q6LXeJ$O3IF@d⪼YFg?45A zbq8+2^NT8-PD^(%<i=j$N0JK)I&|ZP*M^(~&ILXL_ef8d^bAN(0Kdmwuj~#YtDefp zpbk|qtY8x<&sW1isE6Drmfo^<Bdt!j9@atRF%}Jakz`qVQD#&LwL0okZ>6mC=`wOu z1KN#CaD3Q@zmX(Q>0?dOFa2H8KOp^XTnU+2e+&zJ!vKZZI<1uC-(N}c&+Cy<R@sP| zFIB>b4)VcB5Qf1C$%n2VmDz|+)SM(7Nxq^Jt7BeJM(<UWgd3364EuE)qoolx3Vz*m z!1D`gzlS~~H4l!d*XbW7P-IbT@BviL;evBahY{M6Rhe{as!xvwVeI6hqE~R<s1ze7 zA7oXk_lVP{k9)Lp_9MBhYRk0lax%M|wp}XIn%%i)TV`h_lj=s(oz)V8FspKI?D}J_ z$_0^*)IM~P;%mb}6s3oPv{!x=XZ&KtEovvP-I1&^i)O+sn>kZc`<lwED(O`2aIUMF zZfiP|LXToJ#L171BBxlNjCYKdUC(b<LnSwiblh<?f56$>v}1RNb?9{YLjhl5R_z`1 z;#6<B61rvQ0B$kLDt|N)qmH(ARbO^&_0^UR)!NdYddtD{=OwbdgR#A?AXIJXS6b7% zQ({)kl9?4#MHOevX)aD<IV1Q?n;90kY^KDV=R#2Ev^lHHbVI#l=Bb`HGtktsVx~Yg zWXYVP^Qsv)^I{gToI|Uo6cot`>wYFNrm`kx7H1dDIsUET;1Z-Ny*7eXO%3t_1KQ)~ zlM~Cdv8hdnxo9q68{zFjHH*4ohlRm--i#}hT*Y~usG`sdW?7+(xnvK;P9W+GOp+8A zXpRD)tgRklu}NDdaC+HHvfw!!nKP&GE|T7SM>ov5iXzdTddF_vMf+yafH{`Pq-Wq@ zg}!WdrxF)u1>5w6+#0ua!;UR%g^BaxrcqI|V~eO{^*(vKxN_UM@td-qg>Q5sxs&7t zSSy@mVt5NRXeU?GxM(Ko*-Wx`<Jg{t-{y;%Y-ExIWeQb3DPF-8+|=`LUgIgjb7V+d T<V_ygNVfJOCOVP4gRJ}yRT?MM diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/hu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/hu/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 2bd7da6f8d2563f340afc88e6871d57acb104bbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11619 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/id/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/id/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 44ae843410ea26b9f44883c7ebc041599cfa8bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2848 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 QB}My40cTMqc>$E^KUFAi%>V!Z diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/it/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/it/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 349ff3455031ce19c85e7bd06214795bbab0c335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11401 zcmb`M4R9URb;mE?U`z>wLV%WBJ2<kzlD_~GfdjHF+X|8_OR^nY5?H;rdRqM6?qheK zWT_-1P1^94qy%U}n-8Zz3n@@ar=*>dW+rZ@p_D1@G&9XiN+)e6ZJIQlz%Y=3r2YNx z-hJ=M*e;#vj?Vk--o3l`-gD1A_ng&>XP<b#;dl!91>~`ljQKBk_38X@y!La(oC$vd z&w{6M@pgEj=NfoC*IVFmaGU22&-Zx_dyc}>s5b^_%It$Dz?<OPU=^-{E%=M@OOQYF zHGWpW=i#aFWq2Zd1O7Zbj)zZ%=XqWP&*ORpRDU<YI@|>{v_FIA!oTwOzw57GfqHH! zgS`}94Aq}8xDqZvweujPs`(1M9R4ZP_<syffiL^}uS1P@>DfiQ=R!TV9BLdJ;2L-} zTng)O37m&&=i~4Uco*!04?w;Do4))7cn;SuLXGQXXyJcDwQCu?cnRDMFN4zKolyOK z5=swGLACcRlwMzedhT0L{rV@U_x}*8z1N`hbOslyw*oR$vj%R218_5(hil<8kf}2N z2{oRdLbZ1~lc#>14P{5?c%BEPhYO(ewF0h!S3o^~6TAS%P|w`~WlwiQ)&C4!4IhO3 znHTs`|Gx*-zn7ruU&7!qZL=1t|JOkEbC<skpynxqYWG&C@!sjn?}N*@{(|S%;e}j( z7pi|hh3d~cP?p+T1vTC^Q2k!#c^OnY8=>@nEtGx+q250X)qV`O!CT=*cnHcKUWa=A zgm)D6m%^1?_d&J07wY*BK<QyW)cfb4=J&(C{4S_|e-<)D<|(ND|0R^2{)6YK=NIeg zN~m@p_Iv_j8s@7|<9H6D0`mgY`~D58zi&YG>qHuRFI)oEzac37?1dIy4{6dYK=tEZ z&xfG=)gM94$KOHC^LL=?zXWAJr!yIP?p&z$df<B43)jM%pyuHoC_i+c=jWjG@_DFn zJnH#`zyF8+`m0dSKjX{4?#mB(e$$sf@A<c$-}3jr?XO?-{AXYOJ*fWv!1KrOd=&F4 zyqxm0aE{XFcBpaR0Hx;?N`H5F-sSm8&rf^a<9RQXp6-Vl??I^fd>l%TPs2;$-@xVY zbtrvabdfRdf@`4aPeAqe2B>+Nf|}>spzQ1ukU#S&ei(vz9A@xYsP(t$okcstu!rjd z{`w$P{lA8quYZT@;Q1C`2Csu^=Oa*hxE*eSUxd=bccAS3MJT)c4=6kP8PvF!E-UnQ z9@KRo?1%61*E!VqZu7hys=xQZ4e+2Z|9hx*{t==g^L;3No`TXe?sK5*bOTg>H^C3W zLHKU?5Ihb(2UY)hD82m<s{NOt`uzq}`%6&1cs|rTtmKC!Wrm^JnTDFDCe(O73Wwk` zP<lN1;^O&@Q2pKp)vs}=e(ZzC!y7zrglc~Z$}XBv{@@NMfB7enA)9BRp8Ek*zkdW} zr?0|G;nEdFKd*#(ZX6E6DR>fm1Ztk1fU@UrK+XTR{q-x*%^OOyl%EH6eI-<TTVO97 zhWwcYei*X(GL&Bb0<txle}yN*SE0uHGpK&c_{0;S?w<@#f@eVK`|XgSnC1R@JG_zW zJ#YX%4W<9rpyvPhmBqR_6H;W>L-lhX)cp$7dz-%eHmG^K9co@4fDG9@441>_Jbwf= z&a+mrhrw&$hvCieRQP?U{=WpZE`9<}glAHjt-_oGrPtL^^>;wk-vzIQ?}w+s2cY!x zAe8<d_WX0Ge*X)UK3{^%;7LsK64(RP-}Romq2~1fq$}obsP>+Q+Q+^I`7^KZBmFO1 zUHIdRJy$}tw;F03S9xCR?+^OxA*km^efch5zT0!3FTc^V;#u?e_xtOnXYR`nK-s~E zJU<4d7wK|4qT>&cFCt43*@)tak03hc3YcB+J^uVt@C%66lXUSE@&QD8xE<+3u0$q~ z-$CY)cOr)$@1@|@uEMWy{vfg!`5+P?Iy8TD+k6Sp+B*f&+-sgSXQv}tt2%Bj;C^r5 z_i^Nxkh_s5k!^^M-z;Ee;1!5${L{!VQXV-cn-HxN9ixbB;kS_tkzctQ*@x)37jb(u zd`JZxzl#halgO_k_aPNThxVJ_aA)`<DF6HW{#uY7UVz9hbgV33ejUme>i8`rL^kWf zAJ%iHr|kSl$Gd&ufafjnCV&1J*hGeqHOS|XDsmh0A><n55=6)6k&ht_UHD@GKH$%P z1-{Rp3%}>jzYMjeK8ZZy%j)o>$iqktxeU1;ISH9XrVy>C`w<-nkPjofkv&KYS%-`u zCnEci&mxB(DFr)_dyu=3tw?#u@BA{d3>ibNLv%cbT#lT8Jc0Zgq9aDmMb1YaMIvMi zqN5*qzdI{_HiCB{2a&fSS0Q&I)5s@~apdF31|&grtU#_sE=0_V%x(?l?Y1NhD?yg) zdM3#1R2arKs8+-3qLOM@5A(yyTFq*pvegzVT8G7MK+6MTLv}Dtlhh1MC9T{HRI3s@ z8qV3_q!Q#&5}Sc~REry7oZDpD<};yfCe2pUPNzx3*2C%C=7~+C+6<4^=Ysjn?hiw5 z`>xvXKr@Kd!+~b=x^Ui(hqtt%RM%-}=aZJrTK;4%pbcJDbl)ytkuAT*Yz~7K@5;@V zpx)powsDf%N)pFm#noPssk9Q-%@+C?rXF@OsRr{sSx0BZ?RLkek^_Ba%S@7Fp&L~z zj`Ga5vaqTub}ovmHfx4qwa*UJ>&YDDvq8NTW;UR|J^Pz8J*#a`!(&aRtNrxNolNHx zSYFdp_P>Y5>S2&tI+@O!ElFIBq~6R9#a(?|R6G{M8dj$)>aN;KQ%%a=Fkn(r^g5k} z*^JrZ%jbM~T9n&J%3%bY*hUn$@-Q=7!|9+^&+Sa8`E%oT6U;LqFRw6I=^>eG*PM&0 z`OL8^%J$6GC<~_QVP|B%0PWT5b~?-}Gf`Z#ScYw;2@Pes#K78igSiGc(LvN?nPbN- zNs?Bh7(@02qd_Ay+rqG(+2Lq^*l)H)X_ni~2{y7dtOxUETe)P)6MGDW*l3#hQOB!h zo3v@C(lA`033pKo>N<@uEVF%d=g6Sl6Q-Hg$oA3Qc6%6yDf%62P1U0c{i%d;7Ou9l zMIF0d_E4wqsqt0C93}ZiwuedGFFHGxCbLmhRT+NS%8n$B7Lqupk!F%P^O4F}o2_1F z&O2I-2z|}>n;lp|RKb4C(6n1+Gr??Vqb!pF&qd53OE0zAe3pj|8?l};TaB_ND$_(% z5{#>o*XLE}CNiIiGA+*O=zxuKGZbS=QPpae?A#1)D8smmN!9Yv;_btSUMFABR{db< z3x)%l&&@FI!wfsy3!>DYd2I|Q0aIPGeSLkV^hI_uJdoSrFs|h@ox;jY5Z73qdD1US zDJy4YB*5qq?oG|Rdm};ILVMl>P(>ZfWBKD&)|aco2F)PN-73fNVLsJmyy-yHXvyEH z>CzFlXDg>$xCwNS=iZKc*7l%o+luQ^Ba-7SUlF$&Q(>xCRHK?)PB4v0I2Tk6D^bHu zF8wwm3G<J+l;+XCc4jz&SHKKM&FG*R-D~8rC)^B}(Zr4ftS?5lEosG76=1%s^NiI+ z!O`bylw}jl22ov8Zbmyjm0QPeFtf$}GZvV_IgMf5Nlc%$mEhjZ;RVG$Q4MFqdeRKj zzDCfz1slx!DoLYLc_e7=QfcuD{3K3!F2K&lI_GpdVzDf?vvLYD+t8S$e3_mZ(;ij) z+A+UYxb%w#m+QM<mh7CKX7V~U7_6^>>a;_dF@Iurvr)9K`Z@C}wLIzUA!X-$pUwE; zu6Sio$z_k;SFbukjZ)>hS7%AI{rynPEe0+3Gv1!wV&$1}w;xZKi9s{5*GvR?E0wiO z-~@~}lL9P^_D(PV)a_x58s!?C2yqfs=L6WF2}X)AAVM1vu3*9S#5r{56P$~;N$d=J z+IeMlpVt5Hub~S(=eB9+mRM#cW|BGgavT_jr6J<riuRgr<80R`w?eh-H{Hb*b2Mot z@-)GGy!-K2ZmmtQXr#TuSq{lrn#oS9-RJB&#Tp)~2kdH#Zndqh>)FDZCS6qJjWb2N zd4#vd+a_*n$A2{3`qSo&qc@Xs#_XH5G-%+f8>LSl*gUawc=zPs@bz|dr`<a+K0Yuy zd3|3|zwMl2+<MS#)*~LH4ZXCOpgd|6u@LTzy$j2d3)8eI3R+ptVohpZBcGDvC}khG zNuJDR!g_rbjkVHD`kG7{Y$F5@<w<umHpwk+XfN9;?}Bp5ZNf~ZL7Zu)#2m{RGn4oS zy;aLEGrL{9fC}6$X><RC3#hurc7&Nv7{1vPCAjk3W^U&9n!TZo3H5BoIN0eJ5{fB2 zjhx;xDil#x*+=Wwa{ETP`r8F<LoFY5%fk1#y&>%lt8p=|y$U$D5*b&tr0sw-mzl## zS*_hSCKR6*b=;}5rsAP~b3L)O8x)(HkG&Zb0WRA^;cZvjT1ZqMhc?LF_Q)ftWife| zUIgqe&_9X;4{{Ua4Ko#_1~n16v)$ISKBM^8MDdQA+0Rz7zp-Y<?2k=@!iMTL8r> zHq9(D-*|EhvNhyq8#0QF2l_emsQdk6x!9XgOYcy%*M~y=c0=FVzI98+!zQ^w??_gQ zs=b?AwXAoNAYjSZ&ff8GHj)MRZpDuJ?fSLruIOF6u6NyfyY7nq4I3|AyKe2;CBx)W zy`{A!X+M#^BGE*|&2T@iwSrpMI~fKI-dkSx69O$685$Yv^k-e)+9g;k>xMVZH)&Eq z!5RXpD89-PqNJ?9O}i(z^<LSjC#xmW?j4LPiGrPed*u{w9;>$qBzv*7M%HiRrn}5G zt-s0^r<+#B%QmfBb=4ALgbdRsEWsQ20Y}7xd5HD4h!O+RB$5}+DWQ?AMM)Y*$`ubi zg6#*`Lr|+ltvF8>6^0602(uTLsw&T`cy(72=@Q6L0f6y)(gJ#q%z%4yt#e}IRx(Rx ziE-;ue(0bfuOc`jgr|LFeSS-+2A0(wxse5w>%>e(VH~j}8w~WY@rD`W%)&CkB<`KT zwUIqcggg;dS}AXj>?}*3^s5*eFF8Vf8JM94k#!bLDbm2t$C!b_cN-|O9Ejsqy&kv> zGffHv9nH&!baY<c#$Rh}i>Am-RKi+4(m0fM9y;hIs2-3jpdD8rb<9dJeRfY!C-ApH z13yn!-dgI}Y-&I3PCo~Wkt>TOjO#KT##xQroO#oc&2(GTvFdi4*|F-q>76nUSyM6l zh0O-J!Xa`NpQ~cIrO_RsnzkXA$zo#lJX~17SR!;?<h0Uxz{ZAq#eUi|;1XLhy5S(L z%^drg&a{;ec@-AfZG;hb&3@Ef8Y#!9v{-hD#aw$@IkguSWaadb?Y;Bv!c9e_x&-*q zG)bFGt$ki;r@Wmq?Y4@YD`Ar^^b_r|5m(U_)|W;NPG)DLL@{dl@}nxW%Wbr^$ttq} zD}cAM)c3g6NyeR+%_NmURtZ!Vrqx4_apLmd(7JT^t)#)B@?e}(#pV37L75AOW^?MM zgO*4x%8i`~trcmp^cToV!>(2pi4(%RV!~IcSm|*n^}4*+>~<OPp@aQqcN)}!IKeCM z?JQFGM3U2pw9HA%Evmxy+Ku=LQfAEC<VTb#%fiTqi>Y^cOyOJo-L#$<_M3=rRI%0> z$#}W4@k&gXvrw0yTt`9}=gz4uT5GoSW<Eup@Sf0YCNXnvO!HAHs~*;B#J+q1Q?~Ec zh|8B-acSJ>0gV>^l~Hz_?{MjcEe}pb%HyNBoj?~3T3zJhf}RfCt?f9i?iI;q<1*^V zeb!3KBpPQMVk&W*SeHVh5{8TOLV?5od*8gv3#?0`aZczhVy_^PmPHnCO4v>sT3_h6 z67lVe8FQgGYb$9c#gwMC1b<zaaHGhlON%C6;X4(*31!Gd9=(&CS6h^yEV62HznDv9 z&ooV($!)rDv>Qj8?NRJOpI6uywY4a<_FXTw<Tty6BExpOH(x2EfP6qHb{U+7M=W&B zlV-<0?j_moOVV0dxBYNC0yG2cZ+x9adw7BxK7%cCI+$gHASNtt$*w4n0n-!wOWTUv zhaxwwDs{9?wzF?MRC{G=HM(@Mt8CH6F@e41oj?FXWg9M*_0b-|yD3zQ`RJ#VfISpL zXfRX6Lxt~WL`4mG!m@7ZSvoGJm1$<tjZCJ!Ox^C$9;eIWoT+tNe_~fI+PBDkh)<4G zjjniCOdgLpYqe_kkBTI|YxCuHVQhuxaO&Jzgg`|)zmqI}N;WtV)N!AOt^6&{$+*F^ z*LN|vu8ridXNr`ZWfL)cb`r0Q9z4&2OYObim0Ep>Myk}k#kF^}_6}4G(K#d>u8T0* z?`Nk{2fJR6aq+t1gF;yDoPkQ+W@)y!*xyi?kI!<q58zUK^c&#f%5MO~j$MIoyNZkE z7DqXY>S^L!%vkseeM+x%Haz8k`l!vm8#8l8p8&dd1vl@-HwgAFZ@Jpzy+iWG)z!;( z$BxnWqnLH~TgtYiH22jYz&*=H*K;Dqgw268#)YN&Y~Vhzq5R^*0lt_lfRV9!5<4+C zx^KX4AK;6@zM+AlD*9JA?A7gkI?;u`9q`W~GJd?P<``#Dh8|rL@0MW?S}ndMgnU96 zE5Z}E`6v2@fMX+6k!dXYhOj+KW}RO~<pH?_3)rt8XFAoQ)O|ysDkE@hEs9x5>#D7a zi?N;gb+54zzFWB07b@m!f?JJ>6I(?+XX<4T(ix_k$T!=P{>zZJ_zW7Foo0*Dl#~t7 z-a<f8Nq9H5>vsP%T;|fEPTbpZ3`OkSaZAp#6!}Ow0lw%>KEqEU7Fq1lBRBz)9qnuS zpio3d8qus`2YoEjCuzRShD^j;sj}zIX~~hDZqE@Cm}2|w#|@wq@|~dk8X;xkd|Bq5 p4-$zs9r9OKuNcjdcE6)-bY0&goQuIM*jHE)|4&~e9`Ro!{s+$Q#)bd@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ja/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ja/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 61159017f67dfcb48f85d1b364258be982b92350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7939 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/lt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/lt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index c7d34a2603f74143d28dcc2ee174c1fcc1886577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2392 zcmZ9LO^g&p6vqn$(NRzkzflVn*cE!1T|h_+%EB%}m|Z6`v%6etri-51si~S&R}YMd zAt7Qss25|_iwZ|WVnV#DhuK6=o;;ZtO^k^KB{A{hN8<nW_RJD0^ZGYc{p!8{d)4*B zwhbRJi~zO+_U1aqj)6DV<AL$xU5sr2e**6Ye*xjbeh2RdZ-E8y-~9b1IB&*$3wSTM zBj;`qKUTtn_8kK615beDHwQido&#xr3#5EKkn+6&lB7#HFN5TF1*ACdgImE*^7R`a z#r+a|0{jNt2>uLGyx%~IcQfZL@E*+n1j+9okm9bxgmi2M9|X69<hLtl5!{aXVQ>>z z21!>Pq&y9f_C+A+Nx{d!OCWyiLp<Jw<HsOUvONew`SyXd{{Z+1cqnHXr2aKQs<#W0 z&dVU_dN1cPNO`Y<<bMOC{9l0Ez^`+D57PcWK<dZeAdZs#mvbG0()*1d?cWO0{wG0- zUj*@Eui!!7&uNgp2MLn?E=X}*&J?8nTm-59w?K;X4oG=E0;%3l!7bodAo+a@J_LRT zlHac&)%6!hdDcT5<=+5O{GA{N_k$>fRY3B46h;Hn?7JXsdtnd5sQ<T*r!fig1&X-` zMrX4dM!Cmfbe5EtYM{Cwhmn37)W>JDf9O|E!gH`^U{nwF@&y=aq&jKPxef=_N`rdw zJZv9q7mUMp!syP>_xBWx#@H&dGs*s*6uQGsO5>$tGwhU;NsBj}l&{Nt5(`a#RV4cC zRrqN+e1AIas7U#K$WEuusirWJmF0QQ$|`R8p;y_8NST-yi$zwpP2rU_37fT%bi$8f zjpkXpS!*cW9GjbAbBk=wdM<iGY0-d|ik2dg{DM%PRcxXtAXkQ0kYBS3Do9c%`Mja` z`7C5rsUd_fO5t15@iXSUb)8HMtCCz+W3?GpTVyriQ%Bir9v*l)3-y_-TAInK%TAZX zkFwNTsY_@}-FB>V_5!OrVG>RCokS^_#DvvTnRzWJtI<fFWC<48P*Y8Mk4`06h|H?% zqB0SmR!%mvDjR)1Me*T+7a_{COL!HWiGl^`5;P*@v9TQ)BrU0RATN4pXgRpBT6du; zyVm(&Hi=afoJiv&sN0YiDz61q*;AS8G-QW-vNSOn;5RwJCnm##2lkdQ3T2V_U|5`W zA)gh-i-ezbN~D8#)yj2)+0jn6dR(-1QTvy%%fzXOWl)!*6Y{e1tyCB#3_q&<ajlBh z#cN(6*S;`&W_D(+rio&yfJUMiWbbz&&!e>cT`iP(i8ouqCDI?8ub&EztohLqoR=<` zF-=QfV91X&lrNkM$|5z*R#!y9%*Cu5cT{|kmkx%d(rU%$0(|sz+EndmCm(C1N=JO+ z#RG?rj2Bo{bkgh=ImxQ{W>nV=mY2{4mGB<^Nv)DQmRGLP@r#62q-lHH5ozGFa<wP5 zNpIUVjYzRc;Tf`dCt`sPv$H}`0=jP|?xE$QB!kb|NG3Xh?%RTr-r`k)e^H8$>vlP7 zOKVaT6pfTXOcl1k=496?sSKjBiqIl$E0239qQNp1n6&$m)P1O_X=qiJ_fU-VLgfok zKIM%_mlPVpty}pV_cgnJO|>+*!lvcQHD$7TDy&jvl?9~5+Ndj2Y2*Z}b%bl9H6yt- z*&fLqUdom0&Y~Sd0cWM}DK`pK?R&e#=&oc!EKdekbU#K%r;K;Q(z8U0i!3Y3PZKYE yzatbML*T5VTshwM#c|wpiSK^6a{)zI-gf;iEh>(pBa2kdM*X&yI0rb;N&XLhg*3DP diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nb/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nb/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 107f30bb6219da464d619ee12ec76522ca692703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmYL`J8u&~5XTotc$hZ@G!$FWgfq4yq;L>~2#$zkCsA?<65Yl(S#NyaHG6wWEKyKU zfJ8xqgs3PYBs!=_AMpXGkth%yUx9-E9EUQ}+;3-gUbpk((!?79xd^=q-Gg3%UO$2l z<OO&fd<mWcUsrqwo`$_w-G2hl!v0eEzk(e94Lk{c2f5BK@B;X|^8cwgc~poK@Sg)Y z?=m<EN^k-(*FesnIwnL7Y=L|~TiJ6U-!FpvFKZyz(bfGEkn2CK_#EW<Usd*7kmr0~ z*&ji!_Zj3q`yj>;Ksi59`kCDCJRczEpxl>xv7CWUK)Dys&4OPkdvSe!vr^{0N!3_9 zEQTgEVI1S+z3C}SqT^I*td{k9U38u0utgW7+Eyl08ySh^j8sl?N0}g&J>_}fDHf|L z6rO`ui!vvn;fOptNv>IhCjG+a9FVx7^WN=<q@dFAh*Ddfj7?({bz9U6(Lx%nlh2K_ zv7D|qYAZByK1AJIn>4y#=sZeXENjb4(F$!Fj*A|sK(TB!nysjDGipxDRx6&qHPvV~ z8nuqfLzH-B^GpTjV>#FNCJ#ng*=;9}JM9&D$C7uUe{Yutl-7H0co$h#7fMr<kQ$=f ze>;|Tqt;#Mwhw1)V#YaV16lMLk1$A}-Ed=+DPwQTUSIi~!t7cyAI%)b@jRR4qqgli ze)m|;Y?x3Jo1Rjo#e6XcM)xViV#yDb75o?E<<Dmy#8Ba-wOAMoNCuPXEwY+2qs2NV ykeLZVbc)Ro{CF^kMRu@{{b-RN?3ZbW3yKAv1Dil8iPdPbBA9;;XG{NjxtG5YpVyrL diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/nl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 29d107905824ec1671709977c01a93a291bf9555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19445 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pl/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index a86eba3d20d759d8d24b82828d9505f9aacf9d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11647 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index ee437f1d070fe7aa0b41986bf2738c1f55c3c4dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4641 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 Od2+#@Cl~(ZJoyK13p&;S diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index cb437bdd0f3f39ddac2245231f8fe3149197d389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21262 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%0DUsGrs@c8`m0J$_y#e$N?;AD7QBw{VrobllO<Qlo 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ro/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ro/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index bb2704a423dbb2734defebf9e778e284d8594c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmaKsON<mn7{^P&2jd&?32K3`ura;PERbO1g3CT+bp|Fgvx^cB*7VfQlyp~3s;ht< zNj$6`G+Z^J@!*DdG2z0&#CR~-H6g~}jg!%Xi5|RiF<$(Cz1=$)6FXD=tFP*NSJ(Wq zb@N9I&pwQu7_B=PI|N?36E8e(ZDMRQD8ReHMeu$w0ZZT@Uw<Eb0P-bp3;1cyD<Iil z1<CFjcpvy(zW*cm5agR6+5ZkwoLjm4H~19fEpS41d%#D)GD!NzL5f!gN$(7J7wExz z!FO``J&^Q21j)}QAjP=?J`8>ZlK!_jzX!KNz5(6?{sxl$pCIY~1ybA+f;|Cl2PtlV z*B|KN0T3!|2aG8W2gz<9xD`B{ufGOT{SA=%+0NG!5I^SdqWy~?*<S)F&(CxDOOX71 z4N|-xK<e{P;N#%WAk}*dBt0@F`)znp{yV|Pz!4BCYyzY_W<dN{9WUzl8{jtZEJ$|m zf)wWi5J$v52C2?ZLDK&sm#=|j_YFw?Z-Dr*n|M73{tA-aCOAdgvK$`;i-&qnaj3`n zC&~6;PG>`QJ22=W-*o=ZVo?6OFsL7NCX{dSJXuV@-TC}MkaF3V%akwGz%i(YPh-$C zf<d*?LwAMFV=o4sPw`N%sh`haP@QZ_#0i^{+DXf1txS8oZKWK@T<D6Jrm7>B*elSA zWwC$4C#s{|QpiqtYgHt)WL3H7SXFg<uF$F)(NVg~$HvB3)kMN6qf=Hh9chKz@U<al z;c7-xxRb_laZadMw2{L}pR}drW|3nr<x2BKV`U^#$Lg^ZspRK{!rY{aVvs@|DaEXg zqEc@qpVzdXOCf8>7`gG&Qn(%*&uREeviw+sDqv0Fyro2%4m)^TgF^D|<WiPz(`Wg% zWYVXqHe$7U-lpWBWfEhpInP>F=rpFnr%+>-Xv$h%W?Bo%#ON?jvv5UTP3asOn6lHd zqt_KrE8XGK3e{(owwL%Md4~!%LX>FU##S)b2^OSH(TtF%DlxizFz9NN$RO>>I1c0m zCpB#c=hu5sYRJB^E~uql)d`OKZW^>q$V>H8K|`KXnd&r>5BYexG9Hu<1(gGQd^|i@ ze!g5OmrGR~Mo^S!Y{;j2R;5k}&1*BQGu4>}e@RPgT<_%z@~rHPMJ724E8X>?D}$C4 z38EEp$gL^W=4vy;Dk@{;5*mlJ5of87L>!8Ep&tvSkMO7`Y%1Nvd}}s1Jk+C>FG?HC z=*ZBg81lny<x2I~TM-AdINCJix}S;Z#DODxeLAsU^N9&w;m3G6<oowS+{;lVKgugF zj`E8au~sZWuRO{}MmSb>(R_3iX5%5RjE)|8Q|~Ul9@LG*c?ZMd8YU4Mtr_l38LypP z3VGvHZSv&Y<Z!2Hyp814dVL}HZV?3zZ?5(1xK)F-WuC0xtF>h|>#g(pUrP%L%~yr0 zzkb;W3(fiL8q=||c`Ld?<4a#%(OvN$&8Fn5S9K(81i!_FzW$lo@cF;tt6nQMhp#^E z8?D-kZl=NaI1s!qd9=EMTQN|vJjN!kUv{$Z1YF}j4-}Y1=6#`!&#tiY__v|EOp}mJ zM$U^^4Wyth^mD&#+DZXGthu_9wAYs1ZG9<<>wEn1X@!c0ExT=P8h>)@yTjWJ)mM#T zwbd0gl&*Bg^N6l9wF3WCHDM|9jT5-d9WL|QGR~l;q>Vf#&9&vOgf?1$v-iA1w;HnG P=Wqtj$6m1onuY8iJWV}c diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ru/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/ru/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 2b89fbd6ab5a6c31dc4f94d801cd26b866030496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25049 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 L+WHOt2Sxu0sNyvC diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index e736293b79008e7774e59b7fd75ee12cc0585031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11531 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 72e82368f1fdd004b6c52d55f091c22c74621989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5241 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�+4?$#=1*yI@|P;hkO8NQ^dYgwB-km@=_EC*y#3l1??u3!eY_9k^) zX4#p4EE@YzM<UV?>-za<{%T<B7%SUnQ^juw6Zhe#Q##eOV3H?DiCXlKOyQqPw~Mn* znB=FK!I@;@R}HJR#@#dDnsH8P)R1#xBsWKmf+ELh=etVGS*!%44%LYJ0Q&Y>GCYkp z@`&<~#JZAdk{_jU*2&{Z)dr2n&`olsRlBJ<ld2QL@id#PY)ldNcbKX|yOgQ~HI^J{ zOf~LGYF!4Zw+<sG_!UbY#qJ*IWtdVJmQO3sdT`U;qvJi}X9)6%H1Bd5!)hk|_$3EV ziLfyxw^Ngx5~r(~`~8$;lMy+}YI3NgKgJ(*<MyB`kfu<3B26}mo>wl|NLV}B*q`ne zMw+=hwf>y6=%F;2P(}8W{ArUsa!T6M^(ZEXOgyH2`olCFl?Xf9AT*y;uz1b@4tJT; z8$sJkbyh}HuVYr;^Vn>sW+rQPLAsZ;U8k5#RIMFEE*Ji<I!@{N8VeO3+EjKrs#QSc zN|oVs!P-&n*SQAeg-PqMM~h8z4}Yq|J=8(lSib`-Bm-$i8BiQdpy9EypD(&4N6*** z>6iDEeoonE)2*b@O4@_kqI=W!o;E5VpEzIS0bL@8nkP~7ABD6kX`?4c6m#oXz$fKa zyCH3^W?50FceW!;H{xsz>bf)R?AgqrM{%5<JJQ}d51Q$19)}cDHso^ibWAhIXk)i_ zqB~HVN#iG=agakmdeYgPgd7g6NFDd*9LMQ-+gh!2B0aSlyXnV+EZT?7x=rq*8L0cw e#sTuM552g~zbPg6KOq0CWW#8jB>kWMPx&uH&;ZH+ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index cc91453c586cfdf910a8af0e65b01917d38f6d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4517 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 a+hGeg$<-vM$Nqy!W-q&>sq+6*PX8~*^Y<nI diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sv/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/sv/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index b49eb64e2b33624f47b47415c6d60d7193ad6479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4411 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 V(_@8L&Ks`Ieg}m%`M*}${{Va!>6icj diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/tr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/tr/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index d4da9cafcb46b662bd25ca67ce14590cff4fc5b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15648 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 OUe;!sTKw1E(*J+@Rp811 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/uk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/uk/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 1f0a322694870044b11424e5f2841ebda82cb91f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5254 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/vi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/vi/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 47b892cd51d13a9d24d54e9169c6a86609cdda8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1690 zcmZvaO>7%Q6vrR*3k-#}l+Oa43vh@w*i}T54ME6`0}+X_;%&nP(8Qj22d!tV+1Zpx za6lZ8KuE0$NImcoRR|RkwNi7kD>&Gy-~{5<3uxgCLI{Z);{TitqKJ{7fAePE{NI~5 z`@@mF?-PcAJ;-(w(HQe){9$|z?gzgCu|?nI{`cUm@UQ3m8Qcs17w|UlcaYEh1@gIl zdx$Wl133%eLHGwjjz0z-1|I`icN%;EtbqH#mq6BOfvmHZQ-im_k3i0sf``D@^7VIf zegGcD`p4h_a2sU3t02dJ33A?VLC$v_d=vpcf(7{dvB-H3gX|v#x$fg2-(xIap9b%M zKL@g21LQm}f{>z@LDp%4_ke5Q-QepW_x~Kox|hL6z^l3c6UaKhf~@l!$U1-I`+tJB z!{37@u+AZn>-0dbV+s^t8RUL7LDq}FW1s;!?rjiK^j^OI5az7QgY*60;PZSJ9^4Do z;qfqxd(HjjJKhiDH{kp{1dMyd_dz<k7sj<8f$`h(;9l_HyBvpcZTG?WTjTHLPS{;A zswm@>r7F!^-I5#hY}(N+?KXVOtkq3v6fLSXM~ks+Y10<t<Kwgx8;-3}txB~Os>M#o zb*Uq{8Y!wrN+wF2mfBH0PPEgp5!#44q#~+Yl_aTEJ}s*Vl43<k7b+_j%vx+alA~!^ zw?jt_YE-GQLJjFs%lR7VC~crRU1fPuiIWCdf-toS2Ly2^wl+RZft4nSq*J1TQb#2u z6r^etwL-f&8_GG{DZxU^<eS>Gd{h~~qMFWIXnCiUO;D3BO5?@Cvg*dxc}q!Kx4d%N zPP`!YMWOz@x2)DR$9Z$e>WdS_(h0BlgjbprrAfayF;<)`77L3qao%oivGql*J=hk3 zP0`mUP0R6QVxlztbi0FYjyL1ZQ#fPVscb7RP_lzuyS^{hbzx~?sd{6DxUa*Ldcj5) zWjOV!d%PP-ZDvF>lr~Xr_GB>cO%?u$<4&z9>s3uN<_Gr0)T(xcdX!ojdGmOa#22PJ za+BH8jM$mZ7H0~S^*<7Ao%JtC8lJ&3Wc`aG8EmHTvi^CI^)7aNs-#)}94^=mW7DSc z;BzCK9c*d@;cCKVy$hN@s-5GZ)Ktb+nSwGs7Y?=&(i~h7Eo2c9a=n$(3;3FbXS4nV zEjq~KL^RlRbSmq=!^&Iy$4NqILeZ6;QHBO@bVZV8y-%G_0cR9Z*4xzomc@ar|DhI6 zXT7i7PNCh9WAUL6&(tWuZ*;{~EN)N*^Up*L5nB%X*EWq<=MsizV_`zB)Qze<pPw?r zH#>v}|71hpb!iT<%}}_(7pO8E{ohzXo=Z{yfl*Cd^H%pib?$_@YnSO6J-Fi2-}-K* A$p8QV diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 7f664abba616cdb65aa1cff15c3ec6cd25ed037c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10576 zcmb`LdvsORnZS3|K1ADTZL4jy&en>EB_V(nCrUN)5H!R{f|Nc+PjXL^Q|=?)b1xx` z?Ib`X2?V0@CWuIQ3JC(0KnPi_e@r{G+U3kzuGN|8YFBH{xi@P%Wwox(bo!j%clN$X zK<w(QHD~3!zq9w*XYX%+`}@AVPkwyEHCq+eN#qvf*!z{b2p_nPAFkhgM5(`m{{ue; zuch#Dc(dhncopTj@O^NB<wDCxEz2z{;I*`?gbby=46lYy!;iukoC>q>vv4ouPYv-i z8Gavr2)+Zafxm~Jgzw|!55Su&Z-qBeo(x6bIWP{NfHJiU@J9HL_W4h3`PWe1yPnB@ z9^L^(pGtTaTn%NM{g9^WDEtB(gfjnM!VkiC?DOA2neX*Cm~n4}^4{%G<}nLShY!H( zVH{3^%}~Z!2R{rqz+$))O8?)r^>4yYQ2sHLdA$QQ{1cRMHIo<K4VS`upxCh!ioPeH z*x@9U@xBMeu5Utl?=2{L{RB$?KZi2jZ=l%e!xW_5WXM$2bT}K9!G~cpEP>}COQrr3 z%6$F+WxVTHJkjF@D1P(_%bTFs;WJR|H5pEY_d<F9Y4{nKgz{bo6o1+XrTq(V8r%>0 zQ*ZJk`iD^T`xTV-cQbihTa`f3|3N5vK4Hraly&l<jQcE<`F7g+E$}wVdn||H&6Ix% zMZZ5l(dSbbOU9cDWxms)=sm;o9w_6?hGPGRpx9?Vl>W=1jGu%H;InWxd;^L<{0_?d zSAWX1zaHL2xfsg0%b>jfH7Isi0j2*YDC_%8TfYH{-rFHdq)tN7{~w_E=?^VG^l1}M z_dyx=fMp-VHPjg>^Y|x-3DlcV`pZGl_xDirx`x5N2q!_&ZxIyxEQ1;@hYYD!L($_! z%U&q?>RV9O<6oex^N*mk{}mMfxsJt<_iltT-V`_!7QqtuG?aCC9!ehCVz~o~U3#F* z<A`OSeSXT8&p>(qysaO$^>0{y*VcdE@}Di=vd{n3mVa#dGg}`*(f2<re+j>VVg4J6 ze`ZOJ!ZypTmIt8B<6BVdc-C^za>#Pn^4n1C^ad1v_<`kHQ2PH7ybb;w-U>g$kE~M> z)bM^NcKRxm_dQ7JQH{2|*0K}wr=I6Wo}YkK@C_*M-}Kj}{thVZX4~?UmL4pk{#pC{ zsO9&djGKqj??ou<dX+YIm<7c@W<wdL%(4PX{a2v8=R$eD3O)eap!EA4%kM#H|0a}n z{{|%==b*H^5hDpd3&jubfMVBD$dak~P~LZ-v|9le!Zf@S4#M}rpF#285h(5cV0q2$ zrhJ{{4N(00(@^xk8%li5vCo%4$!p8uEZ6{Nz#b_5{{Tw=Im=%_(eKw#{O3=${_4+} zc9Wny{}`0<ZiZ7~v913S6o09KSHU!t{<Bc>>a%br+yo^bd>cxCKeY8fgVO$!cNqKL z0>zF~ZTUf4E{D>t#@2gK`dMk&0%d-kQ2c1W<#%lTPoe1ZTPXcpKiSOp<50>sS>6hz z-^sQ--SS>2>p2IC{g*@Wm#;(d&qGk&dkac`KY^l82t}Vi+4@`WG|wknPJ{B^EGYgp z$JRdz#okXq=_h8Ne*-cF)d{8Fe)t6Z0hE696x09RP~M*buYvQR*maSue+o+bH2eU3 z7E1iAwdK?BYRZF9<~<Chzki3a-oJpN?;jyskh+ddNBa956n%><7eML%DJbphY}tnk zD6fX%pWlY!Kkq;p_rENEYxzeg^SElN;Rm6#yWW;R3g!Jz+WJq~`dch-v-Njc-fdZI zpU<@A*_QX)`Um0r>35#xqfp{i=KKgE*K5d2h|EvcM*OS=k*modTBE<Q_nY7zMC>HC zIf;A?`8?8&NPf8wkvw@2X+}tI@4CK7&9f6~k8-~sS%&;A;vjN~pG-scBC>WLL_UOE zi$r@RlpG@0*A1fIukw2w`3kZTIf2NU$+gQsHNblj+(2zc%8|mA;bso<l&z?Maz=Os z@e$ciB!<3>$n_#J6Onl8MdUh!%txw`He?G@i^z2gvMsvf90=K}RKG0?Zbvu{M1CP< zTqwG_`4wN6Yd7K|4@<#b+VXKr@%t-XciPG_%V*%z_WlLfh%7>;BRh~7^7qI$kOz^w z5xIJhwMaq=_F4^h+WR%|QF||V)!y%exTESq4%@moY()+r^~gQQa^(HUN~8vn{b4I2 z*DB<j$Wr7<B#THqE=I0FRv_Dv%da#Q3z6rM4ahvCa7mu|JLEQ`5_t@f>lpF{<Z7f3 zc@B{)iQI^M8aaY^$XrCOQshg~o%xv!K8L)Fd=$AK=|t*~^~e%r9Wo0^A#zPd9zt$L z)MQ`JbDH&nRNAd|{EU<v9ADSCZc;n3m>avKCg#T7%w=`i#+V~@(==W*1CO1BmCGs@ z>G|n&Dy_<DQrV0ui^W8Ah1;adQ?*XUOC?oV+^bI}++;?l>U5^T)s3mfY@@DArxH5u z)@5`irPE%01Fy%MoMvCIa9ti-RkgdS(MgJiWsQxGxy^cs`%KnLOF8Z8=2TYuS$osu zFb16&_4VzO{o5Z@54%p5zA|dA6HoAy)X7vv*QSz5w>D}$*_YZ{H?HQQqnozS)v1`% zJjEZknRz^>SWRkGv6|bEO8IUyt8CKC_&V#mF=?Wkykt!KjjkIj)@AW{s)_oQPCV=S z+CkqbD;gW7Ow&^m7Snwxtw6WvrY=K;rkg1R{iiTk+;!3#CDYAnZYmk`#Js*<l$@aB zCDoNqQl>Rt=S^&yO{Zm1mbng#lE$ueY1eO1b8UT-txubJ?TK-i0XI6~C9@gVSM%ID zCmYY`23OWEns>CoyyMb&Et3^Hq?*QBHhHm3!=G;`zNhASzEcx-$7g0MuwFc_>)cFj zgO{w=c!q9Frx?hWA`Uj@H@K@q5}l8kG;17jZYq_Ic}X1ER#Z3%S1oYexUb8-6>h0o z;HCYHemI4X%yZ*TvszFHnZk|!GX~LK9qS{C$J7F`rmji5?rMgJ3iVE0Zao}JJyP-b z;`#bXH|<M|JW{b#KjJ3cH1@5`*2KM9^r>}|zB^5?G;Q=u@rO9Nr<H9g%wQxt$Rlnl zZi7x&rc*1um^5Yjg;5r!(%$M+GQ%K^DL--_F&VL$EsETEVK(7mujW#<5HIj*@gKFQ zE{d`SXQit>-xmjN@>oMcFRlG%KjS8}M?CpD=J}17OctUxg>%(r;>}VSEo7#_^CdXz zyj9xEs6|O!$%|=OCEe6O8uD>&v#1h261>Ia(8nYfjG2CZAs3W844+Zuqz_dd`JUsY z?VYtodCFm_>veH)u`1*uUG1*Q=yEq%pJ^DctZi_T^@L|8RVtoRXzZ)S4o;8otfo17 zw%AE#v7U7SOcBTP2!GPb%tBOXr_o7gq9`Zv;Xbk3=xLRg$V$GGp$my{Y_&3|MVi0{ znT+-0DJ4@dx6UTxUc!^aTj(O0P1Lw)=_2OUOUiNTaET}d#oSsi5iKrytHmkSA9pFZ z$5=UX!^LC;+^|Ab%vTl5lw|CxXa!V7N-uVZFJ`wOl}*N^0{11(eWHts_g=3G!p2$Y zcyU>BRWYuqq;>KJD{J<jN=KRGREcw^lISd33F%#3USal$n7h)AryAXKal&bQ1|Q56 z*QOHVjTbwOPe`rlf;>r5ZgTLm%JF;D_6U|s{j9JAzD~%T#rWcSs#5kS^Q$XutWdN; zL&~-47iu1_t7GxTTQFJM0@KM3r7G=>Udl!>Rx0JrMrz?^d=DuoXLVLfE>FdGIkg$_ zN1LmsUZF+7<nk;|NQ~wCMM)kpX-Pjz#+KJao>~&^$5pCozN%WLs+>$VE#6W^5>VDn z3<!*|onG?O#0+a%6k@Q-B}v4h9KZ(6VZ<B*Jgni73RXv&L<v302~mpIsbu8Xbx~Fp z^%?#D-VG}7UbIcaD8zhK)sSk6IwyhQSTaQtoEfh%+BnBr6t+Sc*>1X*Hq2m2Rh3Dn za37m~Y$=MhDuPC=XOiV2NtUX5eAJ2e>^dffE8`Bk+9i+1yl%p~#+$06Q<ZhjG}g^{ zWNWf*D%#q~ABiabWOF9bt7=Kc?3?vzCqb@G6mojm!&Q%$FRh+mzFb#4u9uZ9SyEO} zy}a18A4^V2(z?^w825OMF{D$oKp8J#&O)R!_AWe2QkX28oPzEutYW>GdAj7342e?w zgEYyTeuEp2Pi3%d+829OrxI)<93Bcc6HjB+JmP`uW%DGvV4T7>p{mnP(wChQcPy-! zswO{3uM&Q~S{j`fFhR6S>WqCOI#5lR+Z9$m#q`yaUW!zn(SEe@%hWPgCpqeApLwv; zF(nLRGL0m?+h|};Sp^-njpeZih3Frv7<1IZt5H~3jmI{mWo|5K=Cw=?obxyt*Gfq1 zGO?VmE~_P4CqAf>^QmbQ-A3MIUMf|~Ia^1QVso=+Zzjb7m+ir1+iAMq<y4<^wUddq zM_x&5g2|?Ib6}4S`tOmzos4oa3032y6=ve(&UPF3i<O*zm6u#tuU4>CtVm36P%Dxu zL1jYPCK5d1=&TxjPkraaTx6ch&jO?ZS>njg8%Ltw0ZFl6$1FvQVny~SRBBwVC~~=? zF?TIui%HrwpR~kn<h!A0v0v}SiXP6^`$g3p5GGYVUbMtr>4|q2&BMn^^~{o)GmA>@ zEt*xLXUr^}aqs6#?kg#oRL*x+QNa^a=~A5=9L{%~40`qlZ5{f7xaT)GsfMgq{7mej z8TZbT{p^dpl&sG>^=?tM>m*9`TwKY;;CEGd3F58Jb7NEW1LMs~_3DPF=2lEvylC<K z@u|%yE}4Ym6M`tv+=zy9zL?J0%uC*{Iqjqg<vB~M7Zlw$-cAC5LwnKuWNk{$O{Mz2 z8ZR@cGM?p3T7=ss{8F84jEer88TV^*JE!FSNna{5=TTyzR6kM(C6@D^nP?(kmO<~4 z+^%(_udE9@4@BiNC-bko8lD*pI$s_y2kkG9?(7{ehr3UQ+fJy9=Qm#V$vL`ZXTHB* z1#PEB&TUe*8v|Y#8S2Un^{L?e*<k&-+|lj9=KUjsn}Rb3gZ2}_=2IvV^q(Ca>Q=#_ z4Y|Sgk>Nez##S^8Pi!$72Cr=m&bO%1o|gQ<R_ppITyr?LuP^A^MV(Rf?Us#`{kL1X zg6{1X&+k?F7f$95ZXVsgDR=IW3b((^ogh55H9!1Pxak0+YfhKJ=568Y?P_G;c+lIY zMg}{>?FTL$yp3n!jtjZobIRxw?t3nHO={n6S))c<I>HS{=zO$gZ_u@s$x<7%wdVT< zMuvuSTMlc!EZ=TvB|7AHIvTb{pOsLeN{8*+CaNlZh68OFKHRe}x4Tc7p^Zwp&ey}1 zRu%Ld9^LawxMz4|pz{ikuTT{Xy%=<KnNEWCGqQ{$gP7pC(HHiP44gBH%Sybf-RSny zqr0}K(SzHV>FB<*W&y=}26yE9dPiT~5u7{to{xjRA$e>)DR;0HgG{upGF4$mOW4yf z@j<xtMA+5GF!@bqSfb#CjY03aT=#P<RFBG?-<H4dysVzN3-)w}FRw2Yy1R0RnBLHf z;kvyS&+ii5!eje_?*5?ja4`6Ket55%IFbqut_ff2;W@hD+gG;BM0bqrXYC?Og<}Q1 zha&&lu{Z45J92J|{hZ8ow1+*%qOZx(mR&OUwqrrtYxqX6xj*0E%5b@3$M{sCVX(QA zp;=K}N}8(RLSNK%&k5#jf+*bFJ#t}pc&<D8jI_PyH}|l9I3?B!Pn-_Uo-&OiPdYn{ z{Ua;ve=+JUnyduRu64OngSo-I!R`wf&qPLed_O^D{0H6g{b%g@9PbS}_vY6Qg?kQ+ z4EF`ST`KJE$(??s5Od-7*GF5|6H?O8)^@XcqQGP7J>xkTSR1_7qDTZI7Y?cXP`~Jx z9~z7dd3--kPBzL94Mks!cK+MeW6#m8GAUMA@`@y-EobpzCW%9sN|hTt9d`ESTiQ&m zS*+m1X7Ur(HhwSW>ewJo5iMvC<-lNgD7W>%#q+I&?xPXIo)%f*Xk2E+tV>8V`F)2; z3X)oOb_eaREBa^Rxix2l?oH+mw4p}fy)voXwhPhRjFSv7^^M!bp9T2?!vX@+7*>Tn zN5hT_k|H;r9c}9(^4@Lou{I-vgCj#*bAvD9$YS-8fi4_OoXBJ>rYbIvD(v1Sb<pPM z$hmXTcV5s>9yp*_-2D2ZZ2DLFw$t?S?pJJ0;Q*p-PvSU-yMmUT3XftT&74LCHWmEE zOiH?p7SZ~edBtoLcE7OeIWgmny=9juXx*GUG<Zo;9B;xV5^UO_3{0A{1qq7rcrxP{ zJ$ZZlfpHGwKo`%q2YoM%?rbyp<Kp=aGMgmRvB!49in4_~9$nwXW8=r>rIF!%VQarC z7=p3Pvau1Jk~j#uj86dZ2@pp960{wcPzsLkuznzEB0s#|D&D@$B*B9BOfY*CKQ;+Q z0Y$JH8wc%s*mHx8l3q>7nrw?wCQ;@Ny%70tv~~Zbt@Hf{!?kVsL#-;`cOlyO-?d$_ z9O1x`OP1^kn^tba8i|+S{JAK4*0zsF51X`_n7-IDk4R21FoB3=BIVy}blW!CvsG^Q z0H+Yr19?==0&TC43~rO{Zntbg)(go!xx*WRbDN2;k)a+Fb>W6K)+I`|$9v6;M+VzQ zTh<VM^mmEjJC1Ocp(&1J>T^2>gQ2Z_eBmhUK-&BlvPwR@#C`12@7~SbCj3Wm+4+QT zE<U`BZ`tEX%b*kq_T2DbzW;gi%pM&~k0a+c;%IVMA%^6TGEw7+?I(tU=}m>ZPRlyr zoc2T}C&y?rkj7EEl=L}KBYWa7RTDxh3X_79L<Qr8Y;YtZle(?K107b=TptIu)8WST zq+aw0x}SgV2R!FgrVQ+SDMXRK=CC<WjtsPr#0no&VMiCcoISV|vYN?GlE&Bud+mwD aYPaU_Uz|0guP;8Y#=fw`Xa0Xbto|3=u-T&k diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-openweatherrefined.mo deleted file mode 100644 index 4c2050863db980e1a0c3058e5b1db9d601a9abb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4382 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locs.js deleted file mode 100644 index 8dd2eff2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/locs.js +++ /dev/null @@ -1,383 +0,0 @@ -/* - This file is part of OpenWeather Refined (gnome-shell-extension-openweatherrefined). - - OpenWeather Refined 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. - - OpenWeather Refined 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 - OpenWeather Refined. If not, see <https://www.gnu.org/licenses/>. - - Copyright 2024 TealPenguin -*/ - -import GLib from "gi://GLib"; - -import { getLocationInfo, getCachedLocInfo } from "./myloc.js"; -import { WeatherProvider } from "./getweather.js"; - -export const NAME_TYPE = { - CUSTOM: 0, - MY_LOC: 1 -}; - -export const PLACE_TYPE = { - COORDS: 0, - MY_LOC: 1 -}; - -export class Loc -{ - #nameType; - #name; - #placeType; - #place; - - /** - * Creates a location. - * @param {number} nameType The {@link NAME_TYPE}. - * @param {string} name The name string. - * @param {number} placeType The {@link PLACE_TYPE}. - * @param {string} place The place string. - * @see Loc.myLoc @see Loc.fromNameCoords - */ - constructor(nameType, name, placeType, place) - { - let error = false; - - if(typeof nameType !== "number") - { - error = true; - console.error(`OpenWeather Refined: NameType (${nameType}) not a number.`); - } - this.#nameType = nameType; - - if(typeof name !== "string") - { - error = true; - console.error(`OpenWeather Refined: Name (${name}) not a string.`); - } - this.#name = name; - - if(typeof placeType !== "number") - { - error = true; - console.error(`OpenWeather Refined: PlaceType (${placeType}) not a number.`); - } - this.#placeType = placeType; - - if(typeof place !== "string") - { - error = true; - console.error(`OpenWeather Refined: Place (${place}) not a string.`); - } - this.#place = place; - - if(error) console.trace("OpenWeather Refined: Loc ctor backtrace"); - } - - /** - * The name of the location to display. - * @returns {string} The name to display. - */ - getName(gettext) - { - if(gettext === undefined) - { - console.error("OpenWeather Refined: Loc#getName did not receive a gettext argument. Pass 'null' for no gettext."); - console.trace("OpenWeather Refined backtrace"); - } - - switch(this.#nameType) - { - case NAME_TYPE.CUSTOM: - return this.#name; - case NAME_TYPE.MY_LOC: - return gettext ? gettext("My Location") : "My Location"; - default: - console.warn(`OpenWeather Refined: Invalid name type (${this.#nameType}).`); - return null; - } - } - - /** - * Tests if the name is special (i.e. not user-entered). - * @returns {boolean} If the name is not a user-specified string. - */ - isSpecialName() - { - return this.#nameType !== NAME_TYPE.CUSTOM; - } - - /** - * Gets the coordinates of the location. - * @returns {Promise<[number, number]>} The [ latitude, longitude ]. - */ - async getCoords(settings) - { - let info; - switch(this.#placeType) - { - case PLACE_TYPE.COORDS: - return this.#place.split(","); - case PLACE_TYPE.MY_LOC: - try - { - info = await getLocationInfo(settings); - return [ info.lat, info.lon ]; - } - catch(e) - { - console.error(e); - if(!settings) return [ 0.0, 0.0 ]; - let locs = settingsGetLocs(settings); - for(let l of locs) - { - if(!l.isMyLoc()) return l.getCoords(); - } - return [ 0.0, 0.0 ]; - } - default: - console.warn(`OpenWeather Refined: Invalid place type (${this.#placeType}).`); - return null; - } - } - - /** - * Does a best chance at getting coords without doing any async calls. - * @returns {[number, number]} The [ latitude, longitude ]. - */ - getKnownCoordsSync() - { - let info; - switch(this.#placeType) - { - case PLACE_TYPE.COORDS: - return this.#place.split(","); - case PLACE_TYPE.MY_LOC: - info = getCachedLocInfo(); - return info ? [ 0, 0 ] : [ info.lat, info.lon ]; - default: - console.warn(`OpenWeather Refined: Invalid place type (${this.#placeType}).`); - return null; - } - } - - getPlaceDisplay(gettext) - { - if(gettext === undefined) - { - console.error("OpenWeather Refined: Loc#getPlaceDisplay did not receive a gettext argument. Pass 'null' for no gettext."); - } - - let coords; - switch(this.#placeType) - { - case PLACE_TYPE.COORDS: - coords = this.#place.split(","); - return `${coords[0]}, ${coords[1]}`; - case PLACE_TYPE.MY_LOC: - return gettext ? gettext("My Location") : "My Location"; - default: - console.warn(`OpenWeather Refined: Invalid place type (${this.#placeType}).`); - return null; - } - } - - /** - * Gets if this is a "My Location" type. - * @returns {boolean} If this has a "My Location" place type. - */ - isMyLoc() - { - return this.#placeType === PLACE_TYPE.MY_LOC; - } - - /** - * Checks if this and another {@link Loc} are equal. - * @param {Loc} other The location to compare this to. - * @returns {boolean} `true` if the two are equal. - */ - equals(other) - { - return this.#nameType === other.#nameType && - this.#name === other.#name && - this.#placeType === other.#placeType && - this.#place === other.#place; - } - - getNameType() - { - return this.#nameType; - } - - getPlaceType() - { - return this.#placeType; - } - - toArrayForm() - { - return [ this.#nameType, this.#name, this.#placeType, this.#place ]; - } - - static myLoc() - { - return new Loc(NAME_TYPE.MY_LOC, "", PLACE_TYPE.MY_LOC, ""); - } - - static fromNameCoords(name, lat, lon) - { - return new Loc(NAME_TYPE.CUSTOM, name, PLACE_TYPE.COORDS, `${lat},${lon}`); - } - - static arrsEqual(locArr1, locArr2) - { - // If one is null/undefined but the other is not not equal - if(Boolean(locArr1) !== Boolean(locArr2)) return false; - // If they compare true they must be equal - else if(locArr1 === locArr2) return true; - // If their lengths are different they're definitely not equal - else if(locArr1.length !== locArr2.length) return false; - - for(let i in locArr1) - { - if(!locArr1[i].equals(locArr2[i])) return false; - } - return true; - } - -} - -function fromLocsGVariant(val) -{ - val.get_data(); - let locCount = val.n_children(); - - let arr = [ ]; - - for(let i = 0; i < locCount; i++) - { - let tuple = val.get_child_value(i); - tuple.get_data(); - - let tupleCount = tuple.n_children(); - if(tupleCount !== 4) - { - console.error(`OpenWeather Refined: 'locs' tuple of count ${tupleCount}, not 4.`); - return [ ]; - } - - let nameTy = tuple.get_child_value(0).get_uint32(); - let name = tuple.get_child_value(1).get_string()[0]; - let placeTy = tuple.get_child_value(2).get_uint32(); - let place = tuple.get_child_value(3).get_string()[0]; - arr.push([ nameTy, name, placeTy, place ]); - } - - return arr; -} - -function fromKeysGVariant(val) -{ - val.get_data(); - let keyCount = val.n_children(); - - let arr = Array.from({ length: WeatherProvider.COUNT }, () => ""); - for(let i = 0; i < keyCount; i++) - { - let k = val.get_child_value(i); - arr[i] = k.get_string()[0]; - } - - return arr; -} - -function getLocsGVariantCount(val) -{ - val.get_data(); - return val.n_children(); -} - -export function toLocsGVariant(arr) -{ - let tuples = [ ]; - for(let l of arr) - { - let locArr = l.toArrayForm(); - let info = - [ - GLib.Variant.new_uint32(locArr[0]), - GLib.Variant.new_string(locArr[1]), - GLib.Variant.new_uint32(locArr[2]), - GLib.Variant.new_string(locArr[3]) - ]; - tuples.push(GLib.Variant.new_tuple(info)); - } - - let gArray = GLib.Variant.new_array(null, tuples); - - return gArray; -} - -export function toKeysGVariant(arr) -{ - let strings = [ ]; - for(let s of arr) - { - strings.push(GLib.Variant.new_string(s)); - } - return GLib.Variant.new_array(null, strings); -} - -export function settingsGetLocs(settings) -{ - let gvariant = settings.get_value("locs"); - if(!gvariant) return [ ]; - - let arr = fromLocsGVariant(gvariant); - - let locs = [ ]; - for(let a of arr) - { - locs.push(new Loc(a[0], a[1], a[2], a[3])); - } - - return locs; -} - -export function settingsGetKeys(settings) -{ - return fromKeysGVariant(settings.get_value("custom-keys")); -} - -export function settingsGetLocsCount(settings) -{ - let gvariant = settings.get_value("locs"); - return gvariant ? getLocsGVariantCount(gvariant) : 0; -} - -export function settingsSetLocs(settings, locs) -{ - if(!locs || !locs.length) - { - locs = [ Loc.myLoc() ]; - } - settings.set_value("locs", toLocsGVariant(locs)); -} - -export function settingsSetKeys(settings, keys) -{ - if(!keys || !keys.length) - { - keys = [ ]; - } - settings.set_value("custom-keys", toKeysGVariant(keys)); -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/openweather-icon.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/openweather-icon.svg deleted file mode 100644 index bb0935f1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/openweather-icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400" viewBox="0, 0, 400,400"><g id="svgg"><path id="path0" d="M190.361 122.806 C 151.701 124.976,120.074 153.873,113.535 193.000 C 112.810 197.335,112.810 214.335,113.535 218.400 C 114.911 226.124,117.919 236.492,119.305 238.292 C 119.791 238.922,120.885 238.389,122.800 236.590 C 128.818 230.935,140.383 224.804,151.000 221.640 C 159.962 218.969,176.795 218.451,184.899 220.595 C 185.888 220.857,186.228 220.630,188.274 218.343 C 199.640 205.638,215.637 195.239,228.756 192.025 C 229.550 191.831,231.640 191.314,233.400 190.877 C 246.014 187.748,259.631 187.740,272.467 190.856 C 277.736 192.135,277.706 192.201,275.539 184.200 C 268.158 156.951,244.580 132.673,219.000 125.985 C 210.368 123.728,199.161 122.030,195.800 122.471 C 195.580 122.499,193.133 122.650,190.361 122.806 M249.900 204.696 C 251.275 204.774,253.525 204.774,254.900 204.696 C 256.275 204.618,255.150 204.554,252.400 204.554 C 249.650 204.554,248.525 204.618,249.900 204.696 M240.800 205.433 C 238.774 205.934,238.742 205.958,240.400 205.740 C 241.390 205.609,243.370 205.370,244.800 205.208 L 247.400 204.914 245.200 204.902 C 243.990 204.895,242.010 205.134,240.800 205.433 M258.900 205.087 C 259.505 205.178,260.495 205.178,261.100 205.087 C 261.705 204.995,261.210 204.920,260.000 204.920 C 258.790 204.920,258.295 204.995,258.900 205.087 M263.200 205.600 C 263.750 205.776,264.650 205.917,265.200 205.913 C 266.098 205.906,266.078 205.874,265.000 205.600 C 263.308 205.169,261.856 205.169,263.200 205.600 M236.200 206.400 C 235.181 206.838,236.232 206.838,237.600 206.400 C 238.404 206.143,238.443 206.077,237.800 206.068 C 237.360 206.062,236.640 206.211,236.200 206.400 M267.200 206.400 C 268.568 206.838,269.619 206.838,268.600 206.400 C 268.160 206.211,267.440 206.062,267.000 206.068 C 266.357 206.077,266.396 206.143,267.200 206.400 M232.600 207.315 C 216.195 213.193,206.550 220.276,196.156 234.078 C 195.140 235.427,193.840 236.593,192.756 237.130 C 191.790 237.608,191.288 238.000,191.641 238.000 C 192.918 238.000,195.022 236.117,197.899 232.396 C 207.157 220.425,218.466 212.399,232.600 207.768 C 234.140 207.263,235.040 206.858,234.600 206.868 C 234.160 206.877,233.260 207.079,232.600 207.315 M270.200 207.086 C 271.784 207.470,279.830 210.560,281.147 211.292 C 281.888 211.703,282.585 211.948,282.697 211.837 C 283.140 211.393,271.461 206.760,270.117 206.846 C 269.511 206.886,269.524 206.923,270.200 207.086 M284.535 212.918 C 296.903 220.026,306.083 229.497,312.312 241.576 C 314.691 246.191,315.243 247.065,314.223 244.606 C 310.624 235.924,302.128 225.141,293.818 218.708 C 290.498 216.137,283.950 211.977,283.288 212.018 C 283.129 212.027,283.691 212.432,284.535 212.918 M165.633 235.346 C 165.725 235.426,168.590 235.576,172.000 235.679 C 175.432 235.783,177.307 235.733,176.200 235.568 C 174.167 235.265,165.329 235.079,165.633 235.346 M162.505 235.887 C 163.114 235.979,164.014 235.977,164.505 235.882 C 164.997 235.787,164.500 235.711,163.400 235.714 C 162.300 235.717,161.897 235.795,162.505 235.887 M158.200 236.410 C 157.666 236.647,157.998 236.686,159.200 236.527 C 160.190 236.396,161.075 236.224,161.167 236.144 C 161.514 235.843,158.964 236.072,158.200 236.410 M152.040 238.002 C 135.658 243.594,123.336 255.447,117.445 271.283 C 116.650 273.418,116.009 275.398,116.020 275.683 C 116.031 275.967,116.660 274.490,117.417 272.400 C 123.827 254.713,139.006 241.027,156.600 237.073 C 157.230 236.931,157.188 236.889,156.400 236.874 C 155.850 236.864,153.888 237.371,152.040 238.002 M184.600 237.409 C 187.215 238.135,188.324 238.112,186.000 237.379 C 185.010 237.067,183.840 236.822,183.400 236.833 C 182.960 236.845,183.500 237.104,184.600 237.409 M188.705 238.283 C 189.202 238.379,189.922 238.375,190.305 238.275 C 190.687 238.175,190.280 238.096,189.400 238.101 C 188.520 238.105,188.207 238.187,188.705 238.283 M315.346 248.000 C 315.460 248.330,315.949 249.840,316.432 251.356 C 317.362 254.270,319.713 257.209,321.100 257.191 C 321.524 257.185,321.282 256.927,320.487 256.535 C 318.765 255.686,317.772 254.232,316.800 251.135 C 316.362 249.741,315.809 248.330,315.571 248.000 C 315.187 247.467,315.162 247.467,315.346 248.000 M322.400 257.582 C 322.730 257.805,323.345 257.991,323.767 257.994 C 324.790 258.002,324.471 257.773,323.000 257.444 C 322.124 257.248,321.962 257.285,322.400 257.582 M327.391 258.992 C 328.927 259.519,330.262 259.872,330.358 259.775 C 330.454 259.679,330.456 259.600,330.361 259.600 C 330.266 259.600,329.204 259.240,328.000 258.800 C 326.796 258.360,325.539 258.008,325.206 258.017 C 324.873 258.026,325.856 258.465,327.391 258.992 M334.346 262.004 C 342.542 266.355,349.974 273.586,353.559 280.700 C 354.031 281.635,354.519 282.400,354.645 282.400 C 355.065 282.400,351.958 277.084,350.219 274.828 C 346.225 269.647,339.602 264.198,333.711 261.247 C 329.765 259.270,330.221 259.814,334.346 262.004 M115.207 278.446 C 114.927 279.681,114.796 280.941,114.917 281.246 C 115.038 281.551,115.151 281.332,115.168 280.760 C 115.186 280.188,115.396 279.156,115.636 278.468 C 115.876 277.780,115.992 276.988,115.895 276.709 C 115.797 276.429,115.488 277.211,115.207 278.446 M114.259 283.488 C 114.121 284.319,114.030 285.720,114.056 286.600 C 114.087 287.647,114.223 287.173,114.448 285.230 C 114.811 282.096,114.683 280.919,114.259 283.488 M354.828 283.000 C 354.828 283.220,355.086 283.850,355.400 284.400 C 355.714 284.950,355.972 285.220,355.972 285.000 C 355.972 284.780,355.714 284.150,355.400 283.600 C 355.086 283.050,354.828 282.780,354.828 283.000 M356.063 285.800 C 356.062 286.020,356.303 286.830,356.600 287.600 C 356.897 288.370,357.145 288.730,357.152 288.400 C 357.158 288.070,356.917 287.260,356.614 286.600 C 356.312 285.940,356.064 285.580,356.063 285.800 M357.256 289.600 C 357.256 289.930,357.411 290.560,357.600 291.000 C 357.817 291.504,357.944 291.578,357.944 291.200 C 357.944 290.870,357.789 290.240,357.600 289.800 C 357.383 289.296,357.256 289.222,357.256 289.600 M358.307 294.000 C 358.468 295.210,358.600 298.540,358.600 301.400 C 358.600 304.260,358.468 307.590,358.307 308.800 C 358.024 310.922,358.034 310.908,358.582 308.400 C 358.895 306.970,359.151 303.820,359.151 301.400 C 359.151 298.980,358.895 295.830,358.582 294.400 C 358.034 291.892,358.024 291.878,358.307 294.000 M114.053 295.657 C 113.688 308.550,124.326 327.455,137.025 336.480 C 142.294 340.223,152.882 345.222,155.483 345.192 C 155.877 345.187,154.580 344.639,152.600 343.973 C 131.513 336.884,117.019 318.872,114.422 296.530 C 114.143 294.125,114.099 294.021,114.053 295.657 M357.632 311.634 C 357.614 311.983,357.229 313.397,356.776 314.777 C 356.323 316.157,356.041 317.374,356.148 317.481 C 356.442 317.776,358.079 312.021,357.856 311.474 C 357.743 311.196,357.650 311.262,357.632 311.634 M354.055 321.661 C 348.381 333.337,337.493 342.266,325.307 345.237 C 324.156 345.518,323.296 345.829,323.396 345.929 C 323.495 346.029,324.437 345.885,325.489 345.610 C 335.678 342.942,344.655 336.672,350.786 327.943 C 352.672 325.257,356.252 318.516,355.950 318.219 C 355.868 318.138,355.015 319.687,354.055 321.661 M157.000 345.600 C 157.440 345.789,158.160 345.938,158.600 345.932 C 159.243 345.923,159.204 345.857,158.400 345.600 C 157.032 345.162,155.981 345.162,157.000 345.600 M162.600 346.592 C 165.241 347.044,178.909 347.128,240.800 347.074 L 315.800 347.009 239.400 346.758 C 197.380 346.619,162.190 346.402,161.200 346.275 C 160.210 346.148,160.840 346.291,162.600 346.592 M317.800 346.400 C 315.891 346.662,315.872 346.676,317.400 346.702 C 318.280 346.717,319.900 346.590,321.000 346.418 C 323.699 345.998,320.850 345.982,317.800 346.400 " stroke="none" fill="#fab32c" fill-rule="evenodd"></path><path id="path1" d="M190.600 34.464 C 188.419 35.593,187.267 36.711,186.363 38.575 C 185.183 41.010,185.183 80.021,186.363 82.316 C 189.820 89.035,200.202 89.431,204.200 82.995 L 205.400 81.064 205.513 61.032 C 205.638 38.856,205.689 39.356,203.028 36.467 C 200.314 33.521,194.295 32.551,190.600 34.464 M111.868 55.426 C 104.999 57.301,102.259 64.549,106.000 70.951 C 106.880 72.457,107.600 73.733,107.600 73.787 C 107.600 73.882,108.248 75.012,114.602 86.000 C 125.497 104.843,125.459 104.800,131.328 104.800 C 139.538 104.800,144.196 96.577,140.143 89.238 C 138.430 86.136,129.970 71.403,128.407 68.800 C 127.813 67.810,126.201 65.069,124.825 62.708 C 120.763 55.739,117.482 53.895,111.868 55.426 M273.553 55.406 C 269.855 56.419,269.448 56.896,263.504 67.200 C 261.410 70.830,258.395 76.050,256.803 78.800 C 249.252 91.844,249.537 91.217,249.537 94.807 C 249.537 102.335,257.138 107.085,264.092 103.901 C 266.747 102.685,266.416 103.153,274.380 89.400 C 277.948 83.240,281.459 77.210,282.183 76.000 C 289.188 64.289,288.049 57.844,278.535 55.366 C 276.060 54.722,276.048 54.722,273.553 55.406 M182.200 105.012 C 181.320 105.329,179.803 105.591,178.828 105.594 C 177.854 105.597,176.504 105.764,175.828 105.965 C 173.946 106.525,171.173 107.218,169.400 107.571 C 167.868 107.876,163.078 109.332,161.400 110.002 C 160.960 110.178,159.340 110.815,157.800 111.418 C 128.632 122.835,105.881 148.174,98.020 178.000 C 97.759 178.990,97.345 180.430,97.099 181.200 C 96.575 182.842,96.094 185.504,95.619 189.400 C 95.431 190.940,95.080 192.829,94.838 193.597 C 94.247 195.481,94.245 216.908,94.836 218.803 C 95.075 219.571,95.427 221.370,95.618 222.800 C 96.155 226.830,96.642 229.296,97.142 230.526 C 97.394 231.145,97.600 232.170,97.600 232.802 C 97.600 233.435,97.780 234.064,98.000 234.200 C 98.220 234.336,98.401 234.842,98.402 235.324 C 98.404 235.806,98.674 236.716,99.002 237.346 C 99.331 237.976,99.600 238.729,99.600 239.019 C 99.600 239.310,100.069 240.684,100.643 242.074 C 101.217 243.463,101.835 244.960,102.016 245.400 C 102.198 245.840,103.030 247.640,103.865 249.400 C 104.700 251.160,105.509 252.894,105.662 253.253 C 105.832 253.653,105.457 254.820,104.700 256.253 C 103.113 259.257,100.400 265.582,100.400 266.277 C 100.400 266.571,100.238 267.123,100.040 267.505 C 99.842 267.887,99.375 269.280,99.003 270.600 C 98.631 271.920,98.163 273.553,97.963 274.228 C 97.763 274.904,97.600 276.096,97.600 276.878 C 97.600 277.660,97.330 279.065,97.000 280.000 C 96.265 282.083,96.127 300.117,96.829 302.403 C 97.065 303.171,97.413 304.790,97.604 306.000 C 98.256 310.155,98.573 311.214,101.298 318.361 C 107.993 335.922,123.205 351.779,139.863 358.563 C 141.368 359.176,142.960 359.825,143.400 360.005 C 144.119 360.299,146.375 361.012,149.821 362.033 C 151.671 362.581,154.707 363.195,157.600 363.605 C 159.030 363.808,161.280 364.145,162.600 364.353 C 165.871 364.870,319.057 364.872,322.000 364.355 C 323.210 364.143,325.280 363.808,326.600 363.612 C 329.193 363.225,331.950 362.489,334.800 361.421 C 335.790 361.050,336.948 360.639,337.373 360.508 C 340.952 359.400,349.300 354.322,354.554 350.056 C 364.484 341.995,373.762 326.546,375.608 315.000 C 375.784 313.900,376.120 312.280,376.354 311.400 C 376.887 309.401,376.890 295.298,376.358 292.600 C 376.141 291.500,375.810 289.790,375.623 288.800 C 375.027 285.649,372.592 278.077,371.963 277.420 C 371.764 277.211,371.600 276.837,371.600 276.590 C 371.600 275.708,367.146 267.849,364.834 264.652 C 357.612 254.666,346.095 246.143,334.400 242.131 C 332.256 241.395,331.600 240.915,331.600 240.082 C 331.600 238.229,324.742 226.295,320.061 220.000 C 315.320 213.626,305.589 204.531,299.414 200.704 L 297.000 199.207 296.487 195.504 C 296.206 193.467,295.810 190.630,295.608 189.200 C 295.406 187.770,294.951 185.430,294.597 184.000 C 294.243 182.570,293.859 180.950,293.742 180.400 C 293.477 179.144,292.446 175.660,292.026 174.600 C 291.852 174.160,291.390 172.810,290.999 171.600 C 290.608 170.390,290.133 169.229,289.944 169.020 C 289.755 168.811,289.600 168.392,289.600 168.090 C 289.600 167.301,285.502 158.790,283.302 155.008 C 274.066 139.135,261.062 126.208,245.200 117.131 C 241.573 115.056,236.308 112.400,235.821 112.400 C 235.695 112.400,234.828 112.044,233.896 111.609 C 230.659 110.100,226.255 108.562,222.400 107.596 C 218.764 106.684,217.306 106.303,216.172 105.965 C 215.496 105.764,214.236 105.598,213.372 105.596 C 212.507 105.593,210.916 105.323,209.836 104.996 C 207.034 104.146,184.568 104.158,182.200 105.012 M50.975 115.117 C 42.171 120.027,42.745 129.197,52.200 134.698 C 53.960 135.721,56.930 137.451,58.800 138.540 C 60.670 139.630,64.450 141.817,67.200 143.400 C 69.950 144.984,74.180 147.430,76.600 148.836 C 85.994 154.293,94.017 151.240,94.705 141.946 C 95.114 136.416,93.911 135.032,83.500 129.050 C 79.815 126.932,73.785 123.452,70.100 121.314 C 57.184 113.824,54.723 113.027,50.975 115.117 M330.200 115.917 C 321.302 120.802,300.770 132.899,299.471 134.023 C 292.627 139.941,297.186 151.600,306.343 151.600 C 309.631 151.600,309.090 151.858,324.600 142.902 C 344.889 131.186,344.893 131.184,345.693 127.329 C 347.669 117.814,338.733 111.232,330.200 115.917 M201.200 122.796 C 207.665 123.285,210.875 123.860,219.000 125.985 C 244.580 132.673,268.158 156.951,275.539 184.200 C 277.706 192.201,277.736 192.135,272.467 190.856 C 259.631 187.740,246.014 187.748,233.400 190.877 C 231.640 191.314,229.550 191.831,228.756 192.025 C 215.637 195.239,199.640 205.638,188.274 218.343 C 186.228 220.630,185.888 220.857,184.899 220.595 C 176.795 218.451,159.962 218.969,151.000 221.640 C 140.383 224.804,128.818 230.935,122.800 236.590 C 120.885 238.389,119.791 238.922,119.305 238.292 C 118.388 237.101,116.424 231.204,115.078 225.600 C 111.455 210.515,112.154 193.493,116.991 179.000 C 127.581 147.274,157.089 124.674,190.361 122.806 C 193.133 122.650,195.580 122.499,195.800 122.471 C 196.020 122.442,198.450 122.588,201.200 122.796 M28.600 196.465 C 21.333 200.234,21.615 211.078,29.080 214.938 C 30.221 215.528,32.535 215.600,50.393 215.600 L 70.427 215.600 72.378 214.611 C 79.276 211.116,79.255 200.074,72.344 196.572 L 70.427 195.600 50.313 195.618 C 30.757 195.635,30.156 195.658,28.600 196.465 M318.792 196.380 C 311.624 200.171,311.751 211.523,319.000 214.848 C 321.520 216.004,359.591 215.990,362.122 214.832 C 369.557 211.430,369.505 199.855,362.039 196.256 C 359.828 195.191,320.830 195.302,318.792 196.380 M264.000 205.385 C 279.612 208.624,290.946 214.742,301.200 225.464 C 308.440 233.034,314.923 243.926,317.175 252.303 C 317.871 254.895,319.784 256.551,323.057 257.397 C 352.985 265.132,367.500 295.058,354.339 321.891 C 347.444 335.949,335.000 344.706,319.200 346.618 C 312.053 347.483,168.148 347.463,162.377 346.597 C 127.291 341.327,105.896 307.210,116.645 273.672 C 125.942 244.667,155.050 229.538,186.283 237.478 C 191.114 238.706,193.539 237.642,197.275 232.657 C 213.107 211.527,240.211 200.449,264.000 205.385 M78.000 261.531 C 76.130 262.586,71.630 265.167,68.000 267.267 C 64.370 269.368,59.690 272.075,57.600 273.284 C 50.167 277.583,47.611 279.262,46.832 280.355 C 40.302 289.525,50.412 300.567,60.481 295.262 C 64.464 293.164,83.686 282.063,88.555 279.048 C 102.054 270.692,91.835 253.732,78.000 261.531 " stroke="none" fill="#241b14" fill-rule="evenodd"></path><path id="path2" d="M244.600 205.189 C 226.315 207.390,209.795 217.015,197.899 232.396 C 193.140 238.550,191.666 239.112,184.687 237.430 C 151.295 229.385,120.351 249.393,114.829 282.600 C 109.810 312.782,131.560 341.890,162.361 346.213 C 168.667 347.099,312.268 347.083,319.400 346.196 C 359.474 341.214,373.079 290.158,340.766 266.016 C 335.610 262.164,329.960 259.579,322.208 257.527 C 319.118 256.709,317.665 254.978,316.054 250.196 C 308.456 227.631,289.230 211.106,264.400 205.800 C 260.895 205.051,248.836 204.679,244.600 205.189 " stroke="none" fill="#fbfbfb" fill-rule="evenodd"></path></g></svg> \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunrise-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunrise-symbolic.svg deleted file mode 100644 index b9d840a7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunrise-symbolic.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <g fill="#2e3436"> - <path d="m 2.984375 7.84375 c -0.128906 0 -0.253906 0.046875 -0.355469 0.144531 l -0.707031 0.710938 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 1.417969 1.414062 c 0.195312 0.195313 0.507812 0.195313 0.703125 0 l 0.710937 -0.707031 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -1.417968 -1.417969 c -0.097657 -0.097656 -0.222657 -0.148437 -0.351563 -0.144531 z m 9.898437 0 c -0.125 -0.003906 -0.253906 0.046875 -0.351562 0.144531 l -1.414062 1.417969 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 0.707031 0.707031 c 0.195312 0.195313 0.511719 0.195313 0.707031 0 l 1.414062 -1.414062 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -0.707031 -0.710938 c -0.097656 -0.097656 -0.226562 -0.144531 -0.355469 -0.144531 z m -4.949218 2.15625 c -2.195313 0 -4 1.800781 -4 4 c 0.003906 0.550781 0.449218 1 1 1 h 6 c 0.554687 0 1 -0.449219 1 -1 c 0 -2.199219 -1.800782 -4 -4 -4 z m -7.5 3 c -0.273438 0 -0.5000002 0.222656 -0.5000002 0.5 v 1 c 0 0.277344 0.2265622 0.5 0.5000002 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 13 0 c -0.273438 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.226562 0.5 0.5 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 0 0"/> - <path d="m 8 9 c -0.550781 0 -1 -0.449219 -1 -1 v -3 h -2 v -1 h 0.007812 c -0.003906 -0.265625 0.101563 -0.519531 0.285157 -0.707031 l 2 -2 c 0.390625 -0.390625 1.023437 -0.390625 1.414062 0 l 2 2 c 0.183594 0.1875 0.289063 0.441406 0.289063 0.707031 h 0.003906 v 1 h -2 v 3 c 0 0.550781 -0.449219 1 -1 1 z m 0 0"/> - </g> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunset-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunset-symbolic.svg deleted file mode 100644 index 9f25688e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/daytime-sunset-symbolic.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <g fill="#2e3436"> - <path d="m 2.984375 7.84375 c -0.128906 0 -0.253906 0.046875 -0.355469 0.144531 l -0.707031 0.710938 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 1.417969 1.414062 c 0.195312 0.195313 0.507812 0.195313 0.703125 0 l 0.710937 -0.707031 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -1.417968 -1.417969 c -0.097657 -0.097656 -0.222657 -0.148437 -0.351563 -0.144531 z m 9.898437 0 c -0.125 -0.003906 -0.253906 0.046875 -0.351562 0.144531 l -1.414062 1.417969 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 0.707031 0.707031 c 0.195312 0.195313 0.511719 0.195313 0.707031 0 l 1.414062 -1.414062 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -0.707031 -0.710938 c -0.097656 -0.097656 -0.226562 -0.144531 -0.355469 -0.144531 z m -4.949218 2.15625 c -2.195313 0 -4 1.800781 -4 4 c 0.003906 0.550781 0.449218 1 1 1 h 6 c 0.554687 0 1 -0.449219 1 -1 c 0 -2.199219 -1.800782 -4 -4 -4 z m -7.5 3 c -0.273438 0 -0.5000002 0.222656 -0.5000002 0.5 v 1 c 0 0.277344 0.2265622 0.5 0.5000002 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 13 0 c -0.273438 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.226562 0.5 0.5 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 0 0"/> - <path d="m 8 1 c -0.550781 0 -1 0.449219 -1 1 v 3 h -2 v 1 h 0.007812 c -0.003906 0.265625 0.101563 0.519531 0.285157 0.707031 l 2 2 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 l 2 -2 c 0.183594 -0.1875 0.289063 -0.441406 0.289063 -0.707031 h 0.003906 v -1 h -2 v -3 c 0 -0.550781 -0.449219 -1 -1 -1 z m 0 0"/> - </g> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/internet-web-browser-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/internet-web-browser-symbolic.svg deleted file mode 100644 index f33a9104..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/internet-web-browser-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 8 1.992188 c -2.617188 0 -5.238281 0.933593 -7.195312 2.808593 l -0.496094 0.480469 c -0.3984378 0.378906 -0.410156 1.011719 -0.03125 1.410156 c 0.382812 0.398438 1.015625 0.410156 1.414062 0.03125 l 0.5 -0.476562 c 3.085938 -2.957032 8.53125 -2.957032 11.617188 0 l 0.5 0.476562 c 0.398437 0.378906 1.03125 0.367188 1.414062 -0.03125 c 0.378906 -0.398437 0.367188 -1.03125 -0.03125 -1.410156 l -0.496094 -0.484375 c -1.957031 -1.871094 -4.578124 -2.804687 -7.195312 -2.804687 z m -0.03125 4.007812 c -1.570312 0.011719 -3.128906 0.628906 -4.207031 1.8125 l -0.5 0.550781 c -0.179688 0.195313 -0.277344 0.453125 -0.261719 0.71875 c 0.011719 0.265625 0.128906 0.515625 0.328125 0.695313 c 0.195313 0.179687 0.453125 0.273437 0.71875 0.257812 c 0.265625 -0.011718 0.515625 -0.128906 0.695313 -0.328125 l 0.496093 -0.546875 c 1.277344 -1.402344 4.160157 -1.496094 5.523438 0.003906 l 0.5 0.542969 c 0.175781 0.199219 0.425781 0.316407 0.691406 0.328125 c 0.265625 0.015625 0.523437 -0.078125 0.722656 -0.257812 c 0.195313 -0.179688 0.3125 -0.429688 0.324219 -0.695313 c 0.011719 -0.261719 -0.082031 -0.523437 -0.261719 -0.71875 l -0.5 -0.546875 c -1.121093 -1.234375 -2.703125 -1.828125 -4.269531 -1.816406 z m 0.03125 4 c -0.511719 0 -1.023438 0.195312 -1.414062 0.585938 c -0.78125 0.78125 -0.78125 2.046874 0 2.828124 s 2.046874 0.78125 2.828124 0 s 0.78125 -2.046874 0 -2.828124 c -0.390624 -0.390626 -0.902343 -0.585938 -1.414062 -0.585938 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-night-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-night-symbolic.svg deleted file mode 100644 index 20315b26..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-night-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 6.816406 1.105469 c -3.296875 0.566406 -5.824218 3.441406 -5.824218 6.894531 c 0 3.855469 3.148437 7 7.003906 7 c 1.75 0 3.347656 -0.652344 4.578125 -1.722656 c -3.773438 -0.980469 -6.582031 -4.417969 -6.582031 -8.492188 c 0 -1.3125 0.300781 -2.554687 0.824218 -3.679687 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-symbolic.svg deleted file mode 100644 index fd211601..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-clear-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 7.5 0 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 2 c 0 0.277344 0.222656 0.5 0.5 0.5 h 1 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -2 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m -4.449219 1.84375 c -0.128906 0 -0.253906 0.046875 -0.351562 0.144531 l -0.710938 0.710938 c -0.195312 0.195312 -0.195312 0.507812 0 0.707031 l 1.417969 1.414062 c 0.195312 0.195313 0.507812 0.195313 0.707031 0 l 0.707031 -0.707031 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -1.414062 -1.417969 c -0.101562 -0.097656 -0.226562 -0.144531 -0.355469 -0.144531 z m 9.898438 0 c -0.128907 0 -0.253907 0.046875 -0.355469 0.144531 l -1.414062 1.417969 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 0.707031 0.707031 c 0.199219 0.195313 0.511719 0.195313 0.707031 0 l 1.417969 -1.414062 c 0.195312 -0.199219 0.195312 -0.511719 0 -0.707031 l -0.710938 -0.710938 c -0.097656 -0.097656 -0.222656 -0.144531 -0.351562 -0.144531 z m -4.949219 2.164062 c -2.195312 0 -4 1.804688 -4 4 c 0 2.191407 1.804688 4 4 4 s 4 -1.808593 4 -4 c 0 -2.195312 -1.804688 -4 -4 -4 z m -7.5 2.992188 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.222656 0.5 0.5 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 13 0 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.222656 0.5 0.5 0.5 h 2 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m -9.742188 4.035156 c -0.128906 0 -0.253906 0.046875 -0.351562 0.144532 l -1.417969 1.414062 c -0.195312 0.199219 -0.195312 0.511719 0 0.707031 l 0.710938 0.710938 c 0.195312 0.195312 0.507812 0.195312 0.707031 0 l 1.414062 -1.417969 c 0.195313 -0.195312 0.195313 -0.507812 0 -0.707031 l -0.707031 -0.707031 c -0.101562 -0.097657 -0.226562 -0.144532 -0.355469 -0.144532 z m 8.484376 0 c -0.128907 0 -0.253907 0.046875 -0.355469 0.144532 l -0.707031 0.707031 c -0.195313 0.199219 -0.195313 0.511719 0 0.707031 l 1.414062 1.417969 c 0.199219 0.195312 0.511719 0.195312 0.707031 0 l 0.710938 -0.710938 c 0.195312 -0.195312 0.195312 -0.507812 0 -0.707031 l -1.417969 -1.414062 c -0.097656 -0.097657 -0.222656 -0.144532 -0.351562 -0.144532 z m -4.742188 1.964844 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 2 c 0 0.277344 0.222656 0.5 0.5 0.5 h 1 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -2 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-night-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-night-symbolic.svg deleted file mode 100644 index 1f4d32cf..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-night-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 6.820312 1.105469 c -3.296874 0.566406 -5.824218 3.441406 -5.824218 6.894531 c 0 2.328125 1.15625 4.394531 2.917968 5.667969 c 0.3125 -0.8125 1.0625 -1.394531 1.941407 -1.636719 c 0.140625 -1.046875 0.707031 -1.960938 1.515625 -2.554688 c -0.867188 -1.359374 -1.375 -2.964843 -1.375 -4.691406 c 0 -1.3125 0.300781 -2.554687 0.824218 -3.679687 z m 2.679688 8.894531 c -1.378906 0 -2.5 1.121094 -2.5 2.5 c 0 0.21875 0.042969 0.421875 0.09375 0.625 c -0.179688 -0.074219 -0.386719 -0.125 -0.59375 -0.125 c -0.828125 0 -1.5 0.671875 -1.5 1.5 s 0.671875 1.5 1.5 1.5 h 8 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 c 0 -1.105469 -0.894531 -2 -2 -2 c -0.316406 0 -0.609375 0.089844 -0.875 0.21875 c -0.4375 -0.726562 -1.214844 -1.21875 -2.125 -1.21875 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-symbolic.svg deleted file mode 100644 index ebcc92a8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-few-clouds-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 6.5 1 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.222656 0.5 0.5 0.5 h 1 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m -3.742188 1.550781 c -0.128906 0 -0.253906 0.046875 -0.351562 0.148438 l -0.707031 0.707031 c -0.199219 0.195312 -0.199219 0.507812 0 0.707031 l 0.707031 0.707031 c 0.195312 0.195313 0.507812 0.195313 0.707031 0 l 0.707031 -0.707031 c 0.195313 -0.199219 0.195313 -0.511719 0 -0.707031 l -0.707031 -0.707031 c -0.101562 -0.101563 -0.226562 -0.148438 -0.355469 -0.148438 z m 8.484376 0 c -0.128907 -0.003906 -0.253907 0.046875 -0.355469 0.148438 l -0.707031 0.707031 c -0.195313 0.195312 -0.195313 0.507812 0 0.707031 l 0.707031 0.707031 c 0.199219 0.195313 0.511719 0.195313 0.707031 0 l 0.707031 -0.707031 c 0.199219 -0.199219 0.199219 -0.511719 0 -0.707031 l -0.707031 -0.707031 c -0.097656 -0.101563 -0.222656 -0.148438 -0.351562 -0.148438 z m -4.253907 1.457031 c -2.195312 0 -4 1.804688 -4 4 c 0 1.894532 1.347657 3.492188 3.128907 3.894532 c 0 -0.003906 0 -0.007813 0.003906 -0.011719 c 0.476562 -2.085937 2.136718 -3.003906 4.042968 -2.808594 c 0.191407 0.046875 0.371094 0.117188 0.546876 0.195313 c 0.015624 0.003906 0.03125 0.007812 0.042968 0.015625 c 0.140625 -0.40625 0.234375 -0.835938 0.234375 -1.289063 c 0 -2.191406 -1.804687 -4 -4 -4 z m -6.488281 2.992188 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.222656 0.5 0.5 0.5 h 1 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 12 0 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1 c 0 0.277344 0.222656 0.5 0.5 0.5 h 1 c 0.277344 0 0.5 -0.222656 0.5 -0.5 v -1 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m -3 3 c -1.378906 0 -2.5 1.121094 -2.5 2.5 c 0 0.21875 0.042969 0.421875 0.09375 0.625 c -0.179688 -0.074219 -0.386719 -0.125 -0.59375 -0.125 c -0.828125 0 -1.5 0.671875 -1.5 1.5 s 0.671875 1.5 1.5 1.5 h 8 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 c 0 -1.105469 -0.894531 -2 -2 -2 c -0.316406 0 -0.609375 0.089844 -0.875 0.21875 c -0.4375 -0.726562 -1.214844 -1.21875 -2.125 -1.21875 z m -6.742188 1.035156 c -0.128906 0 -0.253906 0.046875 -0.351562 0.144532 l -0.707031 0.707031 c -0.199219 0.199219 -0.199219 0.511719 0 0.707031 l 0.707031 0.707031 c 0.195312 0.199219 0.507812 0.199219 0.707031 0 l 0.707031 -0.707031 c 0.195313 -0.195312 0.195313 -0.507812 0 -0.707031 l -0.707031 -0.707031 c -0.101562 -0.097657 -0.226562 -0.144532 -0.355469 -0.144532 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-fog-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-fog-symbolic.svg deleted file mode 100644 index d1c31ba1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-fog-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 3.316406 0.992188 c -0.621094 0 -1 0.332031 -1.273437 0.59375 c -0.273438 0.265624 -0.480469 0.542968 -0.675781 0.796874 c -0.191407 0.25 -0.371094 0.46875 -0.484376 0.578126 c -0.113281 0.113281 -0.121093 0.03125 0.113282 0.03125 c -0.546875 0 -0.996094 0.449218 -0.996094 0.996093 c 0 0.265625 0.105469 0.519531 0.292969 0.707031 s 0.441406 0.292969 0.703125 0.292969 c 0.625 0 1.003906 -0.328125 1.273437 -0.59375 c 0.273438 -0.265625 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.191406 0.261719 -0.324218 0.371094 -0.445312 c 0.109375 0.121094 0.222656 0.253906 0.371094 0.445312 c 0.191406 0.25 0.402344 0.53125 0.671875 0.792969 c 0.273437 0.265625 0.652344 0.59375 1.277344 0.59375 c 0.625 0.003907 1 -0.328125 1.273437 -0.59375 c 0.273438 -0.261719 0.484375 -0.542969 0.675782 -0.792969 c 0.148437 -0.191406 0.261718 -0.324218 0.371093 -0.445312 c 0.109375 0.121094 0.222657 0.257812 0.367188 0.445312 c 0.195312 0.253907 0.402343 0.53125 0.675781 0.796876 c 0.273438 0.265624 0.652344 0.59375 1.273438 0.59375 c 0.625 0 1.003906 -0.328126 1.273437 -0.59375 c 0.273437 -0.265626 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.191407 0.261719 -0.324219 0.371094 -0.445313 c 0.109375 0.121094 0.222656 0.253906 0.371094 0.445313 c 0.191406 0.25 0.402344 0.53125 0.675781 0.792969 c 0.273437 0.265624 0.648437 0.59375 1.273437 0.59375 c 0.550782 0.003906 0.996094 -0.445313 0.996094 -0.996094 c 0 -0.480469 -0.34375 -0.894532 -0.820312 -0.980469 c -0.011719 -0.007813 -0.03125 -0.019531 -0.058594 -0.046875 c -0.117188 -0.109375 -0.296875 -0.332031 -0.488281 -0.582031 c -0.191407 -0.25 -0.402344 -0.53125 -0.671875 -0.796875 c -0.273438 -0.261719 -0.652344 -0.589844 -1.273438 -0.59375 c -0.625 0 -1.003906 0.332031 -1.277344 0.59375 c -0.273437 0.265625 -0.480468 0.542968 -0.671874 0.792968 c -0.148438 0.191407 -0.265626 0.324219 -0.371094 0.445313 c -0.109375 -0.121094 -0.226563 -0.253906 -0.371094 -0.445313 c -0.195312 -0.25 -0.402344 -0.527343 -0.675781 -0.792968 c -0.273438 -0.265625 -0.648438 -0.59375 -1.273438 -0.59375 s -1.003906 0.328125 -1.273437 0.59375 c -0.273438 0.265625 -0.484375 0.542968 -0.675782 0.792968 c -0.148437 0.191407 -0.261718 0.324219 -0.371093 0.441407 c -0.109375 -0.117188 -0.222657 -0.25 -0.371094 -0.441407 c -0.191406 -0.25 -0.402344 -0.53125 -0.671875 -0.796874 c -0.273438 -0.261719 -0.652344 -0.589844 -1.273438 -0.59375 z m 0 5.003906 c -0.621094 0 -1 0.328125 -1.273437 0.59375 c -0.273438 0.265625 -0.480469 0.542968 -0.675781 0.792968 c -0.191407 0.25 -0.371094 0.472657 -0.484376 0.582032 c -0.113281 0.109375 -0.121093 0.03125 0.113282 0.03125 c -0.546875 0 -0.996094 0.445312 -0.996094 0.996094 c 0 0.265624 0.105469 0.519531 0.292969 0.707031 s 0.441406 0.292969 0.703125 0.289062 c 0.625 0.003907 1.003906 -0.328125 1.273437 -0.59375 c 0.273438 -0.261719 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.1875 0.261719 -0.320312 0.371094 -0.441406 c 0.109375 0.121094 0.222656 0.253906 0.371094 0.441406 c 0.191406 0.253907 0.402344 0.53125 0.671875 0.796876 c 0.273437 0.265624 0.652344 0.59375 1.277344 0.59375 s 1 -0.328126 1.273437 -0.59375 c 0.273438 -0.265626 0.484375 -0.542969 0.675782 -0.792969 c 0.148437 -0.191407 0.261718 -0.324219 0.371093 -0.445313 c 0.109375 0.121094 0.222657 0.253906 0.367188 0.445313 c 0.195312 0.25 0.402343 0.53125 0.675781 0.792969 c 0.273438 0.265624 0.652344 0.59375 1.273438 0.59375 c 0.625 0.003906 1.003906 -0.328126 1.273437 -0.59375 c 0.273437 -0.261719 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.1875 0.261719 -0.324219 0.371094 -0.445313 c 0.109375 0.121094 0.222656 0.253906 0.371094 0.445313 c 0.191406 0.253906 0.402344 0.53125 0.671875 0.796875 c 0.273437 0.265625 0.652343 0.59375 1.277343 0.59375 c 0.550782 0 0.996094 -0.445313 0.996094 -0.996094 c 0 -0.484375 -0.34375 -0.894531 -0.820312 -0.980469 c -0.011719 -0.007812 -0.03125 -0.023437 -0.058594 -0.046875 c -0.117188 -0.113281 -0.296875 -0.332031 -0.488281 -0.582031 c -0.191407 -0.253906 -0.402344 -0.53125 -0.671875 -0.796875 c -0.273438 -0.265625 -0.652344 -0.59375 -1.273438 -0.59375 c -0.625 0 -1.003906 0.328125 -1.277344 0.59375 c -0.273437 0.265625 -0.480468 0.542969 -0.671874 0.792969 c -0.148438 0.191406 -0.265626 0.324219 -0.371094 0.445312 c -0.109375 -0.121093 -0.226563 -0.253906 -0.371094 -0.445312 c -0.195312 -0.25 -0.402344 -0.53125 -0.675781 -0.792969 c -0.273438 -0.265625 -0.648438 -0.59375 -1.273438 -0.59375 c -0.625 -0.003906 -1.003906 0.328125 -1.273437 0.59375 c -0.273438 0.261719 -0.484375 0.542969 -0.675782 0.792969 c -0.148437 0.1875 -0.261718 0.320312 -0.371093 0.441406 c -0.109375 -0.121094 -0.222657 -0.253906 -0.371094 -0.441406 c -0.191406 -0.253907 -0.402344 -0.53125 -0.671875 -0.796875 c -0.273438 -0.265625 -0.652344 -0.59375 -1.273438 -0.59375 z m 0 5.003906 c -0.621094 -0.003906 -1 0.328125 -1.273437 0.59375 c -0.273438 0.261719 -0.480469 0.539062 -0.675781 0.792969 c -0.191407 0.25 -0.371094 0.46875 -0.484376 0.582031 c -0.113281 0.109375 -0.121093 0.027344 0.113282 0.027344 c -0.546875 0 -0.996094 0.449218 -0.996094 0.996094 c 0 0.265624 0.105469 0.519531 0.292969 0.707031 s 0.441406 0.292969 0.703125 0.292969 c 0.625 0 1.003906 -0.328126 1.273437 -0.59375 c 0.273438 -0.265626 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.191407 0.261719 -0.324219 0.371094 -0.445313 c 0.109375 0.121094 0.222656 0.253906 0.371094 0.445313 c 0.191406 0.25 0.402344 0.53125 0.671875 0.792969 c 0.273437 0.265624 0.652344 0.59375 1.277344 0.59375 c 0.625 0.003906 1 -0.328126 1.273437 -0.59375 c 0.273438 -0.261719 0.484375 -0.542969 0.675782 -0.792969 c 0.148437 -0.191407 0.261718 -0.324219 0.371093 -0.445313 c 0.109375 0.121094 0.222657 0.257813 0.367188 0.445313 c 0.195312 0.253906 0.402343 0.53125 0.675781 0.796875 s 0.652344 0.59375 1.273438 0.59375 c 0.625 0 1.003906 -0.328125 1.273437 -0.59375 c 0.273437 -0.265625 0.484375 -0.542969 0.675781 -0.792969 c 0.148438 -0.191406 0.261719 -0.324219 0.371094 -0.445313 c 0.109375 0.121094 0.222656 0.253907 0.371094 0.445313 c 0.191406 0.25 0.402344 0.53125 0.675781 0.792969 c 0.273437 0.265625 0.648437 0.59375 1.273437 0.59375 c 0.550782 0.003906 0.996094 -0.445313 0.996094 -0.996094 c 0 -0.480469 -0.34375 -0.894531 -0.820312 -0.980469 c -0.011719 -0.007812 -0.03125 -0.019531 -0.058594 -0.046875 c -0.117188 -0.109375 -0.296875 -0.332031 -0.488281 -0.582031 c -0.191407 -0.25 -0.402344 -0.527344 -0.671875 -0.792969 c -0.273438 -0.265625 -0.652344 -0.59375 -1.273438 -0.597656 c -0.625 0 -1.003906 0.332031 -1.277344 0.59375 c -0.273437 0.265625 -0.480468 0.542969 -0.671874 0.792969 c -0.148438 0.191406 -0.265626 0.324219 -0.371094 0.445312 c -0.109375 -0.121093 -0.226563 -0.253906 -0.371094 -0.445312 c -0.195312 -0.25 -0.402344 -0.527344 -0.675781 -0.792969 c -0.273438 -0.265625 -0.648438 -0.59375 -1.273438 -0.59375 s -1.003906 0.328125 -1.273437 0.59375 c -0.273438 0.265625 -0.484375 0.542969 -0.675782 0.792969 c -0.148437 0.191406 -0.261718 0.324219 -0.371093 0.441406 c -0.109375 -0.117187 -0.222657 -0.25 -0.371094 -0.441406 c -0.191406 -0.25 -0.402344 -0.53125 -0.671875 -0.796875 c -0.273438 -0.261719 -0.652344 -0.589844 -1.273438 -0.59375 z m 0 0" fill="#2e3436" fill-opacity="0.34902"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-freezing-rain-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-freezing-rain-symbolic.svg deleted file mode 100644 index 1cf4e3b0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-freezing-rain-symbolic.svg +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><g fill="#2e3436"><path d="m 9.492188 1 c -1.277344 0 -2.3125 0.972656 -2.457032 2.21875 c -0.324218 -0.121094 -0.65625 -0.21875 -1.023437 -0.21875 c -1.648438 0 -2.984375 1.34375 -2.984375 3 c 0 0.097656 0.023437 0.183594 0.03125 0.28125 c -0.296875 -0.179688 -0.652344 -0.28125 -1.027344 -0.28125 c -1.097656 0 -1.9882812 0.894531 -1.9882812 2 s 0.8906252 2 1.9882812 2 h 0.375 c 0.164062 -0.351562 0.367188 -0.679688 0.652344 -0.96875 l 2.453125 -2.46875 l 2.457031 2.46875 c 0.285156 0.285156 0.464844 0.621094 0.621094 0.96875 h 0.464844 l 1.429687 -1.4375 l 1.429687 1.4375 h 2.550782 c 0.824218 0 1.492187 -0.671875 1.492187 -1.5 s -0.667969 -1.5 -1.492187 -1.5 c -0.207032 0 -0.414063 0.050781 -0.589844 0.125 c 0.050781 -0.203125 0.089844 -0.40625 0.089844 -0.625 c 0 -1.230469 -0.886719 -2.226562 -2.050782 -2.4375 c 0.042969 -0.179688 0.0625 -0.367188 0.0625 -0.5625 c 0 -1.378906 -1.113281 -2.5 -2.484374 -2.5 z m 0 0"/><path d="m 5.5 7.917969 l -1.769531 1.769531 c -0.96875 0.972656 -0.96875 2.5625 0 3.535156 c 0.972656 0.972656 2.566406 0.972656 3.535156 0 c 0.972656 -0.972656 0.972656 -2.5625 0 -3.535156 z m 0 1.414062 l 1.058594 1.0625 c 0.589844 0.589844 0.589844 1.53125 0 2.121094 s -1.53125 0.589844 -2.121094 0 s -0.589844 -1.53125 0 -2.121094 z m 0 0"/><path d="m 10.5 9.917969 l -1.769531 1.769531 c -0.96875 0.972656 -0.96875 2.5625 0 3.535156 c 0.972656 0.972656 2.566406 0.972656 3.535156 0 c 0.972656 -0.972656 0.972656 -2.5625 0 -3.535156 z m 0 1.414062 l 1.058594 1.0625 c 0.589844 0.589844 0.589844 1.53125 0 2.121094 s -1.53125 0.589844 -2.121094 0 s -0.589844 -1.53125 0 -2.121094 z m 0 0"/></g></svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-overcast-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-overcast-symbolic.svg deleted file mode 100644 index 51cfb4e8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-overcast-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 9.5 2 c -1.285156 0 -2.328125 0.972656 -2.46875 2.21875 c -0.328125 -0.121094 -0.660156 -0.21875 -1.03125 -0.21875 c -1.65625 0 -3 1.34375 -3 3 c 0 0.097656 0.023438 0.183594 0.03125 0.28125 c -0.300781 -0.179688 -0.65625 -0.28125 -1.03125 -0.28125 c -1.105469 0 -2 0.894531 -2 2 s 0.894531 2 2 2 h 3.101562 c 0.25 -1.679688 1.652344 -3 3.398438 -3 c 0.980469 0 1.785156 0.488281 2.417969 1.144531 c 0.195312 -0.046875 0.359375 -0.144531 0.582031 -0.144531 c 1.261719 0 2.1875 0.875 2.605469 2 h 0.394531 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 c -0.207031 0 -0.414062 0.050781 -0.59375 0.125 c 0.050781 -0.203125 0.09375 -0.40625 0.09375 -0.625 c 0 -1.230469 -0.894531 -2.226562 -2.0625 -2.4375 c 0.042969 -0.179688 0.0625 -0.367188 0.0625 -0.5625 c 0 -1.378906 -1.121094 -2.5 -2.5 -2.5 z m -1 7 c -1.378906 0 -2.5 1.121094 -2.5 2.5 c 0 0.21875 0.042969 0.421875 0.09375 0.625 c -0.179688 -0.074219 -0.386719 -0.125 -0.59375 -0.125 c -0.828125 0 -1.5 0.671875 -1.5 1.5 s 0.671875 1.5 1.5 1.5 h 8 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 c 0 -1.105469 -0.894531 -2 -2 -2 c -0.316406 0 -0.609375 0.089844 -0.875 0.21875 c -0.4375 -0.726562 -1.214844 -1.21875 -2.125 -1.21875 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-severe-alert-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-severe-alert-symbolic.svg deleted file mode 100644 index 19321a17..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-severe-alert-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 9.5 2 c -1.285156 0 -2.328125 0.972656 -2.46875 2.21875 c -0.328125 -0.121094 -0.664062 -0.21875 -1.03125 -0.21875 c -1.65625 0 -3 1.34375 -3 3 c 0 0.097656 0.023438 0.183594 0.03125 0.28125 c -0.300781 -0.179688 -0.65625 -0.28125 -1.03125 -0.28125 c -1.105469 0 -2 0.894531 -2 2 s 0.894531 2 2 2 h 5 v -2.125 c 0 -1.011719 0.863281 -1.875 1.875 -1.875 h 5.0625 c -0.210938 -0.984375 -1 -1.757812 -2 -1.9375 c 0.042969 -0.179688 0.0625 -0.367188 0.0625 -0.5625 c 0 -1.378906 -1.121094 -2.5 -2.5 -2.5 z m 0 0" fill="#2e3436"/> - <path class="warning" d="m 8.875 8 c -0.492188 0 -0.875 0.382812 -0.875 0.875 v 6.25 c 0 0.492188 0.382812 0.875 0.875 0.875 h 6.25 c 0.492188 0 0.875 -0.382812 0.875 -0.875 v -6.25 c 0 -0.492188 -0.382812 -0.875 -0.875 -0.875 z m 2.125 1 h 2 v 2.5 s 0 0.5 -0.5 0.5 h -1 c -0.5 0 -0.5 -0.5 -0.5 -0.5 z m 0.5 4 h 1 c 0.277344 0 0.5 0.222656 0.5 0.5 v 1 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -1 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -1 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0" fill="#ff7800"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-scattered-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-scattered-symbolic.svg deleted file mode 100644 index 3f5b3680..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-scattered-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 5 1.761719 c -0.214844 0 -0.429688 0.082031 -0.570312 0.25 c -0.25 0.289062 -2.429688 2.898437 -2.429688 4.988281 c 0 0.773438 0.265625 1.5 0.75 2.042969 c 0.390625 0.4375 1.09375 0.957031 2.25 0.957031 c 1.96875 0 3 -1.507812 3 -3 c 0 -2.09375 -2.183594 -4.699219 -2.429688 -4.988281 c -0.144531 -0.167969 -0.355468 -0.25 -0.570312 -0.25 z m 6 4 c -0.214844 0 -0.429688 0.082031 -0.570312 0.25 c -0.25 0.289062 -2.429688 2.898437 -2.429688 4.988281 c 0 0.773438 0.265625 1.5 0.75 2.042969 c 0.390625 0.4375 1.09375 0.957031 2.25 0.957031 c 1.96875 0 3 -1.507812 3 -3 c 0 -2.09375 -2.183594 -4.699219 -2.429688 -4.988281 c -0.144531 -0.167969 -0.355468 -0.25 -0.570312 -0.25 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-symbolic.svg deleted file mode 100644 index 2de4ac39..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-showers-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 9.464844 0 c -1.273438 0 -2.304688 0.972656 -2.449219 2.21875 c -0.320313 -0.121094 -0.65625 -0.21875 -1.023437 -0.21875 c -1.640626 0 -2.972657 1.34375 -2.972657 3 c 0 0.097656 0.023438 0.183594 0.03125 0.28125 c -0.296875 -0.179688 -0.652343 -0.28125 -1.023437 -0.28125 c -1.09375 0 -1.9843752 0.894531 -1.9843752 2 s 0.8906252 2 1.9843752 2 h 12.394531 c 0.824219 0 1.488281 -0.671875 1.488281 -1.5 s -0.664062 -1.5 -1.488281 -1.5 c -0.203125 0 -0.410156 0.050781 -0.589844 0.125 c 0.054688 -0.203125 0.09375 -0.40625 0.09375 -0.625 c 0 -1.230469 -0.882812 -2.226562 -2.042969 -2.4375 c 0.042969 -0.179688 0.0625 -0.367188 0.0625 -0.5625 c 0 -1.378906 -1.109374 -2.5 -2.480468 -2.5 z m -7.027344 10 c -0.210938 0.027344 -0.386719 0.1875 -0.429688 0.394531 l -1 4.921875 c -0.023437 0.128906 0 0.261719 0.074219 0.375 c 0.070313 0.109375 0.183594 0.183594 0.3125 0.210938 c 0.132813 0.027344 0.265625 0 0.375 -0.074219 c 0.109375 -0.070313 0.1875 -0.183594 0.210938 -0.316406 l 1 -4.917969 c 0.027343 -0.128906 0.003906 -0.261719 -0.070313 -0.371094 c -0.070312 -0.109375 -0.183594 -0.1875 -0.316406 -0.210937 c -0.050781 -0.011719 -0.101562 -0.015625 -0.15625 -0.011719 z m 8.007812 0 c -0.214843 0.027344 -0.386718 0.1875 -0.429687 0.394531 l -1 4.921875 c -0.027344 0.128906 0 0.261719 0.070313 0.375 c 0.074218 0.109375 0.1875 0.183594 0.316406 0.210938 s 0.265625 0 0.375 -0.074219 c 0.109375 -0.070313 0.183594 -0.183594 0.210937 -0.316406 l 1 -4.917969 c 0.027344 -0.128906 0 -0.261719 -0.070312 -0.371094 c -0.074219 -0.109375 -0.1875 -0.1875 -0.316407 -0.210937 c -0.050781 -0.011719 -0.105468 -0.015625 -0.15625 -0.011719 z m 2 0 c -0.210937 0.027344 -0.386718 0.1875 -0.429687 0.394531 l -1 4.921875 c -0.023437 0.128906 0 0.261719 0.074219 0.375 c 0.070312 0.109375 0.183594 0.183594 0.3125 0.210938 c 0.132812 0.027344 0.265625 0 0.375 -0.074219 c 0.109375 -0.070313 0.1875 -0.183594 0.210937 -0.316406 l 1 -4.917969 c 0.027344 -0.128906 0.003907 -0.261719 -0.070312 -0.371094 c -0.070313 -0.109375 -0.183594 -0.1875 -0.316407 -0.210937 c -0.050781 -0.011719 -0.101562 -0.015625 -0.15625 -0.011719 z m -6.003906 0.003906 c -0.210937 0.023438 -0.382812 0.183594 -0.429687 0.394532 l -1 4.917968 c -0.023438 0.128906 0 0.261719 0.074219 0.375 c 0.070312 0.109375 0.183593 0.183594 0.3125 0.210938 c 0.269531 0.054687 0.53125 -0.121094 0.585937 -0.386719 l 1 -4.917969 c 0.027344 -0.132812 0.003906 -0.265625 -0.070313 -0.375 c -0.074218 -0.109375 -0.1875 -0.1875 -0.316406 -0.210937 c -0.050781 -0.011719 -0.101562 -0.015625 -0.15625 -0.007813 z m 2.003906 0 c -0.214843 0.023438 -0.386718 0.183594 -0.429687 0.394532 l -1.003906 4.917968 c -0.023438 0.128906 0 0.265625 0.074219 0.375 c 0.074218 0.109375 0.1875 0.183594 0.316406 0.210938 c 0.269531 0.054687 0.53125 -0.121094 0.582031 -0.386719 l 1 -4.917969 c 0.027344 -0.132812 0.003906 -0.265625 -0.070313 -0.375 c -0.070312 -0.109375 -0.183593 -0.1875 -0.316406 -0.210937 c -0.050781 -0.011719 -0.101562 -0.015625 -0.152344 -0.007813 z m -4.003906 0.003906 c -0.210937 0.023438 -0.386718 0.183594 -0.429687 0.394532 l -1 4.914062 c -0.027344 0.128906 0 0.261719 0.070312 0.375 c 0.074219 0.109375 0.1875 0.183594 0.316407 0.210938 c 0.128906 0.027344 0.265624 0 0.375 -0.074219 c 0.109374 -0.070313 0.183593 -0.183594 0.210937 -0.3125 l 1 -4.914063 c 0.027344 -0.128906 0.003906 -0.265624 -0.070313 -0.375 c -0.070312 -0.109374 -0.183593 -0.1875 -0.316406 -0.210937 c -0.050781 -0.011719 -0.101562 -0.015625 -0.15625 -0.011719 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-snow-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-snow-symbolic.svg deleted file mode 100644 index 60fe5c87..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-snow-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 7.5 0.5 c -0.277344 0 -0.5 0.222656 -0.5 0.5 v 1.53125 l -1.253906 -0.714844 c -0.238282 -0.136718 -0.542969 -0.054687 -0.679688 0.183594 c -0.136718 0.242188 -0.054687 0.546875 0.183594 0.683594 l 1.75 1 v 3.449218 l -2.988281 -1.726562 l 0.007812 -2.011719 c 0 -0.273437 -0.222656 -0.5 -0.496093 -0.5 c -0.277344 0 -0.5 0.222657 -0.5 0.496094 l -0.007813 1.441406 l -1.328125 -0.765625 c -0.113281 -0.066406 -0.25 -0.085937 -0.378906 -0.050781 s -0.238282 0.121094 -0.304688 0.234375 s -0.085937 0.25 -0.050781 0.378906 s 0.121094 0.238282 0.234375 0.304688 l 1.328125 0.765625 l -1.246094 0.726562 c -0.238281 0.136719 -0.320312 0.445313 -0.179687 0.683594 c 0.136718 0.238281 0.441406 0.320313 0.683594 0.179687 l 1.738281 -1.015624 l 2.988281 1.726562 l -2.988281 1.726562 l -1.738281 -1.015624 c -0.242188 -0.140626 -0.546876 -0.058594 -0.683594 0.183593 c -0.140625 0.238281 -0.058594 0.542969 0.179687 0.679688 l 1.246094 0.726562 l -1.328125 0.765625 c -0.113281 0.066406 -0.199219 0.175782 -0.234375 0.304688 s -0.015625 0.265625 0.050781 0.378906 h 0.003906 c 0.136719 0.238281 0.441407 0.320312 0.679688 0.183594 l 1.328125 -0.765625 l 0.007813 1.441406 c 0 0.273437 0.222656 0.5 0.5 0.496094 c 0.273437 0 0.496093 -0.222657 0.496093 -0.5 l -0.007812 -2.011719 l 2.988281 -1.726562 v 3.5 l -1.746094 0.988281 c -0.117187 0.0625 -0.199218 0.171875 -0.234375 0.300781 c -0.039062 0.125 -0.019531 0.261719 0.046875 0.378906 c 0.0625 0.117188 0.171875 0.199219 0.300782 0.234375 c 0.125 0.039063 0.261718 0.019531 0.378906 -0.042969 l 1.253906 -0.710937 v 1.484375 c 0 0.277344 0.222656 0.5 0.5 0.5 s 0.5 -0.222656 0.5 -0.5 v -1.484375 l 1.253906 0.710937 c 0.117188 0.0625 0.253906 0.082032 0.378906 0.042969 c 0.128907 -0.035156 0.238282 -0.117187 0.304688 -0.234375 c 0.0625 -0.117187 0.082031 -0.253906 0.042969 -0.378906 c -0.035157 -0.128906 -0.117188 -0.238281 -0.234375 -0.300781 l -1.746094 -0.988281 v -3.5 l 3.03125 1.75 l -0.015625 2.007812 c -0.003906 0.273438 0.21875 0.5 0.492187 0.5 c 0.132813 0.003906 0.261719 -0.046875 0.355469 -0.140625 s 0.148438 -0.21875 0.152344 -0.351563 l 0.011719 -1.441406 l 1.285156 0.742188 c 0.238281 0.136718 0.542969 0.054687 0.683594 -0.183594 c 0.136718 -0.238281 0.054687 -0.546875 -0.183594 -0.683594 l -1.285156 -0.742187 l 1.242187 -0.730469 c 0.113281 -0.066406 0.195313 -0.175781 0.226563 -0.304688 c 0.035156 -0.128906 0.015625 -0.265624 -0.050782 -0.382812 c -0.140624 -0.234375 -0.449218 -0.3125 -0.683593 -0.175781 l -1.730469 1.019531 l -3.03125 -1.75 l 3.03125 -1.75 l 1.730469 1.019531 c 0.234375 0.140625 0.542969 0.058594 0.683593 -0.175781 c 0.066407 -0.117188 0.085938 -0.253906 0.050782 -0.382812 c -0.03125 -0.128907 -0.113282 -0.238282 -0.226563 -0.304688 l -1.242187 -0.730469 l 1.285156 -0.742187 c 0.238281 -0.136719 0.320312 -0.445313 0.183594 -0.683594 c -0.140625 -0.238281 -0.445313 -0.320312 -0.683594 -0.183594 l -1.285156 0.742188 l -0.011719 -1.441406 c -0.003906 -0.132813 -0.058594 -0.257813 -0.152344 -0.351563 s -0.222656 -0.144531 -0.355469 -0.140625 c -0.277343 0 -0.496093 0.226562 -0.492187 0.503906 l 0.015625 2.003906 l -3.03125 1.75 v -3.449218 l 1.75 -1 c 0.238281 -0.136719 0.320312 -0.441406 0.183594 -0.683594 c -0.136719 -0.238281 -0.441406 -0.320312 -0.679688 -0.183594 l -1.253906 0.714844 v -1.53125 c 0 -0.277344 -0.222656 -0.5 -0.5 -0.5 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-storm-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-storm-symbolic.svg deleted file mode 100644 index 099fee7e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-storm-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 9.507812 0.0429688 c -1.269531 0 -2.304687 0.9726562 -2.449218 2.2187502 c -0.320313 -0.121094 -0.652344 -0.21875 -1.019532 -0.21875 c -1.644531 0 -2.976562 1.34375 -2.976562 3 c 0 0.101562 0.023438 0.1875 0.03125 0.28125 c -0.296875 -0.175781 -0.648438 -0.28125 -1.023438 -0.28125 c -1.09375 0 -1.9804682 0.898437 -1.9804682 2 c 0 1.105469 0.8164062 1.957031 1.9101562 1.957031 h 5 v -1.5 c -0.015625 -0.785156 0.738281 -1.46875 1.515625 -1.488281 c 0.800781 -0.015625 1.5 0.683593 1.484375 1.488281 v 1.5 h 4.5 c 0.820312 0 1.453125 -0.625 1.453125 -1.457031 c 0 -0.828125 -0.664063 -1.5 -1.488281 -1.5 c -0.203125 0 -0.40625 0.050781 -0.585938 0.125 c 0.050782 -0.199219 0.089844 -0.40625 0.089844 -0.625 c 0 -1.226563 -0.882812 -2.226563 -2.042969 -2.4375 c 0.042969 -0.179688 0.0625 -0.367188 0.0625 -0.5625 c 0 -1.378907 -1.109375 -2.5000002 -2.480469 -2.5000002 z m -1.007812 6.9570312 c -0.132812 0 -0.261719 0.050781 -0.355469 0.144531 s -0.144531 0.222657 -0.144531 0.355469 v 2.5 h -3 v 1 h -1.707031 l -2.648438 2.644531 c -0.09375 0.09375 -0.144531 0.222657 -0.144531 0.355469 s 0.050781 0.261719 0.144531 0.355469 s 0.222657 0.144531 0.355469 0.144531 s 0.261719 -0.050781 0.351562 -0.144531 l 2.355469 -2.355469 h 1.292969 v 3 c 0 0.132812 0.050781 0.261719 0.144531 0.355469 s 0.222657 0.144531 0.355469 0.144531 s 0.261719 -0.050781 0.355469 -0.144531 s 0.144531 -0.222657 0.144531 -0.355469 v -4 h 2 v 0.707031 l 2 2 v 1.292969 c 0 0.132812 0.050781 0.261719 0.144531 0.355469 s 0.222657 0.144531 0.355469 0.144531 s 0.261719 -0.050781 0.355469 -0.144531 s 0.144531 -0.222657 0.144531 -0.355469 v -1 h 1.359375 l 2.382813 1.425781 c 0.238281 0.144531 0.542968 0.066407 0.683593 -0.167969 c 0.144531 -0.234374 0.066407 -0.542968 -0.167969 -0.683593 l -2.621093 -1.574219 h -1.929688 l -1.707031 -1.707031 v -3.792969 c 0 -0.132812 -0.050781 -0.261719 -0.144531 -0.355469 s -0.222657 -0.144531 -0.355469 -0.144531 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-tornado-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-tornado-symbolic.svg deleted file mode 100644 index fe96c9ef..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-tornado-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 1.972656 0.992188 c -1.339844 0 -1.339844 2.015624 0 2.015624 h 0.289063 c 0.128906 0 0.222656 0.113282 0.03125 0.226563 c -0.632813 0.535156 -0.355469 1.785156 0.683593 1.773437 h 2.261719 c 0.207031 0.007813 0.148438 0.148438 0.082031 0.207032 c -0.519531 0.417968 -0.480468 1.304687 0.121094 1.652344 c 0.089844 0.046874 0.054688 0.121093 -0.039062 0.121093 h -0.421875 c -1.398438 -0.050781 -1.398438 2.074219 0 2.023438 h 1.296875 c 0.109375 0 0.179687 0.125 0.035156 0.207031 c -0.519531 0.429688 -0.464844 1.3125 0.140625 1.664062 c 0.175781 0.101563 0.066406 0.183594 -0.015625 0.246094 c -0.597656 0.351563 -0.648438 1.242188 -0.109375 1.664063 c 0.125 0.097656 0.050781 0.1875 -0.046875 0.1875 h -0.289062 c -1.363282 0 -1.363282 2.039062 0 2.039062 h 1.019531 c 1.015625 0.019531 1.347656 -1.199219 0.722656 -1.769531 c -0.128906 -0.15625 -0.03125 -0.234375 0.039063 -0.234375 h 1.242187 c 1.355469 0 1.355469 -2.03125 0 -2.03125 h -0.289063 c -0.144531 0 -0.152343 -0.105469 -0.078124 -0.171875 c 0.503906 -0.382812 0.523437 -1.160156 0.066406 -1.574219 c -0.152344 -0.148437 -0.074219 -0.226562 0.039062 -0.226562 h 0.265625 c 1.007813 0.003906 1.308594 -1.195313 0.710938 -1.753907 c -0.113281 -0.113281 -0.089844 -0.246093 0.035156 -0.246093 h 1.253906 c 1.042969 0.011719 1.328125 -1.253907 0.679688 -1.789063 c -0.082031 -0.082031 -0.082031 -0.214844 0.070312 -0.214844 h 1.253907 c 1.34375 0 1.34375 -2.015624 0 -2.015624 h -0.320313 c -0.117187 0 -0.152344 -0.097657 -0.070313 -0.167969 c 0.726563 -0.503907 0.464844 -1.84375 -0.609374 -1.828125 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-windy-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-windy-symbolic.svg deleted file mode 100644 index 70657ef5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/media/status/weather-windy-symbolic.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> - <path d="m 5.441406 1 c -0.101562 0.003906 -0.199218 0.011719 -0.300781 0.023438 c -0.53125 0.070312 -1.042969 0.308593 -1.441406 0.707031 c -0.386719 0.394531 -0.386719 1.027343 0.003906 1.414062 c 0.390625 0.390625 1.023437 0.390625 1.414063 0 c 0.164062 -0.164062 0.398437 -0.191406 0.597656 -0.078125 c 0.199218 0.113282 0.289062 0.339844 0.230468 0.566406 c -0.058593 0.222657 -0.25 0.367188 -0.476562 0.367188 h -5.46875 v 2 h 5.46875 c 1.125 0 2.121094 -0.765625 2.410156 -1.855469 c 0.289063 -1.085937 -0.1875 -2.246093 -1.160156 -2.808593 c -0.398438 -0.230469 -0.839844 -0.339844 -1.277344 -0.335938 z m 7.039063 1 c -1.617188 0.011719 -3.058594 1.148438 -3.40625 2.769531 c -0.054688 0.261719 -0.003907 0.53125 0.140625 0.753907 c 0.144531 0.226562 0.371094 0.378906 0.632812 0.433593 c 0.539063 0.117188 1.070313 -0.230469 1.183594 -0.769531 c 0.167969 -0.78125 0.886719 -1.285156 1.675781 -1.175781 c 0.792969 0.113281 1.34375 0.796875 1.289063 1.59375 c -0.054688 0.796875 -0.699219 1.394531 -1.496094 1.394531 h -12.5 v 2 h 12.5 c 1.828125 0 3.363281 -1.429688 3.492188 -3.257812 c 0.128906 -1.824219 -1.195313 -3.453126 -3.003907 -3.710938 c -0.171875 -0.023438 -0.339843 -0.03125 -0.507812 -0.03125 z m -12.480469 8 v 2 h 10 h 0.003906 c 0.464844 0 0.859375 0.3125 0.96875 0.769531 s -0.105468 0.914063 -0.523437 1.125 c -0.417969 0.210938 -0.910157 0.105469 -1.210938 -0.25 c -0.171875 -0.207031 -0.414062 -0.332031 -0.679687 -0.355469 c -0.265625 -0.023437 -0.527344 0.058594 -0.730469 0.230469 c -0.421875 0.355469 -0.476563 0.984375 -0.121094 1.40625 c 0.441407 0.53125 1.042969 0.875 1.691407 1.011719 c 0.644531 0.132812 1.332031 0.054688 1.949218 -0.257812 c 1.238282 -0.621094 1.890625 -2.023438 1.574219 -3.371094 c -0.320313 -1.347656 -1.535156 -2.308594 -2.921875 -2.308594 z m 0 0" fill="#2e3436"/> -</svg> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/migration.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/migration.js deleted file mode 100644 index 3b32b450..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/migration.js +++ /dev/null @@ -1,153 +0,0 @@ -/* - This file is part of OpenWeather Refined (gnome-shell-extension-openweatherrefined). - - OpenWeather Refined 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. - - OpenWeather Refined 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 - OpenWeather Refined. If not, see <https://www.gnu.org/licenses/>. - - Copyright 2024 TealPenguin -*/ - -import Gio from "gi://Gio"; - -import { GeolocationProvider, WeatherPressureUnits } from "./constants.js"; -import { Loc, NAME_TYPE, PLACE_TYPE, settingsSetLocs, settingsGetLocsCount, settingsSetKeys } from "./locs.js"; -import { WeatherProvider } from "./getweather.js"; - -const THIS_SCHEMA_ID = "org.gnome.shell.extensions.openweatherrefined"; -const OICKLE_SCHEMA_ID = "org.gnome.shell.extensions.openweather"; - -function tryMigrateOickle(settings) -{ - let keys = settings.list_keys(); - if(!keys || !keys.length) return false; - - let schemaSrc = Gio.SettingsSchemaSource.get_default(); - let oldSchema = schemaSrc.lookup(OICKLE_SCHEMA_ID, true); - if(!oldSchema) return false; - - let oldSettings = Gio.Settings.new(oldSchema.get_id()); - let oldKs = oldSettings.list_keys(); - if(!oldKs || !oldKs.length) return false; - - let schema = schemaSrc.lookup(THIS_SCHEMA_ID, true); - for(let k of oldKs) - { - if(!schema.has_key(k) && k !== "city") continue; - - settings.set_value(k.get_value()); - } - - console.log("OpenWeather Refined: Imported settings from old extension."); - return true; -} - -function tryMigratePre128(settings) -{ - let city = settings.get_string("city"); - if(!city) return false; - - let arr = [ ]; - let sections = city.split(" && "); - for(let l of sections) - { - let place = l.split(">")[0]; - place = place.replace(/\s/g, ""); - let name = l.split(">")[1]; - let isMyLoc = place === "here"; - let isMyLocName = isMyLoc && !name; - arr.push( - new Loc( - isMyLocName ? NAME_TYPE.MY_LOC : NAME_TYPE.CUSTOM, - name, - isMyLoc ? PLACE_TYPE.MY_LOC : PLACE_TYPE.COORDS, - isMyLoc ? "" : place - ) - ); - } - - settings.reset("city"); - settingsSetLocs(settings, arr); - - console.log("OpenWeather Refined: Migrated from cities to v128 locs."); - return true; -} - -function tryMigratePre130(settings) -{ - if(settings.get_enum("pressure-unit") === WeatherPressureUnits.HPA) - { - settings.set_enum("pressure-unit", WeatherPressureUnits.MBAR); - } - - let locCount = settingsGetLocsCount(settings); - let selIndex = settings.get_int("actual-city"); - if(selIndex < 0 || selIndex > locCount) - { - settings.set_int("actual-city", selIndex < 0 ? 0 : locCount - 1); - } - -} - -function tryMigratePre136(settings) -{ - // Create an array of empty strings with the length of weather - // providers available - let keys = Array.from({ length: WeatherProvider.COUNT }, () => ""); - - let owmKey = settings.get_string("appid"); - if(!settings.get_boolean("use-default-owm-key")) - { - keys[0] = owmKey; - settings.reset("appid"); - settings.reset("use-default-owm-key"); - } - let weatherApiKey = settings.get_string("weatherapidotcom-key"); - if(!settings.get_boolean("use-default-weatherapidotcom-key")) - { - keys[1] = weatherApiKey; - settings.reset("weatherapidotcom-key"); - settings.reset("use-default-weatherapidotcom-key"); - } - - if(keys[0] !== "" || keys[1] !== "") settingsSetKeys(keys); -} - -function migrateProviders(settings) -{ - let geoSearch = settings.get_enum("geolocation-provider"); - if(geoSearch === GeolocationProvider.GEOCODE) settings.set_enum("geolocation-provider", GeolocationProvider.OPENSTREETMAPS); -} - -/** - * Migrates settings if needed. - * Imports from original OpenWeather extension. - * Migrates 'cities' (127-) -> 'locs' (v128+). - * Migrates 'pressure-unit' (130+). - * Migrates custom keys (136+). - * @param {Gio.Settings} Settings to read/modify. - * @returns {boolean} `true` if settings were IMPORTED (NOT just if migrated). - */ -export function tryImportAndMigrate(settings) -{ - let imported = tryMigrateOickle(settings); - tryMigrateFromOldVersion(settings); - return imported; -} - -export function tryMigrateFromOldVersion(settings) -{ - tryMigratePre128(settings); - tryMigratePre130(settings); - tryMigratePre136(settings); - migrateProviders(settings); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/myloc.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/myloc.js deleted file mode 100644 index e5125a7b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/myloc.js +++ /dev/null @@ -1,339 +0,0 @@ -/* - This file is part of OpenWeather Refined (gnome-shell-extension-openweatherrefined). - - OpenWeather Refined 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. - - OpenWeather Refined 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 - OpenWeather Refined. If not, see <https://www.gnu.org/licenses/>. - - Copyright 2024 TealPenguin -*/ - -import GLib from "gi://GLib"; -import Soup from "gi://Soup"; -import Geoclue from "gi://Geoclue"; - -// Chrome 120.0 on Windows (common user agent) -export const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.3"; - -let soupSession = null; -let locationInfo = null; -let locationTime = new Date(0); -let locationRefreshInterval = new Date(0).setMinutes(60); -let lastMylocProv = -1; - -let fetchingLocation = false; - -export const MyLocProv = -{ - GEOCLUE: 0, - INFOIPIO: 1 -} - -const DEF_LOC_INFO = -{ - lat: 0.0, - lon: 0.0, - city: "Unknown", - state: "Unknown", - country: "Unknown", - countryShort: "Unknown", - name: "Unknown" -}; - -function initSoup() -{ - soupSession = new Soup.Session(); - soupSession.user_agent = USER_AGENT; -} - -export function freeSoup() -{ - if(soupSession) soupSession.abort(); - soupSession = null; -} - -export function getSoupSession() -{ - if(soupSession === null) initSoup(); - return soupSession; -} - -export function setLocationRefreshIntervalM(minutes) -{ - locationRefreshInterval = new Date(0).setMinutes(minutes); -} - -/** - * @param {string} countryShort - * @param {string | null} city - * @param {string | null} state - * @returns {string} - */ -function getNameFromCountryShort(countryShort, city, state) -{ - switch(countryShort) - { - case "US": - return `${city}, ${state}`; - default: - if(city === "Unknown") return "Unknown"; - else return `${locationInfo.city}, ${locationInfo.country}`; - } -} - -/** - * @param {MyLocProv} locProv - * @returns {Promise<object>} - */ -async function httpGetLoc(locProv) -{ - let addr; - switch(locProv) - { - case MyLocProv.INFOIPIO: - addr = "https://api.infoip.io"; - break; - default: - console.error(`OpenWeather Refined: HTTP Get Loc called when it shouldn't have been.`); - return Promise.reject("Illegal call"); - } - - fetchingLocation = true; - let sess = getSoupSession(); - let msg = Soup.Message.new("GET", addr); - return new Promise((resolve, reject) => { - sess.send_and_read_async( - msg, - GLib.PRIORITY_DEFAULT, - null, - (s, m) => - { - let response; - try - { - response = s.send_and_read_finish(m); - } - catch(e) - { - locationInfo = null; - fetchingLocation = false; - locationTime = new Date(); - reject(e); - return; - } - if(!response || !(response = response.get_data())) - { - locationInfo = null; - fetchingLocation = false; - locationTime = new Date(); - reject("OpenWeather Refined: Invalid response"); - return; - } - - let str = new TextDecoder().decode(response); - if(!str) - { - locationInfo = null; - fetchingLocation = false; - locationTime = new Date(); - reject("OpenWeather Refined: No data in JSON My Location HTTP response."); - return; - } - let obj = JSON.parse(str); - - locationTime = new Date(); - locationInfo = - { - lat: obj.latitude, - lon: obj.longitude, - city: obj.city, - state: obj.region, - country: obj.country_long, - countryShort: obj.country_short, - name: getNameFromCountryShort(obj.country_short, obj.city, obj.region) - }; - - fetchingLocation = false; - resolve(locationInfo); - } - ); - }); -} - -export async function geoclueGetLoc(useNominatim = true) -{ - let locInfo = await new Promise((resolve, reject) => { - fetchingLocation = true; - Geoclue.Simple.new( - "gnome-shell-extension-openweatherrefined", - Geoclue.AccuracyLevel.NEIGHBORHOOD, - null, - (_s, result) => { - let loc; - try - { - let simple = Geoclue.Simple.new_finish(result); - loc = simple.get_location(); - } - catch(e) - { - fetchingLocation = false; - locationTime = new Date(); - reject(`OpenWeather Refined: ${e}`); - return; - } - - let locI = - { - lat: loc.latitude, - lon: loc.longitude, - city: "Unknown", - state: "Unknown", - country: "Unknown", - countryShort: "Unknown", - name: "Unknown" - }; - - resolve(locI); - } - ); - }); - - if(!useNominatim) return locInfo; - - return await new Promise((resolve, reject) => { - let sess = Soup.Session.new(); - // Policy mandates specific user agent - sess.user_agent = "openweather-extension@penguin-teal.github.io"; - - let params = - { - lat: String(locInfo.lat), - lon: String(locInfo.lon), - format: "json", - // Zoom 13: "Village/suburb" - zoom: "13" - }; - let paramsHash = Soup.form_encode_hash(params); - let msg = Soup.Message.new_from_encoded_form( - "GET", - "https://nominatim.openstreetmap.org/reverse", - paramsHash - ); - - sess.send_and_read_async( - msg, - GLib.PRIORITY_DEFAULT, - null, - (s, m) => - { - let response; - try - { - response = s.send_and_read_finish(m); - } - catch(e) - { - locationInfo = locInfo; - fetchingLocation = false; - locationTime = new Date(); - reject(e); - return; - } - if(!response || !(response = response.get_data())) - { - locationInfo = locInfo; - fetchingLocation = false; - locationTime = new Date(); - reject("OpenWeather Refined: Invalid response from Nominatim."); - return; - } - - let str = new TextDecoder().decode(response); - if(!str) - { - locationInfo = locInfo; - fetchingLocation = false; - locationTime = new Date(); - reject("OpenWeather Refined: No data in JSON Nominatim HTTP response."); - return; - } - let obj = JSON.parse(str); - let addr = obj.address; - - fetchingLocation = false; - locationTime = new Date(); - - let city = addr?.city ?? "Unknown"; - let state = addr?.state ?? "Unknown"; - let countryShort = addr?.country_code?.toUpperCase() ?? "Unknown"; - locationInfo = - { - lat: locInfo.lat, - lon: locInfo.lon, - city: city, - state: state, - country: addr?.country ?? "Unknown", - countryShort: countryShort, - name: getNameFromCountryShort(countryShort, city, state) - }; - - resolve(locationInfo); - } - ); - }); -} - -export async function getLocationInfo(settings, forceRefresh = false) -{ - if(settings === undefined) - { - console.error("OpenWeather Refined: getLocationInfo did not receive a settings argument. Pass 'null' to get settings automatically."); - console.trace("OpenWeather Refined backtrace"); - } - - let now = new Date(); - if(fetchingLocation) - { - console.warn("OpenWeather Refined: Location requested while fetching it; returning cached location."); - } - else - { - let myLocProv = settings ? settings.get_enum("my-loc-prov") : MyLocProv.GEOCLUE; - if(forceRefresh || now - locationTime > locationRefreshInterval || lastMylocProv !== myLocProv) - { - try - { - if(myLocProv === MyLocProv.GEOCLUE) - { - return await geoclueGetLoc(); - } - else - { - return httpGetLoc(myLocProv); - } - } - catch(e) - { - console.error(e); - } - } - } - return locationInfo ?? DEF_LOC_INFO; -} - -export function getCachedLocInfo() -{ - return locationInfo ?? DEF_LOC_INFO; -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/openweathermap.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/openweathermap.js deleted file mode 100644 index 4cb59313..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/openweathermap.js +++ /dev/null @@ -1,321 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ -import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js"; -import * as Main from "resource:///org/gnome/shell/ui/main.js"; - -import { getCachedLocInfo, getLocationInfo } from "./myloc.js"; -import { getWeatherInfo, getWeatherProviderName, weatherProviderNotWorking } from "./getweather.js"; - -async function initWeatherData(refresh) { - if (refresh) { - this._lastRefresh = Date.now(); - } - try { - await this.refreshWeatherData().then(async () => { - try - { - if(this._city.isMyLoc()) - { - await getLocationInfo(this.settings); - } - this.recalcLayout(); - - } catch (e) { - console.error(e); - } - }); - } catch (e) { - console.error(e); - } -} - -async function reloadWeatherCache() -{ - try - { - await this.populateCurrentUI(); - if (!this._isForecastDisabled) - { - await this.populateTodaysUI(); - await this.populateForecastUI(); - this.recalcLayout(); - } - } - catch (e) - { - console.error(e); - } -} - -async function refreshWeatherData() -{ - try - { - let weather; - try - { - weather = await getWeatherInfo(this, _); - } - catch(e) - { - let title, msg; - if(e.name === "TooManyReqError") - { - let provName = getWeatherProviderName(e.provider); - let tryAgain = weatherProviderNotWorking(this.settings); - - if(tryAgain) - { - this._provUrlButton.label = getWeatherProviderName(this.weatherProvider); - this.reloadWeatherCurrent(1); - } - else - { - Main.notify(_("OpenWeather Refined Too Many Requests"), - _("Provider %s has too many users. Try switching weather providers in settings.").format(provName)); - - // Try reloading after 10 minutes - this.reloadWeatherCurrent(600); - } - - return; - } - else throw e; - } - - if(!weather) - { - console.warn("OpenWeather Refined: getWeatherInfo failed without an error."); - // Try reloading after 10 minutes - this.reloadWeatherCurrent(600); - return; - } - - this.currentWeatherCache = weather; - - await this.populateCurrentUI(); - await this.populateTodaysUI(); - await this.populateForecastUI(); - this.reloadWeatherCurrent(this._refresh_interval_current); - } - catch(e) - { - console.error(`OpenWeather Refined: ${e}`); - console.log(e.stack); - } -} - -function populateCurrentUI() -{ - return new Promise((resolve, reject) => - { - try - { - /** @type {(Weather | null)} */ - let w = this.currentWeatherCache; - if(!w) reject("OpenWeather Refined: No weather cached."); - - let location = this._city.getName(_); - if(this._city.isMyLoc()) - { - let locObj = getCachedLocInfo(); - let cityName = locObj.city; - if(cityName === "Unknown") cityName = _("Unknown"); - location += ` (${cityName})`; - } - - let iconName = w.getIconName(); - this._currentWeatherIcon.set_gicon(this.getGIcon(iconName)); - this._weatherIcon.set_gicon(this.getGIcon(iconName)); - - let sunrise = w.getSunriseDate(); - let sunset = w.getSunsetDate(); - let lastBuild = new Date(); - - // Is sunset approaching before the sunrise? - let ms = lastBuild.getTime(); - if(sunrise.getTime() - ms > sunset.getTime() - ms) - { - this.topBoxSunIcon.set_gicon(this.getGIcon("daytime-sunset-symbolic")); - this.topBoxSunInfo.text = w.displaySunset(this); - } - else - { - this.topBoxSunIcon.set_gicon(this.getGIcon("daytime-sunrise-symbolic")); - this.topBoxSunInfo.text = w.displaySunrise(this); - } - - let weatherInfoC = ""; - let weatherInfoT = ""; - - let condition = w.displayCondition(); - let temp = w.displayTemperature(this); - - if (this._comment_in_panel) weatherInfoC = condition; - if (this._text_in_panel) weatherInfoT = temp; - - this._weatherInfo.text = - weatherInfoC + - (weatherInfoC && weatherInfoT ? _(", ") : "") + - weatherInfoT; - - this._currentWeatherSummary.text = condition + (", ") + temp; - - let locText; - if (this._loc_len_current !== 0 && - location.length > this._loc_len_current) - { - locText = location.substring(0, this._loc_len_current - 3) + "..."; - } - else - { - locText = location; - } - - let feelsLikeText = w.displayFeelsLike(this); - let humidityText = w.displayHumidity(); - let pressureText = w.displayPressure(this); - let windText = w.displayWind(this); - - this._currentWeatherSunrise.text = w.displaySunrise(this); - this._currentWeatherSunset.text = w.displaySunset(this); - this._currentWeatherBuild.text = this.formatTime(lastBuild); - - if(this._currentWeatherLocation) this._currentWeatherLocation.text = locText; - if(this._currentWeatherFeelsLike) this._currentWeatherFeelsLike.text = feelsLikeText; - if(this._currentWeatherHumidity) this._currentWeatherHumidity.text = humidityText; - if(this._currentWeatherPressure) this._currentWeatherPressure.text = pressureText; - if(this._currentWeatherWind) this._currentWeatherWind.text = windText; - if(this._currentWeatherWindGusts) - { - let available = w.gustsAvailable(); - this.setGustsPanelVisibility(available); - if(available) - { - this._currentWeatherWindGusts.text = w.displayGusts(this); - } - } - - if(this._forecast.length > this._forecastDays) - { - this._forecast.splice(this._forecastDays, this._forecast.length - this._forecastDays); - this.rebuildFutureWeatherUi(this._forecastDays); - } - - resolve(0); - } catch (e) { - reject(e); - } - }); -} - -function populateTodaysUI() { - return new Promise((resolve, reject) => { - try { - // Populate today's forecast UI - let weather = this.currentWeatherCache; - if(!weather) reject("OpenWeather Refined: No weather cached."); - if(!weather.hasForecast()) reject("OpenWeather Refined: No forecast."); - - for (let i = 0; i < 4; i++) - { - let h = weather.forecastHoursFromNow(i * 3); - let w = h.weather(); - - let forecastTodayUi = this._todays_forecast[i]; - forecastTodayUi.Time.text = h.displayTime(this); - forecastTodayUi.Icon.set_gicon(this.getGIcon(w.getIconName())); - forecastTodayUi.Temperature.text = w.displayTemperature(this); - forecastTodayUi.Summary.text = w.displayCondition(); - } - resolve(0); - } catch (e) { - reject(e); - } - }); -} - -function populateForecastUI() { - return new Promise((resolve, reject) => { - try { - // Populate N day / 3 hour forecast UI - let weather = this.currentWeatherCache; - if(!weather) reject("OpenWeather Refined: No weather cached."); - if(!weather.hasForecast()) reject("OpenWeather Refined: No forecast."); - - let hrsToMidnight = 24 - new Date().getHours(); - let dayCount = Math.min(this._days_forecast + 1, weather.forecastDayCount()); - for (let i = 0; i < dayCount - 1; i++) - { - let forecastUi = this._forecast[i]; - for (let j = 0; j < 8; j++) - { - let h = weather.forecastHoursFromNow(i * 24 + hrsToMidnight + j * 3); - let w = h.weather(); - - let forecastDate = h.getStart(); - if (j === 0) - { - let beginOfDay = new Date(new Date().setHours(0, 0, 0, 0)); - let dayLeft = Math.floor( - (forecastDate.getTime() - beginOfDay.getTime()) / 86400000 - ); - - if (dayLeft === 1) forecastUi.Day.text = "\n" + _("Tomorrow"); - else - forecastUi.Day.text = - "\n" + this.getLocaleDay(forecastDate.getDay()); - } - - forecastUi[j].Time.text = h.displayTime(this); - forecastUi[j].Icon.set_gicon(this.getGIcon(w.getIconName())); - forecastUi[j].Temperature.text = w.displayTemperature(this); - forecastUi[j].Summary.text = w.displayCondition(); - } - } - resolve(0); - } - catch (e) - { - reject(e); - } - }); -} - -function processTodaysData(json) { - return new Promise((resolve, reject) => { - try { - let data = json.list; - let todayList = []; - - for (let i = 0; i < 4; i++) todayList.push(data[i]); - - resolve(todayList); - } catch (e) { - reject(e); - } - }); -} - -export { - initWeatherData, - reloadWeatherCache, - refreshWeatherData, - populateCurrentUI, - populateTodaysUI, - populateForecastUI, -}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/aboutPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/aboutPage.js deleted file mode 100644 index 65f6815e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/aboutPage.js +++ /dev/null @@ -1,346 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ - -import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; -import GObject from "gi://GObject"; -import GLib from "gi://GLib"; - -import { PACKAGE_VERSION } from "resource:///org/gnome/Shell/Extensions/js/misc/config.js"; - -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; -import { Loc, settingsGetLocs, settingsGetKeys, toLocsGVariant } from "../locs.js"; -import { getWeatherProviderName, getWeatherProviderUrl } from "../getweather.js"; - -function getLocale() -{ - let locale = GLib.get_language_names()[0]; - if (locale.indexOf("_") !== -1) return locale.split("_")[0]; - // Fallback for 'C', 'C.UTF-8', and unknown locales. - else return "en"; -} - -class AboutPage extends Adw.PreferencesPage { - static { - GObject.registerClass(this); - } - - constructor(metadata, settings, wnd) - { - super({ - title: _("About"), - icon_name: "help-about-symbolic", - name: "AboutPage", - margin_start: 10, - margin_end: 10, - }); - - // Extension logo and description - let aboutGroup = new Adw.PreferencesGroup(); - let aboutBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - hexpand: false, - vexpand: false, - }); - let openWeatherImage = new Gtk.Image({ - icon_name: "openweather-icon", - margin_bottom: 5, - pixel_size: 100, - }); - let openWeatherLabel = new Gtk.Label({ - label: '<span size="larger"><b>OpenWeather Refined</b></span>', - use_markup: true, - margin_bottom: 15, - vexpand: true, - valign: Gtk.Align.FILL, - }); - let aboutDescription = new Gtk.Label({ - label: _( - "Display weather information for any location on Earth in the GNOME Shell." - ), - margin_bottom: 3, - hexpand: false, - vexpand: false, - }); - - aboutBox.append(openWeatherImage); - aboutBox.append(openWeatherLabel); - aboutBox.append(aboutDescription); - aboutGroup.add(aboutBox); - this.add(aboutGroup); - - // Info group - let infoGroup = new Adw.PreferencesGroup(); - let releaseVersion = String(metadata["version-name"] ?? _("Unknown")); - let gitVersion = String(metadata["git-version"] ?? _("Unknown")); - - // Extension version - let openWeatherVersionRow = new Adw.ActionRow({ - title: _("OpenWeather Refined Version"), - }); - openWeatherVersionRow.add_suffix( - new Gtk.Label({ - label: releaseVersion, - }) - ); - - // Git version for self builds - let gitVersionRow = null; - if (gitVersion) { - gitVersionRow = new Adw.ActionRow({ - title: _("Git Version"), - }); - gitVersionRow.add_suffix( - new Gtk.Label({ - label: gitVersion, - }) - ); - } - - // shell version - let gnomeVersionRow = new Adw.ActionRow({ - title: _("GNOME Version"), - }); - gnomeVersionRow.add_suffix( - new Gtk.Label({ - label: String(PACKAGE_VERSION), - }) - ); - - // Copy settings - let copySettingsRow = new Adw.ActionRow({ - title: _("Copy Settings JSON"), - }); - let copySettingsBtn = new Gtk.Button({ - label: _("Copy") - }); - copySettingsRow.add_suffix(copySettingsBtn); - - let pasteSettingsBtn = new Gtk.Button({ - label: _("Paste") - }); - copySettingsRow.add_suffix(pasteSettingsBtn); - - copySettingsBtn.connect("clicked", (widget) => - { - // The settings of these keys will exist in the data but their value - // will be replaced with the string "<REDACTED>" - let redact = [ - "appid", "weatherapidotcom-key", - "geolocation-appid-mapquest" - ]; - - // This object will hold the data to turn to JSON - // Start with some extra info here that isn't in the settings - let obj = - { - "app-version": releaseVersion, - "git-version": gitVersion, - "gnome-version": String(PACKAGE_VERSION), - "user-locale": getLocale() - }; - let keys = settings.list_keys(); - for(let k of keys) - { - // Redact "locs" and older "cities" keys - if(k === "locs") - { - let locs = settingsGetLocs(settings); - for(let i in locs) - { - // Remove location names and coordinates - locs[i] = new Loc( - locs[i].getNameType(), locs[i].isMyLoc() ? "" : "<NAME>", - locs[i].getPlaceType(), locs[i].isMyLoc() ? "" : "<PLACE>" - ); - } - obj[k] = locs; - } - else if(k === "cities") - { - obj["cities"] = "<CITIES>"; - } - else if(redact.includes(k)) - { - obj[k] = "<REDACTED>"; - } - else if(k === "custom-keys") - { - let customKeys = settingsGetKeys(settings); - for(let i in customKeys) - { - customKeys[i] = customKeys[i] ? "<REDACTED>" : ""; - } - obj[k] = customKeys; - } - else - { - let val = settings.get_user_value(k); - if(val === null) continue; - - obj[k] = val.print(false); - } - } - - let clipboard = widget.get_clipboard(); - clipboard.set(JSON.stringify(obj)); - - let toast = new Adw.Toast({ - title: _("Copied settings JSON to clipboard.") - }); - wnd.add_toast(toast); - }); - - pasteSettingsBtn.connect("clicked", widget => { - let clipboard = widget.get_clipboard(); - clipboard.read_text_async(null, (c, result) => - { - let text; - try - { - text = clipboard.read_text_finish(result); - } - catch - { - wnd.add_toast(new Adw.Toast({ title: _("Clipboard contains no text.") })); - return; - } - - let obj = JSON.parse(text); - if(!obj) - { - wnd.add_toast(new Adw.Toast({ title: _("Clipboard didn't contain valid JSON.") })); - return; - } - - settings.set_boolean("frozen", true); - - let skipKeys = [ - "app-version", "gnome-version", "git-version", "user-locale", "locs", - "frozen", "appid", "weatherapidotcom-key", "custom-keys", - "use-default-owm-key", "use-default-weatherapidotcom-key", - "geolocation-appid-mapquest" - ]; - for(let k of Object.keys(obj)) - { - if(skipKeys.includes(k)) continue; - let v = obj[k]; - if(v[0] === "'" && v.endsWith("'")) settings.set_string(k, v); - else if(v === "true" || v === "false") settings.set_boolean(k, v === "true"); - else if(v.includes(".")) settings.set_double(k, parseFloat(v)); - else settings.set_int(k, parseInt(obj[k])); - } - - settings.set_boolean("frozen", false); - wnd.close(); - }); - }); - - infoGroup.add(openWeatherVersionRow); - if(gitVersion) infoGroup.add(gitVersionRow); - infoGroup.add(gnomeVersionRow); - infoGroup.add(copySettingsRow); - this.add(infoGroup); - - // Maintainer - let maintainerGroup = new Adw.PreferencesGroup(); - - let maintainerBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - hexpand: false, - vexpand: false, - }); - let repoLink = "<a href=\"https://github.com/penguin-teal/gnome-openweather\">%s</a>"; - let maintainerAbout = new Gtk.Label({ - label: _("Maintained by: %s").format(repoLink.format("Teal Penguin")), - use_markup: true, - hexpand: false, - vexpand: false, - }); - let contribute = new Gtk.Label({ - label: _("Contribute or translate the project on %s.").format(repoLink.format("GitHub")), - use_markup: true, - hexpand: false, - vexpand: false - }); - let fork = new Gtk.Label({ - label: _("This is a fork of %s's extension.").format("Jason Oickle"), - use_markup: false, - hexpand: false, - vexpand: false - }); - - maintainerBox.append(maintainerAbout); - maintainerBox.append(contribute); - maintainerBox.append(fork); - maintainerGroup.add(maintainerBox); - this.add(maintainerGroup); - - // Provider - let curProv = settings.get_enum("weather-provider"); - - if(curProv !== 0) - { - let providerGroup = new Adw.PreferencesGroup(); - let providerBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - margin_top: 15, - hexpand: false, - vexpand: false, - }); - let providerAbout = new Gtk.Label({ - label: _("Weather data provided by: %s").format( - `<a href="${getWeatherProviderUrl(curProv)}">${getWeatherProviderName(curProv)}</a>` - ), - use_markup: true, - hexpand: false, - vexpand: false, - }); - providerBox.append(providerAbout); - providerGroup.add(providerBox); - this.add(providerGroup); - } - - // License - let gnuLicense = - '<span size="small">' + - _("This program comes with ABSOLUTELY NO WARRANTY.") + - "\n" + - _("See the") + - ' <a href="https://gnu.org/licenses/old-licenses/gpl-2.0.html">' + - _("GNU General Public License, version 2 or later") + - "</a> " + - _("for details.") + - "</span>"; - let gplGroup = new Adw.PreferencesGroup(); - let gplLabel = new Gtk.Label({ - label: gnuLicense, - use_markup: true, - justify: Gtk.Justification.CENTER, - }); - let gplLabelBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - valign: Gtk.Align.END, - vexpand: true, - }); - gplLabelBox.append(gplLabel); - gplGroup.add(gplLabelBox); - this.add(gplGroup); - } -} - -export { AboutPage }; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/generalPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/generalPage.js deleted file mode 100644 index 4375508e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/generalPage.js +++ /dev/null @@ -1,542 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ - -import Gtk from "gi://Gtk"; -import Adw from "gi://Adw"; -import GObject from "gi://GObject"; - -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -import { WeatherProvider, getWeatherProviderName } from "../getweather.js"; -import { settingsGetKeys, settingsSetKeys } from "../locs.js"; - -function getProviderTranslateRowTitle(prov) -{ - return _("Provider Multilingual Support"); -} - -function getDefaultApiKeyRowSubtitle(prov) -{ - let name = getWeatherProviderName(prov); - return _("Use a personal API key for %s").format(name ?? _("Provider")); -} - -function getDefaultApiKeyRowTooltip(prov) -{ - let name = getWeatherProviderName(prov); - return _("Enable this if you have your own API key from %s and enter it below." - ).format(name ?? _("Provider")); -} - -function isValidKey(provider, key) -{ - switch(provider) - { - case WeatherProvider.OPENWEATHERMAP: - return /^[a-z0-9]{32,}$/.test(key); - case WeatherProvider.WEATHERAPICOM: - return /^[a-z0-9]{31,}$/.test(key); - case WeatherProvider.VISUALCROSSING: - return /^[A-Z0-9]{25,}$/.test(key); - case WeatherProvider.OPENMETEO: - return true; - default: - return false; - } -} - -class GeneralPage extends Adw.PreferencesPage -{ - static { - GObject.registerClass(this); - } - - constructor(metadata, settings, wnd) - { - super({ - title: _("Settings"), - icon_name: "preferences-system-symbolic", - name: "GeneralPage", - }); - this._settings = settings; - this._window = wnd; - - // General Settings - let generalGroup = new Adw.PreferencesGroup({ - title: _("General"), - }); - - // Current weather refresh - let currentRefreshSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 10, - upper: 1440, - step_increment: 1, - page_increment: 10, - value: this._settings.get_int("refresh-interval-current") / 60, - }), - climb_rate: 5, - numeric: true, - update_policy: "if-valid", - valign: Gtk.Align.CENTER, - }); - let currentRefreshRow = new Adw.ActionRow({ - title: _("Current Weather Refresh"), - subtitle: _("Current weather refresh interval in minutes"), - activatable_widget: currentRefreshSpinButton, - }); - currentRefreshRow.add_suffix(currentRefreshSpinButton); - - // forecast refresh - let disableForecast = this._settings.get_boolean("disable-forecast"); - let forecastRefreshSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 60, - upper: 1440, - step_increment: 1, - page_increment: 10, - value: this._settings.get_int("refresh-interval-forecast") / 60, - }), - climb_rate: 5, - numeric: true, - update_policy: "if-valid", - sensitive: disableForecast ? false : true, - valign: Gtk.Align.CENTER, - }); - let forecastRefreshRow = new Adw.ActionRow({ - title: _("Weather Forecast Refresh"), - subtitle: _("Forecast refresh interval in minutes if enabled"), - activatable_widget: forecastRefreshSpinButton, - }); - forecastRefreshRow.add_suffix(forecastRefreshSpinButton); - - // My Location Refresh - let myLocRefreshSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 10, - upper: 1440, - step_increment: 1, - page_increment: 10, - value: this._settings.get_double("loc-refresh-interval") - }), - climb_rate: 5, - numeric: true, - update_policy: "if-valid", - valign: Gtk.Align.CENTER - }); - let myLocRefreshRow = new Adw.ActionRow({ - title: _("My Location Refresh"), - subtitle: _("My location refresh interval in minutes"), - activatable_widget: myLocRefreshSpinButton - }); - myLocRefreshRow.add_suffix(myLocRefreshSpinButton); - - // disable forecast - let disableForecastSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: disableForecast, - }); - let disableForecastRow = new Adw.ActionRow({ - title: _("Disable Forecast"), - subtitle: _("Disables all fetching and processing of forecast data"), - activatable_widget: disableForecastSwitch, - }); - disableForecastRow.add_suffix(disableForecastSwitch); - - // Icons - let systemIconsSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("use-system-icons"), - }); - let systemIconsRow = new Adw.ActionRow({ - title: _("System Icons"), - subtitle: _("Disable to use packaged %s weather icons").format("Breeze"), - tooltip_text: _( - "If you have issues with your system icons displaying correctly disable this to fix it" - ), - activatable_widget: systemIconsSwitch, - }); - systemIconsRow.add_suffix(systemIconsSwitch); - - // Startup delay - let startupDelaySpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 30, - step_increment: 1, - page_increment: 10, - value: this._settings.get_int("delay-ext-init"), - }), - climb_rate: 1, - numeric: true, - update_policy: "if-valid", - valign: Gtk.Align.CENTER, - }); - let startupDelayRow = new Adw.ActionRow({ - title: _("First Boot Delay"), - subtitle: _("Seconds to delay popup initialization and data fetching"), - tooltip_text: _( - "This setting only applies to the first time the extension is loaded. (first log in / restarting gnome shell)" - ), - activatable_widget: startupDelaySpinButton, - }); - startupDelayRow.add_suffix(startupDelaySpinButton); - - generalGroup.add(currentRefreshRow); - generalGroup.add(forecastRefreshRow); - generalGroup.add(myLocRefreshRow); - generalGroup.add(disableForecastRow); - generalGroup.add(systemIconsRow); - generalGroup.add(startupDelayRow); - this.add(generalGroup); - - // Units Group - let unitsGroup = new Adw.PreferencesGroup({ - title: _("Units"), - }); - - // Temperature - let temperatureUnits = new Gtk.StringList(); - temperatureUnits.append(_("\u00B0C")); - temperatureUnits.append(_("\u00B0F")); - temperatureUnits.append(_("K")); - temperatureUnits.append(_("\u00B0Ra")); - temperatureUnits.append(_("\u00B0R\u00E9")); - temperatureUnits.append(_("\u00B0R\u00F8")); - temperatureUnits.append(_("\u00B0De")); - temperatureUnits.append(_("\u00B0N")); - let selTempUnit = this._settings.get_enum("unit"); - let unitIsDegs = selTempUnit !== 2; - let temperatureUnitRow = new Adw.ComboRow({ - title: _("Temperature"), - model: temperatureUnits, - selected: this._settings.get_enum("unit"), - }); - - // Wind speed - let windSpeedUnits = new Gtk.StringList(); - windSpeedUnits.append(_("km/h")); - windSpeedUnits.append(_("mph")); - windSpeedUnits.append(_("m/s")); - windSpeedUnits.append(_("kn")); - windSpeedUnits.append(_("ft/s")); - windSpeedUnits.append(_("Beaufort")); - let windSpeedUnitRow = new Adw.ComboRow({ - title: _("Wind Speed"), - model: windSpeedUnits, - selected: this._settings.get_enum("wind-speed-unit"), - }); - - // Pressure - let pressureUnits = new Gtk.StringList(); - // hPa - pressureUnits.append(_("inHg")); - pressureUnits.append(_("bar")); - pressureUnits.append(_("Pa")); - pressureUnits.append(_("kPa")); - pressureUnits.append(_("atm")); - pressureUnits.append(_("at")); - pressureUnits.append(_("Torr")); - pressureUnits.append(_("psi")); - pressureUnits.append(_("mmHg")); - pressureUnits.append(_("mbar")); - let pressureUnitRow = new Adw.ComboRow({ - title: _("Pressure"), - model: pressureUnits, - selected: this._settings.get_enum("pressure-unit") - 1, - }); - - // Clock Format - let clockFormat = new Gtk.StringList(); - clockFormat.append(_("24-hour")); - clockFormat.append(_("AM / PM")); - clockFormat.append(_("System")); - let clockFormatRow = new Adw.ComboRow({ - title: _("Time Format"), - model: clockFormat, - selected: this._settings.get_enum("clock-format") - }); - - let simplifyDegSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("simplify-degrees") - }); - simplifyDegSwitch.set_sensitive(unitIsDegs); - let simplifyDegRow = new Adw.ActionRow({ - title: _("Simplify Degrees"), - subtitle: _('Show "\u00B0" instead of "\u00B0C," "\u00B0F," etc.'), - tooltip_text: _("Enable this to cut off the \"C,\" \"F,\" etc. from degrees labels."), - activatable_widget: simplifyDegSwitch - }); - simplifyDegRow.add_suffix(simplifyDegSwitch); - - unitsGroup.add(temperatureUnitRow); - unitsGroup.add(windSpeedUnitRow); - unitsGroup.add(pressureUnitRow); - unitsGroup.add(clockFormatRow); - unitsGroup.add(simplifyDegRow); - this.add(unitsGroup); - - let notifGroup = new Adw.PreferencesGroup({ - title: _("Notifications") - }); - - let precipStartsNotifSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("precip-starts-notif") - }); - let precipStartsNotifRow = new Adw.ActionRow({ - title: _("Precipitation Starting"), - subtitle: _("Get notified when precipitation starts (e.g. rain or snow)."), - tooltip_text: _("Get notified when precipitation starts (e.g. rain or snow)."), - activatable_widget: precipStartsNotifSwitch - }); - precipStartsNotifRow.add_suffix(precipStartsNotifSwitch); - - notifGroup.add(precipStartsNotifRow); - //this.add(notifGroup); - - // Provider Settings - let apiGroup = new Adw.PreferencesGroup({ - title: _("Provider"), - }); - - - let curProv = this._settings.get_enum("weather-provider"); - - let weatherProvsList = new Gtk.StringList(); - weatherProvsList.append(_("Adaptive")); - weatherProvsList.append("OpenWeatherMap"); - weatherProvsList.append("WeatherAPI.com"); - weatherProvsList.append("Visual Crossing"); - //weatherProvsList.append("Open-Meteo"); - let weatherProvsListRow = new Adw.ComboRow({ - title: _("Weather Provider"), - subtitle: _("Provider used for weather and forecasts; choose \"%s\" if you don't care.").format(_("Adaptive")), - tooltip_text: _("Choose '%s' if you don't care, otherwise choose a specific provider.").format(_("Adaptive")), - model: weatherProvsList, - selected: curProv - }); - - // Provider Multilingual Support - let providerTranslateSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("owm-api-translate"), - }); - let providerTranslateRow = new Adw.ActionRow({ - title: getProviderTranslateRowTitle(curProv), - subtitle: _( - "Using provider translations applies to weather conditions only" - ), - tooltip_text: _( - "Enable this to use provider multilingual support if there's no built-in translations for your language yet." - ), - activatable_widget: providerTranslateSwitch, - }); - providerTranslateRow.add_suffix(providerTranslateSwitch); - - // Provider API key - let curProvKey = curProv ? settingsGetKeys(this._settings)[curProv - 1] : ""; - - let defaultApiKeySwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: curProvKey !== "", - sensitive: curProv !== 0 - }); - let defaultApiKeyRow = new Adw.ActionRow({ - title: _("Use Custom API Key"), - subtitle: getDefaultApiKeyRowSubtitle(curProv), - tooltip_text: getDefaultApiKeyRowTooltip(curProv), - activatable_widget: defaultApiKeySwitch, - }); - defaultApiKeyRow.add_suffix(defaultApiKeySwitch); - - // Personal API key - let personalApiKeyEntry = new Gtk.Entry({ - max_length: 32, - width_chars: 20, - vexpand: false, - sensitive: curProvKey !== "", - valign: Gtk.Align.CENTER, - }); - let personalApiKeyRow = new Adw.ActionRow({ - title: _("Personal API Key"), - activatable_widget: personalApiKeyEntry, - }); - - let provKeyIsValid = isValidKey(curProv, curProvKey); - personalApiKeyEntry.set_icon_from_icon_name(Gtk.PositionType.LEFT, - provKeyIsValid ? "checkbox-checked-symbolic" : "dialog-warning"); - personalApiKeyEntry.set_text(curProvKey); - personalApiKeyRow.add_suffix(personalApiKeyEntry); - - apiGroup.add(weatherProvsListRow); - apiGroup.add(providerTranslateRow); - apiGroup.add(defaultApiKeyRow); - apiGroup.add(personalApiKeyRow); - this.add(apiGroup); - - let resetGroup = new Adw.PreferencesGroup({ - title: _("Reset") - }); - - let resetToDefsBtn = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "view-refresh-symbolic", - label: _("Reset"), - }), - }); - let resetToDefsRow = new Adw.ActionRow({ - title: _("Restore Defaults"), - tooltip_text: _( - "Restore all settings to the defaults." - ), - activatable_widget: resetToDefsBtn, - }); - resetToDefsRow.add_suffix(resetToDefsBtn); - - resetGroup.add(resetToDefsRow); - this.add(resetGroup); - - // Bind signals - currentRefreshSpinButton.connect("value-changed", (widget) => { - this._settings.set_int( - "refresh-interval-current", - 60 * widget.get_value() - ); - }); - forecastRefreshSpinButton.connect("value-changed", (widget) => { - this._settings.set_int( - "refresh-interval-forecast", - 60 * widget.get_value() - ); - }); - myLocRefreshSpinButton.connect("value-changed", (widget) => { - this._settings.set_double("loc-refresh-interval", widget.get_value()); - }); - disableForecastSwitch.connect("notify::active", (widget) => { - if (widget.get_active()) { - forecastRefreshSpinButton.set_sensitive(false); - } else { - forecastRefreshSpinButton.set_sensitive(true); - } - this._settings.set_boolean("disable-forecast", widget.get_active()); - }); - systemIconsSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("use-system-icons", widget.get_active()); - }); - startupDelaySpinButton.connect("value-changed", (widget) => { - this._settings.set_int("delay-ext-init", widget.get_value()); - }); - temperatureUnitRow.connect("notify::selected", (widget) => { - let unit = widget.selected; - simplifyDegSwitch.set_sensitive(unit !== 2); - this._settings.set_enum("unit", unit); - }); - windSpeedUnitRow.connect("notify::selected", (widget) => { - this._settings.set_enum("wind-speed-unit", widget.selected); - }); - pressureUnitRow.connect("notify::selected", (widget) => { - this._settings.set_enum("pressure-unit", widget.selected + 1); - }); - clockFormatRow.connect("notify::selected", (widget) => { - this._settings.set_enum("clock-format", widget.selected); - }); - simplifyDegSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("simplify-degrees", widget.get_active()); - }); - precipStartsNotifSwitch.connect("notify::active", widget => { - this._settings.set_boolean("precip-starts-notif", widget.get_active()); - }); - weatherProvsListRow.connect("notify::selected", widget => { - let prov = widget.selected; - this._settings.set_enum("weather-provider", prov); - providerTranslateRow.set_title(getProviderTranslateRowTitle(prov)); - defaultApiKeyRow.set_subtitle(getDefaultApiKeyRowSubtitle(prov)); - defaultApiKeyRow.set_tooltip_text(getDefaultApiKeyRowTooltip(prov)); - - let isAdaptive = prov === 0; - let keyArr = settingsGetKeys(this._settings); - // Array Index 0 is first provider, but in the provider enum 0 = adaptive - // and 1 = the first provider - let key = isAdaptive ? "" : keyArr[prov - 1]; - // Empty String = Default Key - let isDefKey = key === ""; - // Switched on if not Adaptive and not using Default Key - defaultApiKeySwitch.set_active(!isAdaptive && !isDefKey); - // Grey out if Adaptive - defaultApiKeySwitch.set_sensitive(!isAdaptive); - // Grey out if Adaptive or using Default key - personalApiKeyEntry.set_sensitive(!isAdaptive && !isDefKey); - // Set text to an empty string if using Default, or the key - personalApiKeyEntry.set_text(key); - }); - providerTranslateSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("owm-api-translate", widget.get_active()); - }); - defaultApiKeySwitch.connect("notify::active", (widget) => { - let prov = this._settings.get_enum("weather-provider"); - // If somehow provider is set to Adaptive - // (which this should be greyed out so shouldn't happen) - // we'll just get out here - if(prov === 0) return; - - let active = widget.get_active(); - // Grey out key text box if we turn this off - personalApiKeyEntry.set_sensitive(active); - - let keyArr = settingsGetKeys(this._settings); - // Set the corresponding provider (where 1 in the enum is 0 in the key - // array) to the key or an empty string to signify default - keyArr[prov - 1] = active ? personalApiKeyEntry.text : ""; - settingsSetKeys(this._settings, keyArr); - }); - personalApiKeyEntry.connect("notify::text", (widget) => { - let prov = this._settings.get_enum("weather-provider"); - if(prov === 0) return; - - let key = widget.text; - let isValid = isValidKey(prov, key); - personalApiKeyEntry.set_icon_from_icon_name(Gtk.PositionType.LEFT, - isValid ? "checkbox-checked-symbolic" : "dialog-warning"); - // Don't save if not a valid key - if(!isValid) return; - - let keyArr = settingsGetKeys(this._settings); - // 1 in enum is 0 in the key array - // Note if this is empty, that will turn default mode on - keyArr[prov - 1] = key; - settingsSetKeys(this._settings, keyArr); - }); - resetToDefsBtn.connect("clicked", () => - { - let keys = this._settings.list_keys(); - this._settings.set_boolean("frozen", true); - - for(let k of keys) - { - this._settings.reset(k); - } - - this._settings.reset("frozen"); - - this._window.close(); - } - ); - } -} -export { GeneralPage }; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/layoutPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/layoutPage.js deleted file mode 100644 index 86b261b4..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/layoutPage.js +++ /dev/null @@ -1,443 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ - -import Gtk from "gi://Gtk"; -import Adw from "gi://Adw"; -import GObject from "gi://GObject"; - -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -class LayoutPage extends Adw.PreferencesPage { - static { - GObject.registerClass(this); - } - - constructor(metadata, settings) { - super({ - title: _("Layout"), - icon_name: "preferences-other-symbolic", - name: "LayoutPage", - }); - this._settings = settings; - - // Panel Options - let panelGroup = new Adw.PreferencesGroup({ - title: _("Panel"), - }); - - // Position in panel - let panelPositions = new Gtk.StringList(); - panelPositions.append(_("Center")); - panelPositions.append(_("Right")); - panelPositions.append(_("Left")); - let panelPositionRow = new Adw.ComboRow({ - title: _("Position In Panel"), - model: panelPositions, - selected: this._settings.get_enum("position-in-panel"), - }); - - // Position offset - let positionOffsetSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 15, - step_increment: 1, - page_increment: 1, - page_size: 0, - value: this._settings.get_int("position-index"), - }), - climb_rate: 1, - digits: 0, - numeric: true, - valign: Gtk.Align.CENTER, - }); - let positionOffsetRow = new Adw.ActionRow({ - title: _("Position Offset"), - subtitle: _("The position relative to other items in the box"), - activatable_widget: positionOffsetSpinButton, - }); - positionOffsetRow.add_suffix(positionOffsetSpinButton); - - // Temp in panel - let temperatureInPanelSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - tooltip_text: _("Show the temperature in the panel"), - active: this._settings.get_boolean("show-text-in-panel"), - }); - let temperatureInPanelRow = new Adw.ActionRow({ - title: _("Temperature In Panel"), - activatable_widget: temperatureInPanelSwitch, - }); - temperatureInPanelRow.add_suffix(temperatureInPanelSwitch); - - // Conditions in panel - let conditionsInPanelSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - tooltip_text: _("Show the weather conditions in the panel"), - active: this._settings.get_boolean("show-comment-in-panel"), - }); - let conditionsInPanelRow = new Adw.ActionRow({ - title: _("Conditions In Panel"), - activatable_widget: conditionsInPanelSwitch, - }); - conditionsInPanelRow.add_suffix(conditionsInPanelSwitch); - - // Sunrise/Sunset in Panel - let sunsetriseInPanelSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - tooltip_text: _("Show the time of sunrise/sunset in the panel."), - active: this._settings.get_boolean("show-sunsetrise-in-panel") - }); - let sunsetriseInPanelRow = new Adw.ActionRow({ - title: _("Sunrise/Sunset In Panel"), - activatable_widget: sunsetriseInPanelSwitch - }); - sunsetriseInPanelRow.add_suffix(sunsetriseInPanelSwitch); - - // Sunrise/Sunset in Panel - let sunsetriseFirstSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - tooltip_text: _("Show the sunset/sunrise before the temperature/conditions. Requires restart."), - active: this._settings.get_boolean("sun-in-panel-first") - }); - let sunsetriseFirstRow = new Adw.ActionRow({ - title: _("Sunrise/Sunset First (Restart Required)"), - activatable_widget: sunsetriseInPanelSwitch - }); - sunsetriseFirstRow.add_suffix(sunsetriseFirstSwitch); - sunsetriseFirstRow.set_sensitive(this._settings.get_boolean("show-sunsetrise-in-panel")); - - panelGroup.add(panelPositionRow); - panelGroup.add(positionOffsetRow); - panelGroup.add(temperatureInPanelRow); - panelGroup.add(conditionsInPanelRow); - panelGroup.add(sunsetriseInPanelRow); - panelGroup.add(sunsetriseFirstRow); - this.add(panelGroup); - - // Weather Popup Options - let popupGroup = new Adw.PreferencesGroup({ - title: _("Popup"), - }); - - // Popup position - let weatherPopupPositionScale = new Gtk.Scale({ - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 100, - step_increment: 0.1, - page_increment: 2, - value: this._settings.get_double("menu-alignment"), - }), - width_request: 200, - show_fill_level: 1, - restrict_to_fill_level: 0, - fill_level: 100, - }); - let weatherPopupPositionRow = new Adw.ActionRow({ - title: _("Popup Position"), - subtitle: _("Alignment of the popup from left to right"), - activatable_widget: weatherPopupPositionScale, - }); - weatherPopupPositionRow.add_suffix(weatherPopupPositionScale); - - // Wind arrows - let windArrowsSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("wind-direction"), - }); - let windArrowsRow = new Adw.ActionRow({ - title: _("Wind Direction Arrows"), - activatable_widget: windArrowsSwitch, - }); - windArrowsRow.add_suffix(windArrowsSwitch); - - // Translate conditions - this.providerTranslations = this._settings.get_boolean("owm-api-translate"); - let translateConditionsSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("translate-condition"), - }); - let translateConditionsRow = new Adw.ActionRow({ - title: _("Translate Conditions"), - activatable_widget: translateConditionsSwitch, - visible: !this.providerTranslations, - }); - translateConditionsRow.add_suffix(translateConditionsSwitch); - - // Temp decimal places - let temperatureDigits = new Gtk.StringList(); - temperatureDigits.append(_("0")); - temperatureDigits.append(_("1")); - temperatureDigits.append(_("2")); - temperatureDigits.append(_("3")); - let temperatureDigitsRow = new Adw.ComboRow({ - title: _("Temperature Decimal Places"), - tooltip_text: _("Maximum number of digits after the decimal point"), - model: temperatureDigits, - selected: this._settings.get_int("decimal-places") - }); - - let pressureDigits = new Gtk.StringList(); - pressureDigits.append(_("Unit Default")); - pressureDigits.append(_("Follow Temp.")); - pressureDigits.append(_("0")); - pressureDigits.append(_("1")); - pressureDigits.append(_("2")); - pressureDigits.append(_("3")); - pressureDigits.append(_("4")); - let pressureDigitsRow = new Adw.ComboRow({ - title: _("Pressure Decimal Places"), - tooltip_text: _("Maximum number of digits after the decimal point"), - model: pressureDigits, - selected: this._settings.get_int("pressure-decimal-places") + 2 - }); - - let speedDigits = new Gtk.StringList(); - speedDigits.append(_("Follow Temp.")); - speedDigits.append(_("0")); - speedDigits.append(_("1")); - speedDigits.append(_("2")); - speedDigits.append(_("3")); - speedDigits.append(_("4")); - let speedDigitsRow = new Adw.ComboRow({ - title: _("Speed Decimal Places"), - tooltip_text: _("Maximum number of digits after the decimal point"), - model: speedDigits, - selected: this._settings.get_int("speed-decimal-places") + 1 - }); - - // Location length text - let locationLengthSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 500, - step_increment: 1, - page_increment: 10, - value: this._settings.get_int("location-text-length"), - }), - climb_rate: 5, - digits: 0, - numeric: true, - valign: Gtk.Align.CENTER, - }); - let locationLengthRow = new Adw.ActionRow({ - title: _("Location Text Length"), - tooltip_text: _( - "Maximum length of the location text. A setting of '0' is unlimited" - ), - subtitle: _("Maximum length to cut off the location text at. \"0\" is unlimited."), - activatable_widget: locationLengthSpinButton, - }); - locationLengthRow.add_suffix(locationLengthSpinButton); - - // Hi Contrast Styles - let hiContrast = new Gtk.StringList(); - hiContrast.append(_("Off")); - hiContrast.append(_("White Text")); - hiContrast.append(_("Black Text")); - let hiContrastRow = new Adw.ComboRow({ - title: _("High Contrast"), - subtitle: _("Override GNOME shell text colors in the pop-up with hard-coded ones that may be easier to read. This may not be very effective depending on your shell theme."), - tooltip_text: _("Enable to override GNOME shell colors"), - model: hiContrast, - selected: this._settings.get_enum("hi-contrast") - }); - - popupGroup.add(weatherPopupPositionRow); - popupGroup.add(windArrowsRow); - popupGroup.add(translateConditionsRow); - popupGroup.add(temperatureDigitsRow); - popupGroup.add(pressureDigitsRow); - popupGroup.add(speedDigitsRow); - popupGroup.add(locationLengthRow); - popupGroup.add(hiContrastRow); - this.add(popupGroup); - - // Forecast Options - this.disableForecast = this._settings.get_boolean("disable-forecast"); - - let forecastGroup = new Adw.PreferencesGroup({ - title: _("Forecast"), - sensitive: !this.disableForecast, - }); - - // Center today's forecast - let centerForecastSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("center-forecast"), - }); - let centerForecastRow = new Adw.ActionRow({ - title: _("Center Today's Forecast"), - subtitle: _("Center today's forecast instead of left-aligning it."), - activatable_widget: centerForecastSwitch, - }); - centerForecastRow.add_suffix(centerForecastSwitch); - - // Conditions in forecast - let forecastConditionsSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("show-comment-in-forecast"), - }); - let forecastConditionsRow = new Adw.ActionRow({ - title: _("Conditions In Forecast"), - subtitle: _("Show the condition text (e.g. \"Cloudy\") in the forecast."), - activatable_widget: forecastConditionsSwitch, - }); - forecastConditionsRow.add_suffix(forecastConditionsSwitch); - - // Forecast days - let forecastDaysSpinButton = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - lower: 0, - upper: 31, - step_increment: 1, - page_increment: 3, - value: this._settings.get_int("days-forecast"), - }), - climb_rate: 1, - digits: 0, - numeric: true, - valign: Gtk.Align.CENTER - }); - let forecastDaysRow = new Adw.ActionRow({ - title: _("Total Days In Forecast"), - tooltip_text: _( - "Number of days to show in forecast where a setting of \"0\" is only today" - ), - subtitle: _("Number of days to show in forecast. \"0\" means only show today.\nDifferent providers support different amounts of days.\nCurrently \"%s\" supports the furthest forecast of %s days.").format("Visual Crossing", "14"), - activatable_widget: forecastDaysSpinButton, - }); - forecastDaysRow.add_suffix(forecastDaysSpinButton); - - // Keep forecast expanded - let forecastExpandedSwitch = new Gtk.Switch({ - valign: Gtk.Align.CENTER, - active: this._settings.get_boolean("expand-forecast"), - }); - let forecastExpandedRow = new Adw.ActionRow({ - title: _("Keep Forecast Expanded"), - subtitle: _("Automatically open the forecast when the pop-up is opened."), - activatable_widget: forecastExpandedSwitch, - }); - forecastExpandedRow.add_suffix(forecastExpandedSwitch); - - forecastGroup.add(centerForecastRow); - forecastGroup.add(forecastConditionsRow); - forecastGroup.add(forecastDaysRow); - forecastGroup.add(forecastExpandedRow); - this.add(forecastGroup); - - // Bind signals - panelPositionRow.connect("notify::selected", (widget) => { - this._settings.set_enum("position-in-panel", widget.selected); - }); - positionOffsetSpinButton.connect("value-changed", (widget) => { - this._settings.set_int("position-index", widget.get_value()); - }); - temperatureInPanelSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("show-text-in-panel", widget.get_active()); - }); - conditionsInPanelSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("show-comment-in-panel", widget.get_active()); - }); - sunsetriseInPanelSwitch.connect("notify::active", (widget) => { - let active = widget.get_active(); - this._settings.set_boolean("show-sunsetrise-in-panel", active); - sunsetriseFirstRow.set_sensitive(active); - }); - sunsetriseFirstSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("sun-in-panel-first", widget.get_active()); - }); - weatherPopupPositionScale.connect("value-changed", (widget) => { - this._settings.set_double("menu-alignment", widget.get_value()); - }); - windArrowsSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("wind-direction", widget.get_active()); - }); - translateConditionsSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("translate-condition", widget.get_active()); - }); - temperatureDigitsRow.connect("notify::selected", (widget) => { - this._settings.set_int("decimal-places", widget.selected); - }); - pressureDigitsRow.connect("notify::selected", (widget) => { - // -2 because -2 = Unit Default, -1 = Follow Temperature - this._settings.set_int("pressure-decimal-places", widget.selected - 2); - }); - speedDigitsRow.connect("notify::selected", (widget) => { - // -1 because -1 = Follow Temperature - this._settings.set_int("speed-decimal-places", widget.selected - 1); - }); - locationLengthSpinButton.connect("value-changed", (widget) => { - this._settings.set_int("location-text-length", widget.get_value()); - }); - hiContrastRow.connect("notify::selected", (widget) => { - this._settings.set_enum("hi-contrast", widget.selected); - }); - centerForecastSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("center-forecast", widget.get_active()); - }); - forecastConditionsSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean( - "show-comment-in-forecast", - widget.get_active() - ); - }); - forecastDaysSpinButton.connect("value-changed", (widget) => { - this._settings.set_int("days-forecast", widget.get_value()); - }); - forecastExpandedSwitch.connect("notify::active", (widget) => { - this._settings.set_boolean("expand-forecast", widget.get_active()); - }); - // Detect settings changes to enable/disable related options - this._settings.connect("changed", () => { - if(this._settings.get_boolean("frozen")) return; - - if (this._disableForecastChanged()) { - if (this._settings.get_boolean("disable-forecast")) { - forecastGroup.set_sensitive(false); - } else { - forecastGroup.set_sensitive(true); - } - } else if (this._providerTranslationsChanged()) { - if (this._settings.get_boolean("owm-api-translate")) { - translateConditionsRow.set_visible(false); - } else { - translateConditionsRow.set_visible(true); - } - } - }); - } - _disableForecastChanged() { - let _disableForecast = this._settings.get_boolean("disable-forecast"); - if (this.disableForecast !== _disableForecast) { - this.disableForecast = _disableForecast; - return true; - } - return false; - } - _providerTranslationsChanged() { - let _providerTranslations = this._settings.get_boolean("owm-api-translate"); - if (this.providerTranslations !== _providerTranslations) { - this.providerTranslations = _providerTranslations; - return true; - } - return false; - } -} -export { LayoutPage }; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/locationsPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/locationsPage.js deleted file mode 100644 index b1eb261a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/locationsPage.js +++ /dev/null @@ -1,659 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ - -import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; -import GObject from "gi://GObject"; - -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -import { SearchResultsWindow } from "./searchResultsWindow.js"; -import { GeolocationProvider } from "../constants.js"; -import { Loc, settingsGetLocs, settingsSetLocs, NAME_TYPE, PLACE_TYPE } from "../locs.js"; - -class LocationsPage extends Adw.PreferencesPage -{ - static { - GObject.registerClass(this); - } - - cityIndex; - - constructor(metadata, settings, parent) - { - super({ - title: _("Locations"), - icon_name: "find-location-symbolic", - name: "LocationsPage", - }); - this.metadata = metadata; - this._window = parent; - this._settings = settings; - this._count = null; - this._locListUi = null; - this.cityIndex = this._settings.get_int("actual-city"); - let locationProvider = this._settings.get_enum("geolocation-provider"); - - // Locations list group - let addLocationButton = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "list-add-symbolic", - label: _("Add"), - }), - }); - this.locationsGroup = new Adw.PreferencesGroup({ - title: _("Locations"), - header_suffix: addLocationButton, - }); - this._refreshLocations(); - this.add(this.locationsGroup); - - // Geolocation providers group - let providersGroup = new Adw.PreferencesGroup({ - title: _("Provider"), - }); - - let myLocProvsList = new Gtk.StringList(); - myLocProvsList.append("Built-In + Nominatim"); - myLocProvsList.append("infoip.io"); - this._lastMyLocProv = this._settings.get_enum("my-loc-prov"); - let myLocProvsListRow = new Adw.ComboRow({ - title: _("My Loc. Provider"), - subtitle: _("Provider for getting My Location"), - model: myLocProvsList, - selected: this._lastMyLocProv - }); - - let providersList = new Gtk.StringList(); - providersList.append("Nominatim/OSM"); - providersList.append("MapQuest"); - let providersListRow = new Adw.ComboRow({ - title: _("Geolocation Provider"), - subtitle: _("Provider used for location search"), - model: providersList, - selected: locationProvider > 0 ? locationProvider - 1 : 0, - }); - // Personal MapQuest API key - let personalApiKeyMQEntry = new Gtk.Entry({ - max_length: 32, - width_chars: 20, - vexpand: false, - sensitive: locationProvider === GeolocationProvider.MAPQUEST, - valign: Gtk.Align.CENTER, - }); - let personalApiKeyMQRow = new Adw.ActionRow({ - title: _("Personal MapQuest Key"), - subtitle: _("Personal API Key from developer.mapquest.com"), - activatable_widget: personalApiKeyMQEntry, - }); - let personalApiKeyMQ = this._settings.get_string( - "geolocation-appid-mapquest" - ); - if (personalApiKeyMQ !== "") { - if (personalApiKeyMQ.length !== 32) { - personalApiKeyMQEntry.set_icon_from_icon_name( - Gtk.PositionType.LEFT, - "dialog-warning" - ); - } else { - personalApiKeyMQEntry.set_icon_from_icon_name( - Gtk.PositionType.LEFT, - "" - ); - } - personalApiKeyMQEntry.set_text(personalApiKeyMQ); - } else { - personalApiKeyMQEntry.set_text(""); - personalApiKeyMQEntry.set_icon_from_icon_name( - Gtk.PositionType.LEFT, - "dialog-warning" - ); - } - - personalApiKeyMQRow.add_suffix(personalApiKeyMQEntry); - providersGroup.add(myLocProvsListRow); - providersGroup.add(providersListRow); - providersGroup.add(personalApiKeyMQRow); - this.add(providersGroup); - - // Bind signals - addLocationButton.connect("clicked", this._addLocation.bind(this)); - // Detect change in locations - this._settings.connect("changed", () => { - if(this._settings.get_boolean("frozen")) return; - - if (this._locationsChanged()) - { - this.cityIndex = this._settings.get_int("actual-city"); - this._refreshLocations(); - } - - if(this.myLocProvChanged()) - { - myLocProvsListRow.selected = this._settings.get_enum("my-loc-prov"); - } - }); - myLocProvsListRow.connect("notify::selected", widget => { - this._settings.set_enum("my-loc-prov", widget.selected); - }); - providersListRow.connect("notify::selected", (widget) => { - let isMapQuest = false; - let inx; - switch(widget.selected) - { - case 0: - inx = GeolocationProvider.OPENSTREETMAPS; - break; - case 1: - inx = GeolocationProvider.MAPQUEST; - isMapQuest = true; - break; - default: - inx = GeolocationProvider.OPENSTREETMAPS; - break; - } - personalApiKeyMQEntry.set_sensitive(isMapQuest); - this._settings.set_enum("geolocation-provider", inx); - }); - personalApiKeyMQEntry.connect("notify::text", (widget) => { - if (widget.text.length === 32) { - this._settings.set_string("geolocation-appid-mapquest", widget.text); - personalApiKeyMQEntry.set_icon_from_icon_name( - Gtk.PositionType.LEFT, - "" - ); - } else { - personalApiKeyMQEntry.set_icon_from_icon_name( - Gtk.PositionType.LEFT, - "dialog-warning" - ); - if (widget.text.length === 0) { - this._settings.set_string("geolocation-appid-mapquest", ""); - } - } - }); - } - - _refreshLocations() - { - let locs = settingsGetLocs(this._settings); - - // Check if the location list UI needs updating - if (this._locationsChanged(locs)) - { - if (locs.length > 0) - { - // Remove the old list - if (this._count) - { - for (let i = 0; i < this._count; i++) - { - this.locationsGroup.remove(this.location[i].Row); - } - this._count = null; - } - - this.location = []; - // Build new location UI list - for (let i = 0; i < locs.length; i++) - { - this.location[i] = {}; - this.location[i].ButtonBox = new Gtk.Box({ - orientation: Gtk.Orientation.HORIZONTAL, - halign: Gtk.Align.CENTER, - spacing: 5, - hexpand: false, - vexpand: false, - }); - this.location[i].EditButton = new Gtk.Button({ - icon_name: "document-edit-symbolic", - valign: Gtk.Align.CENTER, - hexpand: false, - vexpand: false, - }); - this.location[i].DeleteButton = new Gtk.Button({ - icon_name: "edit-delete-symbolic", - valign: Gtk.Align.CENTER, - css_classes: ["error"], - hexpand: false, - vexpand: false, - }); - this.location[i].Row = new Adw.ActionRow({ - title: locs[i].getName(_), - subtitle: locs[i].getPlaceDisplay(_), - activatable: true, - }); - this.location[i].ButtonBox.append(this.location[i].EditButton); - this.location[i].ButtonBox.append(this.location[i].DeleteButton); - this.location[i].Row.add_suffix(this.location[i].ButtonBox); - this.locationsGroup.add(this.location[i].Row); - this._setIcon(i, i === this.cityIndex); - } - // Bind signals - for (let i = 0; i < this.location.length; i++) - { - this.location[i].EditButton.connect("clicked", () => { - this._editLocation(i); - }); - this.location[i].DeleteButton.connect("clicked", () => { - this._deleteLocation(i); - }); - this.location[i].Row.connect("activated", () => { - if (i !== this.cityIndex) - { - this._setIcon(this.cityIndex, false); - this._setIcon(i, true); - - this.cityIndex = i; - this._settings.set_int("actual-city", i); - let _toast = new Adw.Toast({ - title: _("Location changed to: %s").format( - this.location[i].Row.get_title() - ), - }); - this._window.add_toast(_toast); - } - return 0; - }); - } - this._count = this.location.length; - } - this._locListUi = locs; - } - else if(this._count) - { - for(let i = 0; i < this.location.length; i++) - { - this._setIcon(i, i === this.cityIndex); - } - } - } - - _setIcon(index, isOn) - { - this.location[index].Row.set_icon_name(isOn ? "checkbox-checked-symbolic" : "checkbox-symbolic"); - } - - _addLocation() - { - let _dialog = new Gtk.Dialog({ - title: _("Add New Location"), - use_header_bar: true, - transient_for: this._window, - default_width: 600, - default_height: -1, - modal: true, - }); - let _dialogPage = new Adw.PreferencesPage(); - let _dialogGroup = new Adw.PreferencesGroup(); - let _dialogRow = new Adw.PreferencesRow({ - activatable: false, - focusable: false, - }); - let _dialogBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - margin_top: 10, - margin_bottom: 10, - margin_start: 10, - margin_end: 10, - }); - let _findLabel = new Gtk.Label({ - label: _("Search by Location or Coordinates"), - halign: Gtk.Align.START, - margin_bottom: 5, - hexpand: true, - }); - let _findEntry = new Gtk.Entry({ - placeholder_text: _("e.g. London, England or 51.5074456,-0.1277653"), - secondary_icon_name: "edit-clear-symbolic", - secondary_icon_tooltip_text: _("Clear entry"), - valign: Gtk.Align.CENTER, - activates_default: true, - hexpand: true, - vexpand: false, - margin_bottom: 5 - }); - let myLocBtn = new Gtk.Button({ - label: _("My Location"), - valign: Gtk.Align.END, - hexpand: true, - vexpand: false, - margin_bottom: 5 - }); - let _searchButton = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "edit-find-symbolic", - label: _("Search"), - }), - css_classes: ["suggested-action"], - }); - _dialog.add_action_widget(_searchButton, 0); - _dialog.set_default_response(0); - let _dialogArea = _dialog.get_content_area(); - - _dialogBox.append(_findLabel); - _dialogBox.append(_findEntry); - _dialogBox.append(myLocBtn); - _dialogRow.set_child(_dialogBox); - _dialogGroup.add(_dialogRow); - _dialogPage.add(_dialogGroup); - _dialogArea.append(_dialogPage); - _dialog.show(); - - // Bind signals - _dialog.connect("response", (w, response) => { - if (response === 0) - { - let location = _findEntry.get_text().trim(); - if (!location) - { - // no input - let _toast = new Adw.Toast({ - title: _("We need something to search for!"), - }); - this._window.add_toast(_toast); - return 0; - } - let resultsWindow = new SearchResultsWindow( - this.metadata, - this._window, - this._settings, - location - ); - resultsWindow.show(); - } - _dialog.close(); - return 0; - }); - _findEntry.connect("icon-release", (widget) => { - widget.set_text(""); - }); - myLocBtn.connect("clicked", () => - { - let locs = settingsGetLocs(this._settings); - if(!locs) locs = [ ]; - - locs.push(Loc.myLoc()); - - settingsSetLocs(this._settings, locs); - - let toast = new Adw.Toast({ - title: _("%s has been added").format(_("My Location")), - }); - this._window.add_toast(toast); - _dialog.destroy(); - }); - _dialog.connect("close-request", () => { - _dialog.destroy(); - }); - return 0; - } - - _editLocation(selected) - { - let locs = settingsGetLocs(this._settings); - - let _dialog = new Gtk.Dialog({ - title: _("Edit %s").format(locs[selected].getName(_)), - use_header_bar: true, - transient_for: this._window, - default_width: 600, - default_height: -1, - modal: true, - }); - let _dialogPage = new Adw.PreferencesPage(); - let _dialogGroup = new Adw.PreferencesGroup(); - let _dialogRow = new Adw.PreferencesRow({ - activatable: false, - focusable: false, - }); - let _dialogBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - margin_top: 10, - margin_bottom: 10, - margin_start: 10, - margin_end: 10, - }); - // location display name - let _editNameLabel = new Gtk.Label({ - label: _("Edit Name"), - halign: Gtk.Align.START, - margin_bottom: 5, - hexpand: true, - }); - - let name = locs[selected].isSpecialName() ? "" : locs[selected].getName(_); - let place; - if(locs[selected].isMyLoc()) place = "here"; - else - { - let latLon = locs[selected].getKnownCoordsSync(); - place = `${latLon[0]}, ${latLon[1]}`; - } - - let _editNameEntry = new Gtk.Entry({ - text: name, - secondary_icon_name: "edit-clear-symbolic", - secondary_icon_tooltip_text: _("Clear entry"), - valign: Gtk.Align.CENTER, - activates_default: true, - hexpand: true, - vexpand: false, - }); - // location coordinates - let _editCoordLabel = new Gtk.Label({ - label: _("Edit Coordinates"), - halign: Gtk.Align.START, - margin_top: 10, - margin_bottom: 5, - hexpand: true, - }); - let _editCoordEntry = new Gtk.Entry({ - text: place, - secondary_icon_name: "edit-clear-symbolic", - secondary_icon_tooltip_text: _("Clear entry"), - valign: Gtk.Align.CENTER, - activates_default: true, - hexpand: true, - vexpand: false, - }); - let searchLocNotice = new Gtk.Label({ - label: _("If you meant to search up a new location by name, " + - "<b>add</b> a location instead."), - use_markup: true, - margin_top: 15, - margin_bottom: 5 - }); - let _saveButton = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "document-save-symbolic", - label: _("Save"), - }), - css_classes: ["suggested-action"], - }); - _dialog.add_action_widget(_saveButton, 0); - _dialog.set_default_response(0); - let _dialogArea = _dialog.get_content_area(); - - _dialogBox.append(_editNameLabel); - _dialogBox.append(_editNameEntry); - _dialogBox.append(_editCoordLabel); - _dialogBox.append(_editCoordEntry); - _dialogBox.append(searchLocNotice); - _dialogRow.set_child(_dialogBox); - _dialogGroup.add(_dialogRow); - _dialogPage.add(_dialogGroup); - _dialogArea.append(_dialogPage); - _dialog.show(); - - // Bind signals - _editNameEntry.connect("icon-release", (widget) => { - widget.set_text(""); - }); - _editCoordEntry.connect("icon-release", (widget) => { - widget.set_text(""); - }); - _dialog.connect("response", (w, response) => { - if (response === 0) { - let _location = _editNameEntry.get_text(); - let _coord = _editCoordEntry.get_text(); - let _provider = 0; // preserved for future use - - if (!_coord) - { - let _toast = new Adw.Toast({ - title: _("Coordinates field cannot be empty."), - }); - this._window.add_toast(_toast); - return 0; - } - else if(_coord !== "here" && !/^\s*-?\s*[0-9]*\.[0-9]+\s*,\s*-?\s*[0-9]*\.[0-9]+\s*$/.test(_coord)) - { - let toast = new Adw.Toast({ - title: _("Coordinates field must be in the format of '%s' or the text '%s'.").format("0.0, 0.0", "here") - }); - this._window.add_toast(toast); - return 0; - } - else if(!_location && _coord !== "here") - { - let toast = new Adw.Toast({ - title: _("Name field can only be empty if coordinates are '%s'.").format("here") - }); - this._window.add_toast(toast); - return 0; - } - - let nameTy, placeTy, newPlace; - if(_coord === "here") - { - nameTy = !_location ? NAME_TYPE.MY_LOC : NAME_TYPE.CUSTOM; - placeTy = PLACE_TYPE.MY_LOC; - newPlace = ""; - } - else - { - nameTy = NAME_TYPE.CUSTOM; - placeTy = PLACE_TYPE.COORDS; - let split = _coord.split(","); - for(let i = 0; i < 2; i++) - { - split[i] = split[i].replace(/\s/g, ""); - } - newPlace = `${split[0]},${split[1]}`; - } - locs[selected] = new Loc(nameTy, _location, placeTy, newPlace); - - settingsSetLocs(this._settings, locs); - - let _toast = new Adw.Toast({ - title: _("%s has been updated").format(locs[selected].getName(_)), - }); - this._window.add_toast(_toast); - } - _dialog.close(); - return 0; - }); - _dialog.connect("close-request", () => { - _dialog.destroy(); - }); - return 0; - } - - _deleteLocation(selected) - { - let locs = settingsGetLocs(this._settings); - - if (!locs.length) return; - - let _dialog = new Gtk.Dialog({ - title: "", - use_header_bar: true, - transient_for: this._window, - resizable: false, - modal: true, - }); - let _dialogPage = new Adw.PreferencesPage(); - let _dialogGroup = new Adw.PreferencesGroup(); - let _selectedName = locs[selected].getName(_); - - let _dialogRow = new Adw.ActionRow({ - title: _('Are you sure you want to delete "%s"?').format(_selectedName), - icon_name: "help-about-symbolic", - activatable: false, - focusable: false, - }); - let _dialogButton = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "edit-delete-symbolic", - label: _("Delete"), - }), - css_classes: ["destructive-action"], - }); - _dialog.add_button(_("Cancel"), 0); - _dialog.add_action_widget(_dialogButton, 1); - _dialog.set_default_response(0); - - let _dialogArea = _dialog.get_content_area(); - _dialogGroup.add(_dialogRow); - _dialogPage.add(_dialogGroup); - _dialogArea.append(_dialogPage); - _dialog.show(); - - _dialog.connect("response", (w, response) => { - if (response === 1) - { - if (locs.length) locs.splice(selected, 1); - - if (this.cityIndex >= selected) - { - let newI = selected ? selected - 1 : 0; - this._settings.set_int("actual-city", newI); - this.cityIndex = newI; - - // this may not change anything, - // or if the deleted one is selected select the last one - if(this.location && this.location[newI]) this._setIcon(newI, true); - } - - settingsSetLocs(this._settings, locs); - - let _toast = new Adw.Toast({ - title: _("%s has been deleted").format(_selectedName), - }); - this._window.add_toast(_toast); - } - _dialog.close(); - return; - }); - _dialog.connect("close-request", () => { - _dialog.destroy(); - }); - } - - _locationsChanged(current) - { - return !Loc.arrsEqual(this._locListUi, current); - } - - myLocProvChanged() - { - return this._lastMyLocProv !== this._settings.get_enum("my-loc-prov"); - } -} - -export { LocationsPage }; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/searchResultsWindow.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/searchResultsWindow.js deleted file mode 100644 index 49fb5b90..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/preferences/searchResultsWindow.js +++ /dev/null @@ -1,307 +0,0 @@ -import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; -import GObject from "gi://GObject"; -import Soup from "gi://Soup"; -import GLib from "gi://GLib"; - -import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -import { GeolocationProvider } from "../constants.js"; -import { Loc, settingsGetLocs, settingsSetLocs } from "../locs.js"; - -class SearchResultsWindow extends Adw.PreferencesWindow -{ - static { - GObject.registerClass(this); - } - - constructor(metadata, parent, settings, location) - { - let provider = settings.get_enum("geolocation-provider"); - let provName; - switch(provider) - { - case GeolocationProvider.OPENSTREETMAPS: - provName = "Nominatim/OSM"; - break; - case GeolocationProvider.MAPQUEST: - provName = "MapQuest"; - break; - default: - provName = String(provider); - break; - } - - super({ - title: _("Search Results from %s").format(provName), - transient_for: parent, - search_enabled: false, - modal: true, - }); - let mainPage = new Adw.PreferencesPage(); - this.add(mainPage); - this.metadata = metadata; - this._window = parent; - this._settings = settings; - this._location = location; - this._provider = provider; - - // Search results group - let searchButton = new Gtk.Button({ - child: new Adw.ButtonContent({ - icon_name: "edit-find-symbolic", - label: _("New Search"), - }), - }); - this.resultsGroup = new Adw.PreferencesGroup({ - header_suffix: searchButton, - }); - this.resultsStatus = new Adw.StatusPage({ - title: _("Searching ..."), - description: _( - 'Please wait while searching for locations matching "%s"' - ).format(this._location), - icon_name: "edit-find-symbolic", - hexpand: true, - vexpand: true, - }); - this.resultsGroup.add(this.resultsStatus); - mainPage.add(this.resultsGroup); - // Query provider and load the results - this._findLocation(); - - // Bind signals - searchButton.connect("clicked", () => { - this._window.get_visible_page()._addLocation(); - this.close(); - return 0; - }); - this.connect("close-request", this._destroy.bind(this)); - } - - async _findLocation() - { - // OpenStreetMaps - if (this._provider === GeolocationProvider.OPENSTREETMAPS) { - let params = { - format: "json", - addressdetails: "1", - q: this._location, - }; - let _osmUrl = "https://nominatim.openstreetmap.org/search"; - try - { - let json = await this._loadJsonAsync(_osmUrl, params); - if(!json) - { - this._resultsError(true); - throw new Error("Server returned an invalid response"); - } - if(Number(json.length) < 1) - { - this._resultsError(false); - return 0; - } - - this._processResults(json); - } - catch (e) - { - console.warn("_findLocation OpenStreetMap error: " + e); - } - } - // MapQuest - else if (this._provider === GeolocationProvider.MAPQUEST) { - let _mqKey = this._settings.get_string("geolocation-appid-mapquest"); - if (_mqKey === "") { - this.resultsStatus.set_title(_("AppKey Required")); - this.resultsStatus.set_description( - _("You need an AppKey to use MapQuest, get one at: %s").format( - "developer.mapquest.com" - ) - ); - this.resultsStatus.set_icon_name("dialog-error-symbolic"); - return 0; - } - let params = { - key: _mqKey, - format: "json", - addressdetails: "1", - q: this._location, - }; - let _mqUrl = "https://open.mapquestapi.com/nominatim/v1/search.php"; - try - { - let json = await this._loadJsonAsync(_mqUrl, params); - if (!json) - { - this._resultsError(true); - throw new Error("Server returned an invalid response"); - } - if (Number(json.length) < 1) { - this._resultsError(false); - return 0; - } else { - this._processResults(json); - return 0; - } - } - catch(e) - { - console.warn("_findLocation MapQuest error: " + e); - } - } - - return null; - } - - _loadJsonAsync(url, params) - { - return new Promise((resolve, reject) => { - // Create user-agent string from uuid and the version - let _userAgent = this.metadata.uuid; - let _httpSession = new Soup.Session(); - let _paramsHash = Soup.form_encode_hash(params); - let _message = Soup.Message.new_from_encoded_form( - "GET", - url, - _paramsHash - ); - // add trailing space, so libsoup adds its own user-agent - _httpSession.user_agent = _userAgent + " "; - - _httpSession.send_and_read_async( - _message, - GLib.PRIORITY_DEFAULT, - null, - (sess, msg) => { - try - { - let jsonString = sess.send_and_read_finish(msg).get_data(); - if (jsonString instanceof Uint8Array) - { - jsonString = new TextDecoder().decode(jsonString); - } - - if (!jsonString) - { - throw new Error("No data in response body"); - } - - resolve(JSON.parse(jsonString)); - } - catch (e) - { - sess.abort(); - reject(e); - } - } - ); - }); - } - _processResults(json) - { - this.resultsUi = {}; - this.resultsGroup.remove(this.resultsStatus); - this.resultsGroup.set_title( - _('Results for "%s"').format(this._location) - ); - // Build search results list UI - for (let i in json) - { - this.resultsUi[i] = {}; - - let name; - let lat; - let lon; - - try - { - name = json[i].display_name; - lat = parseFloat(json[i].lat); - lon = parseFloat(json[i].lon); - } - catch(e) - { - console.error("OpenWeather Refined: Error processing results: " + e); - return; - } - - let coordsText = `${lat}, ${lon}`; - let simpleName = this._simplifyName(name); - - this.resultsUi[i].Row = new Adw.ActionRow({ - title: simpleName, - subtitle: coordsText, - tooltip_text: name, - icon_name: "find-location-symbolic", - activatable: true - }); - this.resultsGroup.add(this.resultsUi[i].Row); - - this.resultsUi[i].Row.connect("activated", () => { - this._saveResult(simpleName, lat, lon); - }); - } - } - - // Simplify the name returned by OSM. - _simplifyName(s) - { - // Locations in the USA I'd expect to be City, State. - // Plus a city isn't always in one county anyway so this is hardly - // accurate - let usa = s.match(/^(.+), .+ County, (.+), United States$/); - if(usa) - { - let city = usa[1]; - let state = usa[2]; - return `${city}, ${state}`; - } - else return s; - } - - _saveResult(name, lat, lon) - { - let locs = settingsGetLocs(this._settings); - - locs.push(Loc.fromNameCoords(name, lat, lon)); - - settingsSetLocs(this._settings, locs); - - let _toast = new Adw.Toast({ - title: _("%s has been added").format(name), - }); - this._window.add_toast(_toast); - this.close(); - return; - } - - _resultsError(error) - { - if (error) - { - this.resultsStatus.set_title(_("API Error")); - this.resultsStatus.set_description( - _('Invalid data when searching for "%s".').format(this._location) - ); - this.resultsStatus.set_icon_name("dialog-error-symbolic"); - } - else - { - this.resultsStatus.set_title(_("No Matches Found")); - this.resultsStatus.set_description( - _('No results found when searching for "%s".').format(this._location) - ); - } - return; - } - - _destroy() - { - this.destroy(); - return; - } -} - -export { SearchResultsWindow }; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/prefs.js deleted file mode 100644 index 19acbaf9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/prefs.js +++ /dev/null @@ -1,77 +0,0 @@ -/* - This file is part of OpenWeather (gnome-shell-extension-openweather). - - OpenWeather 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. - - OpenWeather 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 OpenWeather. - If not, see <https://www.gnu.org/licenses/>. - - Copyright 2022 Jason Oickle -*/ - -import Gdk from "gi://Gdk"; -import Gtk from "gi://Gtk"; - -import { - ExtensionPreferences, - gettext as _, -} from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -// Import preferences pages -import { GeneralPage } from "./preferences/generalPage.js"; -import { LayoutPage } from "./preferences/layoutPage.js"; -import { LocationsPage } from "./preferences/locationsPage.js"; -import { AboutPage } from "./preferences/aboutPage.js"; - -export default class OpenWeatherPreferences extends ExtensionPreferences { - constructor(metadata) { - super(metadata); - } - - fillPreferencesWindow(window) { - let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()); - if (!iconTheme.get_search_path().includes(this.metadata.path + "/media")) { - iconTheme.add_search_path(this.metadata.path + "/media"); - } - - window._settings = this.getSettings(); - - const generalPage = new GeneralPage(this.metadata, window._settings, window); - const layoutPage = new LayoutPage(this.metadata, window._settings); - const locationsPage = new LocationsPage( - this.metadata, - window._settings, - window - ); - const aboutPage = new AboutPage(this.metadata, window._settings, window); - - let prefsWidth = window._settings.get_int("prefs-default-width"); - let prefsHeight = window._settings.get_int("prefs-default-height"); - - window.set_default_size(prefsWidth, prefsHeight); - window.set_search_enabled(true); - - window.add(generalPage); - window.add(layoutPage); - window.add(locationsPage); - window.add(aboutPage); - - window.connect("close-request", () => { - let currentWidth = window.default_width; - let currentHeight = window.default_height; - // Remember user window size adjustments. - if (currentWidth !== prefsWidth || currentHeight !== prefsHeight) - { - window._settings.set_int("prefs-default-width", currentWidth); - window._settings.set_int("prefs-default-height", currentHeight); - } - window.destroy(); - }); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/private_metadata.json deleted file mode 100644 index 119e95e0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/private_metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Display weather for the current or a specified location. Fork of OpenWeather.\nWeather data is provided by OpenWeatherMap.org or WeatherAPI.com or VisualCrossing.com.\nIf location is set to \"My Location,\" which is the case by default on laptops, this extension will use location services and Nominatim (from OpenStreetMap.org), or infoip.io if that failed.", - "gettext-domain": "gnome-shell-extension-openweatherrefined", - "git-version": "138.r1.g2406098", - "name": "OpenWeather Refined", - "settings-schema": "org.gnome.shell.extensions.openweatherrefined", - "shell-version": [ - "45", - "46", - "47" - ], - "url": "https://github.com/penguin-teal/gnome-openweather", - "uuid": "openweather-extension@penguin-teal.github.io", - "version": 18, - "version-name": "139" -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/gschemas.compiled deleted file mode 100644 index 7c3033f462820acf8d8ef48d761aa97d25289dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3836 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 O3mN9lN@e&(^Zx>2UTszY diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/org.gnome.shell.extensions.openweatherrefined.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/org.gnome.shell.extensions.openweatherrefined.gschema.xml deleted file mode 100644 index d3ae38d5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/schemas/org.gnome.shell.extensions.openweatherrefined.gschema.xml +++ /dev/null @@ -1,267 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist gettext-domain="gnome-shell-extension-openweatherrefined"> - <enum id="org.gnome.shell.extensions.openweatherrefined.weather-provider"> - <value value="0" nick="default" /> - <value value="1" nick="openweathermap" /> - <value value="2" nick="weatherapicom" /> - <value value="3" nick="visualcrossing" /> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.geolocation-provider"> - <value value="0" nick="openstreetmaps"/> - <!-- Geocode.farm (1) is deprecated and will be changed to OSM (0) --> - <value value="1" nick="geocode"/> - <value value="2" nick="mapquest"/> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.unit"> - <value value="0" nick="celsius"/> - <value value="1" nick="fahrenheit"/> - <value value="2" nick="kelvin"/> - <value value="3" nick="rankine"/> - <value value="4" nick="reaumur"/> - <value value="5" nick="roemer"/> - <value value="6" nick="delisle"/> - <value value="7" nick="newton"/> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.pressure-unit"> - <value value="0" nick="hPa"/> - <value value="1" nick="inHg"/> - <value value="2" nick="bar"/> - <value value="3" nick="Pa"/> - <value value="4" nick="kPa"/> - <value value="5" nick="atm"/> - <value value="6" nick="at"/> - <value value="7" nick="Torr"/> - <value value="8" nick="psi"/> - <value value="9" nick="mmHg"/> - <value value="10" nick="mbar"/> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.wind-speed-unit"> - <value value="0" nick="kph"/> - <value value="1" nick="mph"/> - <value value="2" nick="m/s"/> - <value value="3" nick="knots"/> - <value value="4" nick="ft/s"/> - <value value="5" nick="Beaufort"/> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.position"> - <value value="0" nick="center"/> - <value value="1" nick="right"/> - <value value="2" nick="left"/> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.clock-format"> - <value value="0" nick="24h" /> - <value value="1" nick="12h" /> - <value value="2" nick="system" /> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.hi-contrast"> - <value value="0" nick="none"></value> - <value value="1" nick="white"></value> - <value value="2" nick="black"></value> - </enum> - <enum id="org.gnome.shell.extensions.openweatherrefined.my-loc-prov"> - <value value="0" nick="geoclue"></value> - <value value="1" nick="ipinfoio"></value> - </enum> - <schema path="/org/gnome/shell/extensions/openweatherrefined/" id="org.gnome.shell.extensions.openweatherrefined"> - <key name="weather-provider" enum="org.gnome.shell.extensions.openweatherrefined.weather-provider"> - <default>'default'</default> - <summary>Weather Provider</summary> - </key> - <key name="geolocation-provider" enum="org.gnome.shell.extensions.openweatherrefined.geolocation-provider"> - <default>'openstreetmaps'</default> - <summary>Geolocation Provider</summary> - </key> - <key name="unit" enum="org.gnome.shell.extensions.openweatherrefined.unit"> - <default>'celsius'</default> - <summary>Temperature Unit</summary> - </key> - <key name="pressure-unit" enum="org.gnome.shell.extensions.openweatherrefined.pressure-unit"> - <default>'kPa'</default> - <summary>Pressure Unit</summary> - </key> - <key name="wind-speed-unit" enum="org.gnome.shell.extensions.openweatherrefined.wind-speed-unit"> - <default>'kph'</default> - <summary>Wind Speed Units</summary> - <description>Choose the units used for wind speed. Allowed values are 'kph', 'mph', 'm/s', 'knots', 'ft/s' or 'Beaufort'.</description> - </key> - <key type="b" name="wind-direction"> - <default>false</default> - <summary>Wind Direction by Arrows</summary> - <description>True to display wind direction through arrows rather than letters.</description> - </key> - <!-- 'city' no longer in use, will be migrated to 'locs' --> - <key type="s" name="city"> - <default>''</default> - <summary>DEPRECATED, City to be displayed</summary> - </key> - <key type="i" name="actual-city"> - <default>0</default> - <summary>Index of the city to display by default.</summary> - </key> - <key type="b" name="translate-condition"> - <default>true</default> - <summary>Translate Conditions</summary> - </key> - <key type="b" name="owm-api-translate"> - <default>false</default> - <summary>Provider multilingual Support (weather descriptions only)</summary> - </key> - <key type="b" name="use-system-icons"> - <default>true</default> - <summary>System Icons</summary> - </key> - <key type="b" name="show-text-in-panel"> - <default>true</default> - <summary>True to show temperature in the panel</summary> - </key> - <key type="b" name="show-comment-in-panel"> - <default>false</default> - <summary>True to show conditions in the panel.</summary> - </key> - <key type="b" name="disable-forecast"> - <default>false</default> - <summary>Disable Forecast</summary> - </key> - <key type="b" name="show-comment-in-forecast"> - <default>true</default> - <summary>Conditions in Forecast</summary> - </key> - <key name="position-in-panel" enum="org.gnome.shell.extensions.openweatherrefined.position"> - <default>'right'</default> - <summary>Position in Panel</summary> - </key> - <key type="i" name="position-index"> - <default>0</default> - <summary>Position in Panel</summary> - </key> - <key name="menu-alignment" type="d"> - <default>75.0</default> - <summary>Horizontal position of menu-box.</summary> - </key> - <key type="i" name="refresh-interval-current"> - <default>600</default> - <summary>Refresh interval (actual weather)</summary> - </key> - <key type="i" name="location-text-length"> - <default>0</default> - <summary>Maximum length of the location text</summary> - </key> - <key type="i" name="refresh-interval-forecast"> - <default>3600</default> - <summary>Refresh interval (forecast)</summary> - </key> - <key type="b" name="center-forecast"> - <default>true</default> - <summary>Center forecastbox.</summary> - </key> - <key type="b" name="expand-forecast"> - <default>false</default> - <summary>Always keep forecast expanded</summary> - </key> - <key type="i" name="days-forecast"> - <default>2</default> - <summary>Number of days in forecast</summary> - </key> - <key type="i" name="decimal-places"> - <default>0</default> - <summary>Maximum number of digits after the decimal point for temperature</summary> - </key> - <key type="i" name="pressure-decimal-places"> - <default>-2</default> - <summary>Maximum number of digits after the decimal point for pressure</summary> - </key> - <key type="i" name="speed-decimal-places"> - <default>-1</default> - <summary>Maximum number of digits after the decimal point for wind speed</summary> - </key> - <!-- DEPRECATED. Use 'custom-keys' instead. --> - <key type="s" name="appid"> - <default>''</default> - <summary>DEPRECATED. Your personal API key from openweathermap.org</summary> - </key> - <!-- DEPRECATED. Use 'custom-keys' instead. --> - <key type="s" name="weatherapidotcom-key"> - <default>''</default> - <summary>DEPRECATED. Your personal API key from WeatherAPI.com</summary> - </key> - <!-- DEPRECATED. Use 'custom-keys' instead. --> - <key type="b" name="use-default-owm-key"> - <default>true</default> - <summary>DEPRECATED. Use the extensions default API key from openweathermap.org</summary> - </key> - <!-- DEPRECATED. Use 'custom-keys' instead. --> - <key type="b" name="use-default-weatherapidotcom-key"> - <default>true</default> - <summary>DEPRECATED. Use the extensions default API key from WeatherAPI.com</summary> - </key> - <key type="s" name="geolocation-appid-mapquest"> - <default>''</default> - <summary>Your personal AppKey from developer.mapquest.com</summary> - </key> - <key name="clock-format" enum="org.gnome.shell.extensions.openweatherrefined.clock-format"> - <default>'system'</default> - <summary>Time format for hours. Possible values are '24hr' for 24-hour clock, '12hr' for AM/PM, and 'system' to follow the GNOME setting.</summary> - </key> - <key type="i" name="delay-ext-init"> - <default>0</default> - <summary>Seconds to delay popup initialization and data fetch on the first load</summary> - </key> - <key type="i" name="prefs-default-width"> - <default>700</default> - <summary>Default width for the preferences window</summary> - </key> - <key type="i" name="prefs-default-height"> - <default>600</default> - <summary>Default height for the preferences window</summary> - </key> - <key name="hi-contrast" enum="org.gnome.shell.extensions.openweatherrefined.hi-contrast"> - <default>'none'</default> - <summary>High contrast style to use, possible values are 'none', 'white', or 'black'.</summary> - </key> - <key type="b" name="show-sunsetrise-in-panel"> - <default>false</default> - <summary>True to show the sunset/sunrise in the panel.</summary> - </key> - <key type="b" name="sun-in-panel-first"> - <default>false</default> - <summary>True to show the sunset/sunrise in the panel before the temperature/conditions if enabled.</summary> - </key> - <key type="b" name="has-run"> - <default>false</default> - <summary>False if this extension has never been initialized before.</summary> - </key> - <key type="d" name="loc-refresh-interval"> - <default>60.0</default> - <summary>How often, in minutes, to re-fetch My Location if selected.</summary> - </key> - <key type="b" name="simplify-degrees"> - <default>true</default> - <summary>True to cut off the "F" or "C" after the degree symbol.</summary> - </key> - <key type="b" name="frozen"> - <default>false</default> - <summary>Freezes the settings changed listener; user should not change this.</summary> - </key> - <!-- locs: [ ( NameType, Name, LocType, LocInfo ), ... ] --> - <key type="a(usus)" name="locs"> - <default>[ (1, '', 1, '') ]</default> - <summary>List of locations.</summary> - </key> - <key name="my-loc-prov" enum="org.gnome.shell.extensions.openweatherrefined.my-loc-prov"> - <default>'geoclue'</default> - <summary>Provider to use for "My Location."</summary> - </key> - <key type="s" name="last-init-error"> - <default>''</default> - <summary>Empty or the last initialization error message.</summary> - </key> - <key type="as" name="custom-keys"> - <default>[ '', '', '' ]</default> - <summary>Custom keys for weather providers.</summary> - </key> - <key type="b" name="precip-starts-notif"> - <default>false</default> - <summary>Get a notification when precipitation starts.</summary> - </key> - </schema> -</schemalist> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/stylesheet.css deleted file mode 100644 index cd3acb0e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/stylesheet.css +++ /dev/null @@ -1,180 +0,0 @@ -.openweather-button { - border-radius: 32px; - padding: 13px; -} - -.openweather-button:hover { - border: none; - padding: 14px; -} - -.openweather-button > StIcon { - icon-size: 6px; -} - -.openweather-button > StLabel { - padding: 6px; -} - -.openweather-menu-button-container { - padding: 0px; -} - -.openweather-button-box { - padding: 0px; - spacing: 12px; -} - -.openweather-current-summarybox, -.openweather-forecast-icon, -.openweather-current-databox-captions, -.openweather-current-databox-values, -.openweather-current-icon, -.openweather-forecast-summary, -.openweather-forecast-temperature { - border-radius: 0px; - padding: 0px; - border: 0px; -} - -.openweather-current-summarybox { - padding-top: 5px; - padding-right: 60px; -} - -.openweather-current-summary { - font-size: 36px; -} - -.openweather-current-databox { - padding: 5px 15px 0px; -} - -.openweather-current-icon { - padding-right: 40px; -} - -.openweather-current-iconbox { - padding-right: 20px; - padding-left: 20px; -} - -.openweather-icon:ltr { - padding-right: 5px; -} - -.openweather-icon:rtl { - padding-left: 5px; -} - -.openweather-label { - padding-right: 6px; -} - -.openweather-current-databox-captions { - text-align: right; - padding-right: 5px; - spacing: 0; -} - -.openweather-today-box { - padding-top: 15px; - padding-bottom: 15px; -} - -.openweather-forecast-expander { - padding-right: 15px; - padding-left: 15px; -} - -.openweather-forecast-box { - padding-top: 15px; -} - -.openweather-forecast-icon { - padding-right: 10px; -} - -.openweather-forecasts { - -st-hfade-offset: 60px; -} - -.openweather-today-databox { - text-align: center; - padding-right: 35px; - padding-left: 35px; -} - -.openweather-forecast-databox { - text-align: center; - min-width: 180px; - min-height: 120px; -} - -.openweather-forecast-day { - min-height: 120px; - padding: 0px 2px 0px 0px; - text-align: right; - font-weight: bold; - font-size: 90%; - spacing: 0; -} - -.openweather-forecast-time { - font-size: 85%; - padding-bottom: 5px; - spacing: 0; -} - -.openweather-forecast-iconbox { - text-align: center; - vertical-align: top; -} - -.openweather-forecast-summary { - padding-top: 5px; - font-size: 80%; -} - -.openweather-sunrise-icon { - padding-right: 5px; -} - -.openweather-sunset-icon { - padding-left: 15px; - padding-right: 5px; -} - -.openweather-build-icon { - padding-left: 15px; - padding-right: 5px; -} - -.openweather-button-action { - -st-icon-style: symbolic; - border-radius: 32px; - margin: 0px; - min-height: 22px; - min-width: 22px; - padding: 10px; - font-size: 100%; -} - -.openweather-button-action:hover, -.openweather-button-action:focus { - border: none; - padding: 11px; -} - -.openweather-button-action > StIcon { - icon-size: 16px; -} - -.openweather-white { - color: white; -} - -.openweather-black { - color: black; -} - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/weathericons.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/weathericons.js deleted file mode 100644 index 85d6385b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/openweather-extension@penguin-teal.github.io/weathericons.js +++ /dev/null @@ -1,387 +0,0 @@ -/* - Copyright 2024 Teal Penguin - - 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 <http://www.gnu.org/licenses/>. -*/ - - import { WeatherProvider } from "./getweather.js" - -/** - * More icons than there currently are available because they follow - * the Breeze icon set, which I can't get working right now, so everything - * is mapped to available Adwaita icons. - * @enum {string} - */ -const WeatherIcons = -{ - CLEAR: "clear", - CLOUDS: "few-clouds", - FEW_CLOUDS: "few-clouds", - FOG: "fog", - FREEZING_RAIN: "freezing-rain", - FREEZING_SCATTERED_RAIN: "freezing-rain", - FREEZING_SCATTERED_RAIN_STORM: "freezing-rain", - FREEZING_STORM: "freezing-storm", - HAIL: "snow", - MANY_CLOUDS: "overcast", - MIST: "fog", - OVERCAST: "overcast", - SHOWERS: "showers", - SHOWERS_SCATTERED: "showers-scattered", - SHOWERS_SCATTERED_STORM: "storm", - SNOW: "snow", - SNOW_RAIN: "snow", - SNOW_SCATTERED: "snow", - SNOW_SCATTERED_STORM: "snow", - SNOW_STORM: "snow", - STORM: "storm", - WINDY: "windy", - TORNADO: "tornado" -}; - -// Map OpenWeatherMap icon codes to icon names -/** - * @enum {string} - */ -const OpenWeatherMapIconMap = -{ - "01d": WeatherIcons.CLEAR, // "clear sky" - "02d": WeatherIcons.FEW_CLOUDS, // "few clouds" - "03d": WeatherIcons.FEW_CLOUDS, // "scattered clouds" - "04d": WeatherIcons.CLOUDS, // "broken clouds" - "09d": WeatherIcons.SHOWERS_SCATTERED, // "shower rain" - "10d": WeatherIcons.SHOWERS, // "rain" - "11d": WeatherIcons.STORM, // "thunderstorm" - "13d": WeatherIcons.SNOW, // "snow" - "50d": WeatherIcons.MIST, // "mist" - "01n": WeatherIcons.CLEAR, // "clear sky night" - "02n": WeatherIcons.FEW_CLOUDS, // "few clouds night" - "03n": WeatherIcons.FEW_CLOUDS, // "scattered clouds night" - "04n": WeatherIcons.CLOUDS, // "broken clouds night" - "09n": WeatherIcons.SHOWERS_SCATTERED, // "shower rain night" - "10n": WeatherIcons.SHOWERS, // "rain night" - "11n": WeatherIcons.STORM, // "thunderstorm night" - "13n": WeatherIcons.SNOW, // "snow night" - "50n": WeatherIcons.MIST, // "mist night" -}; - -/** - * @enum {string} - */ -const WeatherApiComIconMap = -{ - 1000: WeatherIcons.CLEAR, // "Sunny" / "Clear" - 1003: WeatherIcons.FEW_CLOUDS, // "Partly cloudy" - 1006: WeatherIcons.CLOUDS, // "Cloudy" - 1009: WeatherIcons.OVERCAST, // "Overcast" - 1030: WeatherIcons.MIST, // "Mist" - 1063: WeatherIcons.SHOWERS_SCATTERED, // "Patchy rain possible" - 1066: WeatherIcons.SNOW, // "Patchy snow possible" - 1069: WeatherIcons.SNOW_RAIN, // "Patchy sleet possible" - 1072: WeatherIcons.FREEZING_SCATTERED_RAIN, // "Patchy freezing drizzle possible" - 1087: WeatherIcons.STORM, // "Thundery outbreaks possible" - 1114: WeatherIcons.SNOW_SCATTERED, // "Blowing snow" - 1117: WeatherIcons.SNOW_STORM, // "Blizzard" - 1135: WeatherIcons.FOG, // "Fog" - 1147: WeatherIcons.FOG, // "Freezing fog" - 1150: WeatherIcons.SHOWERS_SCATTERED, // "Patchy light drizzle" - 1153: WeatherIcons.SHOWERS_SCATTERED, // "Light drizzle" - 1168: WeatherIcons.FREEZING_RAIN, // "Freezing drizzle" - 1171: WeatherIcons.FREEZING_RAIN, // "Heavy freezing drizzle" - 1180: WeatherIcons.SHOWERS_SCATTERED, // "Patchy light rain" - 1183: WeatherIcons.SHOWERS_SCATTERED, // "Light rain" - 1186: WeatherIcons.SHOWERS, // "Moderate rain at times" - 1189: WeatherIcons.SHOWERS, // "Moderate rain" - 1192: WeatherIcons.SHOWERS, // "Heavy rain at times" - 1195: WeatherIcons.SHOWERS, // "Heavy rain" - 1198: WeatherIcons.FREEZING_SCATTERED_RAIN, // "Light freezing rain" - 1201: WeatherIcons.FREEZING_RAIN, // "Moderate or heavy freezing rain" - 1204: WeatherIcons.SNOW_RAIN, // "Light sleet" - 1207: WeatherIcons.SNOW_RAIN, // "Moderate or heavy sleet" - 1210: WeatherIcons.SNOW_SCATTERED, // "Patchy light snow" - 1213: WeatherIcons.SNOW_SCATTERED, // "Light snow" - 1216: WeatherIcons.SNOW, // "Patchy moderate snow" - 1219: WeatherIcons.SNOW, // "Moderate snow" - 1222: WeatherIcons.SNOW, // "Patchy heavy snow" - 1225: WeatherIcons.SNOW, // "Heavy snow" - 1237: WeatherIcons.HAIL, // "Ice pellets" - 1240: WeatherIcons.SHOWERS_SCATTERED, // "Light rain shower" - 1243: WeatherIcons.SHOWERS, // "Moderate or heavy rain shower" - 1246: WeatherIcons.SHOWERS, // "Torrential rain shower" - 1249: WeatherIcons.SNOW_RAIN, // "Light sleet showers" - 1252: WeatherIcons.SNOW_RAIN, // "Moderate or heavy sleet showers" - 1255: WeatherIcons.SNOW_SCATTERED, // "Light snow showers" - 1258: WeatherIcons.SNOW, // "Moderate or heavy snow showers" - 1261: WeatherIcons.HAIL, // "Light showers of ice pellets" - 1264: WeatherIcons.HAIL, // "Moderate or heavy showers of ice pellets" - 1273: WeatherIcons.STORM, // "Patchy light rain with thunder" - 1276: WeatherIcons.STORM, // "Moderate or heavy rain with thunder" - 1279: WeatherIcons.SNOW_SCATTERED_STORM, // "Patchy light snow with thunder" - 1282: WeatherIcons.SNOW_STORM, // "Moderate or heavy snow with thunder" -}; - -/** - * @enum {string} - */ -const VisualCrossingIconMap = -{ - "snow": WeatherIcons.SNOW, - "rain": WeatherIcons.SHOWERS, - "fog": WeatherIcons.FOG, - "wind": WeatherIcons.WINDY, - "cloudy": WeatherIcons.CLOUDS, - "partly-cloudy-day": WeatherIcons.FEW_CLOUDS, - "partly-cloudy-night": WeatherIcons.FEW_CLOUDS, - "clear-day": WeatherIcons.CLEAR, - "clear-night": WeatherIcons.CLEAR -}; - -function hasNightVariant(name) -{ - return name === "clear" || name === "few-clouds"; -} - -/** - * @param {boolean} isNight - * @param {boolean} useSymbolic - */ -export function getIconName(provider, key, isNight, useSymbolic) -{ - let name; - switch(provider) - { - case WeatherProvider.OPENWEATHERMAP: - name = OpenWeatherMapIconMap[key]; - break; - case WeatherProvider.WEATHERAPICOM: - name = WeatherApiComIconMap[key]; - break; - case WeatherProvider.VISUALCROSSING: - name = VisualCrossingIconMap[key]; - break; - } - - let fullName = "weather-" + name; - - if(isNight && hasNightVariant(name)) fullName += "-night"; - - // Ignore useSymbolic for now because we only package symbolic icons - fullName += "-symbolic"; - - return fullName; -} - -/** - * @enum {string} - */ -const OpenWeatherMapConditionMap = -{ - 200: "Thunderstorm with Light Rain", // Thunderstorm with light rain - 201: "Thunderstorm with Rain", // Thunderstorm with rain - 202: "Thunderstorm with Heavy Rain", // Thunderstorm with heavy rain - 210: "Light Thunderstorm", - 211: "Heavy Thunderstorm", - 212: "Ragged Thunderstorm", - 230: "Thunderstorm with Light Drizzle", // Thunderstorm with light drizzle - 231: "Thunderstorm with Drizzle", // Thunderstorm with drizzle - 232: "Thunderstorm with Heavy Drizzle", // Thunderstorm with heavy drizzle - 300: "Light Drizzle", - 301: "Drizzle", - 302: "Heavy Drizzle", - 310: "Light Drizzle Rain", - 311: "Drizzle Rain", - 312: "Heavy Drizzle Rain", - 313: "Shower Rain and Drizzle", - 314: "Heavy Rain and Drizzle", - 321: "Shower Drizzle", - 500: "Light Rain", - 501: "Moderate Rain", - 502: "Heavy Rain", - 503: "Very Heavy Rain", - 504: "Extreme Rain", - 511: "Freezing Rain", - 520: "Light Shower Rain", - 521: "Shower Rain", - 522: "Heavy Shower Rain", - 531: "Ragged Shower Rain", - 600: "Light Snow", - 601: "Snow", - 602: "Heavy Snow", - 611: "Sleet", - 612: "Light Shower Sleet", - 613: "Shower Sleet", - 615: "Light Rain and Snow", - 616: "Rain and Snow", - 620: "Light Shower Snow", - 621: "Shower Snow", - 622: "Heavy Shower Snow", - 701: "Mist", - 711: "Smoke", - 721: "Haze", - 731: "Sand/Dust Whirls", - 741: "Fog", - 751: "Sand", - 761: "Dust", - 762: "Volcanic Ash", - 771: "Squalls", - 781: "Tornado", - 800: "Clear Sky", - 801: "Few Clouds", - 802: "Scattered Clouds", - 803: "Broken Clouds", - 804: "Overcast Clouds" -}; - -/** - * @enum {string} - */ -const WeatherApiComConditionMap = -{ - 1000: "Clear", - 1003: "Partly Cloudy", - 1006: "Cloudy", - 1009: "Overcast", - 1030: "Mist", - 1063: "Patchy Rain Possible", - 1066: "Patchy Snow Possible", - 1069: "Patchy Sleet Possible", - 1072: "Patchy Freezing Drizzle Possible", - 1087: "Thundery Outbreaks Possible", - 1114: "Blowing Snow", - 1117: "Blizzard", - 1135: "Fog", - 1147: "Freezing Fog", - 1150: "Patchy Light Drizzle", - 1153: "Light Drizzle", - 1168: "Freezing Drizzle", - 1171: "Heavy Freezing Drizzle", - 1180: "Patchy Light Rain", - 1183: "Light Rain", - 1186: "Moderate Rain At Times", - 1189: "Moderate Rain", - 1192: "Heavy Rain At Times", - 1195: "Heavy Rain", - 1198: "Light Freezing Rain", - 1201: "Heavy Freezing Rain", // Moderate or heavy freezing rain - 1204: "Light Sleet", - 1207: "Moderate Or Heavy Sleet", - 1210: "Patchy Light Snow", - 1213: "Light Snow", - 1216: "Patchy Moderate Snow", - 1219: "Moderate Snow", - 1222: "Patchy Heavy Snow", - 1225: "Heavy Snow", - 1237: "Hail", // Ice pellets - 1240: "Light Shower", // Light Rain Shower - 1243: "Heavy Shower", // Moderate or heavy rain shower - 1246: "Torrential Rain Shower", - 1249: "Light Sleet Showers", - 1252: "Heavy Sleet Showers", // Moderate or Heavy Sleet Showers - 1255: "Light Snow Showers", - 1258: "Heavy Snow Showers", // Moderate or heavy snow showers - 1261: "Light Hail", // Light showers of ice pellets - 1264: "Heavy Hail", // Moderate Or Heavy Showers Of Ice Pellets - 1273: "Patchy Light Rain With Thunder", - 1276: "Heavy Rain with Thunder", // Moderate or heavy rain with thunder - 1279: "Patchy Light Snow with Thunder", - 1282: "Heavy Snow with Thunder" // Moderate or heavy snow with thunder -}; - -/** - * @enum {string} - */ -const VisualCrossingConditionMap = -{ - "clear": "Clear", // Clear conditions throughout the day - "clearingpm": "Clear Afternoon", // Clearing in the afternoon - "cloudcover": "Cloud Cover", // Cloud cover - "cloudierpm": "Coudy Afternoon", // Becoming cloudy in the afternoon - "coolingdown": "Cooling Down", // Cooling down - "overcast": "Overcast", // Cloudy skies throughout the day - "precip": "Precipitation", // Precipitation - "precipcover": "Precipitation Cover", // Precipitation cover - "rainallday": "Rain All Day", // A chance of rain throughout the day - "rainam": "Morning Rain", // Morning rain - "rainampm": "Rain", // Rain in the morning and afternoon - "rainchance": "Chance of Rain", // A chance of rain - "rainclearinglater": "Rain Clearing Later", // Rain clearing later - "raindays": "Chance of Rain", // A chance of rain - "raindefinite": "Rain", // Rain - "rainearlyam": "Early Morning Rain", // Early morning rain - "rainlatepm": "Late Afternoon Rain", // Late afternoon rain - "rainpm": "Afternoon Rain", // Afternoon rain - "type_1": "Drifting Snow", // Blowing or drifting snow - "type_2": "Drizzle", // Drizzle - "type_3": "Heavy Drizzle", // Heavy Drizzle - "type_4": "Light Drizzle", // Light Drizzle - "type_5": "Heavy Rain", // Heavy Drizzle/Rain - "type_6": "Light Rain", // Light Drizzle/Rain - "type_7": "Dust Storm", // Dust storm - "type_8": "Fog", // Fog - "type_9": "Freezing Drizzle", // Freezing Drizzle/Freezing Rain - "type_10": "Heavy Freezing Drizzle", // Heavy Freezing Drizzle/Freezing Rain - "type_11": "Light Freezing Drizzle", // Light Freezing Drizzle/Freezing Rain - "type_12": "Freezing Fog", // Freezing Fog - "type_13": "Heavy Freezing Rain", // Heavy Freezing Rain - "type_14": "Light Freezing Rain", // Light Freezing Rain - "type_15": "Tornado", // Funnel Cloud/Tornado - "type_16": "Hail Showers", // Hail Showers - "type_17": "Ice", // Ice - "type_18": "Lightning", // Lightning Without Thunder - "type_19": "Mist", // Mist - "type_20": "Precipitation", // Precipitation In Vicinity - "type_21": "Rain", // Rain - "type_22": "Heavy Rain & Snow", // Heavy Rain And Snow - "type_23": "Light Rain & Snow", // Light Rain And Snow - "type_24": "Rain Showers", // Rain Showers - "type_25": "Heavy Rain", // Heavy Rain - "type_26": "Light Rain", // Light Rain - "type_27": "Sky Coverage Decreasing", // Sky Coverage Decreasing - "type_28": "Sky Coverage Increasing", // Sky Coverage Increasing - "type_29": "Sky Unchanged", // Sky Unchanged - "type_30": "Haze", // Smoke Or Haze - "type_31": "Snow", // Snow - "type_32": "Snow & Rain Showers", // Snow And Rain Showers - "type_33": "Snow Showers", // Snow Showers - "type_34": "Heavy Snow", // Heavy Snow - "type_35": "Light Snow", // Light Snow - "type_36": "Squalls", // Squalls - "type_37": "Thunderstorm", // Thunderstorm - "type_38": "Storm No Rain", // Thunderstorm Without Precipitation - "type_39": "Ice Crystals", // Diamond Dust - "type_40": "Hail", // Hail - "type_41": "Overcast", // Overcast - "type_42": "Partially Cloudy", // Partially cloudy - "type_43": "Clear" // Clear -}; - -/** - * @returns {string} - */ -export function gettextCondition(provider, code, gettext) -{ - switch(provider) - { - case WeatherProvider.OPENWEATHERMAP: - return gettext(OpenWeatherMapConditionMap[code] ?? "Not available"); - case WeatherProvider.WEATHERAPICOM: - return gettext(WeatherApiComConditionMap[code] ?? "Not available"); - case WeatherProvider.VISUALCROSSING: - return gettext(VisualCrossingConditionMap[code] ?? "Not available"); - default: - return gettext("Not available"); - } -} - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index 1431878b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-FileCopyrightText: 2011 Vamsi Krishna Brahmajosyula <vamsikrishna.brahmajosyula@gmail.com> -// SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org> -// SPDX-FileCopyrightText: 2013 Florian Müllner <fmuellner@gnome.org> -// SPDX-FileCopyrightText: 2016 Rémy Lefevre <lefevreremy@gmail.com> -// -// SPDX-License-Identifier: GPL-2.0-or-later - -/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; - -import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; - -import {PlacesManager} from './placeDisplay.js'; - -const N_ = x => x; - -const PLACE_ICON_SIZE = 16; - -class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem { - static { - GObject.registerClass(this); - } - - constructor(info) { - super({ - style_class: 'place-menu-item', - }); - this._info = info; - - this._icon = new St.Icon({ - gicon: info.icon, - icon_size: PLACE_ICON_SIZE, - }); - this.add_child(this._icon); - - this._label = new St.Label({ - text: info.name, - x_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - this.add_child(this._label); - - if (info.isRemovable()) { - this._ejectIcon = new St.Icon({ - icon_name: 'media-eject-symbolic', - style_class: 'popup-menu-icon', - }); - this._ejectButton = new St.Button({ - child: this._ejectIcon, - style_class: 'button', - }); - this._ejectButton.connect('clicked', info.eject.bind(info)); - this.add_child(this._ejectButton); - } - - info.connectObject('changed', - this._propertiesChanged.bind(this), this); - } - - activate(event) { - this._info.launch(event.get_time()); - - super.activate(event); - } - - _propertiesChanged(info) { - this._icon.gicon = info.icon; - this._label.text = info.name; - } -} - -const SECTIONS = [ - 'special', - 'devices', - 'bookmarks', - 'network', -]; - -class PlacesMenu extends PanelMenu.Button { - static { - GObject.registerClass(this); - } - - constructor() { - super(0.5, _('Places')); - - let label = new St.Label({ - text: _('Places'), - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - this.add_child(label); - - this.placesManager = new PlacesManager(); - - this._sections = { }; - - for (let i = 0; i < SECTIONS.length; i++) { - let id = SECTIONS[i]; - this._sections[id] = new PopupMenu.PopupMenuSection(); - this.placesManager.connect(`${id}-updated`, () => { - this._redisplay(id); - }); - - this._create(id); - this.menu.addMenuItem(this._sections[id]); - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - } - } - - _onDestroy() { - this.placesManager.destroy(); - - super._onDestroy(); - } - - _redisplay(id) { - this._sections[id].removeAll(); - this._create(id); - } - - _create(id) { - let places = this.placesManager.get(id); - - for (let i = 0; i < places.length; i++) - this._sections[id].addMenuItem(new PlaceMenuItem(places[i])); - - this._sections[id].actor.visible = places.length > 0; - } -} - -export default class PlacesMenuExtension extends Extension { - enable() { - this._indicator = new PlacesMenu(); - - let pos = Main.sessionMode.panel.left.length; - if ('apps-menu' in Main.panel.statusArea) - pos++; - Main.panel.addToStatusArea('places-menu', this._indicator, pos, 'left'); - } - - disable() { - this._indicator.destroy(); - delete this._indicator; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ab/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 72dd7809c6332051c0af8c22c1448e3a9f53245e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmYjO&r4KM6uy@IV1gDAL{xMkY*W|9Sq(2Uf0L9YG6g}KJ2Tgrm+##>-S<YT)i@#u zL(nED(uE5bA;L(BqN9bY+TAz0Xcgpt(XQ`~>2%<G-#O=g=NIqSxz=|Cb{e=0JOj=E zbAYw)z**o2U^PF1tH5vIBGA%8$TjdKa4YyO_$0U=+ymSPt{{GMjF9u-C2$h_4SXH^ z=U+^Z6LJCZQ?Q-)0*ul|PutJVwsrzI)$k5JC?}8-(yP^EAm~F8PAWZ4`jlTNhC-8p z=OPojGDox8oe*@tG}jjFm*(jhcRi7H$Y6tMsHn$_GLt`2{P*Ikq73PT@`}EoV@fwQ z_mnTlh{rP`AR}7YS!^iFo(LVdN;)(rAz(pXcpeikLm_QCpgwnHY*ZAK4%u*!bF-|s zm<w1+IW#u%h>eN~*9uub4~0V$@kD~f6Raaa;|V98yb*`R9`GP!Da~cz@la`pnt4+- zTV};n58SHRgxe`O_c)VWrg^vKe%cedT^GA<Hrk?#%oTY~u$17wLwnNWdH&kvl6LZR zx97Gio$ERhIh3bk!$ZRZ%>z5y<FP&^aT%6*Rlv3(?z~m-aN%v5$#Wfu@Xq7ZAWJrN zcIh#p*?`QbEdGr{lW8}M5%aeG*>2z1d~Y$Djb`8@6_rdCuV%w+o0|D*)}!gDY*wR^ zO@2W*Wj5%}Qd_XIiR$`tR5`4oX3e%kq881f(TrJzyzG#s9KEJc6_wy%&SAx@okh%h zl-JC5G`+iE3$3thU*MQ^vl3P6%Ln^48=AGKVsH6mwxUW@-u+<Kp|-l+1)IludyDmt H$XCf<bVE{z diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/af/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 8df130b1dfe0c89214dc4dd443c17f9d5dd56fb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 zcmah{&2AGh5OyK_Xb~KG0)fO(R0)I}HUZISOZe$epelu^O%Vq!ZgzHK)@w($Hzl0< z65Ps>cY!zHghbzfH(<OeEjKKE`+4S@8IRZVbH4GJ(Yi>uL3mHNL^vdb^^I_a@SPB1 zeh_XFei5z_=H?i?O?;iWLHv~XJn<UwSHdP?p6uUeX8Db?v;51%SIN(h?H+N+&xk{Q zK}@N&FWBMiu+9-K)VtY-$}$RNY{i;=hwvKxzOe;cHRZVSXxaJ)9D1p9NUfY89331k zx}$?HkO`?UO<1pH@CKBq^l)?%@sCoPN_&_XRh0;tv8ORFO^K|p#1I|pTNBRW8!3N_ z)=8ri$TbCUH$tU2e)On=+d(ND^%ia8*jUfETrN|-Qss^hOaf8=4d2Fz4555Ycub%j zw>ms-^Y{_8mXe1{_u_UON3W;~A6TKC65iMZ`Vy%u><mXj6@d(vLc`;6?SJNs-a{v` zIW)~r;tA#Jyb?L`0g5t#=b4p-plbh3NI+!K*2dQQ=|x-3I9fHDZb&Un$JDc@``#Zb zA@wp)L)M}1?hbmqa~c;~&(QL9Jv1r3Q39Pk>7%}?tWdmXZ0Qov<JxrH_A<=2-8&j? zb)j{4IeN!mphkOqeS@j=&~C=f2c-Ocj~zc%)KC2s5nEA0NJz1=plMc+W@Q@-)IwOc zX*6hw;EHJm3yW?6D(PK8e=oR`6TOxcHIMYSNjVWxO0LD@Ss7to>w`+td?+jmWPbpB Cg7#Se diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/an/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index f1966c093fac6fc7d95deee4db4f466816dd5437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmY+9&u$Yj5XKFZKiUIAoH-1)BIK~U63}j%sx(PUB?3_u5E7>$nYu1s&tiLN;R)aY z5L~$+ao{O<51xhDL{Kr(Pvfz_8PE6o=Gtc^aap(}jD)L#6T0{)To*nG*MzUan($4y zB77IVTu|z#<W4ufxVoQ7z9IE1$;)|?MW!wZU4QrA-;gJzb_1VAf~S;DIlNIruA4Sd zP>;DLHFY?rsHTBWXrA=JLcgF8E&B?L7lDq)<ea9nM83O@P-B$t?2sA`Nl&7&3%%Q# zsApV3HhrcK>7DJQdW4B8DD&dJ&I?_ZP;6G^!@GHr=h+jPqGthpbeK3)FhXz1!30CH zo<6`9`GhVp1~lw<OpVs{=3H+}t2Zqg(lf%kf=5fiuOAV%A|Iudp5l&SHjYf-wu%2Y zR)9X698AXNUW;Cy4cUuH+3I~GYbUXMuW@L7ALhpxBBjCe*`D4w*LB+;QP5*Q=Y{pA zf{oWUWiRzUc?v6A`{|!YD0`bl??E<oZ9u2@IMlHM-z>{GDEqKF4%R)~9zb!YpQ-T~ g*4ASHhCoS;-?p}4HN?<RLTCa-_UP2KrI<LXKV5#YK>z>% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ar/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 1504827c54899906ecd75449e4a960497bdebf2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 954 zcmY*XOHUL*5FQjC8I1=oMlo8(z{NDqEQ(}ccrTA2umL0<yfnMb?8t2Qrl$wo!~=v! zj5iP7z{D5>BAAG9@fYaTQ_sajeu>q)fz{4@^Hp_yRn;{;zppmFwQyZT+(bM>TtaLj z%=&@2g7}Fr8jZM(_=C8PXlSskyU0z*jmSO7=aC1Ie<8*Y*U-OpwpOPdxe5I&@(pB) zd<Xd@@@3?A$fn<CWK6BrH1$kxv(6zdRIS?U3=&E$t6z$xn85^7OF}MK1EN$;6q8o= zIm@e%2T+jVB7@`Q&F1)cc?;%g7_ow94OJPGfQTkMUp!U(6Df&=D_9g!QerSKWL+~N zO3cbdG|yryCxz)nMhj$?$v70;gIwRhSl@6KX0ub%qmvW%6e|m<$aoxt1=61cF_{q_ z*ttnE#TG-8Lk6j09%LN%5pnRzfYa`|nR`ygaqP!5R%Av}9!FFO>A_f$;uJ6<VqSr+ zg{oIHPA?0hBxn^f=*BD_Bs5@ThS8D-eUi?FdFU#Ld@n_tRapGL&;u&%@zL>YeGs?R zu?GZKjN<_+Wjvu`FVy{VL_^*Q`687uQ~r~gA<|LTnS;(VNwPdI3U~(|bj*dy&P9o& z5g8J)6nntSRX6tAJE3O!-1i;m0S7SZ`!1Sp&CH;gF=n&tINg35w6xUhF5fj7ZS|OI z(jK7yu+x4@h8btF_Q_^LsVI#ACu()b98=Uq!O7)Kt4f5!1spHdw)Cz(N>|c1dLQ(5 zx~32HPP(c;Syg9WZ|iUAE4^c-EBY{91N~8d(O+?Q4}Xv?^P6pYr?Fj3{+_-@*-7jq kge8tlwrQ}Z5A^%G!tAB%>4rW?*J@2ar0cl3nr>Ks0j47|P5=M^ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/as/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 103ee4fcc1505d56031c8323e793490b55709710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmYL^&u$Yj5XKFZKiUHaP8^UhHxP1~O{f}e8dTb*rBYL(C?Kw8ci6buwS(;t$_qe+ zI7X_(q2f@dLV(JR6TAuXqcFPxWu%{GK7TXz_|J`{DZ#jm+(NdHt4M|v@gBL393j_` zV`K^Wj9ft+^6CO1-!RvZ+ZPGBiMfZl@Q44j#*A&`5>m_;@BI(72-(nTVu0?0ohUsd zn<^iTEokys<v_X_kHL_xRtFGUwwthLpp8&6qCpQvN?X=3sYuwyI5n)V@VNVg_29KA zn%EY%5YbvSe88#=7S?IF8r4_tS6AxQV2>Ni`kG6VajSGh_eI9@<Zx^S-BD)3b3xZ+ zI<M9>Bm-_MvC1Ffq)f*=1=a_iNAyt+TEtw^woEf&26Szh025(DvP8w}C@M;)i?N7u z6LfYv?ZschN;TM2(t^a54oA4Ng*SG2lyM=OG#+qmz_y<Dw^?J+SFHXLG;7OPB|@eV zZM+aR=w@ThGq$aCZXzm2r8KQtlg`W5T}kh>Xn3y~JZC!~LC?Rxr-nQeZ-IuDm4JA6 z=4bD`JMpt0es=C>AHADW@4gllYWK^#Bkw-p(X`Z49GQCe-McT|{VvUuqHA`J#_>G; PEU!5&htJBpJ`~1Z_uSct diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/be/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 70e79ec4ac644515984986bad74e3b0462d545f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmZuuQEL@P7@b(PvIW6{h_v8WN{mwGx_gsi*kqFsO<Jj`ml%tJFPnQOo7LT&%gk=l zfDcK8yhMyI=0T!wKKam~kwOv^@JZih-U<bw{sMo3XYVyl3l5w;Gdt&e-}!dmeSPpD z!#V<d3)}?00@i?Xy#bB_Z-G+t7jO#r2RI3IbTIZk_#5y+@F4gw_#*gk;1}RH&Rt(H zb_^VVJ@6GU2QPq!z<+>GfIom8@DUV)wN<mMSN1N~A>hl_uKhRwf`zeRC1<suUqwDE z)ope`rp+Q3ijCY7^*qiZYN&Wd(EItdPW^uVF-?VWA{ss$Z87DNlCa3?)Bh^|bCb#< z%V|a?MJi}Ys(sDRG8L?rgms}=P06wsztrHr38iD1`4nXka6K)Ogp1#Ek(IACrJ+VP zXIwO;%K4a%;szfsBF!hHPfqO$9~U!mDdiW#T=-OVt3BMUa_>iSd;RM9AKY%&buOa{ zpHN|@lQ5UcryGR|HC>%9QaKZ2lzzRpog0c$3|gtnbO63AD#A$c2@$3~4T~gHg^t6F z`eUy*<C7xct>8nElu;rgC5xv1zt^Wp;f!4x8`+=LtGLbunPEtznrk9<j*-tblQ7Qu zs6HJkE%M;n#3=9G*Olp~gyJJvT{iHWeCnNybElSIl!T8;m1>`|X6vYf?mlX7gELvD z=LUgCr%zM4b-xQdj|Ryl$Z;MBs(V-cK~K4DIoy8Fr8{@p7HHhF@Obc4&-OXj`A;Gf zs{Ji%QZ(Y6x+^`Es>93!^TKS|6|+Hh!MwDKX49@R^T@25ZL`~D@8iw7ooD8;c}ez( z*}%n?*|7_Dh0JriY+l(FyJYW?*|5u~ut~3<b?Vn!{^uQk!oF+o!oFlzTfVmZ^XgqY wj}F@iums=plF<o?cFZ;!mbpK*t1$Bv*Nd$<NVZ${F`H(cnKevRwp(T&0e<dossI20 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bg/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 58fff19ac488e737151afc5be96032b9f0b6f9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmZva&1(}u7{;esKUhJ;i->|FA}BI7i3(-gXzdpkjfNUMd6^`W&D!0WFuR-9Thxp6 z;7Ko%dh!og#cGu{z3M@jy?GMsU*a<fwiP?@%x^xP_nr4;_t){^*97A*bQ*dD9f7)# z9p9j%(09msenMxU-_S{DXo!$=;3;qzya65rr$GVTh8*nQ?<3?GxDL*NKfr6?iT#9( zgC)@BTL!KF9f;6=PMgoZZN~xVP=7U;kcPlY$fQ<_k)U@)yr}d7nNndZiG?OJk3}u^ zrAO=9ZwtEB>7I|aIxDon{Xo=RGTSGO6%BYIYt3!PuA5LLGNx@6B%z=UrFT5HR47O} z;58AEvR3vjHdkj4g^qkBUFt~~Skx3jz{FB4q&<#k$RpI|%!`)NF)Kx$UuTnv7qN<R zsZ+kk=0)4LRyNIJ;nG5`P+++N%U_}Syn8iwDVNXXoIA+EDw@kE;IYy!y%~rlF6%<m z`%TqSZ92}Q=EMRIt6XyJ^AV-J>j;xx!acz%f`=}hOajkdN;+QmYw<)Q;;icZYjtVW zb4qiinVrt^BROYENwkC-p0rS8j0P{a0`AK(T5ED0iMaTnGRsDHe74qx&}>H5R2?71 zrK43pcFIAbdBA3s4kMS!R(~563uAP!EMAcGY?0<Kjyc41vyNFcpG->38`CrEW;1)4 zJ<FD}4lyfcHG7^tHJjiIvtfGFteMZ|gGmwa5%Y#wrI=D`ZHVe1!xy`Pr-#q_*8Ut_ zcdtx+SDJO;T|?ZiTz|v%ib8!ov+;inPHgSz_M61K8l3bCPbqpxp|7^jF50m*rsNOR C)?mc| diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bn_IN/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index ad967339a1b70173516509ac4530a1cb451e084b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1107 zcmah`%WD%s9G+@@5W$1sK@=P-r7f~+(x8;B(b}iMwuV|oP>@M>nylTO2{W^;-g*)7 zAR^L>M2paFrPv3aJn6-Q{s*39?SJ9TZ#QkzTL-@V=J)u1kJ&$`+7}7Vao`;A2si;W zfaLrHP6EGxB<DA99{3BK0ovLKxd=WBZU^509|aGC*MZxB4g23A<bb;m6EdE}!M)%& z;D_KJ;G{oAk<;J;7}B(6QZMP9oFl-o^w#{KEP<4eK_%xkr<2^wOEpV|WKa(cS7hV~ zuNY5MsjIv>PPZ2toqBuWJ)L2m&s~R%rc8~bJ_|*qwwJLl639>(Iw$=w;B-c+R?aOM za8mMFg=<n$GU;U%UF$wq+LOYep%5(KF0D6XnJHeE%2*S+>bcfnSk>0FbZDk@$C~1E zUZSyvnc)uY&Gu%kY@e0O(_Gfc<}YQh<g=M^rj0eNn9x2mQaSYIEK|D11ReDBJk#_V z+i}?C)G<(#CcuVvMF!U)7uAqexi!sM;Lt%Xs?7IjcTu<=>w#E=W#$g}o;KQMVm4H^ zR8`v(EvZAx;&E{@Gf|uvX|0*FvzZ|&3>O&hSsn8m{?uHq`^*#lv{J*6+!XFjk6L}L zykw0TuB;JJkuLs_L;K2}$&~z1G2a@MD$ouU_0-gb-hSG=7P<w!P@uV<%mchtAh<j3 zac$kL$fR$bDdRC8u`w>VYQEB#*?TgYxARvqEs3K~@#>2>T8g8$@hZOG;%F;geHBNG zG>$%}x2@FsGL9NZUyP%T)Vmf(-{T109TDm3)Lqbg+^0d|b+|x{w98@|TY?K^P<9z! z7|k}DyPa34LpnNj2O?kM=tHV`cc5lh@)~83+(<XW9-A=M(@M>8H(+n<ZiMBLa^OHD gj@Hsl%)A0QN??6F)iS;aK2LUtzNRUNBk+m*2fvN7rT_o{ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/bs/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6762b9a04850b124f6e0caa2c03bbf73b398142a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmYk1&rTFU5XM`<KbZqDUc7kdqY3GCW(6S)8nUn=35%0;F<xtD%AuE;>PdGGi@X4M z;7G!ii#K1v)A|}di#38-EBU38s;|4g@AuQiE5Y@EdCu%GkC>8a>w;NgzA=xPYi5zT zVIDHy8FNpFAKafX&+gyqUflJBd#lsjStb^k_I-QrU-3$ap0iVr@&Losx?{0ztGWs3 z#CuzzNK44ji`3Z(W<l-c>JvI|ENMBmo(xb!=7dKW9FQ*|@Gcr+ZCy|UUzl9=n!>A* z)iO#ys3D%1_PN@DfLeCrWL3qlRNR%xs$NN!<0Ouweegkz?*6k*%a2eQCx>QiX6JJA zkdDbt=`HK1XrMqfLa4Ot-5QdcW4~3Jj&;Rc!ghT$*c<fc{*z7|ZCeUReC%t@ZUUZ$ zmvsq-He_}LZKyYgqjze3u4_$wL8tnZ+1yZ}<@(r!=(E~~hO(m?a@9Zm8~*=*U6riK z__gkGKrWW=BB6uOhD$BxCdj0-)>(<f5YCDcbC}4=;jf<!4`!DQffK2nU1A^*g9-Wo F;tzk$n|J^K diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 3f91ae8db9defb6a97f6bc3f6e006c5e54f7114f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmZ{iJ8u**5XT(|uSKGO3K5Ax5Jdtx++9Eln;eh4NFbM-qJxTN*qz&R@Y*ZedpW4` zCFp`gPl-fBmoz|4L4`!V2+UprK}cBo@6X=(k3D{TKR^0fa68Q!V?AS?W$m!4_K9_l z^_f+9zOgQ|ey}dGMn;6V%DluJW!__+WG*l_S&vy4c>Lj*5NDWQnAe$Knbmqfnb(+O z$Avh-d~nEzOimrnS<P3iUA4+{YS=sYaJpct5OdCMd4e?xTh_f0^ENNaKu#=fQWBKO zAa$xwu)n=C?)SIfKo^y!G!{!kLa?B*G)eD|<F80=OB0}Pb(s@%tvm88+nhvOV?tiE zovqfAE2(@+&MRwT$P62#?~&G$27yfV+eaHzSQli=XDXF*W#(na#t^mF<p%Xt<&g^* zD27I@aZA>2%f=Mcr{cz)8?}0^7OkQWvg6QrjlsGY9$A+vXrTuM%jC@7Ta(f&nBC0L z-}kl~5)7zu(z@&}XPd0VjAVx}k70foGB6t)ro(#wn-N2TQER2Oc(lR#WG$MvhIhsl zy)3xo!27&eXjEnfk{&uwq4}h<B&UyjRpniBa?vC<<-3Vt`nd{GTbB;CT(U0rF_>aF z^v%W$9CVuot~8-O6NxqKQ-)BG<6DCPx&exHJ_3WObz&L$b~PUj=m{DWrS@v?J)~55 zOQQk@cHfQr-H)+Yv*0IsJd@4J0LrLDp*xKJ6U_MyaE$c9L-=i4sdB`swuu+N0Q(g4 A6aWAK diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ca@valencia/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index ec53ac344f0ffde39983dbbbe92f56b066f55e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmZ9K%Wl*#6oy?Ww;-{A6&HzvpsED&FjE$kv_q@5Q*}fyBQziuY)s<G7#usYopjjs zCD@fGU<o^RWmC4SSRv8(K;qA|FbFGuJ}2it_BnBWT%LZ%FwR3apqJ1^XdkM_A#@4) z3e}$P&`szkbQPMKV(d0}9h?T2z_Z{QIE0=+SMdDl6k`{_L+~#64XpS31>OO#oo4I| zxOBn}h}7|#^?LQ*^{74P#<Sxa(iyCbtvI{uC2h;FYuy{RYV)ED(y`8KnFM7rN}Z}C z9qsMU_@lk|G!RP5G-m5#Qm~{&X_Dbz$3KzWmL^bTb(u>VSU2%(*j%!n7K!w%=WM+f z@232@bY58#Q)Xb`ekir(aulSgU;F5(EUXKB%V#R(D`n<+-^LX6cKB0SsoKNWM36Df zHCqpP6W2Vo9>jBx?loJ@X0$1M;C&~I*CJRK(+g24>Q=&eS{z~CQ1yH{%h6mTvH4@9 zn5-0;<b5gfm{vs)S{PakPNd@^m%SZ?Wc<2eT{g*xDG|I9TAD<OXsf%`nY7nxG^15( z&==}?TcF^8F7FpwD6>Gx5Jkw)e%4>-^AlfP_dq({F^NraGBM4+QX%T;(h1Git;>B( zrWil^_S^y;PuqrWwW+lbv29VwOi&>m&WuLFjRf0qSW2YUu?>N<)%Y-^XXU6UwO3z0 zQYve2X;eVq;KPhR_#CrsOMZ5Um26f9QbwUecM|<CnBxyXOzPv`;E$<W=dev}6VHAF DTBPyx diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/cs/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index d4abcb5c8ec22a853d51284138ec1f1704d08317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmYk4&u$Yj5XN07f3!#laYKL@geXPGVUre7ZJV}g(?SJ-sDz3G7kAg$n0oD%?M-P< zeSw}32Sh>Yfn&r&q><naIDzOBaOc7}5d=$LejfX?J(Jn*7suZc9A{BiP%lyEPzNYK zzM#&dzM{P68|oVBC+ZSvY>bc_$jiua<O1?EvW9$vdW5=w@sAUP1jt{=>&V|o|K8P; zgxo?#$WzEoq(9$A;?cpKKK5_>;XP*tv*8b3L(oddlF{3i!xQedwb>%eI?D^k4Ow}` zV<%J!i4h$R$9o4i?eX3RXfYvq5|Pyb!D*1JP;vX8<G-Cu7s^3L%Oc~@(q`m&s54F) zlEvJThSB~lx|YxlZmiHMf>fb_+BTPx^4E?lzifkbo@?W1-KHX;OGRpFQ%4Xqp3-&R z5#B><%<%{+VP%?z6&l`$^1UdWxf7PdFnG+YqfNt<mCR`qL5(TFC9D^gZ^2xKB`q== z3$d+bs}$>O9*?NBU@50f&aw!WcR7|iH%u?KR0``B2T@6zbYzbpwn2TZzA`GQTnd9_ zt*{o%VJF8V9aeTXmrSTxh}+Cq?yAq5t8`}M^SQRTp(`rZ33elbnN8t>hAa$|bXA+o zMxgRRXsc7RFq~E=Rkd2a4GR!L1e0pMT7iiPP;=F3zgWh_%53n0KH!R*;a}0vJP{72 zO4FrE;Cm9cdxyK+f$eqspGZR=?f1Hl9qp5i9b2fv^}3J<yH#LQKl)GO04$enCUr!f u4JTmpqJQX)-YfL}b^Y7S`|m`Ko%frz!*=ne+~|?7rnCNMQtx%GW8@DP0t6ZW diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/da/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index aa7bfc3609670082ff484d23657815f2b8de7f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 869 zcmZ8f&udgM5KguJ;0c0)2T^cD1gm7byH%;LU9IhIZE34Z-HL(;>1OtA`rb<(N#54p z3jPh=>QVoZUi9SElh7XhE1c|Nw;1^H%_QGUX2|@$I{BH=x=6T5cu%-QI3R@eop71( zgAg>o2)77FgzJQf3C8Xa-yohOenxzrxJmqputvB-{?9X`_#@)`<o_WK@z>5WHbp#5 z9OB;*hxiY~6goT$et0{qbA$^+YqU`sMpDKWt=V-5FVXKBo3bU77o|tbT07YFN+%$# z8Xz3+AKZ1v`(L0ZRE9EU%R>flAQPqT_D>Y2ZgNv<4+E2xIYQ6av1Y~O$l96cqGN4q z!drY*@;7LmGCGDtlYqNEW*Nti9(6c&kPAn(MVnX{>-mODl;n$L;&{iz5Vc?NO&q8o z<xSx+hI+OBkXL7Ttq!#(@uSBNs<mo0TBj_$V}*8^@W#gQ+@-LxLn-^PF04Zh^TMUs z&|FAz>a@}|`BMtiNhuQK9Ta&CO`(<R!@Q(S>B4a5i7kr)bw#FQc??oS8><_waeuW+ zHCi&78ly_~3M$o8o6|)ml%9ibKRoRlTb*S-JJyAYduVw}ca5a4iD7nI`KX<hR%CqH z*xbdSi=pcp^*I=sje8nyH=s5(7ro^#P@^4n-8Lwdhk9iuVsxxAr#aB*2Z!HI55kso zX}PV#D2N_S0}jxid?e(`WqWCg5?##JO3DI?TsZu?P3FI;Ien9dwk?8GE=Ao(`QK#h LV9s89N@&?%*k%0r diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/de/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/de/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6d428b3e77399c79643fa33dd6e024520493aec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmYjP%T5$Q6fG1VX%iET8>5Mr7!n_;aTrJ>4Wr0YBFF^MxNy_ceW$0Tx@uBY4QgV7 zAK?yn?%cc46>Q`WT#?Aa@9@-sjyE|uxB8yCkGg$$dHAD%od>Q1uYe1{E)eVoa1l5F zg61c11Na481%`%%xCy=n9tJ-Ip9Rl@-vdv8D>xsV65<^A5PS#x8$1HObXtf>@HjZ= z6gcGh0LIn6AM%CT!Oj37&tF3t0jUtP)@(bbr|h?l-4t`C>{XtvSa{8;FLX|sEw-4B zc6LYI(atC8B!%KE7K?o*Z%8GTPP_jU|3ykuX-`{5RV7o$*n#G;DOt2slCl#mYeFr# zoXHn#U14-gxrRWxE-NMZjb|M`J1UbxN9)`(*2`6w7nz)`awj)TOi^o1uJcwAgmOOd z98;s-n2_~`tlx(lPc-h<$LjTHC2?ME*hD*(cw=K)O4_zyMYH&p(R7YutsVTC9Q9N! zHRS``(s`BSEH^kQW18p6I}AO2+-Sx#eWzw@KG4RLakRR;x-gh)tX7ZajK)Cd;cX91 zdW?6kr!d$QrQO6j_RZ%Ti*j<H3%z#O$_1U83@eFgvR(M7r7D{!xoB+ZV$!|-(KQ=W zbnG^7X&PzL*zKw4rCego_ITcw;jHj9UYn>jB7w!f+h)5-S!L6%tI{rOvCe51dhw`o zh;>+FiJDfDs?(S5eH(RqUkDGNs+>C9Rk3*H6N|C>!jpIi<Q!CZI4#0bw72`8bGFpk s|8D6-w`nw9gmjU1JuwF4cBM1qLNSnN;jh^Lsukk6xn{G_+8U~fKWgs@bpQYW diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/el/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 94a3088e0037936302a9ca0ca9b54d4968792ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmZuu&rcLF7%hT7vL+skF)<n~Atay{_Xi|oV3hz15=A$N#)Fq}x4VqYPB(2A<hBTC zNbumn8yXIJl7IvW0xAh7y>zagH1c<N@XbsR6KV41^=seveeaw8I9d0SU>yU_0S|!V zz&sGFufPf58xUx|0~df_z!{*XhL8sES#TZr8u$pf7yKT$0n{V@eTb0L;PbVFq`__A zi(m!r0>1_~fPaEdfoo9=sbS5aUeG&Ohk>KvF8ZJ>K?)(=Qj9B3Z*e^?<S6M8rE*1c zNivUkPCH(a=A|>n>27ttQSDY=(Sq%`Ja3V{kf|2bwJTn3<genNo06z_nvMy#QsT5A z<i6&*C~=Z??HpGmD@D+Y4dmH9E|nuZixxcym>S`(%lKo>z2I2UlC9t^HpI(9YBs2f zPM&pFii!;ji^j6I*$^Ld0x9dYHMeLoo=mZLJBuf1GG(<UF2z&vc<d&suwiL?%C)tS z7R?ltw)Kc36de%CDL8pY(N2yy+INL^T7)cKMY30{*hS8Uxm~hozvO)MG946oE<M_m zXl+ZeX4)C~=Pq*{r4LHCD0gFn1B03UnG-GXSdZ{9EZj|$VP9kPD`nSqybhWhv8CcV zeRsHzweRbKDGFS&jF%I6JeNh=A38dgbt}?#S)Y(4Wl^sjhAN%xpwTwn<k9*xO*D7J z?z4XGaT)!Itl)V^(^N~UC5fB8r@5miT=)s6iV?G5*8EAcVV2CQS@);RIyD~<Zu-;y zbF=Nw5cAfrnr*WMteOpf%AYn%{u5$e1jkU#_|MF;S)pdld@(C#)t`k93JM|egL2EL zyBP*M?;6$4mUUqECN#_DbL0Z~k@kP7Uxndqlw9;D(IYe+w)5xAr>G^2!qHxVg-Gwu g!f`O!T%dkx7SV4lm@Am(4Ja7%BYwveY^>q%4|A-Hp8x;= diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/en_GB/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6c0bdf7697fa4f3ee5b5a38894f8d00881651ae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmd6l-)a*<6vn4o|FD7=-ieAwL{Ma6vaJ|4jn<?|EwvhIDg^}{cTYB>vom34HnDeo z2`_~DKKce;2^M?<Zw1e6(D(=r{Pvrf{l1-ZcK6$b<qwR;S>iJBk~l{k5n+5L&J$mV z;Q2~iCB73EiKQjRu9IFOT_$}%dYW{D^dqrNg#3>a^ZZZJkpD#*@>fpI^Y=(Y{sn2s zzb2(<wHMam>@ZFdXR6u!LXTl&WvpY(%pp8MKQs0n>zZOxdbF(f7E>>E4w;oxgyX}b z8}9h<6O4pZm?f-VDR=`)lsX;%b^LRuFs1e|HL5HSM#e5Yk4%AVphSv}4Xg=g@vV$M zN9&}~3FMj#+>KEwj_*C{u<fE<oEYo*j>~1nJ7w<p&?FEIp7LFs%HZJ}!eat)JznMY zn8z#7Xe4)=x9c>b$HI9&v_d;2ys-&9)R~0tSm;clg*8&So|~DXzH6x|?o&eNrO1&F zQ4|UEbgrZu1BX2=J!Y^?&de0BhWgcJXI;sfvH2pFK(!z3Z0+<G%{6NEsB1KJMb#Wk zs9aAy-kB&Nbqmt5unv8DZ`kL}g)dY+Ld$zPH5r|nK=Y0C(Lj|}DBd@=a0%#1wRG*c x1@me9riN>6XxwT=`+O5M+Ii;#gPHWOQd_OXbmz}Ec;*ij)l<Fx=s);3egi;c`Pu*g diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eo/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index dc17d0e4f0e0a95f0283dc06c2069065fa080cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmYjP%}x|S5N;F|$LPVE!NfAgC^5Y*BMCULN?><^z~Tm0!okb1Q_MEo)3xdD0l9JU z-~)KWSMcT=aL_mKWFn8@$(mW+wUckYuIjIA>ZgC+o%|$tO)>5>-Z5@5&Kbq}#<;`y z&L}iL7!Me~821<x6GA*<o@Sn8e$9NHxz7BBvB|j2_U|h~++?1*D#R1!yUf$f5%Uc5 z9&>U3jQJY#2WGxn`igkPzl&9z-6(g%4~G>j6=KEGi9^^%e?qn|Rw*0g9<68`Vb?2@ zLSof1!sXfdV|RJ>84hEmF^NR8Wbgz!&P}&BQv7$4QEogOlg=}QL$YJdI%O!@I_{zq zZA-<!<VGU*&^kpXg4D1;x*lpR@x4b=xE*A%<J^KB9FX<0<x-W%l{|H_LlFe+H*yD$ zRUwu2*kc4?HGCnfFJ(9nVHnNLKdXk-YOuvoWXHzF>DZHvVACq+k75J6tLv?edIy&J ze?1k~?PV(Q%PCQ+G2@~uUCLf@43p+@in4=o7D2-ekOOizmWHV#NzFl*ORGXQ9bbt6 zDQIo98sl<jE7f3?4A;qtoens2&s9Gk=vbLW==Ngk(AVB}nsQ;RD+)M7D;uUu2~R45 zg#+b-w$5#=Ws_{?A~1u}bhU61hTGax0}pF3I}_~7H8h-d*@HDdY6#4QoX@`eH<(?2 zsyU^ylt45|t2|R+(UTFI<$F<@L_=SEWfvqkoH&i9&12Ip@AIsci$rT|@Y69DAJs@G iwh{1v`vw_590f`2^Q;&($2Y*6v9eAXi7o2Wk@y2Ay$ad@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/es/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/es/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 627e131bc8bc1ab5de29497b37ee8452294ef663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmYk4Pfrvv7{&+1KN%A>o-~^H8bbmxU3XV7WMCD61&OR~U^O00Ox-E7#ZEi6odxxR zAHtLP2|RlAh8Ioz0G>?b;z#gid}b%GG<ovtpQms8w(qYCqwfQ>)6f;@8FU8Pg^KnK zItzV=3eQjID)bw=1dWUY!FBL5I11hcPlAi!2j~HG4&y(^%K5+G1jhfsi{SWi2)qZL z2RFe};9C$|2QiCy#o0wW0Tt^94PgRUgJ9m8Ehp%q@LR^d3>Hk9<zCpJxhc9{>V#q| z`-1j&cE{ZQ&PUqdQi(VUmIfqmNby{EdxwrAE2+t~r@m2nDrm#lq36CyMbK8fD_qdF zrZ|hO#O#T%P8uCiqG4dJCzN7h+Y4PxJ4(63-NH4I8S7cgB{F97dE!{dL=?6ku{F_` zg_SLGFCwZ}>yxZnXZ71un~bVcH>$O2HC#m$*0EeW#l5i+Epjb|qE_xaC>+hkgPBTt zFf*5=$hXop=^bp>NzN0&I)bMWt!MDM9<ib)HO-cH7mg|E{M=wvF*X@)j7YfW&GoRg z(rOM<u2rhxg3-tomwTPz_8ytv%oKvoP`Age6Tb1dv&5!{z9NYYVOdjmO^n})X!?cp zVO!;vE4E~8>LSwFVCWk487jMtaZT46RGSE&vSp!#E#G0;A3h3APE~G&L35j@Qge$> zCM)8g`6`#0!51s_^)qorVmr%~g8}asOP3iZz3dy>`!weEz7%Dml=<<luqv+Kz*w#v jT}Y928KEo{O&PcRz_`F|COoGMwP7?@!D^mxi@Ny_*g6Nd diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/et/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/et/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 5d3acdf10f0cb694d6fc0e846a6bcf75a65d35a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmY+BJ#Q015QY~BAG$~=qCrSV3`HamT5~>9B<C3A0~;bRSjI%Oi*IsX`)>ENyLW*G z<p<D06{sT7(IG+Yh8BsMBL5%_HM6$lC@Vep-ptO-&g}lZw(ybBx=h?8`otpff$-}G zah3Q<Tp@lDw}{`w4dR4YAQsOtc8PR}^gVH%SR(t=`I-MK=`z{hNc}l~NPXT3sjvHw zlv1WXU&r_3*TtF4zZAwUcx%h(eT(oM-M%(swypD`bZA&>gaap43W<>w!tuf3vOPZd z40}Rmn8d6-Rd5<IQL4dk9>JdI99cIL1GKDbw6DW=626PZO08l@6$NlR#4O|Z)}iul z3%Rg#ZqUO*8^=2~l?mS}Q_K50hM@a`_pp*als^&<V~E1~8V?`vdI<HkI9j<EMqwB{ zqbj^_gtD1%+QiTi#z9Y%iN&IT^$exnNKrYhYucm_DM6*BNRjtZ<T13Y(@F{j>$5h| z@l0B`F}2QS#DFg7>~vbEqt$C+u&ou%L`}Ras7pr^-Y+sCRRab?VJy1ltA3lWp2qoR z_t5Z`8t8;>JciXb(goeDG$P||ZE_ofDyF7wMh%$#Ht#67-GutxM(~<HMulcJa93j@ z9YnP#V7rs=CN05AQ^{N^WSgccon$XjB)NaoFaA*vp_&|JBf2@^gFuyLRN9!$x5tws US;;fI?5R#lwrR_;9*Tth2TV%cEC2ui diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/eu/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 7ea42924d50c0c4f7a0ee94d5e6551b387a43cf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893 zcmY+C-A)uS6vvC=N5-$jJEF#83;|+_!v-T6Smj#?ARAnb7v7xRIXl#yY1e)%!WFkZ zfOqTr=mVH|Wg@<SkKma>K$`sL*UtI3J*Vx@+rys)x2vqXtaq$ytO2WRUs*R<-&m#R z2kSoT7i)wyG$h1B<{joR^EvY}bD8;xwZXc<<L?)QxX%2|9B2Mv-eZnj6k?M3lzEHU zVV3jzOrBb;S&qxS%XW!%rRp7jcp1S~Ar`IKa|AER?-|<_OQz@rPgbnFr?yu*gVd@% z!O`Jh)Eymufexyi(nPFQ1aBb6pxe8rj{hQs3ED&7<e?zw7<=YfGX;r8j%{+HVNJQ0 zTu<d2vQ8PDK&IIs-7e+1q>r9-`P)H(j&qB4sAsH~TP{<nTnw3$O_M;>*p@rgSEW@h zqo)LFacx@0H97SJ;y9VEJ&J2_9BuL{vT0Gf9KEp#EI36LUZF)75MH1yNT&*64$FW$ z{y(qPBn9`3r|T?WMzTp*B(R9?Lm-&TRm;)=<}`oWJMT|`LbSEMwQ^SG)MOkj8O`-^ zLi;_=*mJdydpRmS3+-LBj(q)fb5+iq`O3sQWaWx(o0M-Tfti-_Q6mo)bGd44;S$ij zYUt{<Svc<2$2B~t!_>rV^j4mn`76Jl^RCr#M`FQZ7kvP(m{4rnlr(01&jH0+@D3<b z8q#objROc;c|K_5h&f>D<h*fg)QthQ6rW%fJ|F$}rUv77f;6<MXQB}bel+M0cr~$s SwnrX;(+EzX*raa2uJ{WArvt?R diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fa/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index afc6fbdc6bc9fbd02bffb82e5169dc9b25d9b290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcmZ8eO-~a+7#;*aQjK3XqluFkPG)Lpi6IN9p@0%W8?45Imtl9>uI|n>v$LR{xBwow zdc&hB2+|O^dE=!2U|JIs`3L?3pJ|CTO!D-3Kc4ri`|Ik!M}l__xB<KZ&I22Od*6YJ zzz@J_EN~O}4O|2I`UtrNz78G$-v^%oPl7)KkAW-j|C}P^0=U1QkRtdp*!3xc?}823 z_1^|x0v~`;+Ue=~xtx2afwLW}`-8RwQbH!QT1o_cBFvJ~Z%9$a_0$MWrd|u*gtAHl z9WDxbw7fBx94&vM6&^++@W^zBsZliIsq}0A6#r#nl}bYwRg}hpR+R2(9;sN6QpA0c zkdjtz7Mls!3!#%xNsm?~1T3kEC}QHR5z>W|<8XoHGV`LYv|)2eH4NB9T1{A4c{Edc z%I3vl=+tbI8{yG>E<en2c{Y@X>E%am=L&^fW|k+0l{J@1#EsG(o#Zm)5uFgV_dE#c zSO7n}055!yF5rqZ>#O)4>SQ(LRl&-F#~v-YeYvD#y^M!{C^I)RH`P04D4WX^mBba8 z`L2$o3~stpk9a6YsbAwd5oY{(d76#%bZ)nb&}>TjD!_N}=*U87GNmZhJYv&I$B9Q} zz2he1L!-27j^{=*FL8P-MKBwRggx_>n^@=C;6UUa3Mq8==#mmaXlNljoXsQCb=fnO zYF`w)Yk4#^73@V?D|WB-!R}FeU^m-atu<ozY~$y;ZM0UMvk4P|)+)74+px`!f!Ka~ z>u7ns-Gmx(L=U$Ilf!Rl)84ZC_6xPUuB~l)q!)skqRCEo#Bs^V{66X$5TXyt-Mp`M Zr?o=u=83Z1;~iTokYWYw(^|6)@)yZ_RucdK diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fi/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index e1282ec28acb34d9b495762a14d82cb79bac2e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmZXS%We}f6oy?Wx8bs2$3?;jkSLYIWZFVCB~W?^lu{D417g9(BqtL$9-qkeq-58Z zU{`k8@D@njz#FhaqEEt^=_MeJ^v`D>|Gpj1ud9=v8O3?hP0|O_MbaLri0`B;q#vZh z^OJOo^qX{zG%>;09pVk*B=H&XEOCYSjkHd>O#Mrz8M{EdPJBSTOPnG$j`~AlF@HoX zd|!z)wagXk6?+$PhIFoM9ez#`$jaD~#T^Iy4fq|jJ+_QlKlfnS>Nd2zGAVCcH2{9F zyLZnW?0(@LsWh}>RximtaxHVy>Yh0M8p$v>o)1vx8SoC;vF9abz?xdNz_F&qVlT1Q z7Vp41g(l{yA%k#T&|1JJ52i@FU=#Xiz1VQ6YKx^jbt1u-2hE1qgn=qNVnuq0c@##o zBAgLn#H)|vnd)>Hg<<eoIxi9{jnmSjjrprhQCIwl^U`M0EFQ7aQBTQh(p;t>5|CNU zU5*(!HTI-d4wdmrP{Yf`6fxD1TFm>d(!y*!HRc@^Y^-gpj_*~iguyZzx)2>?*r$_v zy57USmdY&fR##dFzV<e$i}|syIB*B7ST!wd)04z}{-g3iQ|DG{QAeA(n45mtb+u@L zA2w_E4ZmIE)v1Nxy?6lz?BS)G2yNy0Ol7tb(a3T6xBO7kdCJNc=|&>fva;OAC9Otf zN#}TVE)E~X)o41T2-p^ADfs|wuZNN)3Ox4E0DJC$s(SM1Tv?0W%S;(C9QyksG=@r; xtC+20*8^owezV^GXjqO8-9J{ANbTvJ$4;%3_xq#&SEWV0Vq0pPYHO5de*iXF7ij<h diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fr/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 75e20f2b0f604da6bd63c140d00e8859b6c7b11f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 927 zcmZ8fPiqrF6rXCVvWlR15d|Me!6Flrv`E?hv9wKUv1vo8#e<jW?#pI%cP74>Y4w)R zAb2QL=r#Beyd@X?2A%{9ehE*$P1F<ze*2r5_vZKh?E8Lm@`K=Yg>jehl5v%B!YI}k z#&yP5M&a{~agXtXahowQA;f*=JIs^JPna(;uQMMro-uCm`R4^80_I=LW#*}iBb~?0 zGko4>zQNpOzQ+8XnV$|d3%w$Cv8EW8hr7{-<pjG5u}bF1B5b2OGW1%knY`m2lBm7H z$fY`gn9@Upv+l{XJ?nmimP#{>Ls1_xI0KpTI%@y(IA_U?*A5O%=5vIWp|Q_XlcQ*6 zDncuoWQtgFGnV^EHZ?kgM6-jmZOk%>ZyoC5+Cr`@=N9Z@$B>f^o20Q^^@){xCWN55 zBX{vIEnMZgau`CjT%D8Us;tgIwGvilAC@cSa<IiJa*vd@nR13g*zjq_RdAB4NLo=0 zi^^IPrOFjySCYSWc`&k<TC~hEI`Jw&xrZuek?oyE4eEqNGm0x%99Gey6-O%eQOQs; zeicHCg2rZ}HZHnSDhF#ubG4k_yAJ2?xb{b#Or?4OqP8N7Zt3}6UCxjFiZWVAvZf;w z^ZyEA{vdThGxMY}SvQp15OimFv`f_m7;TpxXjq2I%tG)&ZlFdQb)so7P94ma=1SE- zG!;e0Q%aB_(4c2gd9gzrhP&%YY@KzF2fg8-7!9$9IJIv)LjP0$blUb$`=3F<pcl1` zAN2aCq1enj#@h6N<znQ)(Gk))@Bi$1(Tid1KO;2O73+l#8#_EPMr+JOE$2o>m~;26 F_zj}l7^MIJ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/fur/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index b07469b5dba5cda40c98ddbe88e319e8842e1ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmZuv&1w`u80=__GKvRpqTq+(NqRE7E+I_(2}w2@OyUw&@!+L1+dJE_r+et`+2}1V zA$W+FfFK@xf!y4SzJVvf_#)QqV%9?%YHE7As=x1}=GV2^_YCV2a1(e9Tm}w-dVL43 z0zZIS^AorQ{06QAGc%0c0p9@6f**tDz-!=5;2CfQ`w!<P{!ic*_Fuub!GFN>;JNb? z{{p!7FM(kl-&ybL+V#2sTpYhm9<Vb=8C!97-%Hw-Vc)tpY}FQJ6{KVBJ(&e%a_TuX zlyq`%c-NmCe5AfmTJ}=5K4uD*w5UurI92?2QrOA_8d_ZylKR$7HBW6JSx1XZde(8a zuEjTc{H1hWS(8$3AmDx=wdV3|kf#3ZsSqB$MLV*zF7Pd%s~%sea?iUqrKt0q@5rI5 zrF=~UnNl-pws_LwjRk5p(xiDWX(mauiCcKr3FEa0)}^#Ac9o^BEkvLP{W!#BwX0RO zoEI1}&TR1r9+Ouhm%J-Q0f$qSR>DADxn-?l>+-26C47yxHn!T+i5hVdty+UoQ2Skp z<^l$rFSSr+iL!xkUWSJ+y6b##s;hhKOUK(Lvps~7(&DZP(JTH$8tEp@cdYEGK=<QT z+>BV;m)bf>ZuBKg!`!yy6^%X<vK$=+Pl8I}Mn}{i9XkX_l~Dl)rvZICPT3hIWrhl_ be?P-nk^(bAqVy#9y3SNTiM^6O+hczL1ts-| diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gd/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 278ecb75303bee2e6d74e097febd4e2721bc105a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmZ`%&1zIJ6u#A}Wds+33sLZZSQN=PbL&sJ?X=Qgi>(%|;=;}8-1OdPZZagft%WYS z^aWf96?_0!ZhU}l^bK4IcH?8{ml@jX!obIuob#QZB<IKZ;dcqv2yhvA37iG?fVjQ_ z=YVfO)O-i706&3?z|c^VTm@eO4}+({r@?dJU%*4)0?uP62YHvkDbCNpP4HXrBKQk9 z=Kl>o10F##g!XgBe9;%zDIod}*9mM8k|Z<EZh1+MWZ1Iqbuw$KULB-M=3mKfP^O^V zsZB`-yL;FC!R`mzV5McAB@2C~U`cary5*7LFHdD_6KK=wx{|bE-Ld9@tz@#Qxhs9L z>TIkfmU8i2I<KtBs4x%+UrMcod=sRJW=|D+^wxMHd)5W9;tQ3FnY!>|&1TeCeJq~H zO%<hLj)Tl7ZMDZmD;4QoYNy$q^k%EwYBiRTMXWhCUURT6qs7|HmRi~_O>QXb@1s?& z3>U2OQmdkAWSByfDQYgHSd(03w6OmfA~H;i`yU6oBMJJ?8!JmI^T!uzH(QNaYj6{k z-tM8dfP3BQX;x-}x+Oa=L+9Drf*3#6#TGZD6Z58PbNod{<LfFkR(0)Iiv{Z{pONYH zkG^wzf(F~pb<^pzX=jHbw{OriwJ4)#O%JVUw6^<Jnxd3ON6FA69xU2Z*vBRsFT|oW z(hc6|xpIM7Q>%He*@kNlFC_D2CB1mswedndc0sX*@9;;ThHVW;|1%qyG+r+~E6fTT z()*vRag2deRZrD{l}lzzrd%=vS}J2OdaTxuCySVhQrGM`Cl(cSSwCd`VD~-M4&oS7 z){&0pmGQW>qoStV>i^2oP!P&iA}<Fu(T=zOq^Zi<n1G_3m&sgYRg}q+HJr0a{s7)O BG4B8X diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gl/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 9988bda13e23d89caf45fafa64660d3febb74d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmZ`%yKWRQ6m=j0G)REx5J(tMBoOj4*`$ajS%{L|4G~#bNI(=cX2v^f@c52Ao;;}X z2UK+73#h5+Qo$ckA(4t-pySLwvPcL^N5|K5u6@tk`{VNT2ZnVHxCXoe&I5-)wY~xu zfNwyh`3_tMegap3sVT;8fv<w6!4JS^z)kSXDaIawFCu<=ny~;Z!8gGMJPUpgu7f{= zFM)r7&w_u0kvh1uy03b>S~EcPeZ24lgOssVN4tgMkCopg_m-_umX}^R)_S92uWiZ` zr*{-TJ~*5$jt@Tap43Jq5o-^ad*VixHtwG&{`!(pX+7T|Q)Y_y$W1g4DO0R#WULC- zbyU42HWKkdxk8hTcxoXKMPC^s)Sg$iIxcu73)B`oQ#m;=Iz_4zv0A2u*rtdF-6!Ii z+R>F%G^JM&uZQ&o5!OY0o`+!+F5C_0!Z6sxEn?eATNvrdMZAqYZ)%m6>K$M1A*v<A zXk}1Hja+&kX*Mlos>HUES;W_+(XmG2a_(pk257}QSy-y2(oEFwVuH>_r!_G*R||tR zvT%hm_H)$f;qhK>q_#^u?n_rF-*~>=7K;;IRc=o?(Xufm=u5;GUuz$9P3fc&ZE{%= zahngqqETPs!)@cX<u@99?#@#1QmiYh+|Y8DRH8kfuPxN-_%iOnmftt1XW$yg&CQWn zco;+-O3D+#Km8eMR#9r)kI*b_hbK*{_7Tr%7;pJOcg8J%n}D_Uazjo!F1b^Q8V#aM z$YG$2AufsIFFC0yNojQ=6UC1{%@#*rqH2bcGS(#~xwM$kQG&Kri`+=|KUIcaKt$t7 a&83s$lr`zR?2+L)Mw6srn`J5;ruGkPzArEU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/gu/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 352f3ec76c6c4fed8a2e95dd637d38a250382ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmYL_&ui2`6vs!cKghvDuX-47icCy`*frag+IFjju7<jb*J<)hr%h(UWMcIudeBll zF7zTr#Ufd&i=cSY|3v0b@g+re;FIsX`M&oi^Zw4xj0mpN$VFrsIg4aSv)&-*kzM2* zvX9Il?~yaeA@bn_AxEeI5}hRE0_rQ&#y>!vMLk5tG;#`Q>YMxiFSH0*)M}>$dJoKw z(%WQ7<wa#cle;Ph5@kGwl0;f<L2TG+!XAMxg_0q4)}c_^utAxMge_KS$%YD#qx)<f zo{A=kEpr1Q4Ltt_^X8cE(;x`F>sP(N^PDwa8aC8imKirnht$?TZ2ia9KW+Wn*55Hc zLTQ7KcKm|QW7AEZZ6I8V&dr51=OS}smEXc<GOc(DYzRCL>Fpe}h`FSFnPyl;=eHAJ z!tY3ysCWSbSLt+G7SgnG2CIYq^m)GPIZH|!kocF+3w(xwXXaXwaUr`j-sHLj(|b5v zVV!AS^O`51SzpE~5i$*FXG0h#$|}t>wxV=ihEx`9SoVT0J>K>%OM0nC{VQGPG0rTP zkgN$P*@IX$7Z+R`!87#kfCPO!tw=#44E5cPJLmcivGr#=er@Z6c8n7{erxLy&hSgS to3vxxwe>qZ8rd5CJuJc9*VeDw?>9Ss*>;$qw~tvUzgp*0TaP#Fk$>f}^H%@> diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/he/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index fdac45969482b2820bab45e21419b75258babacb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmZuvU2D`p6rF1QAc~+qiGmlT;0Lp2w*^buZKYqfXmx2<sp!k>?sPYr%q%lWYoQPI z&DTnc)Yd8@T8lqKf5G@9*k9qJCmU!5J8*L5-h1wxxk-MV>t1JACxJ`AQ{WV^1!U_x za0d7RWSXDAW#Bh(0qE*t><aiIxEnkSJ`NrOe*^9UXA%E7lJ|Q@8M}`7JUH_k0{4KQ zfU~}r;M3q&V6=A5%<`FcwvGWOI=lRVV;Q83jTpUXCEb_FqBhUjsE*rdA`KgVChJM4 zn$$4if~38btsc9#@{Z<37|BM!COS-srbwi!-r86EQ;Bt|5?atv8cUkj=0G#4W63I! zs7uQ#MrU4ps=*&gV?(V1YAOi0ZOJI&@<k$5mbTuEY-^M7Y1<4Nd?amJUey74l?QxA zE`*tekBLMERPsxG+%NIsE%N=KSiIqveBZk#Y{IKXC>x1Hn}8k*qZQ4zM9YYpP$3Q4 zR$(bi-fqSiuu#|W5ZY8T6-~*jQp5pG%9@djG`OU##89=vqye?0H$62yelSw8;CrK5 zVHVtBsf|k}nCxad5}_KPdP^89lk&sr1n)o4Wp|yIhL5YdZs2PK)L#n|uM(w3M0`S< z*aoE9ozRwh2Pof`Rk>WGVe%=Ut7@pUyo`i@4VfY`r2%h_SF~(|37^%esmsyaJ)qov zj^B|=n*1H*Lh3E_6^b5nAKivqckjuqx*hk`?J~FR-e9xJ@Yq7}liMY?<~E`F0Nvio rcK+ia+U!Wy0*3mI`wZbB)!gEBZjzm|<KF(SWANX|-M>J(4eYYN8D=j7 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hi/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hi/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 5fde217f0c5b5b01a0cd3396a86d8cad39ebfbab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1104 zcmaJ<U2D`p6iu~$5JAB=QE-X~ip;vZZf#AwTKZkIy67rCD41rayU}E3nMvCER(!BX z5uXa86;ZNKv{Vra6{NoEKj@Rh{s4c2XJ%n{eKBxya&OK(_uff<9qnGRa2*6r0QZ1H zz$&1xAHZSYC!jSuz)9dYa17|`vaD0!<KS-a74UxWDEK{a704t0vj-Y*&tA*A4=#cS z!LPv&z&l`FcL^p(z(Zh^8c&_qz4f&ZIAETdH`rPzwX9(&<`pB?Su`)?BWpy2^*CbE z8hgmR$mdm3k^USbyNj!*)$ZaOGVA&Qt2oxUVG;=vxH0!?Ek(zhP{ceUb0UaCMrMU< zYbHg=tWw~5Oj#u<bT2wpp?8>6zTgh2atNrZu^^yqA!1yo6$xF1+3cIFE@VWfRn@Q1 z;kc@3SvbTl-JmzwoUf&H)Qy-!^4WZWW_xL_KytlKA$u;{dm(FIg9|N7m#e^ygmlO) zPrBg@*6Qo)BZKp726>iI9oZq}hxLF3qU!UEC&J4x;nmo!GFoPC=#WXDS9~&vd*JhU zf!1_96!<Dq86{%rG3;Mu8P1}1twU<QJv}u&)?Pf9$=V}=V`Gf?xQ-nn?0>!<xIP~s zUd@$?MaA3YaoXS3=~ZT#q+{F@6?`*?^w0Q_T?%6926SA=P&tIxO{j|b0n&Udp5dgY zNOETf?7MV=aVDF`F%h-Sh7>Mla<-KwTWRtnO;*!nJ59cjG+9p@&(q|yiJzGl-;iC= zsm2ntC_%7cR3FU!Q`&&TTPX1ET}L_Oo2@^?m^79_>&E*l^a$3{<hyay?M=9i?54?n zY)*t(Al`PY)~~9i4Ggztn!PgCdSt{)2r!(U^dFzj;+3Wh?a=y#k!d%0V)N!U8^}I2 aJ1?U<0&@WWZIC7}n@6x^d>UrUHR~^?;kWky diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hr/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hr/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6bd83123f034470d632604a898ed65ca92c79d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcmZuv&2H2%5Oz!X3lc(bLVy^ATD3x6lC*~^-LzGI7ApF)sut7(7jJepo882YY-bCo zhrR$p95_)9yaY#1tpsnt35h-llU>>c2`gW|8T*?VkL{l~Cq6J5R|t0rFA3KOM}%^G zBU~qZCzP5Wg!_bFgxiF%F~%Me-yxnLULw9kyhi+m@QiSS{P7EnT_wInJWYI$xXe@g z<F|>+y6=d~Iv<HCbda;mSI(8=BH{AD8ve$KNXpoXR{I8F8|}W*J+`W{ys)U*dKV*` z$QW8W=_8yT9!;9l!%xr_Ns6t2)dmb!K`IIvb<P!ktz@c@7WyhJGK99$Bh6ElA*-h% zLc{7>m9_Xri@!i^5+wtOB?-9cV48A#Wl@&X1~Or2Z_X~}N?X2V;-tk_irDam3c#uF z@LlXDrIfD;ivjqq?{SYlA3Q(s=N`G9>pGj1g*UX2CKXm`s-|KERjaXysZ4tQa-30j zl}KfaB$ja@V&n}JSpchA37ZHB)s9|HlZw*uNE1LuJ6juD>!U`zitDT@NgYth*E#LU zQa_LLR3vf%qK?o8ZTP%V<MSh3xwSTGzAhuxqB{s+zL{93o)%i9yry(!0+9K@HR0?6 z49##_PI_(_dN4HwrRhEhJr9<^1(K7$82V>R)o`vf2N7=7bK&4%7(yC%hGIO5@n;sC zJ^lnG>fu4v6}A!!er497Yr~jcg6Kk~@#Jg4cE$1ALW)$ejW<mZC4C{g2!+Pu_o6G# z?;a!;ChuaZ0=7LgPd-Zpx$0@OgP60&_Ro4or<l;m{4XclF{&vAy^mb5P1U37U1Yxj Dz10cp diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/hu/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 72e59b825b28e347c27cb5c1f2c7cb64dc3a41cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmZ{iziSjh6vrnTf3S*$U?B=V5hX$AvUisvY;ubE<pq;?B&S%|Om5%pZEkjEnVC(@ zRjF(&#YUoVWeTf+mEAV_7icAz-v7YDw|9_4!GZ67=IwspoA;Rgae4GDqjjEio%Diq zfwV^|))&$x(pOU9`A)h)`boM<8W~~i7V#Q!l=y&nmN-v*O?phaLh-j#!#cl+6BPd@ z-XY#Q%~*xFPP|BbMJ)2)5Gi#~vxtkci*<%{Zm=6Zs0<@3W3xtYTZC0~+uC&5oKDir zp<xS~*mALoAT;q7!r|`TZF{);9@-+77zS){KyVtQ$W*Iy<T&vq(V23vrDc{Nw6!_* z)OCWaAw>%<YZzUe#g{_<42_Mo3LsKs;I@NOa(wAf6|XHM!cuSE8m8JfzG9;|<g;01 zc~b}AHJ<P_+=>e;pBD}TsQ8sh?pL`#3FS&q_3!#+-}jcO3U3;rtQ1b00A_{E`#lT! zI|DPBDQyTTC=?Fbwhf_n(8=yonu;<JA#b8c0;p#y5+)W3W^_sow&?l4lz<9&D@!X2 z#}k%IzBi{8jYhrfq|~gVK_^lvVl@q|jxZKo?P+t7PaXS;p4({nf@<lIE+>Ggjo5k5 z`6E<lhQloDu8?sLp;9gRQ>96-Au}T+U(_bC0jP8k+FE5AhTGbhf}1rck57B7p7&*b z(4)znki{<VTfx=|N&eC02T{JCvWH{6ak|P6!yh8Ss3SJ%8+2n47Jg8efQ`Fo^3T!* zZ1rRa;;-yjg+<}wlz(i{%|AJG(6Tfa-4E48rSg3l9G%V9#b(}j^joB<V0Dx`*kykJ D3alHZ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/id/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 0f39dc93907e8c92ecf10bc8766a6e005e426fa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmY*X%T5$Q6fG1VX%kIcm>5mG!LTwlHZ2CyfD&LpM07HYh8PzX(|3BxsjiyT17ycf z7&rJo`UkE|#7}VR!du-6TFL2Cx9Z$i_5F5z@&luFnQ)u%hH!;&Oo;0<;VR(^A!@!7 z?hw8cZW1OY7`sb+i+GawG4Vy>HR6wiEy6Xjf1GRle-cOiFX9`-aGtR#;yL0A#IK2? z|65{mtz$+z=8h|BF4eo{Ltz+68C$XDz#%+Ge_-s0t(s~aJX+R%hkY+~35AvW2q#C! z)9&Qx6AXk@SmbQIX7C1-2)aK!Rs3^PnV>!F8x<;qfw5<rC#FKyQKFBIb*zcG_-4Uh zp>@*e97;_B?uMuo$M+s}Ja$kCN3|tg92@KTwku`9S3>D{&*YGFUhppN%P8e*!eb6u zn$7Yw<5@=AJWKDTb7`79qbR&*g?37KV{_OFqcDV>LopD-!{R8KuCbQuN?OL2kH}A# zL6pdQD5@Mbbzw9*DKsqBs%1IzQ2#H@K^DpO=63t6wV76$tQt){Q4xn@s?t-3_s2>| zy#W28unzsw%icPlKhwox2WWX)_f0{6C5QPv>64BMRw%x1Y~^y$<JxpfGYimcm(qn~ zmv;;n((@e?Y#&#f1UWPrcKHTsw9Pv-LU_=cZDk4TifWH~dnzm?6q;@Q9gUs%N)_r7 zRS<SWnr23(rri{jq7*7;8<9w)Xf{HviMOZ66j1u;`DZw2PQnOkNjFqt$a+|fg=fD3 D<-GO% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/is/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6b0cdb827c1e7486364af66a017f508ea716079c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 849 zcmYk4&ubJh6vtDoKN!)2CyRp5YAGmLceV%HX;(|T-MZM-rCr5?mpJ=&8Yh!1NoH$% z>ObK{>eZVd2;Mvmh~7O2f?)p=-)ybh2cP*Sc`xtfCG-38<QqnIp14N5ATAIGL}}lM zOT>4gjQL4iC;kvq#KZ(+H%YIOPLe(#Jxkgk-6I|m7is?W)Y1A6(pxnDMS6vloo4Jd z$rNe1zd?GAv_(o=M{8xivUX`_h|+&-l%`C<*orkf4&gES9b;3rYO+D@(XzEy7<;J` z=vg^LINU#&afkcwpf9AtUc{Os1#du!T*ur0BTjfSlWPw{qw)-)Z|pecp~;YSl!(!> zjx}X1-s<sZXq_}Vf?yK|#(Lg%iR|%}JaN2hXu0!*Z{kpvLA)V6Mo_EPLLSz5I0w~* zsCw^Cl`Pm0&hxGn+9~0UjbLktQfnwaKogacu;hl}a-W7yqpwJJpSI{E7YXt%iY$Uw zj7sR9jA6<D%TpHh<mA#VE9tzeIFs8Lsj~zt^cg3KK)RsaYOjr33M<uM)o72JPPRLs zqkDYq?+%oZdJ*DnVIBJV({7W`kK@Y9eYAW{$EHWG5yAXR>4T2Stx&vaY~~`+gVEI0 zYm0C+tZTSYhj1}?&eu_+J-UMplL{sG5W<B@SgXthtf@qr3dl2{TVUPdvl<Fky!CES zd^vvnzLVO)?2Ma*jG8V!rOrpJeLMtFd<0v(cLJto+%#Jk9xzQMb*B>#iAXeE>Tc## T4*gv#PyPfbGq&X^fwb%|zb5p? diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/it/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 9a58492f1c7823f367af9f067430985e6d2c38d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 zcmZuv!EO^V5OtwISr7+q2qXrf2vBj@gi=-821?TuDhNbX3LLnY-O1MAwO6(`g`WBo z+=|4VPvBN01ZOTB5EA_o#)%+3)Y9|wjNf=>Z2vw#{hra7AzUK7B%C4a5yJRJI7j$S z2%4XS%Y;9K3xugD#;y`yB%UU|M|_fam3W8nh;WwdugAvmKZs|^{zV+}%^YX!CUK28 z#BUIvCVoy#p(9^7FXRs61mV<ZHJ<1gMpDLBtl4%5Ptb20`-ZhmQC1!;>%7L)OPxbz z<q+XucdzCSc0a&CNQGI#)<z88fD)BXxBe>*?G&cc9)?C$1;W7CiRPgxkoA;E(XpO2 zAs1iI_%pOl8l6C{Nx<C}D#h`wM;+WQ+Q8CS&$}*{8DFV#$NMIMsP~j_;7|q)Ulkq` zXvWPs9yfV&9vbt>op?5G#BuakIM4f5Xs3iXHi52G2HL`joSYfLQbCU8Fx9mv@GeE@ zyb?L`K8hlNbuW|@+Q8DdK<T-X&M%Lwy0Q5rA_3{6?s~T~X{u3=qqfo14OQ{3q%uAA zcB@oE>P1Mmgmvg!oBcJuFwuo-2WWXmrzWHKNMPX=o!nEE6^gGJTet*tIWk?Vxd`KB z>$-+3Eoj_Wj9%~usL_r)?itLahuihJdLv>TS1Mx#SoC=4>0Mc=aG3}hJ;1d}OaJ8~ z?0>4c{m-C{1}iI<N-q+2e>ju|GI_+VVO?rg<arRF`u7h?v`31^U&1)KLzyM}3+Jo( AivR!s diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ja/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ja/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 2a8959952d956920f471f5362b9453040a578b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmZva%WKp?9LJ|xUlBYA9;AW;J}x>nyI$I~Rp|?BtuAHt<YnBQP17csFf-}n)@Ba2 ziU?xs!KxLiD1t>)lp=c7dk>xjJ8Uif75<V{cZCk~ozFbJzh8cn<oo{Sc?4}Y=n&`{ zXfJ3Hl(sLReW0(P)bkB=81w^l5Y*I!&=Ft@uo-w3xD(h5^g)B57Fd7ShR^}v8n7Ms z3wRuObUQ*PfrG$3z)4^lp8z2=%bBjzXQyokXje9?4Uh(b6`^jyCnUp{n3~{X4E69J ziWL*6Z<Ljk7rMACym5xtrx%aO_34MWLOq|A9n_x@D~^2{hozB!j)s$f$DzXG+>Zl> zD_qn)=Xt<T!KWoAQ9<zZS!AG0t}-D#9y-_!!9e5)^L@f56${gCi32L3HfxwgTqrUm zU9U{KV^@+Qcd%8sOorLGms&|LRm{P8JD(@^X_Cw1T)Si2C+v3Hwk|>zQWP|lK2=;e zSbC)~f6DhN40ozO`;g>ZeZO@yIs<W`8&j8&BBOzWFVKjF4BlO5t=h)OY^T)~|HV0Y zlv+arLw)so=2~s5hlg-MsAwvJk`-L{ROC}H?7*cFDkM`~SBm|lt?o-JtS~|P!V)jT zCvtGxbx&CZKNi#{{aggn!C{mwWmm2P*QQ-|hlPy3ZL~Ie*60<ZKbmC4BzHHTJpZ}8 zicIpxXz2Hhewv+qh7ls>jDBH~Wuq7V{sm^{RrSt-Np4neteTnoX69ve`Sr#;OrU?t r#>Wn7aBseQU%fTIrLWOu^dplz%ZixY+HCZLv^2ehs!MM-=BCkaN6<u2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ka/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index d3ca3887333ff3447c0821a9a28f100d82a4aa46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmah_%W4!s6s>4{(1Hs=P!uhYtfa=CiIAb=s3e(aFrz~l9}72?nVL?Up01|4dZN2P zt=z>&Flr(`5Jmh3!JY11xDqR0;_2=<BZydV>QvP|_uPBy$Dz@6g0&ww4%`L~0GmLz zz5oY-uRx~x4x9uma1<CBA><VJ7<d$X0lXJH1FivAfC=31?;_*`_%nDO{1aRSv)zQ; z1b4xQ!JoiKz~8_~%{?=}tai5c0Q>S&vB8EwO30LwD~X_2g<g?rnM})GoNA#+{f=ns zAo6KP1${xcS2xF!?bR*X<v}Pq9+}OVYDq($M(w46;*UsArje$78Kyl!yHX7`mt{|o zX2{zjAx$N-T5PVvZU~hGGV-XiAY!RBYb1WqVN<D}u$IJg^BP+a{U8&u8Lov#D{kd1 zb1SS|q2;PKK5^PDyRI|O6U|zRM@h)FR35D_L#={H&?b+0pVM=3&Lwft*J;TY=aCcn zDfb0y3Eo4k-*=BLbEh%as1MsKmt1FBMp{IuaxX?3THMuV;*bZ?ByBHol?YwC-kN3A zp)TvDD-^3oZP~%kdbGM2Xr~#biid1gs$SyJD9*1*tvpGKW6hm(Zm~-u5~>)bDMcsH zbi6cPsyM`&x7NI}=CL);tl7YsTJy-7HEW(&vz{M{02D8C-2*%#@2NFg);zc7MV|M@ zn%8+4q78)Mk-0%f#}YQMewaHV3%NK$1z$MsRDPe|KjeYJea$0(=R=0p{+C%K7Gn%2 s+v#dh620IFJ4QxFgBkzb5vIdjkbku1UEzZruXw^hFhMRpZKpr-3ny}h)&Kwi diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kab/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 50e3d3efe5404177e52facf3a1cef6d00393fe9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmZuv%}x|S5N-tjhQvf~MiVPBdLfOo3lY)?W??}ItZrcaIe6*aDQ1W5>7MQG0r6ls zdGqKEPsVrf5#$X#nZO(P23GIN!okjb`KqSAuKH3lzi&-^VRWt$?h@V+CJ9G`aDEbQ z5RM5!^NVnga6-6E7#m~kKJgvm3F4>3SBUGx-w7Lpo0R{##Mo8h@o~nch$o3dpE=@( z#BYd0{Uh;p;!nhMb<i{P3$w$yObEKOLv0yJ8C$ky-yys}zi(`ht(d$hJzBQ9iyfco z6cU^5A)Fo_J#eRoUtvdP3KPNB1`OVSlBMo+M~VxT+?3kGo>66vuw(4G=DEp{HI?k3 zV@+$qEWV!b*Jxd4w184;nPURQuoi7$VXWs3mu3lHE>p)_MnKej$+vJX3wL;3dK6HN ztFt_w;nf+4=S1c4R9uPUXj3}RTUKhPq&HT8lk`rfrA(2xQ04+QWcxrNJXsnQ1oUJ( zYOFU_&wW*<<7mZbkDB@&6g1G|d;h3VGSdst=}PO+FTQH6@%eLIn7f0Puj-CTXr%(? z+nJA=s<cw^HDhxpKo^75Emjv`7%u9i%0l#(KSPanXuD}J$vn(V&rVmVQs4Y%J{TRO z4U?3LT&0>8%v~3i;$#qYSdklQmdQ`2D<CJ&!#8ykVgZF2=G%U-%d>@%<%n(T%wi7m z1D^c&OpjzWhpLz5tVS93`)EN!8RE9fMqe6A3kR4a8AvNdxYO$ml%pT&q9D|558I(r XTjBAy|My|F6n7J;*?Jz_^eOraa)}CD diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kk/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 999588439b4d79b9f0c131e56a7098635cc40567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmah^&1(}u9Gz<YU<JW~2T^dS^du9vu}WF1E&b9`qoJhY!OJ$8Y}V}VgxT3tdrH%b z5K&MJs8#UjMJu)zt<|e~noTdB1pAlxHbvvD18?4Zyx;G=->;tTCj{#ta00jm90Hbs zWPJk;1K)u}^Ak7;{05EzU0sBn0v`u=gNMQU!Q<drU>Z1z`>Q>K^nlmF!{8s_ez38Z zkTLKO_z1WLPW&E$QQGdA^h>;xwGTMZKJ9F1Lm(w&REqhK(`#JK3t1*(!mmV%OEPhr z=am~cv>@For`xsVzHqztf);Jp;{}UMwwWqHJv$2WrGJY5etZ!HidKae`J5Jo>}akC zpOdU-=Xpr7QY2n%s=#h=8M-2{s1rcI!V>p9#_uQ|B+nuB?GV|F8D0@mu}tW=1vVNv zA<GGi8rkb?hF9H0%EoQQEt)pd1I$db^f_vpmYF_no;OY7D!Q<ow1d#Im5>%4wIjJu zvICllipnmR+=3g3Djk}`yDIUbD?>Hn_?S4A7yczQ2%N}vILmR{x9GIJfFe3nE{}L_ zN=T=puxPn#WTr9`ozePJrZFZ0%!CkkD@ds@;hBnOyTJvTFWEBW>f&r}k_~orN!TKn zY$C`DgmWx9IOi(kCcDf7E_bHL3SMv(J)0Uxr46E+dQES{O}!a6X?#zA!DWf)XE=P; zU*r4ngSf8O;u`7g3wx>lfHUs;eNq8^+-N=4D{(DeqVeL^)3_cl;%A-W?P2RVq$_$u zuf`4QZ~fM5z1eoG?^d!?(RvG$wpYC!3B4#>nsH5kLY7@@N$ZXNNcFpT3Dc|~TZ8DA MNZUY&)g(9h17?g?9smFU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/km/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index c0ce4976b0c0c3925bdd663a75c856300c45f19c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmYL^O>Yx15QYtu53LXf&ItK{!~r>MP!VC%Ak?&_RU3#x__&&6*euz#SN5hYx14}d z2?3(0faHh^H?CYj{1hbfOL#Y-%E*u28PAM8^XL4+0fU_c7r+WQ4N_3rD{v0%fivI` zEP$`z6!-?Vk1_TgdKp|g&e%oh7W6E1_+NLSC}Sr;*<b#5WJoc#Z1j#LewT_JZHBC= zvwT#LVe2|0)=p)QENdJ6jCzIG=!=JBY@$`fV}$}?2b89Qb_-JFwdI+#=nguRYg34p zjg!7u9>rF4b;N`AJ<*}<q%0LHvY?1x3#*GF#JS1CT6BH!N_Zm-gDt!wx<)FS%0ion z-`DwoBxJ~!?9{)lb5a#;;>vJv3k@nB$(Tf!WESzwK}Loz&F>>V%!1ZNYjwUrwGswR ztuQ&hdY)sJ0()G|Q<<nb?+v7}R5TuR*F<ezSB~_Qj967Y-A_~;@!FH52-@k$$W*Lp zli7%?d>YzDwa#a5BdiCH#T`;)X8SzSrjP2Fcvz|NPP2;i(GKOTVskxU-hK9N{CB+X z-Jy5Cz56otKX~`XPu_d?+Pfd#?V)b$-A_Mx;oZk+;*)p3ynE*-Z}9}u2h&@`FA>bT J#(uKT{sCAV(gXki diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/kn/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index a7cd0bfe063f959edbf44b6b1e56c44d6d17e9b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638 zcmYL^O>fjN5QYtuuLyBKf)fXG10gR-m%@^E5wzPvMHfN|2&pHN3`t00uWWA%oG6D1 z4jd~ua6yQV16&*-IKe+b{wYkhLOasq*W-D|9{)Wtvr8}zBBzl7au}(QHeMmek=Mu( z<Q+1Dd_WE%pOJhYA>UC$<kWsbj-uX0J%+l0dJ;89MH@MQwEgXS{{u^eEGoIBf!+qQ zB~?k5WIY-iP~@hpfkYKgK$A$xCy*Gnnz9F=bRk7Zy>%E#W!O+>MamY(nP#!X<LC}s zhs~lju>m&_(pf*a$owlTxJ-jfVYhqUpX>VG8rO!!iVIzFBUMQ6<y@3p(MWO4Q@Wrx z0doWNdQ26hIX8454NYWy6`Msi<{7XUcpcJPTnL_Wx=^OTil8T0DwAuNbfn6r?vR$k z8?FwQr@sg~zPBWW0fECj8{xDDo|+4ziWg#@COKCcO#gno!g^C*JM?2vY*{2SEkqX5 z-lM{J57`Y6p!R;VCQDuw&w&P=IWMZlidSq!s#=Fsj3%k>&(71mZU3w|(+|#h#M$@G z{&v<n`_0*x&VF(BhqGT@^JcPc(>8BjIJ-MJ`swT+XMee78(ZHx`w<JcL;p^DNwb3q OR<Ze$v(3cPwB~=<#ne6k diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ko/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index abe5d13cc39bde98975a5dfd96eee3d4d9f6407a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmZvZ%}>-o7>5VNubO!9W;AgU!^sSE!4T|%622lqbVC-SiI<@}bnCV=o0*oC8zy^L z7fehL{90~H<ltcw)&$~)GyVsjOyuaae}leV64nEgKJ!f5-`ja7{dKi_1Hrfm+yI^f zmw_6Pj6>iG@B>IPKY^RTZ{Qlx)rHV4@O5xE_&)eNcmn(sm;sVp{R~2vzz5(#@FBPd z{1@B@?m3GPTxcGqr2ZKgO55K|?vuTfaSpi9UL8+R-mXJqQj`?Kk62I=vVg{gUkn2# z(c}we2QGJTPP$7BAFb4S)X~ZoUZk$aau%9u8wUb=G~{;vB=O%HUxYlsOTr6%h8KnG zWF82gp^Qgurcg$TWG^zEBTtxAuHY7SI0T5wGtVRJWx#mySQ&GyC}copmE-2fSm-E{ z6&5x!kI5Wca+3_1paHXRzuA9>m;)qb;{KF1FnHU%YnsMGssfUglq-)0LRxq{Pq|YP z0?#dnc-St<<#05|7F^1Eg>>#g0e3>`Fp_1|xA2URjB-4D++9JAIzl)ebEF81s@E2N zr^3PoVa!g?PIk_e>NSmV!Qn8_#Bve34B%*eMUT2XjqN;@iUlL{*(oyA$tBG$GD#-6 zEpqTXEIhQ}21dpUCH2UZkiN1oFSc*hNGgqwmm_A{K)PIyt9#MswfNOn95oK2jk4Zt z{@H7w=zB9>--*i&bn;*IdQES&qOGRhThrSutoK{G`cA)T;ApiTukFN}m8kknuU7PG r-RhJjFE?LD@86yh>!kE<OK<OB{iPCpY9>9Mo{v9PP*f{N`ybFhyU8r4 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lt/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 77ed2e98e8d56e0e42c19bac8552081d2571514e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909 zcmYjP&2H2%5O$#j6eI-P_>mZdT2Ub{N!r6I+q9*BQ1ypZwNxCqn5>(+>)4U)Y^l^k zFL2_@tswP=#F1C%O7I4pkmxh;0E~B0x0b$qGx0Z`@pyjU9{ogcT|?YQyg^(?93%Yt zfw+PAiSU|VhzE#2h&zap5kejz-$Ncno<qKZyoCG}v4*&b{@+W3bH^?dGKu~z<h#fX zWI*0V_IdV^ef$Sx4DFxkeV^N}F~rrrHTdAM1f_&57`<;fY;w1+O@}P%qO2S@WO<Kg zPN*E(Mszux9UYI`v!l<j!-VARgsk)#oCe7%mF=D@F6<P#QVzOWRt1M0ZHAf`y5OWK zS;j4C8trq@)i&Mc#tN+xkS^Hbr8bUk*j%*fLX}(E(g_63mvoDFg_qGK=6C{e7*EqM zrcoW@IGL(H3F9yf)|qv*Wtg&(Ic*YnRvA$+3#T8sQKGUi!|;#Irswkl?^4TjF^f?u zuUO7$i?bqub-`WL6}|5;lPfHlN;fZsb+*PjvL@XypkMOF>c;Z$4pA)(7PWF*VIc=4 zR_gdW_q3Eus0L)a%vkQySFIIVAL@L;JKWG^mFYINKY{vN;ew{D43l(4o5Cib%D!vU zsRj(p^syR`!ZeLwVgkGwK1`zs<{$)=qd%L*eycAFXQB`e4+lEj2q#e(p)j6o1h46H zuDBWWtf_fhIGCzU*W!R|GSfRbZ~|~HI`Z^AS;Juwep-Yj>r8YCuC&ER{^CdF7)0;H zy56^<-*&}I);;Lxglzt|pk$I`GsSttg)JlYDwX?Oy3iK{tiZ=$*hAG}mTcquXiNS9 D*YyNl diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/lv/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index fc3478f731b23c4f91bd537863ded3969c392e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmY+C%We}f6oy?W7Yz~;>`;+76>0@S4l~mtl}UzHy+K7&qAFA@y1-<dsT+?yvOOte z)jmUo*pw&8Yorpq0V^cRGq7X9nFN|*>6`x?`#-+U_uG>n3AXFVU1S%zft(;^`-0p= zz9OaP8*&f%f!skRCJ4EYI)yrkx`=uebrtm!@)Eg)`OizE{$Hr2|2OIsDqJ4rHPo{1 z?O#n%v2-|R*<Y?*wkycBVKn;SGz6`LEE|1bIc#xvpiPIY=qxWBH)L&}x13NZBt~>O zoE@Ib*t5gW&}KsNBqHlW1*bu>LbdkJ9T!G2T_^`#EsKmpTbr@xh0Zu>NY>((G>k6S zq8ka_;l>KBBJj3(u8pI0n~H=k7pbL9jopn`benfYX`-vl@d!dcoTq+B!zU1g(frd# ze(3w&CbNz<4O3P!r%eRgr~O3BwuL(D6~;o%6vMod4fCZm!}C;HI(vq-DlJ&bX_K=o zf=%YSf+?usOpMCFS4*kZspP5AMQ;DEi9mL}`bK?ie3YQ#dn;Nwu5d>ma@?}x@7?2E zGNG!_+GECY7r$<<(}l6G+<BWDx~5t>!B>c2;hk{a8~U6pZbnDi)Ey>8k3%?D@fRwA z*N}x_lCEo$*$7lVOl>?@g;5wkP&0ua#{taFLK*tgaS*^F_<(kpjxkt-0F&@x)gz6; zk&&nUj&|S%{f;aM-ncfFY;n;`cz1AQLG)5{+P4mpo>1caeWQz>oZ(T?^6wYAIF{kX Z435WRU<b$hMOKjd;Ao#&vLm=d`2!ca|4je@ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mjw/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 398469b0f6cfdf3ba09fa888b159409ef68bd2d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678 zcmZvZ!EV$r5QYO3go4BYaX}z47f#3_yH&;Fma1yIg@rCuRe)aIWSY%xVn>eC1&Ko+ zfGamRaDzAC%8MY;*Wki$cH0#amcIOs{o6C+`FUgMV}Nl5+yT4b8h8)<_zJFrZ{RBU z4(@^<;1>7=mcVcD<^n#z`wuS8{5kYC{%hz>=m)6xe}Q_tpZnNn<MP>LuCN7{{Cv}z zX~Xn_-PG7guw|;cb!>zFm{V8ioHAP+Go7A%y4ReZe5NB+l$^<6=dY48RH{~|qjN{_ z)KnboS>rDdgG{_;+Z0Ai$~AUGGvcxo{MNDd%MDekLBMdIYh#@lHhGbW%{FgDVkCuo zFU39|7v3tim19ZWxbsNF4@Gx{;#kJ<{di?L4tH^jNUYLLshqKro*7FCTcc@hY;1%O zMsMU5(vDJ7t>b{sTa~j&SXGjqD|=Yb+Qdub=Jz1z|Bgti#?x>(81@&%b)q=jG8$DO zjdwNjbg1z`U8+K_QaVz$VfXk|vLkv6pAU1yR`hjhGCa1V-eKXw1M!44+gTksXN9BX psN0J=VKDC#O}Iq<i*{}Q+oc*W<*3zyM>06?-9YDcJ6oM~=??+gzD)oC diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ml/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index d3e6d6b66892ee22705049aaa621f961aa7d5584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1292 zcmbVLOKVgy7`?t_1Q)szMWZ4rl5u8=T5qk2efX>nTE&H%bS9l%y*C+>JFV{83L;2d z2o(yIA}EOXZbrKBvDJSdE+lsEUl31nnN|=4y>N0e$(QqeIbY`6y5*ArzSY1c;0mw? zm<HVU30Mn!23*V+U<>da*Z?e95(L}98^O!LN5Ct=-Qb_VX~4ywS{4L5!B@ef;CtY+ z;Pp5(0v-Ub1Ahf?2LAx#sMmCQF1Pzu0IU2g8<v6~6$HnW9MPPd<>`o2*McsY)Eg;R zLC;lQNh47sRTT|$GCw-KL(h*sAcHK5c{L1rJ(E<Dm^DOYXd&XaokTW7N`__JNH`gk zYBA=7On6X^S%vGMtfb3DPgdzAu5=_tNNNHBR1fhuru=%!g<IAnVH&mN&hxrdDecp> zs7jADYMS=TkmSne=y^UIxlr28QXZ00p?H86+G%M&DIN?<r9FjxZH3$!sL+1JgpOG% zRY<IPX3Ym{-dOY2nkn0yux8RW-(h3Unvdkr0E?Ms;u=$xqpXoeI*lq(UaHz*h>2Q* z)i~|vEOAnE{&>@xN7g*?^GAMsWz7qp;-$|uYt1;KC*7*c_tcLsZFAh389$#v>Q*(b zCUPh)7Q|7VR9xnKBo>p0B#Co<C;NI99W3Sxxh^SS9qxLg4l`01xwjs(NOX|O5L23` zofrFiY5QWF^JI`K+9N8mispx;eIQD6<+!0(OnaqDbVx+q|J0qO4w6kfcL}n!lN5J% z<Sx_WTyT~7T9&*TrKFTE<lC^*YV?KlMvQuVk8^?Zym=FDSaTo#z>}xez$~~n27j>s zcaL7dn)%U*VA~G84Tm3k@345=nx=EjTMMPvUJ_12_?GwB$@^%Gm}kv;;u{C!-(<QA z_27L>TZ86hox+%@KoR{K3tI)?5k2>+2t~tj?0=Gsx8&~rQ5fnRLjn|r``xi-ww2Aj mr+>-beE;X=#shyrGy~5Prl2KmDSOn9y?*xpn9346=YIiMUs0g| diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mr/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/mr/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index deb7e645988bd351af3e102a0ec77ce3cfda79bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmYL^&1)1f7{;U4uQ@36>>-Lb$vRUlwzFL+{j|{4rCmR+ap!e*+?ixZvaNdbq9PuP z;zgxd@uCPK=tch%$)Dmg73mAVJa3ZcP2Ts<^wb_h90%vX3OET$(8P0a2D|{Lz#A|H zK7bS8BiK2@*k|YkaPcT(XQAuR)6l!nX{dz4#*TrezWMKe;EJ&&qjxRwo8)%28L?$u z)niA7-Ov@WUMUA;S<mQ)G;m@g6L-kiLaUVL3I<_^RF;AsIa1BB<(0Ikj<%@Q#)+=Y zi%cwyb1V8f<x%gJ*rJ`Hv5FPxDCIM8a#h6hBDu!n`7};0#j{u9XcMo9zLCn7(rJ_O zZK*P%nr{y&tK^9Ig2mTOx@agHO4l0b>N@IFK9)I&KFKQOU1_8n7JQ*Hi)GQ$CO@>K zyfRUDqq}-IQqqc}Wvws^K7U-JJBP_G*QG2}n-7N4SaO}){WURn=xdsMKt`;pfzAq* zr+n^y;i6tSHnJ3J+Eg~>sy^7-&P<#COFN36@9?A@-4pAi2z@qVZt9UNizmdB)@;Or z{}d+Af`1qM_u#*V$*bV^c<^t7{}uc<tg!qD{%P>9gWty`_CLeqW$<5+y$}93&JN7` Hc!>Q4bUw(v diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ms/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 8b713749301b2bcd439fb80b97f67fc1dd4f7fb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmYk4O-~d-5QZDYkBo^XUW^~n62r;#I*bXDfmH)6NMK>JS&auS#cVM<Y)|*3y9eAG zf5IF78ZUbG;=!26@9<#tZeZ=?ou_-|t*)x+{(X1$v*2-)^@z34y2UzUh4GDboAsR) zJU>}aSbtdeSu-<2JYzm&&NAOHuQS(~C#-GO9bSLEGKv4e4Dr91514<MkD2$b3UQ6O z$PDo-Ob#9I8P*|p7{PO6Jexc?T(DJ$RclTh!7lj|V~1kRlvVA?iq;WjzR)@JZE;L+ zetI_V&QHI<Ar^}Isn{43ya9!^&IXr`|Gt!_)*g<Hs!M`HW2c^XrX<l(n2{45YeFu$ z)t4X0y29uba?J+m2BegvPo8vm?Vv=*wMAX3jP<hZ@}e(S>)gqnNg?X&$u1oi!7A6$ zQwm9(#4=ux$t#Forb+TVUW(&rhj)=Zi`psl#-@M=^~hAPGU402<lY*YDPOZy=QZXe zdxT{Q9dz{&HT1|HQHcYdZtm{2ThK;@BUj*MKnkUc+FR|`w5Nqe9IYA6&2aWn#pQW! z?M0=q(94hw&^q$X_q`3dH1&ll56Q}w&P<<=BZZ}d!bcrdTU2tx*wUq-tMSq`lVzAp zn;M=rVPQG?C^t!yo%Go;)Gs_FjkvKGi5(oFg)VnE!~(V0zBu|eDXx)|g;p!>Gpk{4 u-pxUdIjU4_20%#)b%r*WE^f#46AiJNoILOysE6YXM7QRjCVEs>=*2&A2<pxN diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nb/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 03d4fd5d58704714036187e13f4bfea54c5c39f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 zcmZ8f&ubGw6rO6WvVsTkA__hzJ;`j7G)P>lmh^`$wQZ=Wh<KS~UpAA>&V-rSw7vD8 z@K%pKc^AQ3b5XpDC&B(DzDcAJ2fqF0?fc%mA2Yvh&%S50ZV>Jh-VtsRP6=UsCEOx> zBLvM)!UMu@!d=453}f@e_lReSpA*j!uMzhM+k`u0f4ah0MEsq2k@yF3$TxSDu`=;I zafm-44)Je^DRlfV*dcdV*9h0gyUB-+VI*a&Zq1=X*hPP6Y@e-~d{B6_Y`uqVFLef~ zl|zJ!lhXxvaq<B=LMluXwlQY#29zjtyL+kl$CH~vdl(v3<Om&Or<zTZBWozpM#mb~ zgj{?p<*(5?X><aaCINR{REpz~M;(4USc)r;;-hFE2gZ87<1(4@dXYKaGzmnFJ-&}a z8Kitocub&Ds#JNY!YfrMSCgg34@>1zDS9cK=S?fLQ^FgYK;4QAVWY^DL*IqvR<JvN z&6RO2v9Z}Riqu&_KHfx;C$MYmA!br&XqkRKI#aML%Qek)Yeh*%Q;Y{R!MKnn)@B-= zfNn)QTRZF1e#>zwS~Z#)rOJ*6RJy0O7Y9m6{RG-wVX3mG2h9y$o9aRb9khI1w@pfk z5~#JLkKXVXsL@VZYZy$Wr@>X@O2q0)K-NP|(*=#*50S2%MkR9L`ckt4uSTDp4%aS* zbg`MGtwY^KstnFQF1YhAkV~hI`yO4w_67szh4n%Gzn5(*@*v25A7OL`d1%k#<*6pO VqqB7KE+(;Tvxhl*<uRrA_XiRB{SE*C diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ne/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index ae79bcad08fbe79c87a75d229405ba4de6dafd46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmaJ;O-~a+7#<YAYU07fgVDqhgOQl2+X@LR78NK;6m75?qh7{#Xjis7&Fn7d4K&6W z!jX7E!DO2d6(pSW0$24Hcrqiu!-LPxTB`@0<k@H5@8_NUcCdYc;OqsC0{4LZz#<Tz zPrw1-GZ5!|1&#sVfx|#s8zCpaN5Jji^Wfd!VemR|1-J<N#}4Fx2X+#Y2j2mAftSH| z!C%1pz$ek<5ZD5v)bxz|#k1qH3)o|B$p>u-N(mWMa@rU4nh2()nj}NARu2QANdAE+ z1&&vtW#vo>x;?Yl>2J@xq!Zk6McF1JhG`(F%R{eJ{hjegq$Wczpi|NfYl2Ql)ylan zYl0M9UJ^bjC>hUUqh)qWDBqEuO)DM}m|qpH%f!P#c(FV2(zEGIcWPYJr3%=XUvbK8 zFs%5jC~cZ5Txa8A%89etFb{-HvsO0CtUhM-QY&ls^qsbPx_eSrxgW5i;-2sFKq{LS z_%!$EP}K<(pX7?3D^+<IaOGU6)Uau~Bx?hx@+u*(2v!ulX5-E3+;wQPO{_2u{J++w zo=A<2j^$g+X3|z_NP5^3njY05I>63n>MnP@ehMMV7eVf3afJ1@@?z~1Lb1G8l4blS zoA%y!f>gl`6?fT)R5c%?>c;eQ*?yW_bEiCdJV!HK{i)mRlJJE3wZ9Z)C&1fU=?o$T zW3n4ER3$N#D6nZFf#~Rij$Y};yp9%iw5g*Fs-t(tUN`o01mJq1qjlq5(T!OhebkM) zxU?~k4huS3GqE@3``%<Mp@4LB`W+~KZTv~UXF6JiYeh#}rZOIB!YlATHFDl2Dpqxb zR&zG#^bx`=%!P(o7%eq_6*cEU&?W*KW&z}G!B{nllTnGnHF(#WJ7O(7!4h2m>K#WK SPp~@C(Q>oQJVmVPG5HC%eyLRe diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/nl/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 2cf6641efbc119c4eaf441cd1b001d39acc7f234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 zcmZ8f-D(su7)`bQFrtWfBML@}Xp!unm6oZi(ss9&w%euMiWlCbJKye3H<JuWX4`@n zeE}~8g?i=7=o@$?*cb2>JTqIjV&Ke4=KD|1&s)<U8P-+c9`Fvh2Alx-`Uczpz5}_> z58yuV3%CPJO))kDz6+iPzXV?fuYkV->%eWCe_t5KPhVv05zg1adA(=gS@1UaCip!# zuk!(n&?0A^FaMXXOTd+4H~t_kgDYc8)*LwEE%FD(4%xCv(#(@(jeY9+Soe8k;}P-G z<CBN(^!N+!$yiYovSz{D8?I!gyMu|xKbFK~+Vhc7Swg&L?77ctlMrhw*(Jx?*5tLs zS|r|(b+OSQ?`t>+Hz1`19eUFFZ^skq&|9!gsj*&cx_%sqrL6Bn$Amm+Z;5Rh#ks3k zk)A?ctJLO1r6#HiygDCN=bu!nl}fOIETUtjc1n6<L*9~pAT@6qrBI1K*S+!XRnbPt z*!~Ly>3$~rBswIMkgvA3HXEX~!3W-_E-aT5>1}*i@}@jfp3y3tgiazuu2rzPhOo() z)lwx`HX8Gxp`#QXdrVtSm5lWw?+&DO<m<bgrdT-l%Ny^J6%E}r5nd?d3wyB-+A6bB ziKelML#eblx_WJqkGJ*5nm?%X>g;0hR;-dHJ08AmD2hFQTAC}>VEOwRJN`(apJI%F z<?<jq<dHFUPsxZZ>2s~@#<?{m%}2OK=cUIJ;ITjDlKIS&*r{yjL$>3k#jJ(b|5mnc m(v)!jh4oA`XOWOlA)awQ)`m)q(JI~_5+sqb4bw$QNa+uy3k-$; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/oc/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 6f7f771da1cbd6c2dc516ac408ca0d7042de6eaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 zcmYk4zfTlF6vqd}Uu!hc&OqWz48b26+&d`95;OvLh=QDO8Vj0X_ua9&J9C+tJ*1<w zHnGEmP7_KiLwDC`tWB&;<S+5NM+7JN?q_D-ci+5uv%jwoe-IcKp;2f9x(w|><@g3& zg}y_j=NEJn`UBm7hK7W=1&)Bj;6v~{xB%wRQ|KDjU(X0}3H$-x1%HAgpg1dp1V+Kq z_XNBGZh-i7kh9EJ?p=;^(1pS5_<=NK3L)mK*>+6N*l!#AM$DVMQ+T$b_L^g#>NX`d z?J^zh?v1&l-H+5#X~sz;>I0HDl&M0;TPKeHBDpEFr>@D0oT+8(spqlDSu`>gvl9(# z%Dv=LB44s~snHR&H4M^iah6Gb>sgnt9p%cQwqT7r#(KHp+G!%^infzY6H(Aum22Eh zORHQ^o+GM;)hQWH%1V_gVN|Ky3oBt5EF+6-TBTj4ys;5IFIeNO)OfVmf47dfZWpS} zvdJossA)XaH1*%dCy|Iu9IPy@)J`j|OoYL_(I^$UcRJYIqwxEkOr?5;;w@zz``H)G zx|}}sl{K{3%9@T%f@ViFy_x!;krh^DvTkhdBGR3~(#=+9=y*DNThjxo+?fep$wk&| zkB`wXoTQ#6C#EK<i2Up8y5GrA&Y-1%Xt0g@U#w+|izCZktlEUNN{kiD<BXe#(LYK! zqa<}P^$uvvQSXoxwXBMjbIMaBmhz5qF5S$Sl5y2dl|6BaI(+?oH^`BrCCazqLc+nH nKpkw|JLv6?x!!*7P%IeSdH=I5-#epKCTcml*8ik(^wNpH)>i%^ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/or/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index efd54bb9f1730685c4cb18ad5d4410e3196a96bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmY+9O=}b}7{{a57v|tW@gRuAn<80fR#%p3x0JqG?Am2n#cSMsoJ~8E3`xdXZ}y@+ zcwF=#NI|7YMpnFd(r+U9C_XbqN+0;~&-3zslKj0iGa(pfk!#2@avn*MD&8U&k$vO> z@&TDa4v=%mR|HNGQlicymroON1+|ZQ6?Key9d!>C$H*C^@>lo$4{Q;#sMU@E`Uvcf z(%WQ7WqDyilLsmT(o6Xe4C!gL1w+f$N9+k`Bb1D3(1%=U%ep2JBeqy1h7A;!dz-8e zFGMxOmbrzPHpA#13)`%DpGM6%YTXW7cf(+V8_NcoOOtY|bWFQksxA7k$hf9!LJK;V zB`6CTMq_RpLzT^=NhSqPfDM3WG2PT+m(w{_2@`f9Q7TCx(W=PJNkdGP4!Y~zmE#XY zjWAeJ(t^Zy?B@7T3oq@RJmo^p(&3nE1Ge*cu*%xUbJcsFgJvsos7692F>OB+Hh9X` zK!QH{$cEbHsdxo6YP5o0T4<iKRi!f%Q<>MP=`?5Q(Xn$=(i<Hb-3o|zhrWE{-6voE z@b0&FQ(wOGZbH3t^=VpH_r3dwrAgJV960jXm#@)|rSEnA4fAS`n_?A9d*1y-%dfim VrQULgofElt?`zkAcYkmd`3EJx?pXi; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pa/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 819a34387fcf34d7d8034700b8d5bb44f011e9bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmZ`%O=}cE5bbD;vVwx(K@8X;-t2X<@gq*Mns1FJx+JT3@Y31sOeUF`UV3H{^%MeP zRB~JqNfZ^KS0%(iz<}sg|AAhl%}?;=%{Q}&>&1q*ud4dJs%mC`9B8f*oIOA*a0}QA zECI>+0_+360*U4ua0K`X90Hn}2ss8m3~mNr0Jnhq!Hd8Z-~{sTI|w-lZrMr5WpFF_ z4A=pWfuDgB-!Jff@NY1zY0spd%udcOV0RkTf6$gdN=UDgv!S3@MKmkbH0hImC60t5 z15=_Dxq(B=%AFB(b8hK)xH-2>C%Eg0vP}k4rjeu`kAu?WU&TK+zKny2&PXrz1)Y$p zp}8b|K?)u(iI5bOOlGm6GP@yE=*qyRP5=Q5Cxz!RaXS)0QVzGu?aa!Iii%Vb8wnk^ z%z9%dWJPJyOyL?E6*F$4X8k-8HqBW%=+7}LN39O~G~%<Cl^Nz?#EOasp~oYsY}!M| zXphHz+Qm7jJLHiUPi3WY&O;nHF?R$j3hvvq5C>Cy+@)QWdcdNsJ{a2VNa=XOQ8KQC z*^=}dZktwkW@Kn&pz+GKtd;4L0iK6t?o_aCgvXw&c-##-X=#$HP(=Cb#X;85&?Unr zgkl3hNtW?}Y}zsIMwy%Jq6mblzh+oYbI-jiXs$hLoyxXn3SO+Z#|EYHLz@PbG!65) zPFfH10X>?hZJilnv^KQ`Q+sdpbEDUdUNyQ(jb1i-tsbqL+I^!Ro7y9YtEL9Q8>2rP z{V=txqWU7WeKH!t_3f{|gf8!lMs)+%NZ`ekmqx!rg60dLw`ub=Q(J`0CR=~I#QHSV z!2RI=2FNzB{kCnn(H9Sa6@BN7zGw6bZdTF~mY&Dn$gAnny5WKDL$Z<n2q!W62?U_m KsjuE}p8Nqg){V{p diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pl/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index b43077c988f8661405b9473943ba3e9d5675d5c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmaJ<&1w`u5bkKAvVx#DQLsP~5~SnoCQ6v>CLw<q;_4DM3L;25)0yqq(=~MWWZjTM z5Q0yTLm=klqpYBB;7Kq?pTUFG8)7_J%*WT&^;K8bbp5zBe8|YI5$+OR6Rs1E3BkS+ zZV<i^g62En9^oh9HeqOpvHQe#h=+;iiLVeZ6Q2;)2{+0Ab?GesH*rM%$YsXHi60X` zB7Q?0>KqbZCH_oIse?1ad7*Z&5kiQc8y&|;%GjdCu9NUg`YzgcYzgzC^wP4GZJBsw zGDxl3k#M?yJnByOKf#tzTBb2u9WZzVElQJg{wn^7<X9RHJE+TC!WP;K%@fQeYiW^4 z$66LcExwlW7t%U~CWg$AfV+;=n#=cIny~FE8?r#_dDCSo<%?zJcpGD=w4U<~xub%H zFAFbYs71AD9!=3l%Q%{T5LKh7@>Dp_+g2E-g-07hOQE;0Z2Jcp)QjMxR%8oVPR&gw zn9os)$x4w)-j*V#1k}oPpiZ&8G|KmQfm)b!A;(>%wU|VkT_nX&=t^^~xpL81buy|f zp`niGCcT2L>Z!kng%--pLede|N#EFPukx7-UAXa<w0y-Rn9`fXF!NUVN=uhkXugUz zcQKe^;JU`tER_wB#<*!TsxS``P<XT&%{6K;Ha1w+8`EJq9=4-;HG;jp!G6$06O>b> zoZ7@}g`Q_uX1afnifwR8_CK=q^BH;BbMzDXM~RYPMA1J=OM2pyvq5nb07H=iy9(1U zA24Q{woE#hD;f6xqhzl{PCp5|A_%)-fRrgA)#ATd>%t3-G_sgux5t`FZo5RVKQJd1 A;Q#;t diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index b8d11e52bde6b68e9c4dfbaf1a69e828171285a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmYjPO>fgc5Z#vYAtOLS;($P6DT>+(ZQ_I=RW1S4CZ!ckiQ0fTAf&~f+HTi7*6uoO zZ@uyZxE1khkl@UP6B7L;jGeS$<>%+wedC?4Key+;Fk06L_X!^e*9oVDa{VCOB>W_l zn%{&6gujHlgqaz}9ueOoo+Exie1*76JUh$SYvNmEZ(m}}BmPKS`lrNqh(8n8h`$lv zApTBV`u`#(*Xp08UEW=;%Y>`d*Z4(OFp@I1YVgnk-v)Px=76nXmKP2T>+M76QXTWi zq$A*GC#N-gcJh_)$y7lUu=R?$L#||@!{kEo-${mrc6@}Y$bj#mnQAsL12#}H1j_~n z%e%y8B;J9sDe8bfsW;o+4&-Q@=-W7r#A*>+F~op-gEwLaMrkP&UFjg;Ex*+k{!@Cm z?*}davETH4Z%bMyhDK_uq(c+%jUq<ACe28y1o^Xs%!7&bGC`M7M)eT0=j5s5LdGD5 zAhUoED2gI3fXcL(IG5X?(NIla*JDj-)X~HZM?%}kU1RCOIpDeT`kVdUG^=La_tsE5 z&=lBlPLVq}a*bTcRIl(bk;a1SydAEK<*BYrU=NJw=@27oNWhmrrOq3u!bm07(PTE@ zI<HLIX|3?_XJ=9KhaKKrTJheCSD?X+i!eZlQbz@D*IRUQUi@8mtSFu;Biin6O>(Ck zDyxrCaUl>k0i^`R4!UfE9cxx8)G(R+M6~_!ZWpPr)Y2Ts_O7dXcHS7u$YZ^uT%nPM zOKu>7$rQ>64Na3uB$voxA6%s<bQ;MB_(IJtlyf*aPjwomB$%(+`RQ&(<)+PZpIjO_ Uox%Z4h~zm~i&C*I3}tHBKb2z{aR2}S diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/pt_BR/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 9dc76b2399e4e74c83d0be02669d5cd1ac1985ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 914 zcmYjP%W4!s6s>4{(4vAnAK(QQbW!t40<rT@CNG1TIK)x15ag!&rl*qXs-~)XVgw<3 z*Y4t1_!IgEt_1TVdV6N#SaAB>>N>aTzJA@B{vvo?W!z)DV_ajLGOG2Raf9)LQE7fM z?lXQfZZoE)gm}PwmwB4`8S`c4RpxJumyDad|8qfzi23Hlk^T;I<-g4Qka?H+I`b#y z%KtMnyAJQH_SM_fy2Q9Lv_>DkR<KlvwzEf`V4K2`b%$cb=0zFEiM0btf-)JTP7Mgo zPEH^Bvy-o|k4jS-i}fKxu%NLtN&lbXzmwdSCcwbzGAG!#ZlZZ%a}r&R33<_Vwt7o$ zrt&R0udIn7Gc1t4Pg+a*5Xe-&J>=*)wrGb6>w@g~Or^42W?uGe3{m%$+@XQ0q;eGl z#n5WBW@TeWww^+x88_$HZZx7TzD4#N8m}=}7efa_pGps1s}HR+$FP_eWAnKxLT%42 zvy;h6%t-bK^BCF=KPs)zu#*dARuUI+u^&R=<9dD1)rJ|=tjp@bVOl0=CwIh9g!k>8 zsI%Ewo8;WAHKG-3I9ZPFxZv;ur(Q2KDzgAdADySL^rp8i=O?-<i+yr(%_KJEcEvEi zr$W@#r9&;(t;>B3rWkJhQfmQ5=F(#W%g}tX5beqhGUP^u*x*>lRe{;L+6<qbcjt9D z)*R9>tw?O+fHHJo5FDj69ve)p<M!)50$QL03M@e=jY=_{%uqEvV~sK@Q7k$iugOWy bmEeQ%@D%89BI<Gj5eo9&q83{=LFL6?vyKYl diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ro/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 7b196533843bc45a3d4655537117bbf14c865342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 zcmYjPTTc@~6dn{WSrZ?OFJ2N)Vn7KQ+_omdmO=ztBvNRg8YB8JZl~MP-I-=CMGOx_ zeuEDL@YnEA-hA}QM1Fw3!82Q-PWIdH%sJm&&N=hz*625a<2vF#;vM1!;t1hKA8`|L zitw7BhzE$@h&zap5kej!-$Ncno=3ilyoCG*@e*+x=h0<C0_1h%N62rH?;?Lio<u%I z_UlfO{W(97acRD%_j{ioR}j~7Yw){-gi=BlwAwZt*0|kP`V(1HS=U*vN%bR-t&j<{ zwCHg-+dCRFXM4xcW+LUSh}3chs~}}g#+?hrf00Z%X`!c5mvLw-J=DBV87GaD#oUmF zR{kuy(xR`qHbTh=5{Uw8Iy_A&|7^MRZUY%Jc(-7Kca^rZZW7U=3obFVsUip(>vV(n zgqPAKW_bj~uvntuGg_R1LMeJWGZ~h`Fj&Q1Xj3z3Qf8Hopq47lC1%T@?)nGJ!fbo! z+G;8L9x`XpKd_6_u*J}qWLSiMzF1{*xU)<gOE_(EmPN4avw#hiF)5gY^CR(o-~|`* z2($|7EA{HI0EMYASX2@-$E)siF&B$<c+yRokY$KFOdD=1ubMSFJ=FP>+FaABj8zMJ z7s2!gVS`5MG)rks>C8kRyZO{qN@W<BmB+GDDZo605P`Qt*xf~AtPqAUhu-mV7))ld zq7xISETFPDQ7#8>=rWgF59-)Zyd^A@rb<&qjGQ-i)9$30K;F}Utg)U*I-Gqu*$2)0 zhnzV^7Fim*yc=XQR@ghu88|8I$$tM(2z)r-2hWcI?;kj3BU0@j@E9K-e$p_nKNk%{ f8CEb4<!{iXPCyqcs@+igJZ9!(pRB5w`IE?Bv2!C8 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ru/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 513ee1cc07531f28fa8f2015f043efb60b1aac0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmZuu&rj4q7#$RUq$Vcf$zb9b1Cf|n+XWL+cKHoT6y4xzJb0<Q!&2>bHq#a);jq9# z4@53{Az-|FSqTIbgoMOIZ_}FxV<LZrN8fa#>w!sL-#63uzVDlFezr8fAy}t@i@;;x z46q95^%Xb^d;_%RJ8%j31zZ4{nh3c9ZUr}k`@ko`!{9H#ZQwli=Z+K70&W9$g1f;C z?12ZsE8te}53m9L4Td$zsq^XDdYu4HB~krz3<N15gHp@{oZjW(jF8XBkSJH8kV`W1 zlovwRFVUiOr#U^WuC@h-)ipZlxE?RsWHezK3hFtLUzqx*`0r0yM1Dx8g%_1MofNX6 zxh2Y+<UFUq1Co<M*J5Ku_K?fK6~0YNJ_Ib7;-1I&^N{=cI4~x7MaYni2PL=22BT8I z^1`M@?jD=q)2`OAVJGA^O`GX1W~P~CQLEcdTi47^(=_flLCEsb@dM8Zg|z8_3?oVJ z3z~6s<cc6|nm78(xLZm_y)gKt$SHA_=T6zC>Rr4T&&TuXliF4vX{O#~VOI7hQA)^C z!(&q!8RKK)BaK^GDbpAdKCXi{W-I73#O1D6JjeBWXkp5c0S~he@}sP~q0{Y7a>+*g zf+*raY})<A4UL=^NylTOLY4!Y`juoGWIKCkJ<MM9+blDiwP<@g)uDMgi)r*xlR}Pt zZ#Mn+S0>w~!^B}`ER)X7)h*DN9q?H2q&s?yN9-o|xvUQ_CwS2fX=kb{l{Scat3IeL zwHH?@2DBM3sBNNF)SlW^`|(oz3J05Um8dnfN#jMep=xRe>iKwyVwhWM9ox<Lh2Czc zZ9QXp@V+fL*s+iHY$3sZ@*JoXFThuqAE`#VU9|F9cNJF=t*ct%!2vqdC3oWGe;HmU aZP((La4h3o?dxKA^%_yD=yD#m8u<fyzHp2H diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sk/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 994b6a75def428615e2e1b88e35b56ad8eea00b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmYL_!Ab)$5QY^!?a{M`IY?1-)?}+#)2<e^6~*FGSMeI#agE(gmLwH@2d}=K&tkR( z`@=_OCV#@8{BCXjtOczHwgWqXjle;mQ77;nHc!Lac>a}H^G*|wH&c8f>y*&~3T-OF zO4bf4={(tJOtrBdN3Kv)yqFgbb0Z+i?r}^XsyT&M(vyIMB}d4Pkte{I;GKPzFc#f~ zTQIj$yHa{%1>71(Fjj98dhem+C!F_-N~$uRnCdL}bupI(VNS9V@KBl$IfLFZmz!a! zobNBX*w|v_7vN^m=w>uny@kgtx-{C84hg>M5Yf}8KdeisbQdOX(mL|#V?M;r%GV@) zC5r<+F;k@r0i74+qpX};S>n*x$_dc*qIGGz3(GRy)oIH2;2byz*wtrg0<9M4UV79F alQ3l6=ozm`lU;s9W@xHBwBvTnqqRQ{+k#R6 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sl/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 873d92ee594b0f289c427cc3b25835a0080feadb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 997 zcmZuuO-~a+7+w@VvL+t58BKf>LxM3=x21`=P$59UMoSwghNy{|Zr?83&dzLRW{VOI z9K3S$hDT5S1QQPg6FqzJq>*3XPw?F?SPx9{>@&~2&%7TyKPSfDIkc`4ZV_G*t`QCi z+4@SjPWVR1JU<Ax3BL(92xDW8bBFjQ@i_53@nzy=;y;8ZgbC7f7xTOg;wjQEh=KSm zF(dwP8vjmwiS#dGx;o66<;!YkD~nwj?()wCBC<NpqE<TwVGZq$(tT%1#Yt*WJJlWr zHj*K9bTmLX**}~#C;RWA%Oimu-&q+lSOtQoGT8p-_%9NxR9YA)k;VvJrAMB}Dn_R% zc!0)fYL(SuwGMlR+C)nF5K1yIvyDP9d~H!?$Hra9L}|<FCX704F%1oCDIeTsgRSEr z$~<hDTlAsimCDR3vEoB07Jcu*J+J6_?o)0oYiTZx;8tlL>SXT0rfze2d=MQUz+9Z2 zqzgs|g<%f`rNc*bQHCiGk+qP=K5PgzKpAlft80yV70yypeaIXzciMln5GoZ447ExV zQwUT%%H@L*uQqCKy;iS|1}_#ocS%W_m^yuv&?uJXzn=&m$yo@txi)Ako2?Z#GxB8< zby2gb3{;2S%!iqFWZkAnH5Y6}>Dc%nlc6+~@+{=r%9Na>-%_a*VIGP=mRy!dmPT?K z_V&&~WeQDG$h$l1Zn37qPGs4JN_Busd2c?XwoA=zu~n3)^Z%S1VY*N*lw5jnY-`i! zJy5a6FQ0qptn=f8RB|DszEj(c(eeS8J%mJsN^&^*G--}L0v(t{bp%=z%6FdgkW540 kd4>WNiu!^lBKJsTA`x)dJwKn*FxaMAF;BQtM`OA37qhe^7XSbN diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 651348d16c6bf18b3bbc2fd2f5311da779054b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmaJ<OHb867#)0D6Bq7`CVs>~G-j^tg+x*)5MF8&y#X{X+?0EVQfWIk(_WB-7?4Ev zCMHJF_!F)Vl<?f@Zn|@2BEP{O;At<f6_cEvZ#v&O^UZwo=fa6M4C4%N8F&hu1D1ho z`~=Pezkn>~H*f{`3tR-6ni#tZz63r2?g5_y4}hDFF?J8!jQQ~KhK~gIV*Uc$4&Dae z0sjM^1v@Y?z_-DW=AM~fws$s80;lt+@xc}hQpWm}oQVZJ5Xp>GQ><Tx)mkDH8+<0p zi641XQU0``o%!XKcxV0tO}Ks_DmEL+nG#8XTZ_t*`x%E;LRpIvnwCK=6f_~#LCzf+ z3RVi-vWQtp$!srvx56I_75g%>$%~M{<4F+&Ts%)il>Lq=bYs+JjEJgK2_KF<zry=! zUd+d&O-AV<9}&}jmdXd*MA%d`i$!j>amym}mTj3gOv^Nl`*7i7%8lZ{O{B6(FY9_b zuh;Yz!UE}cdMjN>U+UHLJ#~eynv#XEFeT%}FZX&O4qhnBup2&+S93kV$AlZ&G%D1% z??%+MTfFM^r1S#eDOsz=1*yCPiA}LGhVKp!9vs;!m`1;ha8?vITSfH=PJXi*xPH`0 z<w;k?B5@v#4e^eHyzCGYLh-?<EGy`iO&#NYVw8fKasxgjRT$e8Rr6`=w0BY?bRx&G zdZ>-C*kYNOP-|-*n#~R_tB1_prEaIVx76jdXW_L>VRl(2&CN9=$T6=&V?k5wG@kIi zj*cd?0nU-%2Y%lckx-2rFG*4H6KX4%1<PRildkI@`m0{oEBYIH@fMfALV5#DS<&Cq z#XKWjN*DEJ)+wexpf?K;ZBV+1U>j-Z9i*gJ;q)0<uMp+S@JL^0rg(lIvq!vaA8D|y zxAa=R^CoOJ_EkrVAXvo<s;5i&zWNJX)=}^VJT?h6)ejlHNBK*7Q!>1~mHesI*?&DZ Bm52ZU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sr@latin/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index d8496769d565c400f19640caa789e79a721df343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmZWnO-~d-5FHdhGA16l8BHu>AQ<g+W+h679YDS!%HjrB;=xNZTMW(4bWgf_79kwC zdE#KAH}t2Nn5+r@15YOMORU}n)@UbhUUk*0>Z<AfH8T9kqji;Vi}03kjc`P8>zHtz z@PptqKMA)9zX>-8Lqnc-m-r^}F!2oWW#R?m6T%C^2<<Bu`}t3a$7%nZ7>Et=1LBXw zF7F%hCE{aZO6}Ejes{K8E_S77^*<MgNa}fWTJ0EwRkS-wx4n6l7o|n*EpB6Cg-oHP zMF-*J;AqsG9DIgNE;4LI-cpajD#&;#ldW^bUy)pu(n3dNWsb0^^g#1W<>)mso}lp> zTDh~>a*M5_HbTh=Qb_`4wlK>WzOyKu+d$3@_2#c(p|oXnlZqCbD^tUoDgwXplC5D! zI4N7;79*$z;S&~2vTy>bVN`v5Kd1(Qzd}`5Q*&uDZk3LpF0>-M1FNE~GSPhxwfxj2 zd!A%gtE7!Kr=cr}%BQJ@OiP|3Ya-7hFuE{p0kzY<^=ztCnqjI{S(u8_=^(?2{rYl! zaWHLI3H*5_X-w*Cx1h!?4gIjlxR6tjY;kSS#;==8Y;vG;{coaXi!xCyx~K>yH-z;Y zS*dx(mXyv-1hVLDO*}CLeKVGE9L~Tapx|g2&<4iFdS-AZ4nvrM;50NHSI<JVc*2?E zE+eRg0qpPhQ%Dosqnwa(s#E?Oc6OPs>~2PL^!|tMt?@nj8!f(V5ps>+zn0|c9+r}8 zZ&etcLum?B(BdHWHh3b)p|SgcZ_|_c;vU{n^slf`ZH*H1bH#rGE!uPl)#|@M3444X OUJ>0xsk}NG%e_A|NgApE diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sv/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/sv/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index ee7b5a6e70bdb214f3abcded72248d3908840b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmZuv%W4!s6s>4{(1M`gLKM89f*>_^UJ}}<agvOQIy%IO2)Ze!@62?jyK1Pa=`p+f zgu7%H@DJR%nvMQ}E5WS&2v5ym62VKKKHRQzUw!N6<>^lXb{@D6yaz4-dqA*nz(wFY z5Hvr48^AB%Dlj!A#7*!u@HF@__$+u8{0?{yT!H`jln`gYU%_|4Bk(QoZ*UC0bXo{J zqKel!a1D&man6u0)D9MMg!8|K@Nt}|S~GM^FWC=`?THmr^aq};Sli~7&vb`Uo0Uw5 zyL-3Y;qE@QRhDy_h}xLR8_Lx{x4K7)6DNfkXiufd2L)5x*kjGQDOfae)nX?a)`VJe zBb9I1y3FW=IvN7$x}4{dKYG^Tvx_#lZ>*Pf*U3^@9dw**nuMapE4j&K7Bq5Ic}{3H zo}HKR93GmvpDZlgjc4LGdZC<`O{=ual{Yq_Cptw%dWPK2Xj)QZzp_2?m$k8O+mtHL zSyvoCLIT|xs1C~}t0JM-Lryc-r6u2&u3XMDhpd&c^N&0sS4Q=X`r7e;GnF`6F&dMh zqn$ol_L%ctKUbN4K&`H_j{U=}W=$?0>q6&kwsK9kOp4tkwD=+O(OdbHHQUKZ4TGLM z%~j?rvyrIgqk}ZHiZarp17EW3u^0G9#)>UpD6hkcRY{nmhxP1FmRw}c<vXpOO4%i% se!`=IQ&QfO^U8X46!L#j5hg@+T!Ec}+M_Sw3QTH<buPjU@D7*l4+BK^)c^nh diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/ta/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 4c9af82295d3b2c4d6d25a11b088903b3b60d558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmYL^O=}cE5QbZgAIw1^;LSsO458PV)s=NND<NMR$m$X&;<cSAXU3iBUb=gds3%Wu z4juz~5>W&NdqMH4|3vzySiOsE!_#k7^;<Jlf0vg|37+%FHDn99h*XF_6XY^-f?Pu0 zAxp?d<O1>qd3A=6@2IQD%2`6LpdO$uqXOzx)MHe%k#mUe_y7BU@QIKOC66@F2Vjn* z8j(#|j~fGu+?O?wVZ~F>WT@nGNDbS~*ke$-lp?0NKm*eSR273`1HzXzt+~eTU?0X( z88*;)nX!!~*DR4S4TcZdJ{*?b%C@+Hn6|^{77OpNs6(T6-0rM~w{M2Q9)5)-iVIzF zBUMZv6<nBt(@|4%Mb~sO3)U561vjl!)_1W-<PFb(CBW;LCcG{yx;Dyyl~Gr)Os4CY zw4}-x-k2I540Z?Gi@l;&7;H*`3*iJW#yFzE^=^zSUWy(~3$8Sn{z0<Cx(lD5^cg6& zEmE14B9CeJX=#Ed>>dbE^A+~wh*#xHpi!$6468=*itR{M>zIo1EY<yXkIuuspx65} z>IKBvZ_fU4_LG}VoSi!R*-hWh?g@4F#MvLt{&x14o4!WxsW*E2SG+NQ<KMj>T^56R O>4UTHXH~TS^wodgo7z?Y diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/te/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 2d245ab5ae081f36fe2d1e831323dd6a2c2104f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmYL^&x;c=6vv~kKbV7uJ&AgVH$_rA)k>XOS@xGMZnZ2`_L|PTosLbDA<4Mv$@Sn5 z)MG)sEFKgQ)Kn1Gi~c7P{7ZZ@W!aDq-}myq?<M&=KQ|$`jv{A~W#l*_kaE35P9m?6 z6UaMc4*7r_Lp~wm5FuYtJILw7gq%U$M4d;qsHae0prVZ&LCXH}zWs$ILKd~!HbC!y z-Bx-;mee>eENF5|je+z8kHL_hRu3SyY%O8;L7Pm;hz1*wD{WcVq*=lii`1~b!sFgu zwgC^b(!`dzg@`ul;T2ZDhMR_0qek;$y?MDFtaD>oUvp^$w@OF!w$98@@&O+d7%MyE zITs?M*GHpSwxA&ya$Ael_y)GiwBRYQKJalw`yh(6KyLyp3tN&UDqg^(rgVB>j;Mv8 zyVhMf_(oW(2TMv?kocO%IX>6IBYP<qJd<r254kpAJNNpltaackU%dsIt;kp<nM@<v z8e}%;i9&P1R+S!`h|0W5O{dYOv#@hs(sLaeUT6oK>?TOiv!Ac45f|ALpkb{U5br+w z>2vRP{q*g>r*FLb>7B#ayNRFfc=y9kU(@RJk9WVyn#16kcki)`-IFT$QgwXyQ!MPx c22_(vFAn_e-5&bzXs<GUEa$p!`xoqx|COffOaK4? diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tg/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 3fe6866187ef27984581475f753dcafa6153def6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmZ8fOHb5L7`-SyQWIlbX*BUBhG1gu*uh|+q7Yt66r7NexNuWCmr`hZC%1P7-Ob>} zXkvUs7m6(O4~$Pn)Vfr6x5I{&iTn~z2Vu~goSydUIp_Pnw7(9wKP5Q(f#bkU-~g}$ zq~`~45cmnCnswj=@EbS^w6zg(5_}BY4(<o<1rLKKfh)i%JTLDe<Pi8fxF5U@PJKsq z6EXqr0~_G`fB6|0)@Ej!m-bH29$;VdZu5c|0x2PbQY=KAPH?p#<UAP?L9wK`BqMX& zQC{fMg7nIqZd8^!qK(Q+I%9i2FIZ%>$y5pI+ojN%-B#>)6Npl%Xj%BBfYTWvTbj!v z;3VhU4v$DqinJFSE3hdpBTs}DbwdbPG|PRT@mq?AX*r^S9bq<Ok{5+kY&>$k0vjy3 z5z7mU8o6t1l9#<y%7$&lE!t&fdzpEbndfM>*XlM;o86{qTty1YOFN8wTM22=DbE4Z zv1w_$ULeY}uiUI;ysgTB8(`mzBZ7;thi=JsIm>f9uxQ?%^X6%vatC}bBc$6BSX8;j z_}KVJYp-m^G=@Zog)qVGB1TkL?@ZCRz3@DBW^Ea9b>Vt`l=ZZ9>7+AUvXRgc1$+{V z_Dp-qxWO**kju>#a)K8;MY}RxnXEzdD_zrHbe!DPG1aTOmQ?h6l)maZMXjda04Njv zT*nZ8OCBVP`a@D7`cYFH>$m@y;I1cCSn9O1BkH7$7kIsx+(TM&rx{&Ks>z~7^m5|~ zB3B^X{$>6X6a5(Gs{X83;l)VMHs0x4V+E7c=~gS64vD$rol&~pSV?OXzS?GQq8}nG QPO59KN#i5rpAZ(4KLMv(xc~qF diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/th/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 34c2d9349a86535afcb5d78501b9f096191390d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)4%}*0S932!tvKkMbFq$~Ta57W36(cU7gfAsnZAdkkcv-i@cI|ej*_{QA7sM}2 zI7$ozHAsw!#)BWk>B*}ey?HVt|A@Yw8sOl;N#DMm-@M<O_iOv}VEZD$+6x>3t^@mk z6(Cz*fdjxdAk+K+jsm}cLqJ;_A;-Xn!R_F4;N9S1@B?5RVAy}(K}aX~H~1R3b0;A~ z;5*<+@E7oYa0g5}z+GUp8qdrxyE|LEfIa4|^?)5gD<Olim`OOj#N~{LYh*~&8>!?m z8M(<l8ALv<#KAPD8?!52$;Rw6I^_l-uQ+7XFqMLaZW?*jO~tm8x=15Qr$w07Ih_*m zmga(}b5aUjk0+!Qi|j5oR$*6poCG3rs2@SVk}3~F#&1a;W#xp{-2~aJ3EmK~WW~e} zDr_+I6IK=uwMv)S1fLEvDI0brcWA*bbThkv56z!)y3ZW9PusS25iYD8yHOIlQp64& z52OqlRe@=XoG0##D`{U%n#uqVxtFWe(wyt%Wc4h%BR_S0&dS`aJG5MN1KKC?WMSTp z27Dp>ko&Pn8%fR+^{obn%BocyD~@c9na|nQkccoJ0^M#PvBb0|8lf9Rz0|9^al&Q) zmGUU-+0tdfr+CapB2QHC3pupsMj)+Hn8t3%Mnzmt92zyuHtEmz($;Ig-D^#<^E~2l zYwD8Vl|a&yx$a!SB3eDw&3UcfY4u2}Ct5Xib5^VSTCHjI+0^HZ;Dc5#p~eBEt6DwR z>XTNlje5}(*K~6M3V6KNYDud%nL*3Dc`vIp(Tr0Vzkqb}UqMYbT<;pis_8-VN8=4w z1e<rr-<?`VkW7o<kYuS5ZE2fZcFn&{S{?|Wb(qN)baO77LcP*TnYqlx>aB^1IhOy^ ZSS{=3<CZbL14LUlW55T_@WE^k$sd-v!PNi& diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/tr/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 92fd2ed5a1f158a3146eeb4653c75e3a00b814bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmYk4O>Yx15QbeSA6g_1+)$Aife;7eut{5~+BT(MX{n$Pm4HCv;_SK`H(om$dsE7( ze}Y?4k3ILoDJM2aaN!IWB>GF3O{4}(&%XA~JNC?a|J<7X#AsY6?hx;Z8^keDj_<@x z;s;TBei3(xzr<}~YKpP@q%)+`q)$k%l5UXpiDyK)-`7iw1*AVoACmqi9pztU>>jOW zNa+<@CN1+<Nhx)-XSpuVF2@z(+GsX@lsRN&Yz^&!lkh_N1B+d@ZnIwQC9=l8jJ+}` zB&hll&X0~CxbvgWuqTw3NyIis3f_VixrsX$j{hQ=&5eh?)p;gi&*H@M)Mk=3wTPu- zO|<1%d^_Q9BsyhH1gRkdcO9uUmmj<|<!c9-a8z5cD|;3_-*Kr*_*$Mi-m(z{&6j*v z_El-+8^X&7YGG}Thc#ZUL3JUTn|~C}hGFoWcHu1)#%bX#M(|3sQ9*HRgoY)p+9<_7 zMOV^{nykb&Tc#Y7<|386B}EoNE61*K9a!?BtFo0*xfP3P#pA>qfyZEHd#5q!t6B+z zb!(_0s^G9kC3<S_aZd|n79s8kbkf&fw>J60#8+0jCy_TyY!kYY2o~DP2Th%$(0tQk z<{~h?(bCnci!h$n!^Pk&-;ze+xXq@OiSjU8nXA+SwmLi!uvL8dC_GzJI#o^_3S<`- z?TP^wgSZ&b1d7w)Sy$ljOp8n;!?S4OYm09u^c^oklZYx#m4UWGl|fq!$z{gbtkGxh JBx?H2{sEd3{GR{- diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/uk/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 00afbaef838dfd9c5bf5ccc578bef823179df76e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcmZ`$O-~d-5N#DdGA1VK!5B>}V?d4Rb!Op!0}Dnz)CjskFlxMvyUjB0Z1<*T2E}+l zOgzd(IT-X0cp)N+@|AGXThGmtiN+t|>)j|Gw39cls{6gF>gjI>T3#@$J-|`m4zL%P z2kiO`>;t|4R`V4&27Ct&1KYMSb^?3^+yd?e?*jLOe*#y4L&)77jO_<s0{4P%gE{ym zxC{IlZ2PpJhyy+dhP6@C*0a6s+6nA#M9t535Uh+{(CU6H=&DHWD_v!Ms#Z@Eq1nJa zQA$Etp|TDq1^t+wZ;gLUzoPLVj6~UIgAJxcQ52-IH1S9A*GWyKGNDNor8Pn0N^fZ{ zshVKLC@6`T6}7Ux_~kOcA#@xn=~G2Qz~c!KMO-{cgtXf+)q)taIU}O3bi#+@N?7I> z(n`!nl}}Fb8Xpmpp_TIfAQ3+0-Fydk^W1AE@0{P!e#Xtat}}!xd{hTAj)FvKpKhf( zq`nEIr3xnlN!?SaE+IXiR&`E_qz4vRNrQ^uqavvJG*;C?C_^i)mIV*JPRY~idBi!T zD_e4((yB9jd3a#!W?s&9`jo_#FvC<GLngT3*?NS6T~wL~bS#p>*yted+|t=u$A#tt zvZTs*6rVcphKW;*QXNEmQ0ZFildLz=xX|83&9HDvwt8-%;89x}+0Z>+@I2}zmmo*p zQ^@~5>MnHHu;FmKJ(nImYFeOiPs8KElRw?%+~gO96uSB6hEz3(!iR$L?K!t2=i&7C zb6!uTBHXU=k`6Pk&7xV!X3aY?t7a*iHcRGxHpk3MvyP38li9Ou#_luo$}Ew2Yu=d! zvtrh>$Jwk+m$MnT7tLDs1j1!98>q32)0u2Kn=>D2^G$2Kx#IuZ{{h7|;Dp>(g1;&M qpL!Kjt)cW2bY5ua@xh>kvDW{1pW7`oe``LO1!m^6IW%~h&9Yx3V{^j* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/vi/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/vi/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 76c8af38de85ecf9b7e4d56a801e787fb71f1a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 zcmZXSO>5LZ7{{ktUx*;+O%!~n6hxUd?G{|pR!d(kx^*pU@!)05PLr|8OqiLZ?yWcV z;GqZcQjrQG6^h=3-QyO~4<L9FQoQ>We6kC>LI?iy%gg_Ho8<TT;nxJ$Y1AduW7HYc z4yst+QD;#<P=)6g>M|-vT|f;D5po525jl*!jXa5*N4`YeMHTTsj}hV^{~$f&U*rh# z+HpdzBCE)A$P8KdULY~Fo3qGQ)GpQu)T!=OZ^JYMt%S^KwP`r4aJ#AW2ANZFl3K3G z!c*>BAp>Y=k#RWO+8H&6TW?{ViHJ8mve+e91rbZ7ANC#py@^#SEo3T6V-D*|4?K5N z%t<X`J~yPMRZ)vBH|QGIMkwh)Akjcg$fJnzXO_$2v4NNg>8$cZX-lgn5Dhw;28Py^ z2TtuiUFDf5jC7t^?!mY_K2F^U>Xu<_!kegEcW=6`bB`HI>zYXuF{`u(b)C09N>~Z< z_A4JAq@DK?rZTxHqDIW*On^nBlCR=h7%GF51)SD7i#=Eq+)5U6Jie)3!<nFwFm|SU zS5i6{#CVVir@CBS7z{a9a-BIPaXM_MnPA5jXT6a`IOQbxA=8H2>4)`2S{e9?#@D%~ z3({8&{5~F3o(SvIqExepE-D=x4`kB4HPd60(7T*=C!I%hiA%0~Q!m;65kR?Au3#@@ zK5gdh=N96;wJQTs?d&$ecJ^gRmh#ru1fsnCM!-fW;9xs%?KL4pJ6PPe@kg<FYd-<} zXZoKRH1m#xZlL|0!11t16GleO$Pr7Bw?0d(aj?hGr~3IwJ^c0syK8^&L5t3(qDM>y IGGy4}KgSIsa{vGU diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_CN/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index d0763b1515f5bce62d0bcfc9d18101df2a25d384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmY+C&1(}u7>B2}ey!p`Jop6;h$or2NlOXaR!h@Hi>8JW#e-1BWV*Y$JCn}Lw%Uuu zOGPZ|p%x{ALdANi6u<hFyW&64lVHgv@#MeYyQ#4{@Z_19{mtzAhW&o9Z5F}U0~`mg z1N(py5REUu0pKeTWj25lzz^UE(9(j?N$@dn8~7Y}7q}mM7q|%QhxNA|2<-)LfH8Oz zd<fjyiqKK;VQ`dd2S?|7!Em&3XS9yq9gUs9?#68E2d+U7MW|1T3B~Xb(-T78LMh=F z1I;8FxXJR`<u)!zcbwtPsnRL6IrRdMQrBYz3#A*zT40X`Jn#HX{PV;Y0oQn3c!AIG zsF2&43&Lk8>(M+@C@V$uE;3jkSD93<;1;$y1c-8&=Mi>WGahX#>{A7`8N;k7q$U|< zy9Lr0*ox$Yg^lcGGR(%^C`$UNW)@DEi4I~WNW#SNPRr~(Z6;0AxCFP5oTOZNR10Zg zs1G`wbZ~cb);l&9%M1T3WVszsn~@x&zJ*hc%NhJ#q%oto+l?nVnRI$>A#9J?QUpcy z|49o^IwPqeBQuy8*lsW$GmVts&>56+rwFxb=<`g`qb~2ld522HbkCJsnk2V#QOToB zk^!C<1*q7<$s4XVvR)vmN76$2%EG+ZSgM|Q7v7rom|ey-a-MM}xBATrR&X_Lk9EWn z2C9C1RDW~7R(?`jE1~-0tJ>mRwX}-D^_6gX_2=8A@WDd(Y@zu9g!4=F53hf%KS$NM xm(};P;p2A@Xg>Y3Sy^6f?o=P%tC!2+%x6?tUaLNxuB?3u=T}grJX0$#qTg;`5pVzi diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_HK/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 51bc4bfa8e72b79a9c307f81ec1a66ba4e465122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmYL^&1)1f7{;U4uR%O`R>;v0GR~|YtkWu`+v=8fbt$WOTjK2NOll_Yl4RVjCl3k= ziYGznsh7RE2f<!s{}oTlwEu<g(8|8>%bUD;9+KzxrG>AI>NIhgSS8L9nyBjoagq2) zoFl#w3&b9AhL{j|g0b(^FA!Hw9?h>)KTqfQ_`FD+Wb71C`|J1q7hN&7VsYevKL$TS z`--)&7?vI^YhwYdt7Qs~buDf~>c#p%JOk?#nuKSD1j6N@wSXNDrXIWF@huSrTQEfH zMaN}oAXduEi5@0A=spo!@LJVsu_`?zyb;B>Mbs4WJ=!LX#*L^MMZu<YUi7RqPD_tA z;jLVvXggJ!jBhH5d}+I%_qCGc@>u4GVTwiQM-RwpvQlOsdLWD1rwmZSt8FCb1})e4 z5^0OlC_i4-%9J~~)H+0)&CLmallR*jL1(?QHV++#QP4s|Y3Xm{A${Ic_M1a3m09Fz zF0BK9|7q``XwG$YhL>Q)nn`h>OqTHG3+037;t?3IN8!2%1Lb)f-VN^rta|(9U^1)r ge^fvB*x~N4gZC5mce-EgP7go5V}E9!tJ#$O1C)`cdH?_b diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-places-menu.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/locale/zh_TW/LC_MESSAGES/gnome-shell-extension-places-menu.mo deleted file mode 100644 index 1b0f512ae51da6159303dd1ab91d431ad7d0a4b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 836 zcmYk3&ubGw6vwApf34y{^dKq@NKZ0xHbn{BMoZIHi&jI4KMsPd$#i#hcP7ltHnpck zDk8Re3W{wJQF^mtg$ml<_2O9&1Y0*rPyP$OO={!7XTS5_eBax7yFU+fRuQb-z)|2P zuosvElJy1H4}1j@&v)QB@C!H$baWte0`v%IC+IoQouC7t_koMRK8U|<Yvq4{9)oxd z^dKnO-ii-_?t!oyG^x*mLTR&S5-0CY)(&7-bJu!6o1_Io{ZdpE!<U(^2zeLfL{JVj zlW6b`D{7BBxFo%ChS#FGF0~fT<1yRwS;;~}O~qPZ-wt`v-E#bQ5{Qs%JTCk&V0cW( zw&#Kf7|Q#0ktvjyB6$}XE|F_YDo=0=I~)u|xy<(oo6w9WX|<W|Ce#>ZWg#^gQI1z4 z{h^~sL0H(xUm>Gx+)LbKz}C#dX_`(GdYYJNOsPf9lQcuAamiMi6r|0SZ)+hfoO2m> zNY3?aTu`vZy=7GqCOwm(eNF(grivms3w7KHZHJKpvxB6{;|#uD@1#q7lkz^_<KaX~ zNGGK$ZMTId-CKq0#>nu<V0%V0MU9-`FdSUvUK#GHVboJ)-}ZP9F1of<OlPkahDfIE zORhY|BpKvIQG(xN;mmDM8+kvJwoitH43vd=xf!ag*@Ii#EbTFFkn@Z)*_t;mSjp44 zJ4I8bf$GuI#=>fSd8zU79om@v+<35n8n5T;tBdQ=beCF>W;UWIe)uVV^S)Mn_Gje< zs!zSDeW=FOm+|B3KhI{e_GGrP@+h8Kir+quXQHjscyYNtySOnug?_KjKx_0D7}N?C diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/placeDisplay.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/placeDisplay.js deleted file mode 100644 index 930f92c6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/placeDisplay.js +++ /dev/null @@ -1,542 +0,0 @@ -// SPDX-FileCopyrightText: 2012 Giovanni Campagna <gcampagna@src.gnome.org> -// SPDX-FileCopyrightText: 2013 Debarshi Ray <debarshir@gnome.org> -// SPDX-FileCopyrightText: 2015 Florian Müllner <fmuellner@gnome.org> -// SPDX-FileCopyrightText: 2016 Rémy Lefevre <lefevreremy@gmail.com> -// SPDX-FileCopyrightText: 2017 Christian Kellner <christian@kellner.me> -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Shell from 'gi://Shell'; -import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js'; - -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as ShellMountOperation from 'resource:///org/gnome/shell/ui/shellMountOperation.js'; - -const N_ = x => x; - -Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async'); -Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume'); - -const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; - -const Hostname1Iface = '<node> \ -<interface name="org.freedesktop.hostname1"> \ -<property name="PrettyHostname" type="s" access="read" /> \ -</interface> \ -</node>'; -const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface); - -class PlaceInfo extends EventEmitter { - constructor(...params) { - super(); - - this._init(...params); - } - - _init(kind, file, name, icon) { - this.kind = kind; - this.file = file; - this.name = name || this._getFileName(); - this.icon = icon ? new Gio.ThemedIcon({name: icon}) : this.getIcon(); - } - - destroy() { - } - - isRemovable() { - return false; - } - - async _ensureMountAndLaunch(context, tryMount) { - try { - await Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null); - } catch (err) { - if (!err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) { - Main.notifyError(_('Failed to launch “%s”').format(this.name), err.message); - return; - } - - let source = { - get_icon: () => this.icon, - }; - let op = new ShellMountOperation.ShellMountOperation(source); - try { - await this.file.mount_enclosing_volume(0, op.mountOp, null); - - if (tryMount) - this._ensureMountAndLaunch(context, false); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) - Main.notifyError(_('Failed to mount volume for “%s”').format(this.name), e.message); - } finally { - op.close(); - } - } - } - - launch(timestamp) { - let launchContext = global.create_app_launch_context(timestamp, -1); - this._ensureMountAndLaunch(launchContext, true); - } - - getIcon() { - this.file.query_info_async('standard::symbolic-icon', - Gio.FileQueryInfoFlags.NONE, - 0, - null, - (file, result) => { - try { - let info = file.query_info_finish(result); - this.icon = info.get_symbolic_icon(); - this.emit('changed'); - } catch (e) { - if (e instanceof Gio.IOErrorEnum) - return; - throw e; - } - }); - - // return a generic icon for this kind for now, until we have the - // icon from the query info above - switch (this.kind) { - case 'network': - return new Gio.ThemedIcon({name: 'folder-remote-symbolic'}); - case 'devices': - return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'}); - case 'special': - case 'bookmarks': - default: - if (!this.file.is_native()) - return new Gio.ThemedIcon({name: 'folder-remote-symbolic'}); - else - return new Gio.ThemedIcon({name: 'folder-symbolic'}); - } - } - - _getFileName() { - try { - let info = this.file.query_info('standard::display-name', 0, null); - return info.get_display_name(); - } catch (e) { - if (e instanceof Gio.IOErrorEnum) - return this.file.get_basename(); - throw e; - } - } -} - -class RootInfo extends PlaceInfo { - _init() { - super._init('devices', Gio.File.new_for_path('/'), _('Computer')); - - let busName = 'org.freedesktop.hostname1'; - let objPath = '/org/freedesktop/hostname1'; - new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => { - if (error) - return; - - this._proxy = obj; - this._proxy.connectObject('g-properties-changed', - this._propertiesChanged.bind(this), this); - this._propertiesChanged(obj); - }); - } - - getIcon() { - return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'}); - } - - _propertiesChanged(proxy) { - // GDBusProxy will emit a g-properties-changed when hostname1 goes down - // ignore it - if (proxy.g_name_owner) { - this.name = proxy.PrettyHostname || _('Computer'); - this.emit('changed'); - } - } - - destroy() { - this._proxy?.disconnectObject(this); - this._proxy = null; - super.destroy(); - } -} - - -class PlaceDeviceInfo extends PlaceInfo { - _init(kind, mount) { - this._mount = mount; - super._init(kind, mount.get_root(), mount.get_name()); - } - - getIcon() { - return this._mount.get_symbolic_icon(); - } - - isRemovable() { - return this._mount.can_eject() || this._mount.can_unmount(); - } - - eject() { - let unmountArgs = [ - Gio.MountUnmountFlags.NONE, - new ShellMountOperation.ShellMountOperation(this._mount).mountOp, - null, // Gio.Cancellable - ]; - - if (this._mount.can_eject()) { - this._mount.eject_with_operation(...unmountArgs, - this._ejectFinish.bind(this)); - } else { - this._mount.unmount_with_operation(...unmountArgs, - this._unmountFinish.bind(this)); - } - } - - _ejectFinish(mount, result) { - try { - mount.eject_with_operation_finish(result); - } catch (e) { - this._reportFailure(e); - } - } - - _unmountFinish(mount, result) { - try { - mount.unmount_with_operation_finish(result); - } catch (e) { - this._reportFailure(e); - } - } - - _reportFailure(exception) { - let msg = _('Ejecting drive “%s” failed:').format(this._mount.get_name()); - Main.notifyError(msg, exception.message); - } -} - -class PlaceVolumeInfo extends PlaceInfo { - _init(kind, volume) { - this._volume = volume; - super._init(kind, volume.get_activation_root(), volume.get_name()); - } - - launch(timestamp) { - if (this.file) { - super.launch(timestamp); - return; - } - - this._volume.mount(0, null, null, (volume, result) => { - volume.mount_finish(result); - - let mount = volume.get_mount(); - this.file = mount.get_root(); - super.launch(timestamp); - }); - } - - getIcon() { - return this._volume.get_symbolic_icon(); - } -} - -const DEFAULT_DIRECTORIES = [ - GLib.UserDirectory.DIRECTORY_DOCUMENTS, - GLib.UserDirectory.DIRECTORY_PICTURES, - GLib.UserDirectory.DIRECTORY_MUSIC, - GLib.UserDirectory.DIRECTORY_DOWNLOAD, - GLib.UserDirectory.DIRECTORY_VIDEOS, -]; - -export class PlacesManager extends EventEmitter { - constructor() { - super(); - - this._places = { - special: [], - devices: [], - bookmarks: [], - network: [], - }; - - this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA}); - this._settings.connectObject('changed::show-desktop-icons', - () => this._updateSpecials(), this); - this._updateSpecials(); - - /* - * Show devices, code more or less ported from nautilus-places-sidebar.c - */ - this._volumeMonitor = Gio.VolumeMonitor.get(); - this._volumeMonitor.connectObject( - 'volume-added', () => this._updateMounts(), - 'volume-removed', () => this._updateMounts(), - 'volume-changed', () => this._updateMounts(), - 'mount-added', () => this._updateMounts(), - 'mount-removed', () => this._updateMounts(), - 'mount-changed', () => this._updateMounts(), - 'drive-connected', () => this._updateMounts(), - 'drive-disconnected', () => this._updateMounts(), - 'drive-changed', () => this._updateMounts(), - this); - this._updateMounts(); - - this._bookmarksFile = this._findBookmarksFile(); - this._bookmarkTimeoutId = 0; - this._monitor = null; - - if (this._bookmarksFile) { - this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null); - this._monitor.connect('changed', () => { - if (this._bookmarkTimeoutId > 0) - return; - /* Defensive event compression */ - this._bookmarkTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, 100, () => { - this._bookmarkTimeoutId = 0; - this._reloadBookmarks(); - return false; - }); - }); - - this._reloadBookmarks(); - } - } - - destroy() { - this._settings?.disconnectObject(this); - this._settings = null; - - this._volumeMonitor.disconnectObject(this); - - if (this._monitor) - this._monitor.cancel(); - if (this._bookmarkTimeoutId) - GLib.source_remove(this._bookmarkTimeoutId); - } - - _updateSpecials() { - this._places.special.forEach(p => p.destroy()); - this._places.special = []; - - let homePath = GLib.get_home_dir(); - - this._places.special.push(new PlaceInfo( - 'special', - Gio.File.new_for_path(homePath), - _('Home'))); - - let specials = []; - let dirs = DEFAULT_DIRECTORIES.slice(); - - if (this._settings.get_boolean('show-desktop-icons')) - dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP); - - for (let i = 0; i < dirs.length; i++) { - let specialPath = GLib.get_user_special_dir(dirs[i]); - if (!specialPath || specialPath === homePath) - continue; - - let file = Gio.File.new_for_path(specialPath), info; - try { - info = new PlaceInfo('special', file); - } catch (e) { - if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - continue; - throw e; - } - - specials.push(info); - } - - specials.sort((a, b) => GLib.utf8_collate(a.name, b.name)); - this._places.special = this._places.special.concat(specials); - - this.emit('special-updated'); - } - - _updateMounts() { - let networkMounts = []; - let networkVolumes = []; - - this._places.devices.forEach(p => p.destroy()); - this._places.devices = []; - this._places.network.forEach(p => p.destroy()); - this._places.network = []; - - /* Add standard places */ - this._places.devices.push(new RootInfo()); - this._places.network.push(new PlaceInfo( - 'network', - Gio.File.new_for_uri('network:///'), - _('Browse Network'), - 'network-workgroup-symbolic')); - - /* first go through all connected drives */ - let drives = this._volumeMonitor.get_connected_drives(); - for (let i = 0; i < drives.length; i++) { - let volumes = drives[i].get_volumes(); - - for (let j = 0; j < volumes.length; j++) { - let identifier = volumes[j].get_identifier('class'); - if (identifier && identifier.includes('network')) { - networkVolumes.push(volumes[j]); - } else { - let mount = volumes[j].get_mount(); - if (mount) - this._addMount('devices', mount); - } - } - } - - /* add all volumes that is not associated with a drive */ - let volumes = this._volumeMonitor.get_volumes(); - for (let i = 0; i < volumes.length; i++) { - if (volumes[i].get_drive()) - continue; - - let identifier = volumes[i].get_identifier('class'); - if (identifier && identifier.includes('network')) { - networkVolumes.push(volumes[i]); - } else { - let mount = volumes[i].get_mount(); - if (mount) - this._addMount('devices', mount); - } - } - - /* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */ - let mounts = this._volumeMonitor.get_mounts(); - for (let i = 0; i < mounts.length; i++) { - if (mounts[i].is_shadowed()) - continue; - - if (mounts[i].get_volume()) - continue; - - let root = mounts[i].get_default_location(); - if (!root.is_native()) { - networkMounts.push(mounts[i]); - continue; - } - this._addMount('devices', mounts[i]); - } - - for (let i = 0; i < networkVolumes.length; i++) { - let mount = networkVolumes[i].get_mount(); - if (mount) { - networkMounts.push(mount); - continue; - } - this._addVolume('network', networkVolumes[i]); - } - - for (let i = 0; i < networkMounts.length; i++) - this._addMount('network', networkMounts[i]); - - - this.emit('devices-updated'); - this.emit('network-updated'); - } - - _findBookmarksFile() { - let paths = [ - GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']), - GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']), - ]; - - for (let i = 0; i < paths.length; i++) { - if (GLib.file_test(paths[i], GLib.FileTest.EXISTS)) - return Gio.File.new_for_path(paths[i]); - } - - return null; - } - - _reloadBookmarks() { - this._bookmarks = []; - - let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path()); - let lines = content.split('\n'); - - let bookmarks = []; - for (let i = 0; i < lines.length; i++) { - let line = lines[i]; - let components = line.split(' '); - let [bookmark] = components; - - if (!bookmark) - continue; - - let file = Gio.File.new_for_uri(bookmark); - if (file.is_native() && !file.query_exists(null)) - continue; - - let duplicate = false; - for (let j = 0; j < this._places.special.length; j++) { - if (file.equal(this._places.special[j].file)) { - duplicate = true; - break; - } - } - if (duplicate) - continue; - for (let j = 0; j < bookmarks.length; j++) { - if (file.equal(bookmarks[j].file)) { - duplicate = true; - break; - } - } - if (duplicate) - continue; - - let label = null; - if (components.length > 1) - label = components.slice(1).join(' '); - - bookmarks.push(new PlaceInfo('bookmarks', file, label)); - } - - this._places.bookmarks = bookmarks; - - this.emit('bookmarks-updated'); - } - - _addMount(kind, mount) { - let devItem; - - try { - devItem = new PlaceDeviceInfo(kind, mount); - } catch (e) { - if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - return; - throw e; - } - - this._places[kind].push(devItem); - } - - _addVolume(kind, volume) { - let volItem; - - try { - volItem = new PlaceVolumeInfo(kind, volume); - } catch (e) { - if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - return; - throw e; - } - - this._places[kind].push(volItem); - } - - get(kind) { - return this._places[kind]; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index c2f7bd79..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Add a menu for quickly navigating places in the system.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.", - "extension-id": "places-menu", - "gettext-domain": "gnome-shell-extension-places-menu", - "name": "Places Status Indicator", - "settings-schema": "org.gnome.shell.extensions.places-menu", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "places-menu@gnome-shell-extensions.gcampax.github.com", - "version": 62 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css deleted file mode 100644 index 2d7dbe3a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/places-menu@gnome-shell-extensions.gcampax.github.com/stylesheet.css +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2020 Florian Müllner <fmuellner@gnome.org> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -.place-menu-item .button { - border-radius: 99px; - padding: 3px; - min-height: auto; -} - -.place-menu-item .button:ltr { margin-left: 6px; } -.place-menu-item .button:rtl { margin-right: 6px; } diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/arena.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/arena.js deleted file mode 100644 index 916e10f2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/arena.js +++ /dev/null @@ -1,40 +0,0 @@ -export class Arena { - constructor() { - this.slots = new Array(); - this.unused = new Array(); - } - truncate(n) { - this.slots.splice(n); - this.unused.splice(n); - } - get(n) { - return this.slots[n]; - } - insert(v) { - let n; - const slot = this.unused.pop(); - if (slot !== undefined) { - n = slot; - this.slots[n] = v; - } - else { - n = this.slots.length; - this.slots.push(v); - } - return n; - } - remove(n) { - if (this.slots[n] === null) - return null; - const v = this.slots[n]; - this.slots[n] = null; - this.unused.push(n); - return v; - } - *values() { - for (const v of this.slots) { - if (v !== null) - yield v; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/auto_tiler.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/auto_tiler.js deleted file mode 100644 index 1b968288..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/auto_tiler.js +++ /dev/null @@ -1,606 +0,0 @@ -import * as ecs from './ecs.js'; -import * as lib from './lib.js'; -import * as log from './log.js'; -import * as node from './node.js'; -import * as result from './result.js'; -import * as stack from './stack.js'; -import * as geom from './geom.js'; -import * as tiling from './tiling.js'; -const { Stack } = stack; -const { Ok, Err, ERR } = result; -const { NodeKind } = node; -import * as Tags from './tags.js'; -export class AutoTiler { - constructor(forest, attached) { - this.forest = forest; - this.attached = attached; - } - attach_swap(ext, a, b) { - const a_ent = this.attached.get(a), b_ent = this.attached.get(b); - let a_win = ext.windows.get(a), b_win = ext.windows.get(b); - if (!a_ent || !b_ent || !a_win || !b_win) - return; - const a_fork = this.forest.forks.get(a_ent), b_fork = this.forest.forks.get(b_ent); - if (!a_fork || !b_fork) - return; - const a_stack = a_win.stack, b_stack = b_win.stack; - if (ext.auto_tiler) { - if (a_win.stack !== null) { - const stack = ext.auto_tiler.forest.stacks.get(a_win.stack); - if (stack) { - a = stack.active; - a_win = ext.windows.get(a); - if (!a_win) - return; - stack.deactivate(a_win); - } - } - if (b_win.stack !== null) { - const stack = ext.auto_tiler.forest.stacks.get(b_win.stack); - if (stack) { - b = stack.active; - b_win = ext.windows.get(b); - if (!b_win) - return; - stack.deactivate(b_win); - } - } - } - const a_fn = a_fork.replace_window(ext, a_win, b_win); - this.forest.on_attach(a_ent, b); - const b_fn = b_fork.replace_window(ext, b_win, a_win); - this.forest.on_attach(b_ent, a); - if (a_fn) - a_fn(); - if (b_fn) - b_fn(); - a_win.stack = b_stack; - b_win.stack = a_stack; - a_win.meta.get_compositor_private()?.show(); - b_win.meta.get_compositor_private()?.show(); - this.tile(ext, a_fork, a_fork.area); - this.tile(ext, b_fork, b_fork.area); - } - update_toplevel(ext, fork, monitor, smart_gaps) { - let rect = ext.monitor_work_area(monitor); - fork.smart_gapped = smart_gaps && fork.right === null; - if (!fork.smart_gapped) { - rect.x += ext.gap_outer; - rect.y += ext.gap_outer; - rect.width -= ext.gap_outer * 2; - rect.height -= ext.gap_outer * 2; - } - if (fork.left.inner.kind === 2) { - const win = ext.windows.get(fork.left.inner.entity); - if (win) { - win.smart_gapped = fork.smart_gapped; - } - } - fork.area = fork.set_area(rect.clone()); - fork.length_left = Math.round(fork.prev_ratio * fork.length()); - this.tile(ext, fork, fork.area); - } - attach_to_monitor(ext, win, workspace_id, smart_gaps) { - let rect = ext.monitor_work_area(workspace_id[0]); - if (!smart_gaps) { - rect.x += ext.gap_outer; - rect.y += ext.gap_outer; - rect.width -= ext.gap_outer * 2; - rect.height -= ext.gap_outer * 2; - } - const [entity, fork] = this.forest.create_toplevel(win.entity, rect.clone(), workspace_id); - this.forest.on_attach(entity, win.entity); - fork.smart_gapped = smart_gaps; - win.smart_gapped = smart_gaps; - this.tile(ext, fork, rect); - } - attach_to_window(ext, attachee, attacher, move_by, stack_from_left = true) { - let attached = this.forest.attach_window(ext, attachee.entity, attacher.entity, move_by, stack_from_left); - if (attached) { - const [, fork] = attached; - const monitor = ext.monitors.get(attachee.entity); - if (monitor) { - if (fork.is_toplevel && fork.smart_gapped && fork.right) { - fork.smart_gapped = false; - let rect = ext.monitor_work_area(fork.monitor); - rect.x += ext.gap_outer; - rect.y += ext.gap_outer; - rect.width -= ext.gap_outer * 2; - rect.height -= ext.gap_outer * 2; - fork.set_area(rect); - } - this.tile(ext, fork, fork.area.clone()); - return true; - } - else { - log.error(`missing monitor association for Window(${attachee.entity})`); - } - } - return false; - } - attach_to_workspace(ext, win, id) { - if (ext.should_ignore_workspace(id[0])) { - id = [id[0], 0]; - } - const toplevel = this.forest.find_toplevel(id); - if (toplevel) { - const onto = this.forest.largest_window_on(ext, toplevel); - if (onto) { - if (this.attach_to_window(ext, onto, win, { auto: 0 })) { - return; - } - } - } - this.attach_to_monitor(ext, win, id, ext.settings.smart_gaps()); - } - auto_tile(ext, win, ignore_focus = false) { - const result = this.fetch_mode(ext, win, ignore_focus); - this.detach_window(ext, win.entity); - if (result.kind == ERR) { - log.debug(`attach to workspace: ${result.value}`); - this.attach_to_workspace(ext, win, ext.workspace_id(win)); - } - else { - log.debug(`attaching to window ${win.entity}`); - this.attach_to_window(ext, result.value, win, { auto: 0 }); - } - } - destroy(ext) { - for (const [, [fent]] of this.forest.toplevel) { - for (const node of this.forest.iter(fent)) { - if (node.inner.kind === 2) { - this.forest.on_detach(node.inner.entity); - } - else if (node.inner.kind === 3) { - for (const window of node.inner.entities) { - this.forest.on_detach(window); - } - } - } - } - for (const stack of this.forest.stacks.values()) - stack.destroy(); - for (const window of ext.windows.values()) { - window.stack = null; - } - this.forest.stacks.truncate(0); - ext.show_border_on_focused(); - } - detach_window(ext, win) { - this.attached.take_with(win, (prev_fork) => { - const reflow_fork = this.forest.detach(ext, prev_fork, win); - if (reflow_fork) { - const fork = reflow_fork[1]; - if (fork.is_toplevel && ext.settings.smart_gaps() && fork.right === null) { - let rect = ext.monitor_work_area(fork.monitor); - fork.set_area(rect); - fork.smart_gapped = true; - } - this.tile(ext, fork, fork.area); - } - ext.windows.with(win, (info) => (info.ignore_detach = false)); - }); - } - dropped_on_sibling(ext, win, swap = true) { - const fork_entity = this.attached.get(win); - if (fork_entity) { - const cursor = lib.cursor_rect(); - const fork = this.forest.forks.get(fork_entity); - if (fork) { - if (fork.left.inner.kind === 2 && fork.right && fork.right.inner.kind === 2) { - if (fork.left.is_window(win)) { - const sibling = ext.windows.get(fork.right.inner.entity); - if (sibling && sibling.rect().contains(cursor)) { - if (swap) { - fork.left.inner.entity = fork.right.inner.entity; - fork.right.inner.entity = win; - this.tile(ext, fork, fork.area); - } - return true; - } - } - else if (fork.right.is_window(win)) { - const sibling = ext.windows.get(fork.left.inner.entity); - if (sibling && sibling.rect().contains(cursor)) { - if (swap) { - fork.right.inner.entity = fork.left.inner.entity; - fork.left.inner.entity = win; - this.tile(ext, fork, fork.area); - } - return true; - } - } - } - } - } - return false; - } - find_stack(entity) { - const att = this.attached.get(entity); - if (att) { - const fork = this.forest.forks.get(att); - if (fork) { - if (fork.left.is_in_stack(entity)) { - return [fork, fork.left, true]; - } - else if (fork.right?.is_in_stack(entity)) { - return [fork, fork.right, false]; - } - } - } - return null; - } - get_parent_fork(window) { - const entity = this.attached.get(window); - if (entity === null) - return null; - const fork = this.forest.forks.get(entity); - return fork; - } - largest_on_workspace(ext, monitor, workspace) { - const workspace_id = [monitor, workspace]; - const toplevel = this.forest.find_toplevel(workspace_id); - if (toplevel) { - return this.forest.largest_window_on(ext, toplevel); - } - return null; - } - on_drop(ext, win, via_overview = false) { - const [cursor, monitor] = ext.cursor_status(); - const workspace = ext.active_workspace(); - if (win.rect().contains(cursor)) { - via_overview = false; - } - const attach_mon = () => { - const attach_to = this.largest_on_workspace(ext, monitor, workspace); - if (attach_to) { - this.attach_to_window(ext, attach_to, win, { auto: 0 }); - } - else { - this.attach_to_monitor(ext, win, [monitor, workspace], ext.settings.smart_gaps()); - } - }; - if (via_overview) { - this.detach_window(ext, win.entity); - attach_mon(); - return; - } - let attach_to = null; - for (const found of ext.windows_at_pointer(cursor, monitor, workspace)) { - if (found != win && this.attached.contains(found.entity)) { - attach_to = found; - break; - } - } - const fork = this.get_parent_fork(win.entity); - if (!fork) - return; - const windowless = this.largest_on_workspace(ext, monitor, workspace) === null; - if (attach_to === null) { - if (fork.left.inner.kind === 2 && fork.right?.inner.kind === 2) { - let attaching = fork.left.is_window(win.entity) ? fork.right.inner.entity : fork.left.inner.entity; - attach_to = ext.windows.get(attaching); - } - else if (!windowless) { - this.tile(ext, fork, fork.area); - return true; - } - } - if (windowless) { - this.detach_window(ext, win.entity); - this.attach_to_monitor(ext, win, [monitor, workspace], ext.settings.smart_gaps()); - } - else if (attach_to) { - this.place_or_stack(ext, win, attach_to, cursor); - } - else { - this.detach_window(ext, win.entity); - attach_mon(); - } - } - place_or_stack(ext, win, attach_to, cursor) { - const fork = this.get_parent_fork(attach_to.entity); - if (!fork) - return true; - const is_sibling = this.windows_are_siblings(win.entity, attach_to.entity); - const attach_area = (win.stack === null && attach_to.stack === null && is_sibling) || (win.stack === null && is_sibling) - ? fork.area - : attach_to.meta.get_frame_rect(); - let placement = cursor_placement(ext, attach_area, cursor); - const stack = ext.auto_tiler?.find_stack(attach_to.entity); - const matching_stack = win.stack !== null && win.stack === attach_to.stack; - const { Left, Up, Right, Down } = tiling.Direction; - const swap = (o, d) => { - fork.set_orientation(o); - const is_left = fork.left.is_window(win.entity); - const swap = (is_left && (d == Right || d == Down)) || (!is_left && (d == Left || d == Up)); - if (swap) { - fork.swap_branches(); - } - this.tile(ext, fork, fork.area); - }; - if (placement) { - const direction = placement.orientation === lib.Orientation.HORIZONTAL - ? placement.swap - ? Left - : Right - : placement.swap - ? Up - : Down; - if (stack) { - if (matching_stack) { - ext.tiler.move_from_stack(ext, stack, win, direction, true); - return true; - } - else if (attach_to.stack !== null) { - const onto_stack = ext.auto_tiler?.find_stack(attach_to.entity); - if (onto_stack) { - if (is_sibling && win.stack === null) { - swap(placement.orientation, direction); - return true; - } - else { - ext.tiler.move_alongside_stack(ext, onto_stack, win, direction); - } - return true; - } - } - } - else if (is_sibling && win.stack === null) { - swap(placement.orientation, direction); - return true; - } - else if (fork.is_toplevel && fork.right === null) { - this.detach_window(ext, win.entity); - this.attach_to_window(ext, attach_to, win, placement); - swap(placement.orientation, direction); - return true; - } - } - else if (matching_stack) { - this.tile(ext, fork, fork.area); - return true; - } - else { - if (attach_to.stack === null) - this.create_stack(ext, attach_to); - placement = { auto: 0 }; - } - this.detach_window(ext, win.entity); - return this.attach_to_window(ext, attach_to, win, placement); - } - reflow(ext, win) { - const fork_entity = this.attached.get(win); - if (!fork_entity) - return; - ext.register_fn(() => { - const fork = this.forest.forks.get(fork_entity); - if (fork) - this.tile(ext, fork, fork.area); - }); - } - tile(ext, fork, area) { - this.forest.tile(ext, fork, area); - } - toggle_floating(ext) { - const focused = ext.focus_window(); - if (!focused) - return; - let wm_class = focused.meta.get_wm_class(); - let wm_title = focused.meta.get_title(); - let float_except = false; - if (wm_class != null && wm_title != null) { - float_except = ext.conf.window_shall_float(wm_class, wm_title); - } - if (float_except) { - if (ext.contains_tag(focused.entity, Tags.ForceTile)) { - ext.delete_tag(focused.entity, Tags.ForceTile); - const fork_entity = this.attached.get(focused.entity); - if (fork_entity) { - this.detach_window(ext, focused.entity); - } - } - else { - ext.add_tag(focused.entity, Tags.ForceTile); - this.auto_tile(ext, focused, false); - } - } - else { - if (ext.contains_tag(focused.entity, Tags.Floating)) { - ext.delete_tag(focused.entity, Tags.Floating); - this.auto_tile(ext, focused, false); - } - else { - const fork_entity = this.attached.get(focused.entity); - if (fork_entity) { - this.detach_window(ext, focused.entity); - ext.add_tag(focused.entity, Tags.Floating); - } - } - } - ext.register_fn(() => focused.activate(true)); - } - toggle_orientation(ext, window) { - const result = this.toggle_orientation_(ext, window); - if (result.kind == ERR) { - log.warn(`toggle_orientation: ${result.value}`); - } - } - toggle_stacking(ext, window) { - const focused = window ?? ext.focus_window(); - if (!focused) - return; - if (ext.contains_tag(focused.entity, Tags.Floating)) { - ext.delete_tag(focused.entity, Tags.Floating); - this.auto_tile(ext, focused, false); - } - const fork_entity = this.attached.get(focused.entity); - if (fork_entity) { - const fork = this.forest.forks.get(fork_entity); - if (fork) { - this.unstack(ext, fork, focused, true); - } - } - } - unstack(ext, fork, win, toggled = false) { - const stack_toggle = (fork, branch) => { - const stack = branch.inner; - if (stack.entities.length === 1) { - win.stack = null; - this.forest.stacks.remove(stack.idx)?.destroy(); - fork.measure(this.forest, ext, fork.area, this.forest.on_record()); - return node.Node.window(win.entity); - } - return null; - }; - if (toggled && fork.left.is_window(win.entity)) { - win.stack = this.forest.stacks.insert(new Stack(ext, win.entity, fork.workspace, fork.monitor)); - fork.left = node.Node.stacked(win.entity, win.stack); - fork.measure(this.forest, ext, fork.area, this.forest.on_record()); - } - else if (fork.left.is_in_stack(win.entity)) { - const node = stack_toggle(fork, fork.left); - if (node) { - fork.left = node; - if (!fork.right) { - this.forest.reassign_to_parent(fork, node); - } - } - } - else if (toggled && fork.right?.is_window(win.entity)) { - win.stack = this.forest.stacks.insert(new Stack(ext, win.entity, fork.workspace, fork.monitor)); - fork.right = node.Node.stacked(win.entity, win.stack); - fork.measure(this.forest, ext, fork.area, this.forest.on_record()); - } - else if (fork.right?.is_in_stack(win.entity)) { - const node = stack_toggle(fork, fork.right); - if (node) - fork.right = node; - } - this.tile(ext, fork, fork.area); - } - stack_left(ext, fork, window) { - window.stack = this.forest.stacks.insert(new Stack(ext, window.entity, fork.workspace, fork.monitor)); - fork.left = node.Node.stacked(window.entity, window.stack); - fork.measure(this.forest, ext, fork.area, this.forest.on_record()); - } - stack_right(ext, fork, window) { - window.stack = this.forest.stacks.insert(new Stack(ext, window.entity, fork.workspace, fork.monitor)); - fork.right = node.Node.stacked(window.entity, window.stack); - fork.measure(this.forest, ext, fork.area, this.forest.on_record()); - } - create_stack(ext, window) { - const entity = this.attached.get(window.entity); - if (!entity) - return; - const fork = this.forest.forks.get(entity); - if (!fork) - return; - if (fork.left.is_window(window.entity)) { - this.stack_left(ext, fork, window); - } - else if (fork.right?.is_window(window.entity)) { - this.stack_right(ext, fork, window); - } - } - update_stack(ext, stack) { - if (stack.rect) { - const container = this.forest.stacks.get(stack.idx); - if (container) { - container.clear(); - for (const entity of stack.entities) { - const window = ext.windows.get(entity); - if (window) { - window.stack = stack.idx; - container.add(window); - } - } - container.update_positions(stack.rect); - container.auto_activate(); - } - } - else { - log.warn('stack rect was null'); - } - } - windows_are_siblings(a, b) { - const a_parent = this.attached.get(a); - const b_parent = this.attached.get(b); - if (a_parent !== null && null !== b_parent && ecs.entity_eq(a_parent, b_parent)) { - return a_parent; - } - return null; - } - fetch_mode(ext, win, ignore_focus = false) { - if (ignore_focus) { - return Err('ignoring focus'); - } - const prev = ext.previously_focused(win); - if (!prev) { - return Err('no window has been previously focused'); - } - let onto = ext.windows.get(prev); - if (!onto) { - return Err('no focus window'); - } - if (ecs.entity_eq(onto.entity, win.entity)) { - return Err('tiled window and attach window are the same window'); - } - if (!onto.is_tilable(ext)) { - return Err('focused window is not tilable'); - } - if (onto.meta.minimized) { - return Err('previous window was minimized'); - } - if (!this.attached.contains(onto.entity)) { - return Err('focused window is not attached'); - } - return onto.meta.get_monitor() == win.meta.get_monitor() && onto.workspace_id() == win.workspace_id() - ? Ok(onto) - : Err('window is not on the same monitor or workspace'); - } - toggle_orientation_(ext, focused) { - if (focused.meta.get_maximized()) { - return Err('cannot toggle maximized window'); - } - const fork_entity = this.attached.get(focused.entity); - if (!fork_entity) { - return Err(`window is not attached to the tree`); - } - const fork = this.forest.forks.get(fork_entity); - if (!fork) { - return Err("window's fork attachment does not exist"); - } - if (!fork.right) - return Ok(void 0); - fork.toggle_orientation(); - this.forest.measure(ext, fork, fork.area); - for (const child of this.forest.iter(fork_entity, NodeKind.FORK)) { - const child_fork = this.forest.forks.get(child.inner.entity); - if (child_fork) { - child_fork.rebalance_orientation(); - this.forest.measure(ext, child_fork, child_fork.area); - } - else { - log.error('toggle_orientation: Fork(${child.entity}) does not exist to have its orientation toggled'); - } - } - this.forest.arrange(ext, fork.workspace, true); - return Ok(void 0); - } -} -export function cursor_placement(ext, area, cursor) { - const { LEFT, RIGHT, TOP, BOTTOM } = geom.Side; - const { HORIZONTAL, VERTICAL } = lib.Orientation; - const [, side] = geom.nearest_side(ext, [cursor.x, cursor.y], area); - let res = side === LEFT - ? [HORIZONTAL, true] - : side === RIGHT - ? [HORIZONTAL, false] - : side === TOP - ? [VERTICAL, true] - : side === BOTTOM - ? [VERTICAL, false] - : null; - return res ? { orientation: res[0], swap: res[1] } : null; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/color_dialog/main.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/color_dialog/main.js deleted file mode 100644 index 0ed5b913..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/color_dialog/main.js +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/gjs --module -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Gtk from 'gi://Gtk?version=3.0'; -import Gdk from 'gi://Gdk'; -const EXT_PATH_DEFAULTS = [ - GLib.get_home_dir() + '/.local/share/gnome-shell/extensions/', - '/usr/share/gnome-shell/extensions/', -]; -const DEFAULT_HINT_COLOR = 'rgba(251, 184, 108, 1)'; -function getExtensionPath(uuid) { - let ext_path = null; - for (let i = 0; i < EXT_PATH_DEFAULTS.length; i++) { - let path = EXT_PATH_DEFAULTS[i]; - let file = Gio.File.new_for_path(path + uuid); - log(file.get_path()); - if (file.query_exists(null)) { - ext_path = file; - break; - } - } - return ext_path; -} -function getSettings(schema) { - let extensionPath = getExtensionPath('pop-shell@system76.com'); - if (!extensionPath) - throw new Error('getSettings() can only be called when extension is available'); - const GioSSS = Gio.SettingsSchemaSource; - const schemaDir = extensionPath.get_child('schemas'); - let schemaSource = schemaDir.query_exists(null) - ? GioSSS.new_from_directory(schemaDir.get_path(), GioSSS.get_default(), false) - : GioSSS.get_default(); - const schemaObj = schemaSource.lookup(schema, true); - if (!schemaObj) { - throw new Error('Schema ' + schema + ' could not be found for extension '); - } - return new Gio.Settings({ settings_schema: schemaObj }); -} -function launch_color_dialog() { - let popshell_settings = getSettings('org.gnome.shell.extensions.pop-shell'); - let color_dialog = new Gtk.ColorChooserDialog({ - title: 'Choose Color', - }); - color_dialog.show_editor = true; - color_dialog.show_all(); - let rgba = new Gdk.RGBA(); - if (rgba.parse(popshell_settings.get_string('hint-color-rgba'))) { - color_dialog.set_rgba(rgba); - } - else { - rgba.parse(DEFAULT_HINT_COLOR); - color_dialog.set_rgba(rgba); - } - let response = color_dialog.run(); - if (response === Gtk.ResponseType.CANCEL) { - color_dialog.destroy(); - } - else if (response === Gtk.ResponseType.OK) { - popshell_settings.set_string('hint-color-rgba', color_dialog.get_rgba().to_string()); - Gio.Settings.sync(); - color_dialog.destroy(); - } -} -Gtk.init(null); -launch_color_dialog(); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/config.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/config.js deleted file mode 100644 index 57e6bf21..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/config.js +++ /dev/null @@ -1,239 +0,0 @@ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -const CONF_DIR = GLib.get_user_config_dir() + '/pop-shell'; -export var CONF_FILE = CONF_DIR + '/config.json'; -export const DEFAULT_FLOAT_RULES = [ - { class: 'Authy Desktop' }, - { class: 'Com.github.amezin.ddterm' }, - { class: 'Com.github.donadigo.eddy' }, - { class: 'Conky' }, - { title: 'Discord Updater' }, - { class: 'Enpass', title: 'Enpass Assistant' }, - { class: 'Floating Window Exceptions' }, - { class: 'Gjs', title: 'Settings' }, - { class: 'Gnome-initial-setup' }, - { class: 'Gnome-terminal', title: 'Preferences – General' }, - { class: 'Guake' }, - { class: 'Io.elementary.sideload' }, - { title: 'JavaEmbeddedFrame' }, - { class: 'KotatogramDesktop', title: 'Media viewer' }, - { class: 'Mozilla VPN' }, - { class: 'update-manager', title: 'Software Updater' }, - { class: 'Solaar' }, - { class: 'Steam', title: '^((?!Steam).)*$' }, - { class: 'Steam', title: '^.*(Guard|Login).*' }, - { class: 'TelegramDesktop', title: 'Media viewer' }, - { class: 'Zotero', title: 'Quick Format Citation' }, - { class: 'firefox', title: '^(?!.*Mozilla Firefox).*$' }, - { class: 'gnome-screenshot' }, - { class: 'ibus-.*' }, - { class: 'jetbrains-toolbox' }, - { class: 'jetbrains-webstorm', title: 'Customize WebStorm' }, - { class: 'jetbrains-webstorm', title: 'License Activation' }, - { class: 'jetbrains-webstorm', title: 'Welcome to WebStorm' }, - { class: 'krunner' }, - { class: 'pritunl' }, - { class: 're.sonny.Junction' }, - { class: 'system76-driver' }, - { class: 'tilda' }, - { class: 'zoom' }, - { class: '^.*action=join.*$' }, - { class: 'gjs' }, -]; -export const SKIPTASKBAR_EXCEPTIONS = [ - { class: 'Conky' }, - { class: 'gjs' }, - { class: 'Guake' }, - { class: 'Com.github.amezin.ddterm' }, - { class: 'plank' }, -]; -export class Config { - constructor() { - this.float = []; - this.skiptaskbarhidden = []; - this.log_on_focus = false; - } - add_app_exception(wmclass) { - for (const r of this.float) { - if (r.class === wmclass && r.title === undefined) - return; - } - this.float.push({ class: wmclass }); - this.sync_to_disk(); - } - add_window_exception(wmclass, title) { - for (const r of this.float) { - if (r.class === wmclass && r.title === title) - return; - } - this.float.push({ class: wmclass, title }); - this.sync_to_disk(); - } - window_shall_float(wclass, title) { - for (const rule of this.float.concat(DEFAULT_FLOAT_RULES)) { - if (rule.class) { - if (!new RegExp(rule.class, 'i').test(wclass)) { - continue; - } - } - if (rule.title) { - if (!new RegExp(rule.title, 'i').test(title)) { - continue; - } - } - return rule.disabled ? false : true; - } - return false; - } - skiptaskbar_shall_hide(meta_window) { - let wmclass = meta_window.get_wm_class(); - let wmtitle = meta_window.get_title(); - if (!meta_window.is_skip_taskbar()) - return false; - for (const rule of this.skiptaskbarhidden.concat(SKIPTASKBAR_EXCEPTIONS)) { - if (rule.class) { - if (!new RegExp(rule.class, 'i').test(wmclass)) { - continue; - } - } - if (rule.title) { - if (!new RegExp(rule.title, 'i').test(wmtitle)) { - continue; - } - } - return rule.disabled ? false : true; - } - return false; - } - reload() { - const conf = Config.from_config(); - if (conf.tag === 0) { - let c = conf.value; - this.float = c.float; - this.log_on_focus = c.log_on_focus; - } - else { - log(`error loading conf: ${conf.why}`); - } - } - rule_disabled(rule) { - for (const value of this.float.values()) { - if (value.disabled && rule.class === value.class && value.title === rule.title) { - return true; - } - } - return false; - } - to_json() { - return JSON.stringify(this, set_to_json, 2); - } - toggle_system_exception(wmclass, wmtitle, disabled) { - if (disabled) { - for (const value of DEFAULT_FLOAT_RULES) { - if (value.class === wmclass && value.title === wmtitle) { - value.disabled = disabled; - this.float.push(value); - this.sync_to_disk(); - return; - } - } - } - let index = 0; - let found = false; - for (const value of this.float) { - if (value.class === wmclass && value.title === wmtitle) { - found = true; - break; - } - index += 1; - } - if (found) - swap_remove(this.float, index); - this.sync_to_disk(); - } - remove_user_exception(wmclass, wmtitle) { - let index = 0; - let found = new Array(); - for (const value of this.float.values()) { - if (value.class === wmclass && value.title === wmtitle) { - found.push(index); - } - index += 1; - } - if (found.length !== 0) { - for (const idx of found) - swap_remove(this.float, idx); - this.sync_to_disk(); - } - } - static from_json(json) { - try { - return JSON.parse(json); - } - catch (error) { - return new Config(); - } - } - static from_config() { - const stream = Config.read(); - if (stream.tag === 1) - return stream; - let value = Config.from_json(stream.value); - return { tag: 0, value }; - } - static gio_file() { - try { - const conf = Gio.File.new_for_path(CONF_FILE); - if (!conf.query_exists(null)) { - const dir = Gio.File.new_for_path(CONF_DIR); - if (!dir.query_exists(null) && !dir.make_directory(null)) { - return { tag: 1, why: 'failed to create pop-shell config directory' }; - } - const example = new Config(); - example.float.push({ class: 'pop-shell-example', title: 'pop-shell-example' }); - conf.create(Gio.FileCreateFlags.NONE, null).write_all(JSON.stringify(example, undefined, 2), null); - } - return { tag: 0, value: conf }; - } - catch (why) { - return { tag: 1, why: `Gio.File I/O error: ${why}` }; - } - } - static read() { - try { - const file = Config.gio_file(); - if (file.tag === 1) - return file; - const [, buffer] = file.value.load_contents(null); - return { tag: 0, value: imports.byteArray.toString(buffer) }; - } - catch (why) { - return { tag: 1, why: `failed to read pop-shell config: ${why}` }; - } - } - static write(data) { - try { - const file = Config.gio_file(); - if (file.tag === 1) - return file; - file.value.replace_contents(data, null, false, Gio.FileCreateFlags.NONE, null); - return { tag: 0, value: file.value }; - } - catch (why) { - return { tag: 1, why: `failed to write to config: ${why}` }; - } - } - sync_to_disk() { - Config.write(this.to_json()); - } -} -function set_to_json(_key, value) { - if (typeof value === 'object' && value instanceof Set) { - return [...value]; - } - return value; -} -function swap_remove(array, index) { - array[index] = array[array.length - 1]; - return array.pop(); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/context.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/context.js deleted file mode 100644 index cf5557c2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/context.js +++ /dev/null @@ -1,24 +0,0 @@ -import St from 'gi://St'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -export function addMenu(widget, request) { - const menu = new PopupMenu.PopupMenu(widget, 0.0, St.Side.TOP, 0); - Main.uiGroup.add_child(menu.actor); - menu.actor.hide(); - menu.actor.add_style_class_name('panel-menu'); - widget.connect('button-press-event', (_, event) => { - if (event.get_button() === 3) { - request(menu); - } - }); - return menu; -} -export function addContext(menu, name, activate) { - const menu_item = appendMenuItem(menu, name); - menu_item.connect('activate', () => activate()); -} -function appendMenuItem(menu, label) { - let item = new PopupMenu.PopupMenuItem(label); - menu.addMenuItem(item); - return item; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dark.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dark.css deleted file mode 100644 index 732aefb6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dark.css +++ /dev/null @@ -1,57 +0,0 @@ -.pop-shell-active-hint { - border-style: solid; - border-color: #FBB86C; - border-radius: var(--active-hint-border-radius, 5px); - box-shadow: inset 0 0 0 1px rgba(24, 23, 23, 0) -} - -.pop-shell-overlay { - background-color: rgba(53, 132, 228, 0.3); -} - -.pop-shell-border-normal { - border-width: 3px; -} - -.pop-shell-border-maximize { - border-width: 3px; -} - -.pop-shell-search-element:select{ - background: rgba(246, 246, 246, .2); - border-radius: 5px; - color: #EDEDED; -} - -.pop-shell-search-icon { - margin-right: 10px; -} - -.pop-shell-search-cat { - margin-right: 10px; -} - -.pop-shell-search-element { - padding-left: 10px; - padding-right: 2px; - padding-top: 6px; - padding-bottom: 6px; -} - -.pop-shell-tab { - border: 1px solid #333; - color: #000; - padding: 0 1em; -} - -.pop-shell-tab-active { - background: #FBB86C; -} - -.pop-shell-tab-inactive { - background: #9B8E8A; -} - -.pop-shell-tab-urgent { - background: #D00; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dbus_service.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dbus_service.js deleted file mode 100644 index 66056ab1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dbus_service.js +++ /dev/null @@ -1,44 +0,0 @@ -import Gio from 'gi://Gio'; -const IFACE = `<node> - <interface name="com.System76.PopShell"> - <method name="FocusLeft"/> - <method name="FocusRight"/> - <method name="FocusUp"/> - <method name="FocusDown"/> - <method name="Launcher"/> - <method name="WindowFocus"> - <arg type="(uu)" direction="in" name="window"/> - </method> - <method name="WindowHighlight"> - <arg type="(uu)" direction="in" name="window"/> - </method> - <method name="WindowList"> - <arg type="a((uu)sss)" direction="out" name="args"/> - </method> - <method name="WindowQuit"> - <arg type="(uu)" direction="in" name="window"/> - </method> - </interface> -</node>`; -export class Service { - constructor() { - this.FocusLeft = () => { }; - this.FocusRight = () => { }; - this.FocusUp = () => { }; - this.FocusDown = () => { }; - this.Launcher = () => { }; - this.WindowFocus = () => { }; - this.WindowList = () => []; - this.WindowQuit = () => { }; - this.dbus = Gio.DBusExportedObject.wrapJSObject(IFACE, this); - const onBusAcquired = (conn) => { - this.dbus.export(conn, '/com/System76/PopShell'); - }; - function onNameAcquired() { } - function onNameLost() { } - this.id = Gio.bus_own_name(Gio.BusType.SESSION, 'com.System76.PopShell', Gio.BusNameOwnerFlags.NONE, onBusAcquired, onNameAcquired, onNameLost); - } - destroy() { - Gio.bus_unown_name(this.id); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dialog_add_exception.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dialog_add_exception.js deleted file mode 100644 index 34c59074..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/dialog_add_exception.js +++ /dev/null @@ -1,59 +0,0 @@ -import * as Lib from './lib.js'; -import St from 'gi://St'; -import Clutter from 'gi://Clutter'; -import * as ModalDialog from 'resource:///org/gnome/shell/ui/modalDialog.js'; -export class AddExceptionDialog { - constructor(cancel, this_app, current_window, on_close) { - this.dialog = new ModalDialog.ModalDialog({ - styleClass: 'pop-shell-search modal-dialog', - destroyOnClose: false, - shellReactive: true, - shouldFadeIn: false, - shouldFadeOut: false, - }); - let title = St.Label.new('Add Floating Window Exception'); - title.set_x_align(Clutter.ActorAlign.CENTER); - title.set_style('font-weight: bold'); - let desc = St.Label.new('Float the selected window or all windows from the application.'); - desc.set_x_align(Clutter.ActorAlign.CENTER); - let l = this.dialog.contentLayout; - l.add_child(title); - l.add_child(desc); - this.dialog.contentLayout.width = Math.max(Lib.current_monitor().width / 4, 640); - this.dialog.addButton({ - label: 'Cancel', - action: () => { - cancel(); - on_close(); - this.close(); - }, - key: Clutter.KEY_Escape, - }); - this.dialog.addButton({ - label: "This App's Windows", - action: () => { - this_app(); - on_close(); - this.close(); - }, - }); - this.dialog.addButton({ - label: 'Current Window Only', - action: () => { - current_window(); - on_close(); - this.close(); - }, - }); - } - close() { - this.dialog.close(global.get_current_time()); - } - show() { - this.dialog.show(); - } - open() { - this.dialog.open(global.get_current_time(), false); - this.show(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/ecs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/ecs.js deleted file mode 100644 index 4e2eebb3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/ecs.js +++ /dev/null @@ -1,174 +0,0 @@ -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _System_executor; -export function entity_eq(a, b) { - return a[0] == b[0] && b[1] == b[1]; -} -export function entity_new(pos, gen) { - return [pos, gen]; -} -export class Storage { - constructor() { - this.store = new Array(); - } - *_iter() { - let idx = 0; - for (const slot of this.store) { - if (slot) - yield [idx, slot]; - idx += 1; - } - } - *iter() { - for (const [idx, [gen, value]] of this._iter()) { - yield [entity_new(idx, gen), value]; - } - } - *find(func) { - for (const [idx, [gen, value]] of this._iter()) { - if (func(value)) - yield entity_new(idx, gen); - } - } - *values() { - for (const [, [, value]] of this._iter()) { - yield value; - } - } - contains(entity) { - return this.get(entity) != null; - } - get(entity) { - let [id, gen] = entity; - const val = this.store[id]; - return val && val[0] == gen ? val[1] : null; - } - get_or(entity, init) { - let value = this.get(entity); - if (!value) { - value = init(); - this.insert(entity, value); - } - return value; - } - insert(entity, component) { - let [id, gen] = entity; - let length = this.store.length; - if (length >= id) { - this.store.fill(null, length, id); - } - this.store[id] = [gen, component]; - } - is_empty() { - for (const slot of this.store) - if (slot) - return false; - return true; - } - remove(entity) { - const comp = this.get(entity); - if (comp) { - this.store[entity[0]] = null; - } - return comp; - } - take_with(entity, func) { - const component = this.remove(entity); - return component ? func(component) : null; - } - with(entity, func) { - const component = this.get(entity); - return component ? func(component) : null; - } -} -export class World { - constructor() { - this.entities_ = new Array(); - this.storages = new Array(); - this.tags_ = new Array(); - this.free_slots = new Array(); - } - get capacity() { - return this.entities_.length; - } - get free() { - return this.free_slots.length; - } - get length() { - return this.capacity - this.free; - } - tags(entity) { - return this.tags_[entity[0]]; - } - *entities() { - for (const entity of this.entities_.values()) { - if (!(this.free_slots.indexOf(entity[0]) > -1)) - yield entity; - } - } - create_entity() { - let slot = this.free_slots.pop(); - if (slot) { - var entity = this.entities_[slot]; - entity[1] += 1; - } - else { - var entity = entity_new(this.capacity, 0); - this.entities_.push(entity); - this.tags_.push(new Set()); - } - return entity; - } - delete_entity(entity) { - this.tags(entity).clear(); - for (const storage of this.storages) { - storage.remove(entity); - } - this.free_slots.push(entity[0]); - } - add_tag(entity, tag) { - this.tags(entity).add(tag); - } - contains_tag(entity, tag) { - return this.tags(entity).has(tag); - } - delete_tag(entity, tag) { - this.tags(entity).delete(tag); - } - register_storage() { - let storage = new Storage(); - this.storages.push(storage); - return storage; - } - unregister_storage(storage) { - let matched = this.storages.indexOf(storage); - if (matched) { - swap_remove(this.storages, matched); - } - } -} -function swap_remove(array, index) { - array[index] = array[array.length - 1]; - return array.pop(); -} -export class System extends World { - constructor(executor) { - super(); - _System_executor.set(this, void 0); - __classPrivateFieldSet(this, _System_executor, executor, "f"); - } - register(event) { - __classPrivateFieldGet(this, _System_executor, "f").wake(this, event); - } - run(_event) { } -} -_System_executor = new WeakMap(); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/error.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/error.js deleted file mode 100644 index 8e5b6fd1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/error.js +++ /dev/null @@ -1,26 +0,0 @@ -export class Error { - constructor(reason) { - this.cause = null; - this.reason = reason; - } - context(why) { - let error = new Error(why); - error.cause = this; - return error; - } - *chain() { - let current = this; - while (current != null) { - yield current; - current = current.cause; - } - } - format() { - let causes = this.chain(); - let buffer = causes.next().value.reason; - for (const error of causes) { - buffer += `\n caused by: ` + error.reason; - } - return buffer + `\n`; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/events.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/events.js deleted file mode 100644 index 7d82ba24..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/events.js +++ /dev/null @@ -1,26 +0,0 @@ -export var GlobalEvent; -(function (GlobalEvent) { - GlobalEvent[GlobalEvent["GtkShellChanged"] = 0] = "GtkShellChanged"; - GlobalEvent[GlobalEvent["GtkThemeChanged"] = 1] = "GtkThemeChanged"; - GlobalEvent[GlobalEvent["MonitorsChanged"] = 2] = "MonitorsChanged"; - GlobalEvent[GlobalEvent["OverviewShown"] = 3] = "OverviewShown"; - GlobalEvent[GlobalEvent["OverviewHidden"] = 4] = "OverviewHidden"; -})(GlobalEvent || (GlobalEvent = {})); -export var WindowEvent; -(function (WindowEvent) { - WindowEvent[WindowEvent["Size"] = 0] = "Size"; - WindowEvent[WindowEvent["Workspace"] = 1] = "Workspace"; - WindowEvent[WindowEvent["Minimize"] = 2] = "Minimize"; - WindowEvent[WindowEvent["Maximize"] = 3] = "Maximize"; - WindowEvent[WindowEvent["Fullscreen"] = 4] = "Fullscreen"; -})(WindowEvent || (WindowEvent = {})); -export function global(event) { - return { tag: 4, event }; -} -export function window_move(ext, window, rect) { - ext.movements.insert(window.entity, rect); - return { tag: 2, window, kind: { tag: 1 } }; -} -export function window_event(window, event) { - return { tag: 2, window, kind: { tag: 2, event } }; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/executor.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/executor.js deleted file mode 100644 index ccf4a706..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/executor.js +++ /dev/null @@ -1,90 +0,0 @@ -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var _GLibExecutor_event_loop, _GLibExecutor_events, _OnceExecutor_iterable, _OnceExecutor_signal, _ChannelExecutor_channel, _ChannelExecutor_signal; -import GLib from 'gi://GLib'; -export class GLibExecutor { - constructor() { - _GLibExecutor_event_loop.set(this, null); - _GLibExecutor_events.set(this, new Array()); - } - wake(system, event) { - __classPrivateFieldGet(this, _GLibExecutor_events, "f").unshift(event); - if (__classPrivateFieldGet(this, _GLibExecutor_event_loop, "f")) - return; - __classPrivateFieldSet(this, _GLibExecutor_event_loop, GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - let event = __classPrivateFieldGet(this, _GLibExecutor_events, "f").pop(); - if (event) - system.run(event); - if (__classPrivateFieldGet(this, _GLibExecutor_events, "f").length === 0) { - __classPrivateFieldSet(this, _GLibExecutor_event_loop, null, "f"); - return false; - } - return true; - }), "f"); - } -} -_GLibExecutor_event_loop = new WeakMap(), _GLibExecutor_events = new WeakMap(); -export class OnceExecutor { - constructor(iterable) { - _OnceExecutor_iterable.set(this, void 0); - _OnceExecutor_signal.set(this, null); - __classPrivateFieldSet(this, _OnceExecutor_iterable, iterable, "f"); - } - start(delay, apply, then) { - this.stop(); - const iterator = __classPrivateFieldGet(this, _OnceExecutor_iterable, "f")[Symbol.iterator](); - __classPrivateFieldSet(this, _OnceExecutor_signal, GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { - const next = iterator.next().value; - if (typeof next === 'undefined') { - if (then) - GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { - then(); - return false; - }); - return false; - } - return apply(next); - }), "f"); - } - stop() { - if (__classPrivateFieldGet(this, _OnceExecutor_signal, "f") !== null) - GLib.source_remove(__classPrivateFieldGet(this, _OnceExecutor_signal, "f")); - } -} -_OnceExecutor_iterable = new WeakMap(), _OnceExecutor_signal = new WeakMap(); -export class ChannelExecutor { - constructor() { - _ChannelExecutor_channel.set(this, new Array()); - _ChannelExecutor_signal.set(this, null); - } - clear() { - __classPrivateFieldGet(this, _ChannelExecutor_channel, "f").splice(0); - } - get length() { - return __classPrivateFieldGet(this, _ChannelExecutor_channel, "f").length; - } - send(v) { - __classPrivateFieldGet(this, _ChannelExecutor_channel, "f").push(v); - } - start(delay, apply) { - this.stop(); - __classPrivateFieldSet(this, _ChannelExecutor_signal, GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, () => { - const e = __classPrivateFieldGet(this, _ChannelExecutor_channel, "f").shift(); - return typeof e === 'undefined' ? true : apply(e); - }), "f"); - } - stop() { - if (__classPrivateFieldGet(this, _ChannelExecutor_signal, "f") !== null) - GLib.source_remove(__classPrivateFieldGet(this, _ChannelExecutor_signal, "f")); - } -} -_ChannelExecutor_channel = new WeakMap(), _ChannelExecutor_signal = new WeakMap(); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/extension.js deleted file mode 100644 index f2fb8094..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/extension.js +++ /dev/null @@ -1,2314 +0,0 @@ -import * as Config from './config.js'; -import * as Forest from './forest.js'; -import * as Ecs from './ecs.js'; -import * as Events from './events.js'; -import * as Focus from './focus.js'; -import * as Geom from './geom.js'; -import * as GrabOp from './grab_op.js'; -import * as Keybindings from './keybindings.js'; -import * as Lib from './lib.js'; -import * as log from './log.js'; -import * as PanelSettings from './panel_settings.js'; -import * as Rect from './rectangle.js'; -import * as Settings from './settings.js'; -import * as Tiling from './tiling.js'; -import * as Window from './window.js'; -import * as launcher from './launcher.js'; -import * as auto_tiler from './auto_tiler.js'; -import * as node from './node.js'; -import * as utils from './utils.js'; -import * as Executor from './executor.js'; -import * as movement from './movement.js'; -import * as stack from './stack.js'; -import * as add_exception from './dialog_add_exception.js'; -import * as exec from './executor.js'; -import * as dbus_service from './dbus_service.js'; -import * as scheduler from './scheduler.js'; -import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; -const display = global.display; -const wim = global.window_manager; -const wom = global.workspace_manager; -const Movement = movement.Movement; -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import St from 'gi://St'; -import Shell from 'gi://Shell'; -import Meta from 'gi://Meta'; -const { GlobalEvent, WindowEvent } = Events; -const { cursor_rect, is_keyboard_op, is_resize_op, is_move_op } = Lib; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -const { layoutManager, loadTheme, overview, panel, setThemeStylesheet, screenShield, sessionMode, windowAttentionHandler, } = Main; -import { ScreenShield } from 'resource:///org/gnome/shell/ui/screenShield.js'; -import { WindowSwitcherPopup, } from 'resource:///org/gnome/shell/ui/altTab.js'; -import { Workspace } from 'resource:///org/gnome/shell/ui/workspace.js'; -import { WorkspaceThumbnail } from 'resource:///org/gnome/shell/ui/workspaceThumbnail.js'; -import { WindowPreview } from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import { PACKAGE_VERSION } from 'resource:///org/gnome/shell/misc/config.js'; -import * as Tags from './tags.js'; -import { get_current_path } from './paths.js'; -const STYLESHEET_PATHS = ['light', 'dark', 'highcontrast'].map(stylesheet_path); -const STYLESHEETS = STYLESHEET_PATHS.map((path) => Gio.File.new_for_path(path)); -const GNOME_VERSION = PACKAGE_VERSION; -var Style; -(function (Style) { - Style[Style["Light"] = 0] = "Light"; - Style[Style["Dark"] = 1] = "Dark"; - Style[Style["HighContrast"] = 2] = "HighContrast"; -})(Style || (Style = {})); -export class Ext extends Ecs.System { - constructor() { - super(new Executor.GLibExecutor()); - this.keybindings = new Keybindings.Keybindings(this); - this.settings = new Settings.ExtensionSettings(); - this.overlay = new St.BoxLayout({ style_class: 'pop-shell-overlay', visible: false }); - this.window_search = new launcher.Launcher(this); - this.dbus = new dbus_service.Service(); - this.animate_windows = true; - this.button = null; - this.button_gio_icon_auto_on = null; - this.button_gio_icon_auto_off = null; - this.conf = new Config.Config(); - this.conf_watch = null; - this.column_size = 32; - this.current_style = Style.Dark; - this.displays_updating = null; - this.row_size = 32; - this.displays = [global.display.get_primary_monitor(), new Map()]; - this.dpi = St.ThemeContext.get_for_stage(global.stage).scale_factor; - this.drag_signal = null; - this.exception_selecting = false; - this.gap_inner = 0; - this.gap_inner_half = 0; - this.gap_inner_prev = 0; - this.gap_outer = 0; - this.gap_outer_prev = 0; - this.grab_op = null; - this.ignore_display_update = false; - this.injections = new Array(); - this.prev_focused = [null, null]; - this.init = true; - this.was_locked = false; - this.moved_by_mouse = false; - this.workareas_update = null; - this.signals = new Map(); - this.size_requests = new Map(); - this.workspace_active = new Map(); - this.ids = this.register_storage(); - this.monitors = this.register_storage(); - this.movements = this.register_storage(); - this.names = this.register_storage(); - this.size_changed_signal = 0; - this.size_signals = this.register_storage(); - this.snapped = this.register_storage(); - this.windows = this.register_storage(); - this.window_signals = this.register_storage(); - this.auto_tiler = null; - this.focus_selector = new Focus.FocusSelector(); - this.tiler = new Tiling.Tiler(this); - this.load_settings(); - this.reload_theme(); - this.register_fn(() => load_theme(this.current_style)); - this.conf.reload(); - if (this.settings.int) { - this.settings.int.connect('changed::gtk-theme', () => { - this.register(Events.global(GlobalEvent.GtkThemeChanged)); - }); - } - if (this.settings.shell) { - this.settings.shell.connect('changed::name', () => { - this.register(Events.global(GlobalEvent.GtkShellChanged)); - }); - } - this.dbus.FocusUp = () => this.focus_up(); - this.dbus.FocusDown = () => this.focus_down(); - this.dbus.FocusLeft = () => this.focus_left(); - this.dbus.FocusRight = () => this.focus_right(); - this.dbus.Launcher = () => this.window_search.open(this); - this.dbus.WindowFocus = (window) => { - const target_window = this.windows.get(window); - if (target_window) { - target_window.activate(); - this.on_focused(target_window); - } - this.window_search.close(); - }; - this.dbus.WindowList = () => { - const wins = new Array(); - for (const window of this.tab_list(Meta.TabList.NORMAL, null)) { - const string = window.window_app.get_id(); - wins.push([window.entity, window.title(), window.name(this), string ? string : '']); - } - return wins; - }; - this.dbus.WindowQuit = (win) => { - this.windows.get(win)?.meta.delete(global.get_current_time()); - this.window_search.close(); - }; - } - register_fn(callback, name) { - this.register({ tag: 1, callback, name }); - } - run(event) { - switch (event.tag) { - case 1: - event.callback(); - break; - case 2: - let win = event.window; - if (!win.actor_exists()) - return; - if (event.kind.tag === 1) { - const { window } = event; - let movement = this.movements.remove(window.entity); - if (!movement) - return; - let actor = window.meta.get_compositor_private(); - if (!actor) { - this.auto_tiler?.detach_window(this, window.entity); - return; - } - actor.remove_all_transitions(); - const { x, y, width, height } = movement; - window.meta.move_resize_frame(true, x, y, width, height); - window.meta.move_frame(true, x, y); - this.monitors.insert(window.entity, [win.meta.get_monitor(), win.workspace_id()]); - if (win.activate_after_move) { - win.activate_after_move = false; - win.activate(); - } - return; - } - switch (event.kind.event) { - case WindowEvent.Maximize: - this.unset_grab_op(); - this.on_maximize(win); - break; - case WindowEvent.Minimize: - this.unset_grab_op(); - this.on_minimize(win); - break; - case WindowEvent.Size: - if (this.auto_tiler && !win.is_maximized() && !win.meta.is_fullscreen()) { - this.auto_tiler.reflow(this, win.entity); - } - break; - case WindowEvent.Workspace: - this.on_workspace_changed(win); - break; - case WindowEvent.Fullscreen: - if (this.auto_tiler) { - let attachment = this.auto_tiler.attached.get(win.entity); - if (attachment) { - if (!win.meta.is_fullscreen()) { - let fork = this.auto_tiler.forest.forks.get(win.entity); - if (fork) { - this.auto_tiler.reflow(this, win.entity); - } - if (win.stack !== null) { - this.auto_tiler.forest.stacks.get(win.stack)?.set_visible(true); - } - } - else { - if (win.stack !== null) { - this.auto_tiler.forest.stacks.get(win.stack)?.set_visible(false); - } - } - } - } - break; - } - break; - case 3: - let actor = event.window.get_compositor_private(); - if (!actor) - return; - this.on_window_create(event.window, actor); - break; - case 4: - switch (event.event) { - case GlobalEvent.GtkShellChanged: - this.on_gtk_shell_changed(); - break; - case GlobalEvent.GtkThemeChanged: - this.on_gtk_theme_change(); - break; - case GlobalEvent.MonitorsChanged: - this.update_display_configuration(false); - break; - case GlobalEvent.OverviewShown: - this.on_overview_shown(); - break; - } - break; - } - } - activate_window(window) { - if (window) { - window.activate(); - } - } - active_monitor() { - return display.get_current_monitor(); - } - active_window_list() { - let workspace = wom.get_active_workspace(); - return this.tab_list(Meta.TabList.NORMAL_ALL, workspace); - } - active_workspace() { - return wom.get_active_workspace_index(); - } - actor_of(entity) { - const window = this.windows.get(entity); - return window ? window.meta.get_compositor_private() : null; - } - connect(object, property, callback) { - const signal = object.connect(property, callback); - const entry = this.signals.get(object); - if (entry) { - entry.push(signal); - } - else { - this.signals.set(object, [signal]); - } - return signal; - } - connect_meta(win, signal, callback) { - const id = win.meta.connect(signal, () => { - if (win.actor_exists()) - callback(); - }); - this.window_signals.get_or(win.entity, () => new Array()).push(id); - return id; - } - connect_size_signal(win, signal, func) { - return this.connect_meta(win, signal, () => { - if (!this.contains_tag(win.entity, Tags.Blocked)) - func(); - }); - } - connect_window(win) { - const size_event = () => { - const old = this.size_requests.get(win.meta); - if (old) { - try { - GLib.source_remove(old); - } - catch (_) { } - } - const new_s = GLib.timeout_add(GLib.PRIORITY_LOW, 500, () => { - this.register(Events.window_event(win, WindowEvent.Size)); - this.size_requests.delete(win.meta); - return false; - }); - this.size_requests.set(win.meta, new_s); - }; - this.connect_meta(win, 'workspace-changed', () => { - this.register(Events.window_event(win, WindowEvent.Workspace)); - }); - this.size_signals.insert(win.entity, [ - this.connect_size_signal(win, 'size-changed', size_event), - this.connect_size_signal(win, 'position-changed', size_event), - this.connect_size_signal(win, 'notify::minimized', () => { - this.register(Events.window_event(win, WindowEvent.Minimize)); - }), - ]); - } - exception_add(win) { - this.exception_selecting = false; - let d = new add_exception.AddExceptionDialog(() => this.exception_dialog(), () => { - let wmclass = win.meta.get_wm_class(); - if (wmclass !== null && wmclass.length === 0) { - wmclass = win.name(this); - } - if (wmclass) - this.conf.add_app_exception(wmclass); - this.exception_dialog(); - }, () => { - let wmclass = win.meta.get_wm_class(); - if (wmclass) - this.conf.add_window_exception(wmclass, win.title()); - this.exception_dialog(); - }, () => { - this.conf.reload(); - this.tiling_config_reapply(); - }); - d.open(); - } - exception_dialog() { - let path = get_current_path() + '/floating_exceptions/main.js'; - const event_handler = (event) => { - switch (event) { - case 'MODIFIED': - this.register_fn(() => { - this.conf.reload(); - this.tiling_config_reapply(); - }); - break; - case 'SELECT': - this.register_fn(() => this.exception_select()); - return false; - } - return true; - }; - const ipc = utils.async_process_ipc(['gjs', '--module', path]); - if (ipc) { - const generator = (stdout, res) => { - try { - const [bytes] = stdout.read_line_finish(res); - if (bytes) { - if (event_handler(imports.byteArray.toString(bytes).trim())) { - ipc.stdout.read_line_async(0, ipc.cancellable, generator); - } - } - } - catch (why) { - log.error(`failed to read response from floating exceptions dialog: ${why}`); - } - }; - ipc.stdout.read_line_async(0, ipc.cancellable, generator); - } - } - exception_select() { - GLib.timeout_add(GLib.PRIORITY_LOW, 500, () => { - this.exception_selecting = true; - overview.show(); - return false; - }); - } - exit_modes() { - this.tiler.exit(this); - this.window_search.reset(); - this.window_search.close(); - this.overlay.visible = false; - } - find_monitor_to_retach(width, height) { - if (!this.settings.workspaces_only_on_primary()) { - for (const [index, display] of this.displays[1]) { - if (display.area.width == width && display.area.height == height) { - return [index, display]; - } - } - } - const primary = display.get_primary_monitor(); - return [primary, this.displays[1].get(primary)]; - } - find_unused_workspace(monitor) { - if (!this.auto_tiler) - return [0, wom.get_workspace_by_index(0)]; - let id = 0; - const tiled_windows = new Array(); - for (const [window] of this.auto_tiler.attached.iter()) { - if (!this.auto_tiler.attached.contains(window)) - continue; - const win = this.windows.get(window); - if (win && !win.reassignment && win.meta.get_monitor() === monitor) - tiled_windows.push(win); - } - cancel: while (true) { - for (const window of tiled_windows) { - if (window.workspace_id() === id) { - id += 1; - continue cancel; - } - } - break; - } - let new_work; - if (id + 1 === wom.get_n_workspaces()) { - id += 1; - new_work = wom.append_new_workspace(true, global.get_current_time()); - } - else { - new_work = wom.get_workspace_by_index(id); - } - return [id, new_work]; - } - focus_left() { - this.stack_select((id, stack) => (id === 0 ? null : stack.tabs[id - 1].entity), () => this.activate_window(this.focus_selector.left(this, null))); - } - focus_right() { - this.stack_select((id, stack) => (stack.tabs.length > id + 1 ? stack.tabs[id + 1].entity : null), () => this.activate_window(this.focus_selector.right(this, null))); - } - focus_down() { - this.activate_window(this.focus_selector.down(this, null)); - } - focus_up() { - this.activate_window(this.focus_selector.up(this, null)); - } - focus_window() { - return this.get_window(display.get_focus_window()); - } - stack_select(select, focus_shift) { - const switched = this.stack_switch((stack) => { - if (!stack) - return false; - const stack_con = this.auto_tiler?.forest.stacks.get(stack.idx); - if (stack_con) { - const id = stack_con.active_id; - if (id !== -1) { - const next = select(id, stack_con); - if (next) { - stack_con.activate(next); - const window = this.windows.get(next); - if (window) { - window.activate(); - return true; - } - } - } - } - return false; - }); - if (!switched) { - focus_shift(); - } - } - stack_switch(apply) { - const window = this.focus_window(); - if (window) { - if (this.auto_tiler) { - const node = this.auto_tiler.find_stack(window.entity); - return node ? apply(node[1].inner) : false; - } - } - } - get_window(meta) { - let entity = this.window_entity(meta); - return entity ? this.windows.get(entity) : null; - } - inject(object, method, func) { - const prev = object[method]; - this.injections.push({ object, method, func: prev }); - object[method] = func; - } - injections_add() { - const screen_unlock_fn = ScreenShield.prototype['deactivate']; - this.inject(ScreenShield.prototype, 'deactivate', (args) => { - screen_unlock_fn.apply(screenShield, [args]); - this.update_display_configuration(true); - }); - } - injections_remove() { - for (const { object, method, func } of this.injections.splice(0)) { - object[method] = func; - } - } - load_settings() { - this.set_gap_inner(this.settings.gap_inner()); - this.set_gap_outer(this.settings.gap_outer()); - this.gap_inner_prev = this.gap_inner; - this.gap_outer_prev = this.gap_outer; - this.column_size = this.settings.column_size() * this.dpi; - this.row_size = this.settings.row_size() * this.dpi; - } - monitor_work_area(monitor) { - const meta = wom.get_active_workspace().get_work_area_for_monitor(monitor); - return Rect.Rectangle.from_meta(meta); - } - monitor_area(monitor) { - const rect = global.display.get_monitor_geometry(monitor); - return rect ? Rect.Rectangle.from_meta(rect) : null; - } - on_active_workspace_changed() { - this.register_fn(() => { - this.exit_modes(); - this.restack(); - const activate_window = (window) => { - this.on_focused(window); - window.activate(true); - this.prev_focused = [null, window.entity]; - }; - const focused = this.focus_window(); - if (focused && focused.same_workspace()) { - activate_window(focused); - return; - } - const workspace_id = this.active_workspace(); - const active = this.workspace_active.get(workspace_id); - if (active) { - const window = this.windows.get(active); - if (window && window.meta.get_workspace().index() == workspace_id && !window.meta.minimized) { - activate_window(window); - return; - } - } - const workspace = wom.get_workspace_by_index(workspace_id); - if (workspace) { - for (const win of workspace.list_windows()) { - const window = this.get_window(win); - if (window && !window.meta.minimized) { - activate_window(window); - return; - } - } - } - }); - } - on_destroy(win) { - if (this.tiler.window !== null && win == this.tiler.window) - this.tiler.exit(this); - const [prev_a, prev_b] = this.prev_focused; - if (prev_a && Ecs.entity_eq(win, prev_a)) { - this.prev_focused[0] = null; - } - else if (prev_b && Ecs.entity_eq(win, prev_b)) { - this.prev_focused[1] = this.prev_focused[0]; - this.prev_focused[0] = null; - } - const window = this.windows.get(win); - if (!window) - return; - const stack = window.stack; - window.destroying = true; - this.window_signals.take_with(win, (signals) => { - for (const signal of signals) { - window.meta.disconnect(signal); - } - }); - if (this.auto_tiler) { - const entity = this.auto_tiler.attached.get(win); - if (entity) { - const fork = this.auto_tiler.forest.forks.get(entity); - if (fork?.right?.is_window(win)) { - const entity = fork.right.inner.kind === 3 ? fork.right.inner.entities[0] : fork.right.inner.entity; - this.windows.with(entity, (sibling) => sibling.activate()); - } - } - } - if (this.auto_tiler) - this.auto_tiler.detach_window(this, win); - if (this.auto_tiler && stack !== null) { - const stack_object = this.auto_tiler.forest.stacks.get(stack); - const prev = this.prev_focused[1]; - if (stack_object && prev) { - const prev_window = this.windows.get(prev); - if (prev_window) { - if (prev_window.stack !== stack) { - stack_object.auto_activate(); - this.prev_focused = [null, stack_object.active]; - this.windows.get(stack_object.active)?.activate(); - } - } - } - } - this.movements.remove(win); - this.windows.remove(win); - this.delete_entity(win); - } - on_display_move(_from_id, _to_id) { - if (!this.auto_tiler) - return; - } - on_focused(win) { - this.workspace_active.set(this.active_workspace(), win.entity); - scheduler.setForeground(win.meta); - this.size_signals_unblock(win); - if (this.exception_selecting) { - this.exception_add(win); - } - if (this.prev_focused[1] !== win.entity) { - this.prev_focused[0] = this.prev_focused[1]; - this.prev_focused[1] = win.entity; - } - if (null !== this.auto_tiler && null !== win.stack) { - ext?.auto_tiler?.forest.stacks.get(win.stack)?.activate(win.entity); - } - this.unmaximize_workspace(win); - this.show_border_on_focused(); - if (this.auto_tiler && win.is_tilable(this) && this.prev_focused[0] !== null) { - let prev = this.windows.get(this.prev_focused[0]); - let is_attached = this.auto_tiler.attached.contains(this.prev_focused[0]); - if (prev && - prev !== win && - is_attached && - prev.actor_exists() && - prev.name(this) !== win.name(this) && - prev.workspace_id() === win.workspace_id()) { - if (prev.rect().contains(win.rect())) { - if (prev.is_maximized()) { - prev.meta.unmaximize(Meta.MaximizeFlags.BOTH); - } - } - else if (prev.stack) { - prev.meta.unmaximize(Meta.MaximizeFlags.BOTH); - this.auto_tiler.forest.stacks.get(prev.stack)?.restack(); - } - } - } - if (this.conf.log_on_focus) { - let msg = `focused Window(${win.entity}) {\n` + - ` class: "${win.meta.get_wm_class()}",\n` + - ` cmdline: ${win.cmdline()},\n` + - ` monitor: ${win.meta.get_monitor()},\n` + - ` name: ${win.name(this)},\n` + - ` rect: ${win.rect().fmt()},\n` + - ` workspace: ${win.workspace_id()},\n` + - ` xid: ${win.xid()},\n` + - ` stack: ${win.stack},\n`; - if (this.auto_tiler) { - msg += ` fork: (${this.auto_tiler.attached.get(win.entity)}),\n`; - } - log.debug(msg + '}'); - } - } - on_tile_attach(entity, window) { - if (this.auto_tiler) { - if (!this.auto_tiler.attached.contains(window)) { - this.windows.with(window, (w) => { - if (w.prev_rect === null) { - w.prev_rect = w.meta.get_frame_rect(); - } - }); - } - this.auto_tiler.attached.insert(window, entity); - } - } - on_tile_detach(win) { - this.windows.with(win, (window) => { - if (window.prev_rect && !window.ignore_detach) { - this.register(Events.window_move(this, window, window.prev_rect)); - window.prev_rect = null; - } - }); - } - show_border_on_focused() { - this.hide_all_borders(); - const focus = this.focus_window(); - if (focus) - focus.show_border(); - } - hide_all_borders() { - for (const win of this.windows.values()) { - win.hide_border(); - } - } - maximized_on_active_display() { - const aws = this.workspace_id(); - for (const window of this.windows.values()) { - if (!window.actor_exists()) - continue; - const wws = this.workspace_id(window); - if (aws[0] === wws[0] && aws[1] === wws[1]) { - if (window.is_maximized()) - return true; - } - } - return false; - } - on_gap_inner() { - let current = this.settings.gap_inner(); - this.set_gap_inner(current); - let prev_gap = this.gap_inner_prev / 4 / this.dpi; - if (current != prev_gap) { - this.update_inner_gap(); - Gio.Settings.sync(); - } - } - update_inner_gap() { - if (this.auto_tiler) { - for (const [entity] of this.auto_tiler.forest.toplevel.values()) { - const fork = this.auto_tiler.forest.forks.get(entity); - if (fork) { - this.auto_tiler.tile(this, fork, fork.area); - } - } - } - else { - this.update_snapped(); - } - } - unmaximize_workspace(win) { - if (this.auto_tiler) { - let mon; - let work; - if (!win.is_tilable(this)) { - return; - } - mon = win.meta.get_monitor(); - work = win.meta.get_workspace().index(); - for (const [, compare] of this.windows.iter()) { - const is_same_space = compare.meta.get_monitor() === mon && compare.meta.get_workspace().index() === work; - if (is_same_space && - !this.contains_tag(compare.entity, Tags.Floating) && - compare.is_maximized() && - win.entity[0] !== compare.entity[0]) { - compare.meta.unmaximize(Meta.MaximizeFlags.BOTH); - } - } - } - } - on_gap_outer() { - let current = this.settings.gap_outer(); - this.set_gap_outer(current); - let prev_gap = this.gap_outer_prev / 4 / this.dpi; - let diff = current - prev_gap; - if (diff != 0) { - this.set_gap_outer(current); - this.update_outer_gap(diff); - Gio.Settings.sync(); - } - } - update_outer_gap(diff) { - if (this.auto_tiler) { - for (const [entity] of this.auto_tiler.forest.toplevel.values()) { - const fork = this.auto_tiler.forest.forks.get(entity); - if (fork) { - fork.area.array[0] += diff * 4; - fork.area.array[1] += diff * 4; - fork.area.array[2] -= diff * 8; - fork.area.array[3] -= diff * 8; - this.auto_tiler.tile(this, fork, fork.area); - } - } - } - else { - this.update_snapped(); - } - } - on_grab_end(meta, op) { - let win = this.get_window(meta); - if (win !== null) { - win.grab = false; - } - if (null === win || !win.is_tilable(this)) { - this.unset_grab_op(); - return; - } - this.on_grab_end_(win, op); - this.unset_grab_op(); - } - on_grab_end_(win, op) { - this.moved_by_mouse = true; - this.size_signals_unblock(win); - if (win.meta && win.meta.minimized) { - this.on_minimize(win); - return; - } - if (win.is_maximized()) { - return; - } - const grab_op = this.grab_op; - if (!win) { - log.error('an entity was dropped, but there is no window'); - return; - } - if (this.auto_tiler && op === undefined) { - let mon = this.monitors.get(win.entity); - if (mon) { - let rect = win.meta.get_work_area_for_monitor(mon[0]); - if (rect && Rect.Rectangle.from_meta(rect).contains(cursor_rect())) { - this.auto_tiler.reflow(this, win.entity); - } - else { - this.auto_tiler.on_drop(this, win, true); - } - } - return; - } - if (!(grab_op && Ecs.entity_eq(grab_op.entity, win.entity))) { - log.error(`grabbed entity is not the same as the one that was dropped`); - return; - } - if (this.auto_tiler) { - let crect = win.rect(); - const rect = grab_op.rect; - if (is_move_op(op)) { - const cmon = win.meta.get_monitor(); - const prev_mon = this.monitors.get(win.entity); - const mon_drop = prev_mon ? prev_mon[0] !== cmon : false; - this.monitors.insert(win.entity, [win.meta.get_monitor(), win.workspace_id()]); - if (rect.x != crect.x || rect.y != crect.y) { - if (rect.contains(cursor_rect())) { - if (this.auto_tiler.attached.contains(win.entity)) { - this.auto_tiler.on_drop(this, win, mon_drop); - } - else { - this.auto_tiler.reflow(this, win.entity); - } - } - else { - this.auto_tiler.on_drop(this, win, mon_drop); - } - } - } - else { - const fork_entity = this.auto_tiler.attached.get(win.entity); - if (fork_entity) { - const forest = this.auto_tiler.forest; - const fork = forest.forks.get(fork_entity); - if (fork) { - if (win.stack) { - const tab_dimension = this.dpi * stack.TAB_HEIGHT; - crect.height += tab_dimension; - crect.y -= tab_dimension; - } - let top_level = forest.find_toplevel(this.workspace_id()); - if (top_level) { - crect.clamp(forest.forks.get(top_level).area); - } - const movement = grab_op.operation(crect); - if (this.movement_is_valid(win, movement)) { - forest.resize(this, fork_entity, fork, win.entity, movement, crect); - forest.arrange(this, fork.workspace); - } - else { - forest.tile(this, fork, fork.area); - } - } - else { - log.error(`no fork component found`); - } - } - else { - log.error(`no fork entity found`); - } - } - } - else if (this.settings.snap_to_grid()) { - this.tiler.snap(this, win); - } - } - previously_focused(active) { - for (const id of [1, 0]) { - const prev = this.prev_focused[id]; - if (prev && !Ecs.entity_eq(active.entity, prev)) { - return prev; - } - } - return null; - } - movement_is_valid(win, movement) { - if ((movement & Movement.SHRINK) !== 0) { - if ((movement & Movement.DOWN) !== 0) { - const w = this.focus_selector.up(this, win); - if (!w) - return false; - const r = w.rect(); - if (r.y + r.height > win.rect().y) - return false; - } - else if ((movement & Movement.UP) !== 0) { - const w = this.focus_selector.down(this, win); - if (!w) - return false; - const r = w.rect(); - if (r.y + r.height < win.rect().y) - return false; - } - else if ((movement & Movement.LEFT) !== 0) { - const w = this.focus_selector.right(this, win); - if (!w) - return false; - const r = w.rect(); - if (r.x + r.width < win.rect().x) - return false; - } - else if ((movement & Movement.RIGHT) !== 0) { - const w = this.focus_selector.left(this, win); - if (!w) - return false; - const r = w.rect(); - if (r.x + r.width > win.rect().x) - return false; - } - } - return true; - } - workspace_window_move(win, prev_monitor, next_monitor) { - const prev_area = win.meta.get_work_area_for_monitor(prev_monitor); - const next_area = win.meta.get_work_area_for_monitor(next_monitor); - if (prev_area && next_area) { - let rect = win.rect(); - let h_ratio = 1; - let w_ratio = 1; - h_ratio = next_area.height / prev_area.height; - rect.height = rect.height * h_ratio; - w_ratio = next_area.width / prev_area.width; - rect.width = rect.width * w_ratio; - if (next_area.x < prev_area.x) { - rect.x = ((next_area.x + rect.x - prev_area.x) / prev_area.width) * next_area.width; - } - else if (next_area.x > prev_area.x) { - rect.x = (rect.x / prev_area.width) * next_area.width + next_area.x; - } - if (next_area.y < prev_area.y) { - rect.y = ((next_area.y + rect.y - prev_area.y) / prev_area.height) * next_area.height; - } - else if (next_area.y > prev_area.y) { - rect.y = (rect.y / prev_area.height) * next_area.height + next_area.y; - } - if (this.auto_tiler) { - if (this.is_floating(win)) { - win.meta.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - win.meta.unmaximize(Meta.MaximizeFlags.VERTICAL); - win.meta.unmaximize(Meta.MaximizeFlags.BOTH); - } - this.register(Events.window_move(this, win, rect)); - } - else { - win.move(this, rect, () => { }); - if (rect.width == next_area.width && rect.height == next_area.height) { - win.meta.maximize(Meta.MaximizeFlags.BOTH); - } - } - } - } - move_monitor(direction) { - const win = this.focus_window(); - if (!win) - return; - const prev_monitor = win.meta.get_monitor(); - const next_monitor = Tiling.locate_monitor(win, direction); - if (next_monitor !== null) { - if (this.auto_tiler && !this.is_floating(win)) { - win.ignore_detach = true; - this.auto_tiler.detach_window(this, win.entity); - this.auto_tiler.attach_to_workspace(this, win, [next_monitor[0], win.workspace_id()]); - } - else { - this.workspace_window_move(win, prev_monitor, next_monitor[0]); - } - } - win.activate_after_move = true; - } - move_workspace(direction) { - const win = this.focus_window(); - if (!win) - return; - const workspace_move = (direction) => { - const ws = win.meta.get_workspace(); - let neighbor = ws.get_neighbor(direction); - const last_window = () => { - const last = wom.get_n_workspaces() - 2 === ws.index() && ws.n_windows === 1; - return last; - }; - const place_on_nearest_window = (auto_tiler, ws, monitor) => { - const src = win.meta.get_frame_rect(); - auto_tiler.detach_window(this, win.entity); - const index = ws.index(); - const coord = [src.x, src.y]; - let nearest_window = null; - let nearest_distance = null; - for (const [entity, window] of this.windows.iter()) { - const other_monitor = window.meta.get_monitor(); - const other_index = window.meta.get_workspace().index(); - if (!this.contains_tag(entity, Tags.Floating) && - other_monitor == monitor && - other_index === index && - !Ecs.entity_eq(win.entity, window.entity)) { - const other_rect = window.rect(); - const other_coord = [other_rect.x, other_rect.y]; - const distance = Geom.distance(coord, other_coord); - if (nearest_distance === null || nearest_distance > distance) { - nearest_window = window; - nearest_distance = distance; - } - } - } - if (nearest_window === null) { - auto_tiler.attach_to_workspace(this, win, [monitor, index]); - } - else { - auto_tiler.attach_to_window(this, nearest_window, win, { src }, false); - } - }; - const move_to_neighbor = (neighbor) => { - const monitor = win.meta.get_monitor(); - if (this.auto_tiler && win.is_tilable(this)) { - win.ignore_detach = true; - place_on_nearest_window(this.auto_tiler, neighbor, monitor); - if (win.meta.minimized) { - this.size_signals_block(win); - win.meta.change_workspace_by_index(neighbor.index(), false); - this.size_signals_unblock(win); - } - } - else { - this.workspace_window_move(win, monitor, monitor); - } - this.workspace_active.set(neighbor.index(), win.entity); - win.activate_after_move = true; - }; - if (neighbor && neighbor.index() !== ws.index()) { - move_to_neighbor(neighbor); - } - else if (direction === Meta.MotionDirection.DOWN && !last_window()) { - if (this.settings.dynamic_workspaces()) { - neighbor = wom.append_new_workspace(false, global.get_current_time()); - } - else { - return; - } - } - else if (direction === Meta.MotionDirection.UP && ws.index() === 0) { - if (this.settings.dynamic_workspaces()) { - wom.append_new_workspace(false, global.get_current_time()); - this.on_workspace_modify(() => true, (current) => current + 1, true); - neighbor = wom.get_workspace_by_index(0); - if (!neighbor) - return; - move_to_neighbor(neighbor); - } - else { - return; - } - } - else { - return; - } - this.size_signals_block(win); - win.meta.change_workspace_by_index(neighbor.index(), true); - neighbor.activate_with_focus(win.meta, global.get_current_time()); - this.size_signals_unblock(win); - }; - switch (direction) { - case Meta.DisplayDirection.DOWN: - workspace_move(Meta.MotionDirection.DOWN); - break; - case Meta.DisplayDirection.UP: - workspace_move(Meta.MotionDirection.UP); - break; - } - if (this.auto_tiler) - this.restack(); - } - on_grab_start(meta, op) { - if (!meta) - return; - let win = this.get_window(meta); - if (win) { - win.grab = true; - if (win.is_tilable(this)) { - let entity = win.entity; - let rect = win.rect(); - this.unset_grab_op(); - this.grab_op = new GrabOp.GrabOp(entity, rect); - this.size_signals_block(win); - if (overview.visible || !win || is_keyboard_op(op) || is_resize_op(op)) - return; - const workspace = this.active_workspace(); - this.drag_signal = GLib.timeout_add(GLib.PRIORITY_LOW, 200, () => { - this.overlay.visible = false; - if (!win || !this.auto_tiler || !this.grab_op || this.grab_op.entity !== entity) { - this.drag_signal = null; - return false; - } - const [cursor, monitor] = this.cursor_status(); - let attach_to = null; - for (const found of this.windows_at_pointer(cursor, monitor, workspace)) { - if (found != win && this.auto_tiler.attached.contains(found.entity)) { - attach_to = found; - break; - } - } - const fork = this.auto_tiler.get_parent_fork(entity); - if (!fork) - return true; - let windowless = this.auto_tiler.largest_on_workspace(this, monitor, workspace) === null; - if (attach_to === null) { - if (fork.left.inner.kind === 2 && fork.right?.inner.kind === 2) { - let attaching = fork.left.is_window(entity) - ? fork.right.inner.entity - : fork.left.inner.entity; - attach_to = this.windows.get(attaching); - } - } - let area, monitor_attachment; - if (windowless) { - [area, monitor_attachment] = [this.monitor_work_area(monitor), true]; - area.x += this.gap_outer; - area.y += this.gap_outer; - area.width -= this.gap_outer * 2; - area.height -= this.gap_outer * 2; - } - else if (attach_to) { - const is_sibling = this.auto_tiler.windows_are_siblings(entity, attach_to.entity); - [area, monitor_attachment] = - (win.stack === null && attach_to.stack === null && is_sibling) || - (win.stack === null && is_sibling) - ? [fork.area, false] - : [attach_to.meta.get_frame_rect(), false]; - } - else { - return true; - } - const result = monitor_attachment ? null : auto_tiler.cursor_placement(this, area, cursor); - if (!result) { - this.overlay.x = area.x; - this.overlay.y = area.y; - this.overlay.width = area.width; - this.overlay.height = area.height; - this.overlay.visible = true; - return true; - } - const { orientation, swap } = result; - const half_width = area.width / 2; - const half_height = area.height / 2; - let new_area = orientation === Lib.Orientation.HORIZONTAL - ? swap - ? [area.x, area.y, half_width, area.height] - : [area.x + half_width, area.y, half_width, area.height] - : swap - ? [area.x, area.y, area.width, half_height] - : [area.x, area.y + half_height, area.width, half_height]; - this.overlay.x = new_area[0]; - this.overlay.y = new_area[1]; - this.overlay.width = new_area[2]; - this.overlay.height = new_area[3]; - this.overlay.visible = true; - return true; - }); - } - } - } - on_gtk_shell_changed() { - this.reload_theme(); - load_theme(this.current_style); - } - on_gtk_theme_change() { - this.reload_theme(); - load_theme(this.current_style); - } - reload_theme() { - this.current_style = this.settings.is_dark() - ? Style.Dark - : this.settings.is_high_contrast() - ? Style.HighContrast - : Style.Light; - } - on_maximize(win) { - if (win.is_maximized()) { - const actor = win.meta.get_compositor_private(); - if (actor) - global.window_group.set_child_above_sibling(actor, null); - this.on_monitor_changed(win, (_cfrom, cto, workspace) => { - if (win) { - win.ignore_detach = true; - this.monitors.insert(win.entity, [cto, workspace]); - this.auto_tiler?.detach_window(this, win.entity); - } - }); - } - else { - this.register_fn(() => { - if (this.auto_tiler) { - let fork_ent = this.auto_tiler.attached.get(win.entity); - if (fork_ent) { - let fork = this.auto_tiler.forest.forks.get(fork_ent); - if (fork) - this.auto_tiler.tile(this, fork, fork.area); - } - } - }); - } - } - on_minimize(win) { - if (this.focus_window() == win && this.settings.active_hint()) { - if (win.meta.minimized) { - win.hide_border(); - } - else { - this.show_border_on_focused(); - } - } - if (this.auto_tiler) { - if (win.meta.minimized) { - const attached = this.auto_tiler.attached.get(win.entity); - if (!attached) - return; - const fork = this.auto_tiler.forest.forks.get(attached); - if (!fork) - return; - let attachment; - if (win.stack !== null) { - attachment = win.stack; - } - else { - attachment = fork.left.is_window(win.entity); - } - win.was_attached_to = [attached, attachment]; - this.auto_tiler.detach_window(this, win.entity); - } - else if (!this.contains_tag(win.entity, Tags.Floating)) { - if (win.was_attached_to) { - const [entity, attachment] = win.was_attached_to; - delete win.was_attached_to; - const tiler = this.auto_tiler; - const fork = tiler.forest.forks.get(entity); - if (fork) { - if (typeof attachment === 'boolean') { - tiler.forest.attach_fork(this, fork, win.entity, attachment); - tiler.tile(this, fork, fork.area); - return; - } - else { - const stack = tiler.forest.stacks.get(attachment); - if (stack) { - const stack_info = tiler.find_stack(stack.active); - if (stack_info) { - const node = stack_info[1].inner; - win.stack = attachment; - node.entities.push(win.entity); - tiler.update_stack(this, node); - tiler.forest.on_attach(fork.entity, win.entity); - stack.activate(win.entity); - tiler.tile(this, fork, fork.area); - return; - } - } - } - } - } - this.auto_tiler.auto_tile(this, win, false); - } - } - } - on_monitor_changed(win, func) { - const actual_monitor = win.meta.get_monitor(); - const actual_workspace = win.workspace_id(); - const monitor = this.monitors.get(win.entity); - if (monitor) { - const [expected_monitor, expected_workspace] = monitor; - if (expected_monitor != actual_monitor || actual_workspace != expected_workspace) { - func(expected_monitor, actual_monitor, actual_workspace); - } - } - else { - func(null, actual_monitor, actual_workspace); - } - } - on_overview_shown() { - this.exit_modes(); - this.unset_grab_op(); - } - on_show_window_titles() { - const show_title = this.settings.show_title(); - if (indicator) { - indicator.toggle_titles.setToggleState(show_title); - } - for (const window of this.windows.values()) { - if (window.meta.is_client_decorated()) - continue; - if (show_title) { - window.decoration_show(this); - } - else { - window.decoration_hide(this); - } - } - } - on_smart_gap() { - if (this.auto_tiler) { - const smart_gaps = this.settings.smart_gaps(); - for (const [entity, [mon]] of this.auto_tiler.forest.toplevel.values()) { - const node = this.auto_tiler.forest.forks.get(entity); - if (node?.right === null) { - this.auto_tiler.update_toplevel(this, node, mon, smart_gaps); - } - } - } - } - on_window_create(window, actor) { - let win = this.get_window(window); - if (win) { - const entity = win.entity; - actor.connect('destroy', () => { - if (win && win.border) { - win.border.destroy(); - win.border = null; - } - this.on_destroy(entity); - return false; - }); - if (win.is_tilable(this)) { - this.connect_window(win); - } - } - } - on_workspace_added(_number) { - this.ignore_display_update = true; - } - on_workspace_changed(win) { - if (this.auto_tiler && !this.contains_tag(win.entity, Tags.Floating)) { - const id = this.workspace_id(win); - const prev_id = this.monitors.get(win.entity); - if (!prev_id || id[0] != prev_id[0] || id[1] != prev_id[1]) { - win.ignore_detach = true; - this.monitors.insert(win.entity, id); - if (win.is_tilable(this)) { - this.auto_tiler.detach_window(this, win.entity); - this.auto_tiler.attach_to_workspace(this, win, id); - } - } - if (win.meta.minimized) { - this.size_signals_block(win); - win.meta.unminimize(); - this.size_signals_unblock(win); - } - } - } - on_workspace_index_changed(prev, next) { - this.on_workspace_modify((current) => current == prev, (_) => next); - } - on_workspace_modify(condition, modify, change_workspace = false) { - function window_move(ext, entity, ws) { - if (change_workspace) { - const window = ext.windows.get(entity); - if (!window || !window.actor_exists() || window.meta.is_on_all_workspaces()) - return; - ext.size_signals_block(window); - window.meta.change_workspace_by_index(ws, false); - ext.size_signals_unblock(window); - } - } - if (this.auto_tiler) { - for (const [entity, monitor] of this.auto_tiler.forest.toplevel.values()) { - if (condition(monitor[1])) { - const value = modify(monitor[1]); - monitor[1] = value; - let fork = this.auto_tiler.forest.forks.get(entity); - if (fork) { - fork.workspace = value; - for (const child of this.auto_tiler.forest.iter(entity)) { - if (child.inner.kind === 1) { - fork = this.auto_tiler.forest.forks.get(child.inner.entity); - if (fork) - fork.workspace = value; - } - else if (child.inner.kind === 2) { - window_move(this, child.inner.entity, value); - } - else if (child.inner.kind === 3) { - let stack = this.auto_tiler.forest.stacks.get(child.inner.idx); - if (stack) { - stack.workspace = value; - for (const entity of child.inner.entities) { - window_move(this, entity, value); - } - stack.restack(); - } - } - } - } - } - } - for (const window of this.windows.values()) { - if (!window.actor_exists()) - this.auto_tiler.detach_window(this, window.entity); - } - } - else { - let to_delete = new Array(); - for (const [entity, window] of this.windows.iter()) { - if (!window.actor_exists()) { - to_delete.push(entity); - continue; - } - const ws = window.workspace_id(); - if (condition(ws)) { - window_move(this, entity, modify(ws)); - } - } - for (const e of to_delete) - this.delete_entity(e); - } - } - on_workspace_removed(number) { - this.on_workspace_modify((current) => current > number, (prev) => prev - 1); - } - restack() { - let attempts = 0; - GLib.timeout_add(GLib.PRIORITY_LOW, 50, () => { - if (this.auto_tiler) { - for (const container of this.auto_tiler.forest.stacks.values()) { - container.restack(); - } - } - let x = attempts; - attempts += 1; - return x < 10; - }); - } - set_gap_inner(gap) { - this.gap_inner_prev = this.gap_inner; - this.gap_inner = gap * 4 * this.dpi; - this.gap_inner_half = this.gap_inner / 2; - } - set_gap_outer(gap) { - this.gap_outer_prev = this.gap_outer; - this.gap_outer = gap * 4 * this.dpi; - } - set_overlay(rect) { - this.overlay.x = rect.x; - this.overlay.y = rect.y; - this.overlay.width = rect.width; - this.overlay.height = rect.height; - } - signals_attach() { - this.tiler.queue.start(100, (movement) => { - movement(); - return true; - }); - const workspace_manager = wom; - for (const [, ws] of iter_workspaces(workspace_manager)) { - let index = ws.index(); - this.connect(ws, 'notify::workspace-index', () => { - if (ws !== null) { - let new_index = ws.index(); - this.on_workspace_index_changed(index, new_index); - index = new_index; - } - }); - } - this.connect(display, 'workareas-changed', () => { - this.update_display_configuration(true); - }); - this.size_changed_signal = this.connect(wim, 'size-change', (_, actor, event, _before, _after) => { - if (this.auto_tiler) { - let win = this.get_window(actor.get_meta_window()); - if (!win) - return; - if (event === Meta.SizeChange.MAXIMIZE || event === Meta.SizeChange.UNMAXIMIZE) { - this.register(Events.window_event(win, WindowEvent.Maximize)); - } - else { - this.register(Events.window_event(win, WindowEvent.Fullscreen)); - } - } - }); - this.connect(this.settings.ext, 'changed', (_s, key) => { - switch (key) { - case 'active-hint': - if (indicator) - indicator.toggle_active.setToggleState(this.settings.active_hint()); - this.show_border_on_focused(); - case 'gap-inner': - this.on_gap_inner(); - break; - case 'gap-outer': - this.on_gap_outer(); - break; - case 'show-title': - this.on_show_window_titles(); - break; - case 'smart-gaps': - this.on_smart_gap(); - this.show_border_on_focused(); - break; - case 'show-skip-taskbar': - if (this.settings.show_skiptaskbar()) { - _show_skip_taskbar_windows(this); - } - else { - _hide_skip_taskbar_windows(); - } - } - }); - if (this.settings.mutter) { - this.connect(this.settings.mutter, 'changed::workspaces-only-on-primary', () => { - this.register(Events.global(GlobalEvent.MonitorsChanged)); - }); - } - this.connect(layoutManager, 'monitors-changed', () => { - this.register(Events.global(GlobalEvent.MonitorsChanged)); - }); - this.connect(sessionMode, 'updated', () => { - if (indicator) { - indicator.button.visible = !sessionMode.isLocked; - } - if (sessionMode.isLocked) { - this.exit_modes(); - } - }); - this.connect(overview, 'showing', () => { - this.register(Events.global(GlobalEvent.OverviewShown)); - }); - this.connect(overview, 'hiding', () => { - const window = this.focus_window(); - if (window) { - this.on_focused(window); - } - this.register(Events.global(GlobalEvent.OverviewHidden)); - }); - this.register_fn(() => { - if (screenShield?.locked) - this.update_display_configuration(false); - this.connect(display, 'notify::focus-window', () => { - if (Main.modalCount !== 0) { - const { actor } = Main.modalActorFocusStack[0]; - if (actor.style_class !== 'switcher-popup') { - return; - } - } - const refocus_tiled_window = () => { - let window = null; - const [x, y] = this.prev_focused; - if (y) { - window = this.windows.get(y); - } - if (window === null && x) { - window = this.windows.get(x); - } - if (window && window.same_monitor() && window.same_workspace() && !window.meta.minimized) { - window.activate(false); - } - else { - this.hide_all_borders(); - } - }; - this.register_fn(() => { - let meta_window = global.display.get_focus_window(); - if (meta_window) { - const shell_window = this.get_window(meta_window); - if (shell_window) { - if (shell_window.entity !== this.prev_focused[1] && !shell_window.meta.minimized) { - this.on_focused(shell_window); - } - } - else if (!meta_window.is_override_redirect()) { - if (this.auto_tiler && meta_window.window_type === Meta.WindowType.DESKTOP) { - refocus_tiled_window(); - } - else { - meta_window.activate(global.get_current_time()); - } - } - } - else if (this.auto_tiler) { - refocus_tiled_window(); - } - }); - return false; - }); - const window = this.focus_window(); - if (window) { - this.on_focused(window); - } - return false; - }); - this.connect(display, 'window_created', (_, window) => { - this.register({ tag: 3, window }); - }); - if (GNOME_VERSION?.startsWith('3.')) { - this.connect(display, 'grab-op-begin', (_, _display, win, op) => { - this.on_grab_start(win, op); - }); - this.connect(display, 'grab-op-end', (_, _display, win, op) => { - this.register_fn(() => this.on_grab_end(win, op)); - }); - } - else { - this.connect(display, 'grab-op-begin', (_display, win, op) => { - this.on_grab_start(win, op); - }); - this.connect(display, 'grab-op-end', (_display, win, op) => { - this.register_fn(() => this.on_grab_end(win, op)); - }); - } - this.connect(overview, 'window-drag-begin', (_, win) => { - this.on_grab_start(win, 1); - }); - this.connect(overview, 'window-drag-end', (_, win) => { - this.register_fn(() => this.on_grab_end(win)); - }); - this.connect(overview, 'window-drag-cancelled', () => { - this.unset_grab_op(); - }); - this.connect(wim, 'switch-workspace', () => { - this.hide_all_borders(); - }); - this.connect(workspace_manager, 'active-workspace-changed', () => { - this.on_active_workspace_changed(); - }); - this.connect(workspace_manager, 'workspace-removed', (_, number) => { - this.on_workspace_removed(number); - }); - this.connect(workspace_manager, 'workspace-added', (_, number) => { - this.on_workspace_added(number); - }); - this.connect(workspace_manager, 'showing-desktop-changed', () => { - this.hide_all_borders(); - this.prev_focused = [null, null]; - }); - St.ThemeContext.get_for_stage(global.stage).connect('notify::scale-factor', () => this.update_scale()); - if (this.settings.tile_by_default() && !this.auto_tiler) { - this.auto_tiler = new auto_tiler.AutoTiler(new Forest.Forest() - .connect_on_attach(this.on_tile_attach.bind(this)) - .connect_on_detach(this.on_tile_detach.bind(this)), this.register_storage()); - } - if (this.init) { - for (const window of this.tab_list(Meta.TabList.NORMAL, null)) { - this.register({ tag: 3, window: window.meta }); - } - this.register_fn(() => (this.init = false)); - } - } - signals_remove() { - for (const [object, signals] of this.signals) { - for (const signal of signals) { - object.disconnect(signal); - } - } - if (this.conf_watch) { - this.conf_watch[0].disconnect(this.conf_watch[1]); - this.conf_watch = null; - } - this.tiler.queue.stop(); - this.signals.clear(); - } - size_changed_block() { - utils.block_signal(wim, this.size_changed_signal); - } - size_changed_unblock() { - utils.unblock_signal(wim, this.size_changed_signal); - } - size_signals_block(win) { - this.add_tag(win.entity, Tags.Blocked); - } - size_signals_unblock(win) { - this.delete_tag(win.entity, Tags.Blocked); - } - snap_windows() { - for (const window of this.windows.values()) { - if (window.is_tilable(this)) - this.tiler.snap(this, window); - } - } - switch_to_workspace(id) { - this.workspace_by_id(id)?.activate(global.get_current_time()); - } - stop_launcher_services() { - this.window_search.stop_services(this); - } - tab_list(tablist, workspace) { - const windows = display.get_tab_list(tablist, workspace); - const matched = new Array(); - for (const window of windows) { - const win = this.get_window(window); - if (win) - matched.push(win); - } - return matched; - } - *tiled_windows() { - for (const entity of this.entities()) { - if (this.contains_tag(entity, Tags.Tiled)) { - yield entity; - } - } - } - tiling_config_reapply() { - if (this.auto_tiler) { - const at = this.auto_tiler; - for (const [entity, window] of this.windows.iter()) { - const attachment = at.attached.get(entity); - if (window.is_tilable(this)) { - if (!attachment) { - at.auto_tile(this, window, this.init); - } - } - else if (attachment) { - at.detach_window(this, entity); - } - } - } - } - toggle_tiling() { - if (this.settings.tile_by_default()) { - this.auto_tile_off(); - } - else { - this.auto_tile_on(); - } - } - auto_tile_off() { - this.settings.set_edge_tiling(true); - this.hide_all_borders(); - if (this.auto_tiler) { - this.unregister_storage(this.auto_tiler.attached); - this.auto_tiler.destroy(this); - this.auto_tiler = null; - this.settings.set_tile_by_default(false); - if (indicator) - indicator.toggle_tiled.setToggleState(false); - this.button.icon.gicon = this.button_gio_icon_auto_off; - if (this.settings.active_hint()) { - this.show_border_on_focused(); - } - } - } - auto_tile_on() { - this.settings.set_edge_tiling(false); - this.hide_all_borders(); - if (indicator) - indicator.toggle_tiled.setToggleState(true); - const original = this.active_workspace(); - let tiler = new auto_tiler.AutoTiler(new Forest.Forest() - .connect_on_attach(this.on_tile_attach.bind(this)) - .connect_on_detach(this.on_tile_detach.bind(this)), this.register_storage()); - this.auto_tiler = tiler; - this.settings.set_tile_by_default(true); - this.button.icon.gicon = this.button_gio_icon_auto_on; - for (const window of this.windows.values()) { - if (window.is_tilable(this)) { - let actor = window.meta.get_compositor_private(); - if (actor) { - if (!window.meta.minimized) { - tiler.auto_tile(this, window, true); - } - } - } - } - this.register_fn(() => this.switch_to_workspace(original)); - } - schedule_idle(func) { - if (!this.movements.is_empty()) { - GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, () => { - if (!this.movements.is_empty()) - return true; - return func(); - }); - } - else { - func(); - } - return false; - } - should_ignore_workspace(monitor) { - return this.settings.workspaces_only_on_primary() && monitor !== global.display.get_primary_monitor(); - } - unset_grab_op() { - if (this.drag_signal !== null) { - this.overlay.visible = false; - GLib.source_remove(this.drag_signal); - this.drag_signal = null; - } - if (this.grab_op !== null) { - let window = this.windows.get(this.grab_op.entity); - if (window) - this.size_signals_unblock(window); - this.grab_op = null; - } - this.moved_by_mouse = false; - } - update_display_configuration_before() { } - update_display_configuration(workareas_only) { - if (!this.auto_tiler || sessionMode.isLocked) - return; - if (this.ignore_display_update) { - this.ignore_display_update = false; - return; - } - if (layoutManager.monitors.length === 0) - return; - const primary_display = global.display.get_primary_monitor(); - const primary_display_ready = (ext) => { - const area = global.display.get_monitor_geometry(primary_display); - const work_area = ext.monitor_work_area(primary_display); - if (!area || !work_area) - return false; - return !(area.width === work_area.width && area.height === work_area.height); - }; - function displays_ready() { - const monitors = global.display.get_n_monitors(); - if (monitors === 0) - return false; - for (let i = 0; i < monitors; i += 1) { - const display = global.display.get_monitor_geometry(i); - if (!display) - return false; - if (display.width < 1 || display.height < 1) - return false; - } - return true; - } - if (!displays_ready() || !primary_display_ready(this)) { - if (this.displays_updating !== null) - return; - if (this.workareas_update !== null) - GLib.source_remove(this.workareas_update); - this.workareas_update = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => { - this.register_fn(() => { - this.update_display_configuration(workareas_only); - }); - this.workareas_update = null; - return false; - }); - return; - } - const update_tiling = () => { - if (!this.auto_tiler) - return; - for (const f of this.auto_tiler.forest.forks.values()) { - if (!f.is_toplevel) - continue; - const display = this.monitor_work_area(f.monitor); - if (display) { - const area = new Rect.Rectangle([display.x, display.y, display.width, display.height]); - f.smart_gapped = false; - f.set_area(area.clone()); - this.auto_tiler.update_toplevel(this, f, f.monitor, this.settings.smart_gaps()); - } - } - }; - let migrations = new Array(); - const apply_migrations = (assigned_monitors) => { - if (!migrations) - return; - new exec.OnceExecutor(migrations).start(500, ([fork, new_monitor, workspace, find_workspace]) => { - let new_workspace; - if (find_workspace) { - if (assigned_monitors.has(new_monitor)) { - [new_workspace] = this.find_unused_workspace(new_monitor); - } - else { - assigned_monitors.add(new_monitor); - new_workspace = 0; - } - } - else { - new_workspace = fork.workspace; - } - fork.migrate(this, forest, workspace, new_monitor, new_workspace); - fork.set_ratio(fork.length() / 2); - return true; - }, () => update_tiling()); - }; - function mark_for_reassignment(ext, fork) { - for (const win of forest.iter(fork, node.NodeKind.WINDOW)) { - if (win.inner.kind === 2) { - const entity = win.inner.entity; - const window = ext.windows.get(entity); - if (window) - window.reassignment = true; - } - } - } - const [old_primary, old_displays] = this.displays; - const changes = new Map(); - for (const [entity, w] of this.windows.iter()) { - if (!w.actor_exists()) - continue; - this.monitors.with(entity, ([mon]) => { - const assignment = mon === old_primary ? primary_display : w.meta.get_monitor(); - changes.set(mon, assignment); - }); - } - const updated = new Map(); - for (const monitor of layoutManager.monitors) { - const mon = monitor; - const area = new Rect.Rectangle([mon.x, mon.y, mon.width, mon.height]); - const ws = this.monitor_work_area(mon.index); - updated.set(mon.index, { area, ws }); - } - const forest = this.auto_tiler.forest; - if (old_displays.size === updated.size) { - update_tiling(); - this.displays = [primary_display, updated]; - return; - } - this.displays = [primary_display, updated]; - if (utils.map_eq(old_displays, updated)) { - return; - } - if (this.displays_updating !== null) - GLib.source_remove(this.displays_updating); - if (this.workareas_update !== null) { - GLib.source_remove(this.workareas_update); - this.workareas_update = null; - } - this.displays_updating = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 2000, () => { - (() => { - if (!this.auto_tiler) - return; - const toplevels = new Array(); - const assigned_monitors = new Set(); - for (const [old_mon, new_mon] of changes) { - if (old_mon === new_mon) - assigned_monitors.add(new_mon); - } - for (const f of forest.forks.values()) { - if (f.is_toplevel) { - toplevels.push(f); - let migration = null; - const displays = this.displays[1]; - for (const [old_monitor, new_monitor] of changes) { - const display = displays.get(new_monitor); - if (!display) - continue; - if (f.monitor === old_monitor) { - f.monitor = new_monitor; - f.workspace = 0; - migration = [f, new_monitor, display.ws, true]; - } - } - if (!migration) { - const display = displays.get(f.monitor); - if (display) { - migration = [f, f.monitor, display.ws, false]; - } - } - if (migration) { - mark_for_reassignment(this, migration[0].entity); - migrations.push(migration); - } - } - } - apply_migrations(assigned_monitors); - return; - })(); - this.displays_updating = null; - return false; - }); - } - update_scale() { - const new_dpi = St.ThemeContext.get_for_stage(global.stage).scale_factor; - const diff = new_dpi / this.dpi; - this.dpi = new_dpi; - this.column_size *= diff; - this.row_size *= diff; - this.gap_inner_prev *= diff; - this.gap_inner *= diff; - this.gap_inner_half *= diff; - this.gap_outer_prev *= diff; - this.gap_outer *= diff; - this.update_inner_gap(); - this.update_outer_gap(diff); - } - update_snapped() { - for (const entity of this.snapped.find((val) => val)) { - const window = this.windows.get(entity); - if (window) - this.tiler.snap(this, window); - } - } - window_entity(meta) { - if (!meta) - return null; - let id; - try { - id = meta.get_stable_sequence(); - } - catch (e) { - return null; - } - let entity = this.ids.find((comp) => comp == id).next().value; - if (!entity) { - const actor = meta.get_compositor_private(); - if (!actor) - return null; - let window_app, name; - try { - window_app = Window.window_tracker.get_window_app(meta); - name = window_app.get_name().replace(/&/g, '&'); - } - catch (e) { - return null; - } - const window_type = meta.get_window_type(); - if (window_type !== 0 && window_type !== 3 && window_type !== 4) { - return null; - } - entity = this.create_entity(); - this.ids.insert(entity, id); - this.names.insert(entity, name); - let win = new Window.ShellWindow(entity, meta, window_app, this); - this.windows.insert(entity, win); - this.monitors.insert(entity, [win.meta.get_monitor(), win.workspace_id()]); - const grab_focus = () => { - this.schedule_idle(() => { - this.windows.with(entity, (window) => { - window.meta.raise(); - window.meta.unminimize(); - window.activate(false); - }); - return false; - }); - }; - if (this.auto_tiler && !win.meta.minimized && win.is_tilable(this)) { - let id = actor.connect('first-frame', () => { - this.auto_tiler?.auto_tile(this, win, this.init); - grab_focus(); - actor.disconnect(id); - }); - } - else { - grab_focus(); - } - } - return entity; - } - *windows_at_pointer(cursor, monitor, workspace) { - for (const entity of this.monitors.find((m) => m[0] == monitor && m[1] == workspace)) { - let window = this.windows.with(entity, (window) => { - return window.is_tilable(this) && window.rect().contains(cursor) ? window : null; - }); - if (window) - yield window; - } - } - cursor_status() { - const cursor = cursor_rect(); - const rect = new Meta.Rectangle({ x: cursor.x, y: cursor.y, width: 1, height: 1 }); - const monitor = display.get_monitor_index_for_rect(rect); - return [cursor, monitor]; - } - workspace_by_id(id) { - return wom.get_workspace_by_index(id); - } - workspace_id(window = null) { - let id = window - ? [window.meta.get_monitor(), window.workspace_id()] - : [this.active_monitor(), this.active_workspace()]; - id[0] = Math.max(0, id[0]); - id[1] = Math.max(0, id[1]); - return id; - } - is_floating(window) { - let shall_float = false; - let wm_class = window.meta.get_wm_class(); - let wm_title = window.meta.get_title(); - if (wm_class && wm_title) { - shall_float = this.conf.window_shall_float(wm_class, wm_title); - } - let floating_tagged = this.contains_tag(window.entity, Tags.Floating); - let force_tiled_tagged = this.contains_tag(window.entity, Tags.ForceTile); - return (floating_tagged && !force_tiled_tagged) || (shall_float && !force_tiled_tagged); - } -} -let ext = null; -let indicator = null; -export default class PopShellExtension extends Extension { - enable() { - globalThis.popShellExtension = this; - log.info('enable'); - if (!ext) { - ext = new Ext(); - ext.register_fn(() => { - if (ext?.auto_tiler) - ext.snap_windows(); - }); - } - if (ext.settings.show_skiptaskbar()) { - _show_skip_taskbar_windows(ext); - } - else { - _hide_skip_taskbar_windows(); - } - if (ext.was_locked) { - ext.was_locked = false; - return; - } - ext.injections_add(); - ext.signals_attach(); - disable_window_attention_handler(); - layoutManager.addChrome(ext.overlay); - if (!indicator) { - indicator = new PanelSettings.Indicator(ext); - panel.addToStatusArea('pop-shell', indicator.button); - } - ext.keybindings.enable(ext.keybindings.global).enable(ext.keybindings.window_focus); - if (ext.settings.tile_by_default()) { - ext.auto_tile_on(); - } - } - disable() { - log.info('disable'); - if (ext) { - if (sessionMode.isLocked) { - ext.was_locked = true; - return; - } - delete globalThis.popShellExtension; - ext.injections_remove(); - ext.signals_remove(); - ext.exit_modes(); - ext.stop_launcher_services(); - ext.hide_all_borders(); - ext.window_search.remove_injections(); - layoutManager.removeChrome(ext.overlay); - ext.keybindings.disable(ext.keybindings.global).disable(ext.keybindings.window_focus); - if (ext.auto_tiler) { - ext.auto_tiler.destroy(ext); - ext.auto_tiler = null; - } - _hide_skip_taskbar_windows(); - } - if (indicator) { - indicator.destroy(); - indicator = null; - } - enable_window_attention_handler(); - } -} -const handler = windowAttentionHandler; -function enable_window_attention_handler() { - if (handler && !handler._windowDemandsAttentionId) { - handler._windowDemandsAttentionId = global.display.connect('window-demands-attention', (display, window) => { - handler._onWindowDemandsAttention(display, window); - }); - } -} -function disable_window_attention_handler() { - if (handler && handler._windowDemandsAttentionId) { - global.display.disconnect(handler._windowDemandsAttentionId); - handler._windowDemandsAttentionId = null; - } -} -function stylesheet_path(name) { - return get_current_path() + '/' + name + '.css'; -} -function load_theme(style) { - let pop_stylesheet = Number(style); - try { - const theme_context = St.ThemeContext.get_for_stage(global.stage); - const existing_theme = theme_context.get_theme(); - const pop_stylesheet_path = STYLESHEET_PATHS[pop_stylesheet]; - if (existing_theme) { - for (const s of STYLESHEETS) { - existing_theme.unload_stylesheet(s); - } - existing_theme.load_stylesheet(STYLESHEETS[pop_stylesheet]); - theme_context.set_theme(existing_theme); - } - else { - setThemeStylesheet(pop_stylesheet_path); - loadTheme(); - } - return pop_stylesheet_path; - } - catch (e) { - log.error('failed to load stylesheet: ' + e); - return null; - } -} -function* iter_workspaces(manager) { - let idx = 0; - let ws = manager.get_workspace_by_index(idx); - while (ws !== null) { - yield [idx, ws]; - idx += 1; - ws = manager.get_workspace_by_index(idx); - } -} -let default_isoverviewwindow_ws; -let default_isoverviewwindow_ws_thumbnail; -let default_init_appswitcher; -let default_getwindowlist_windowswitcher; -let default_getcaption_windowpreview; -let default_getcaption_workspace; -function _show_skip_taskbar_windows(ext) { - if (!default_isoverviewwindow_ws) { - default_isoverviewwindow_ws = Workspace.prototype._isOverviewWindow; - Workspace.prototype._isOverviewWindow = function (win) { - let meta_win = win; - if (GNOME_VERSION?.startsWith('3.36')) - meta_win = win.get_meta_window(); - return is_valid_minimize_to_tray(meta_win, ext) || default_isoverviewwindow_ws(win); - }; - } - if (GNOME_VERSION?.startsWith('3.36')) { - if (!default_getcaption_workspace) { - default_getcaption_workspace = Workspace.prototype._getCaption; - Workspace.prototype._getCaption = function () { - let metaWindow = this._windowClone.metaWindow; - if (metaWindow.title) - return metaWindow.title; - let tracker = Shell.WindowTracker.get_default(); - let app = tracker.get_window_app(metaWindow); - return app ? app.get_name() : ''; - }; - } - } - else { - if (!default_getcaption_windowpreview) { - default_getcaption_windowpreview = WindowPreview.prototype._getCaption; - log.debug(`override workspace._getCaption`); - WindowPreview.prototype._getCaption = function () { - if (this.metaWindow.title) - return this.metaWindow.title; - let tracker = Shell.WindowTracker.get_default(); - let app = tracker.get_window_app(this.metaWindow); - return app ? app.get_name() : ''; - }; - } - } - if (!default_isoverviewwindow_ws_thumbnail) { - default_isoverviewwindow_ws_thumbnail = WorkspaceThumbnail.prototype._isOverviewWindow; - WorkspaceThumbnail.prototype._isOverviewWindow = function (win) { - let meta_win = win.get_meta_window(); - return is_valid_minimize_to_tray(meta_win, ext) || default_isoverviewwindow_ws_thumbnail(win); - }; - } - if (!default_getwindowlist_windowswitcher) { - default_getwindowlist_windowswitcher = WindowSwitcherPopup.prototype._getWindowList; - WindowSwitcherPopup.prototype._getWindowList = function () { - let workspace = null; - if (this._settings.get_boolean('current-workspace-only')) { - let workspaceManager = global.workspace_manager; - workspace = workspaceManager.get_active_workspace(); - } - let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, workspace); - return windows - .map((w) => { - let meta_win = w.is_attached_dialog() ? w.get_transient_for() : w; - if (meta_win) { - if (!meta_win.skip_taskbar || is_valid_minimize_to_tray(meta_win, ext)) { - return meta_win; - } - } - return null; - }) - .filter((w, i, a) => w != null && a.indexOf(w) == i); - }; - } -} -function _hide_skip_taskbar_windows() { - if (default_isoverviewwindow_ws) { - Workspace.prototype._isOverviewWindow = default_isoverviewwindow_ws; - default_isoverviewwindow_ws = null; - } - if (GNOME_VERSION?.startsWith('3.36')) { - if (default_getcaption_workspace) { - Workspace.prototype._getCaption = default_getcaption_workspace; - default_getcaption_workspace = null; - } - } - else { - if (default_getcaption_windowpreview) { - WindowPreview.prototype._getCaption = default_getcaption_windowpreview; - default_getcaption_windowpreview = null; - } - } - if (default_isoverviewwindow_ws_thumbnail) { - WorkspaceThumbnail.prototype._isOverviewWindow = default_isoverviewwindow_ws_thumbnail; - default_isoverviewwindow_ws_thumbnail = null; - } - if (default_init_appswitcher) { - default_init_appswitcher = null; - } - if (default_getwindowlist_windowswitcher) { - WindowSwitcherPopup.prototype._getWindowList = default_getwindowlist_windowswitcher; - default_getwindowlist_windowswitcher = null; - } -} -function is_valid_minimize_to_tray(meta_win, ext) { - let cfg = ext.conf; - let valid_min_to_tray = false; - switch (meta_win.window_type) { - case Meta.WindowType.NORMAL: - case Meta.WindowType.UTILITY: - valid_min_to_tray = !meta_win.is_override_redirect(); - break; - } - let gnome_shell_wm_class = meta_win.get_wm_class() === 'Gjs' || meta_win.get_wm_class() === 'Gnome-shell'; - let show_skiptb = !cfg.skiptaskbar_shall_hide(meta_win); - valid_min_to_tray = - valid_min_to_tray && - !meta_win.is_attached_dialog() && - show_skiptb && - meta_win.skip_taskbar && - meta_win.get_wm_class() !== null && - !gnome_shell_wm_class; - return valid_min_to_tray; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/config.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/config.js deleted file mode 100644 index 57e6bf21..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/config.js +++ /dev/null @@ -1,239 +0,0 @@ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -const CONF_DIR = GLib.get_user_config_dir() + '/pop-shell'; -export var CONF_FILE = CONF_DIR + '/config.json'; -export const DEFAULT_FLOAT_RULES = [ - { class: 'Authy Desktop' }, - { class: 'Com.github.amezin.ddterm' }, - { class: 'Com.github.donadigo.eddy' }, - { class: 'Conky' }, - { title: 'Discord Updater' }, - { class: 'Enpass', title: 'Enpass Assistant' }, - { class: 'Floating Window Exceptions' }, - { class: 'Gjs', title: 'Settings' }, - { class: 'Gnome-initial-setup' }, - { class: 'Gnome-terminal', title: 'Preferences – General' }, - { class: 'Guake' }, - { class: 'Io.elementary.sideload' }, - { title: 'JavaEmbeddedFrame' }, - { class: 'KotatogramDesktop', title: 'Media viewer' }, - { class: 'Mozilla VPN' }, - { class: 'update-manager', title: 'Software Updater' }, - { class: 'Solaar' }, - { class: 'Steam', title: '^((?!Steam).)*$' }, - { class: 'Steam', title: '^.*(Guard|Login).*' }, - { class: 'TelegramDesktop', title: 'Media viewer' }, - { class: 'Zotero', title: 'Quick Format Citation' }, - { class: 'firefox', title: '^(?!.*Mozilla Firefox).*$' }, - { class: 'gnome-screenshot' }, - { class: 'ibus-.*' }, - { class: 'jetbrains-toolbox' }, - { class: 'jetbrains-webstorm', title: 'Customize WebStorm' }, - { class: 'jetbrains-webstorm', title: 'License Activation' }, - { class: 'jetbrains-webstorm', title: 'Welcome to WebStorm' }, - { class: 'krunner' }, - { class: 'pritunl' }, - { class: 're.sonny.Junction' }, - { class: 'system76-driver' }, - { class: 'tilda' }, - { class: 'zoom' }, - { class: '^.*action=join.*$' }, - { class: 'gjs' }, -]; -export const SKIPTASKBAR_EXCEPTIONS = [ - { class: 'Conky' }, - { class: 'gjs' }, - { class: 'Guake' }, - { class: 'Com.github.amezin.ddterm' }, - { class: 'plank' }, -]; -export class Config { - constructor() { - this.float = []; - this.skiptaskbarhidden = []; - this.log_on_focus = false; - } - add_app_exception(wmclass) { - for (const r of this.float) { - if (r.class === wmclass && r.title === undefined) - return; - } - this.float.push({ class: wmclass }); - this.sync_to_disk(); - } - add_window_exception(wmclass, title) { - for (const r of this.float) { - if (r.class === wmclass && r.title === title) - return; - } - this.float.push({ class: wmclass, title }); - this.sync_to_disk(); - } - window_shall_float(wclass, title) { - for (const rule of this.float.concat(DEFAULT_FLOAT_RULES)) { - if (rule.class) { - if (!new RegExp(rule.class, 'i').test(wclass)) { - continue; - } - } - if (rule.title) { - if (!new RegExp(rule.title, 'i').test(title)) { - continue; - } - } - return rule.disabled ? false : true; - } - return false; - } - skiptaskbar_shall_hide(meta_window) { - let wmclass = meta_window.get_wm_class(); - let wmtitle = meta_window.get_title(); - if (!meta_window.is_skip_taskbar()) - return false; - for (const rule of this.skiptaskbarhidden.concat(SKIPTASKBAR_EXCEPTIONS)) { - if (rule.class) { - if (!new RegExp(rule.class, 'i').test(wmclass)) { - continue; - } - } - if (rule.title) { - if (!new RegExp(rule.title, 'i').test(wmtitle)) { - continue; - } - } - return rule.disabled ? false : true; - } - return false; - } - reload() { - const conf = Config.from_config(); - if (conf.tag === 0) { - let c = conf.value; - this.float = c.float; - this.log_on_focus = c.log_on_focus; - } - else { - log(`error loading conf: ${conf.why}`); - } - } - rule_disabled(rule) { - for (const value of this.float.values()) { - if (value.disabled && rule.class === value.class && value.title === rule.title) { - return true; - } - } - return false; - } - to_json() { - return JSON.stringify(this, set_to_json, 2); - } - toggle_system_exception(wmclass, wmtitle, disabled) { - if (disabled) { - for (const value of DEFAULT_FLOAT_RULES) { - if (value.class === wmclass && value.title === wmtitle) { - value.disabled = disabled; - this.float.push(value); - this.sync_to_disk(); - return; - } - } - } - let index = 0; - let found = false; - for (const value of this.float) { - if (value.class === wmclass && value.title === wmtitle) { - found = true; - break; - } - index += 1; - } - if (found) - swap_remove(this.float, index); - this.sync_to_disk(); - } - remove_user_exception(wmclass, wmtitle) { - let index = 0; - let found = new Array(); - for (const value of this.float.values()) { - if (value.class === wmclass && value.title === wmtitle) { - found.push(index); - } - index += 1; - } - if (found.length !== 0) { - for (const idx of found) - swap_remove(this.float, idx); - this.sync_to_disk(); - } - } - static from_json(json) { - try { - return JSON.parse(json); - } - catch (error) { - return new Config(); - } - } - static from_config() { - const stream = Config.read(); - if (stream.tag === 1) - return stream; - let value = Config.from_json(stream.value); - return { tag: 0, value }; - } - static gio_file() { - try { - const conf = Gio.File.new_for_path(CONF_FILE); - if (!conf.query_exists(null)) { - const dir = Gio.File.new_for_path(CONF_DIR); - if (!dir.query_exists(null) && !dir.make_directory(null)) { - return { tag: 1, why: 'failed to create pop-shell config directory' }; - } - const example = new Config(); - example.float.push({ class: 'pop-shell-example', title: 'pop-shell-example' }); - conf.create(Gio.FileCreateFlags.NONE, null).write_all(JSON.stringify(example, undefined, 2), null); - } - return { tag: 0, value: conf }; - } - catch (why) { - return { tag: 1, why: `Gio.File I/O error: ${why}` }; - } - } - static read() { - try { - const file = Config.gio_file(); - if (file.tag === 1) - return file; - const [, buffer] = file.value.load_contents(null); - return { tag: 0, value: imports.byteArray.toString(buffer) }; - } - catch (why) { - return { tag: 1, why: `failed to read pop-shell config: ${why}` }; - } - } - static write(data) { - try { - const file = Config.gio_file(); - if (file.tag === 1) - return file; - file.value.replace_contents(data, null, false, Gio.FileCreateFlags.NONE, null); - return { tag: 0, value: file.value }; - } - catch (why) { - return { tag: 1, why: `failed to write to config: ${why}` }; - } - } - sync_to_disk() { - Config.write(this.to_json()); - } -} -function set_to_json(_key, value) { - if (typeof value === 'object' && value instanceof Set) { - return [...value]; - } - return value; -} -function swap_remove(array, index) { - array[index] = array[array.length - 1]; - return array.pop(); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/empty_utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/empty_utils.js deleted file mode 100644 index e69de29b..00000000 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/main.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/main.js deleted file mode 100644 index 660c3de3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/floating_exceptions/main.js +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/gjs --module -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import Gtk from 'gi://Gtk?version=3.0'; -import Pango from 'gi://Pango'; -const SCRIPT_DIR = GLib.path_get_dirname(new Error().stack.split(':')[0].slice(1)); -imports.searchPath.push(SCRIPT_DIR); -import * as config from './config.js'; -const WM_CLASS_ID = 'pop-shell-exceptions'; -var ViewNum; -(function (ViewNum) { - ViewNum[ViewNum["MainView"] = 0] = "MainView"; - ViewNum[ViewNum["Exceptions"] = 1] = "Exceptions"; -})(ViewNum || (ViewNum = {})); -function exceptions_button() { - let title = Gtk.Label.new('System Exceptions'); - title.set_xalign(0); - let description = Gtk.Label.new('Updated based on validated user reports.'); - description.set_xalign(0); - description.get_style_context().add_class('dim-label'); - let icon = Gtk.Image.new_from_icon_name('go-next-symbolic', Gtk.IconSize.BUTTON); - icon.set_hexpand(true); - icon.set_halign(Gtk.Align.END); - let layout = Gtk.Grid.new(); - layout.set_row_spacing(4); - layout.set_border_width(12); - layout.attach(title, 0, 0, 1, 1); - layout.attach(description, 0, 1, 1, 1); - layout.attach(icon, 1, 0, 1, 2); - let button = Gtk.Button.new(); - button.relief = Gtk.ReliefStyle.NONE; - button.add(layout); - return button; -} -export class MainView { - constructor() { - this.callback = () => { }; - let select = Gtk.Button.new_with_label('Select'); - select.set_halign(Gtk.Align.CENTER); - select.connect('clicked', () => this.callback({ tag: 0 })); - select.set_margin_bottom(12); - let exceptions = exceptions_button(); - exceptions.connect('clicked', () => this.callback({ tag: 1, view: ViewNum.Exceptions })); - this.list = Gtk.ListBox.new(); - this.list.set_selection_mode(Gtk.SelectionMode.NONE); - this.list.set_header_func(list_header_func); - this.list.add(exceptions); - let scroller = new Gtk.ScrolledWindow(); - scroller.hscrollbar_policy = Gtk.PolicyType.NEVER; - scroller.set_propagate_natural_width(true); - scroller.set_propagate_natural_height(true); - scroller.add(this.list); - let list_frame = Gtk.Frame.new(null); - list_frame.add(scroller); - let desc = new Gtk.Label({ - label: 'Add exceptions by selecting currently running applications and windows.', - }); - desc.set_line_wrap(true); - desc.set_halign(Gtk.Align.CENTER); - desc.set_justify(Gtk.Justification.CENTER); - desc.set_max_width_chars(55); - desc.set_margin_top(12); - this.widget = Gtk.Box.new(Gtk.Orientation.VERTICAL, 24); - this.widget.add(desc); - this.widget.add(select); - this.widget.add(list_frame); - } - add_rule(wmclass, wmtitle) { - let label = Gtk.Label.new(wmtitle === undefined ? wmclass : `${wmclass} / ${wmtitle}`); - label.set_xalign(0); - label.set_hexpand(true); - label.set_ellipsize(Pango.EllipsizeMode.END); - let button = Gtk.Button.new_from_icon_name('edit-delete', Gtk.IconSize.BUTTON); - button.set_valign(Gtk.Align.CENTER); - let widget = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 24); - widget.add(label); - widget.add(button); - widget.set_border_width(12); - widget.set_margin_start(12); - widget.show_all(); - button.connect('clicked', () => { - widget.destroy(); - this.callback({ tag: 3, wmclass, wmtitle }); - }); - this.list.add(widget); - } -} -export class ExceptionsView { - constructor() { - this.callback = () => { }; - this.exceptions = Gtk.ListBox.new(); - let desc_title = Gtk.Label.new('<b>System Exceptions</b>'); - desc_title.set_use_markup(true); - desc_title.set_xalign(0); - let desc_desc = Gtk.Label.new('Updated based on validated user reports.'); - desc_desc.set_xalign(0); - desc_desc.get_style_context().add_class('dim-label'); - desc_desc.set_margin_bottom(6); - let scroller = new Gtk.ScrolledWindow(); - scroller.hscrollbar_policy = Gtk.PolicyType.NEVER; - scroller.set_propagate_natural_width(true); - scroller.set_propagate_natural_height(true); - scroller.add(this.exceptions); - let exceptions_frame = Gtk.Frame.new(null); - exceptions_frame.add(scroller); - this.exceptions.set_selection_mode(Gtk.SelectionMode.NONE); - this.exceptions.set_header_func(list_header_func); - this.widget = Gtk.Box.new(Gtk.Orientation.VERTICAL, 6); - this.widget.add(desc_title); - this.widget.add(desc_desc); - this.widget.add(exceptions_frame); - } - add_rule(wmclass, wmtitle, enabled) { - let label = Gtk.Label.new(wmtitle === undefined ? wmclass : `${wmclass} / ${wmtitle}`); - label.set_xalign(0); - label.set_hexpand(true); - label.set_ellipsize(Pango.EllipsizeMode.END); - let button = Gtk.Switch.new(); - button.set_valign(Gtk.Align.CENTER); - button.set_state(enabled); - button.connect('notify::state', () => { - this.callback({ tag: 2, wmclass, wmtitle, enable: button.get_state() }); - }); - let widget = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 24); - widget.add(label); - widget.add(button); - widget.show_all(); - widget.set_border_width(12); - this.exceptions.add(widget); - } -} -class App { - constructor() { - var _a, _b, _c, _d; - this.main_view = new MainView(); - this.exceptions_view = new ExceptionsView(); - this.stack = Gtk.Stack.new(); - this.config = new config.Config(); - this.stack.set_border_width(16); - this.stack.add(this.main_view.widget); - this.stack.add(this.exceptions_view.widget); - let back = Gtk.Button.new_from_icon_name('go-previous-symbolic', Gtk.IconSize.BUTTON); - const TITLE = 'Floating Window Exceptions'; - let win = new Gtk.Dialog({ use_header_bar: true }); - let headerbar = win.get_header_bar(); - headerbar.set_show_close_button(true); - headerbar.set_title(TITLE); - headerbar.pack_start(back); - Gtk.Window.set_default_icon_name('application-default'); - win.set_wmclass(WM_CLASS_ID, TITLE); - win.set_default_size(550, 700); - win.get_content_area().add(this.stack); - win.show_all(); - win.connect('delete-event', () => Gtk.main_quit()); - back.hide(); - this.config.reload(); - for (const value of config.DEFAULT_FLOAT_RULES.values()) { - let wmtitle = (_a = value.title) !== null && _a !== void 0 ? _a : undefined; - let wmclass = (_b = value.class) !== null && _b !== void 0 ? _b : undefined; - let disabled = this.config.rule_disabled({ class: wmclass, title: wmtitle }); - this.exceptions_view.add_rule(wmclass, wmtitle, !disabled); - } - for (const value of Array.from(this.config.float)) { - let wmtitle = (_c = value.title) !== null && _c !== void 0 ? _c : undefined; - let wmclass = (_d = value.class) !== null && _d !== void 0 ? _d : undefined; - if (!value.disabled) - this.main_view.add_rule(wmclass, wmtitle); - } - let event_handler = (event) => { - switch (event.tag) { - case 0: - println('SELECT'); - Gtk.main_quit(); - break; - case 1: - switch (event.view) { - case ViewNum.MainView: - this.stack.set_visible_child(this.main_view.widget); - back.hide(); - break; - case ViewNum.Exceptions: - this.stack.set_visible_child(this.exceptions_view.widget); - back.show(); - break; - } - break; - case 2: - log(`toggling exception ${event.enable}`); - this.config.toggle_system_exception(event.wmclass, event.wmtitle, !event.enable); - println('MODIFIED'); - break; - case 3: - log(`removing exception`); - this.config.remove_user_exception(event.wmclass, event.wmtitle); - println('MODIFIED'); - break; - } - }; - this.main_view.callback = event_handler; - this.exceptions_view.callback = event_handler; - back.connect('clicked', () => event_handler({ tag: 1, view: ViewNum.MainView })); - } -} -function list_header_func(row, before) { - if (before) { - row.set_header(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)); - } -} -const STDOUT = new Gio.DataOutputStream({ - base_stream: new Gio.UnixOutputStream({ fd: 1 }), -}); -function println(message) { - STDOUT.put_string(message + '\n', null); -} -function main() { - GLib.set_prgname(WM_CLASS_ID); - GLib.set_application_name('Pop Shell Floating Window Exceptions'); - Gtk.init(null); - new App(); - Gtk.main(); -} -main(); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/focus.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/focus.js deleted file mode 100644 index a42f6054..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/focus.js +++ /dev/null @@ -1,55 +0,0 @@ -import * as Geom from './geom.js'; -export var FocusPosition; -(function (FocusPosition) { - FocusPosition["TopLeft"] = "Top Left"; - FocusPosition["TopRight"] = "Top Right"; - FocusPosition["BottomLeft"] = "Bottom Left"; - FocusPosition["BottomRight"] = "Bottom Right"; - FocusPosition["Center"] = "Center"; -})(FocusPosition || (FocusPosition = {})); -export class FocusSelector { - select(ext, direction, window) { - window = window ?? ext.focus_window(); - if (window) { - let window_list = ext.active_window_list(); - return select(direction, window, window_list); - } - return null; - } - down(ext, window) { - return this.select(ext, window_down, window); - } - left(ext, window) { - return this.select(ext, window_left, window); - } - right(ext, window) { - return this.select(ext, window_right, window); - } - up(ext, window) { - return this.select(ext, window_up, window); - } -} -function select(windows, focused, window_list) { - const array = windows(focused, window_list); - return array.length > 0 ? array[0] : null; -} -function window_down(focused, windows) { - return windows - .filter((win) => !win.meta.minimized && win.meta.get_frame_rect().y > focused.meta.get_frame_rect().y) - .sort((a, b) => Geom.downward_distance(a.meta, focused.meta) - Geom.downward_distance(b.meta, focused.meta)); -} -function window_left(focused, windows) { - return windows - .filter((win) => !win.meta.minimized && win.meta.get_frame_rect().x < focused.meta.get_frame_rect().x) - .sort((a, b) => Geom.leftward_distance(a.meta, focused.meta) - Geom.leftward_distance(b.meta, focused.meta)); -} -function window_right(focused, windows) { - return windows - .filter((win) => !win.meta.minimized && win.meta.get_frame_rect().x > focused.meta.get_frame_rect().x) - .sort((a, b) => Geom.rightward_distance(a.meta, focused.meta) - Geom.rightward_distance(b.meta, focused.meta)); -} -function window_up(focused, windows) { - return windows - .filter((win) => !win.meta.minimized && win.meta.get_frame_rect().y < focused.meta.get_frame_rect().y) - .sort((a, b) => Geom.upward_distance(a.meta, focused.meta) - Geom.upward_distance(b.meta, focused.meta)); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/forest.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/forest.js deleted file mode 100644 index ad48293c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/forest.js +++ /dev/null @@ -1,700 +0,0 @@ -import * as arena from './arena.js'; -import * as Ecs from './ecs.js'; -import * as Lib from './lib.js'; -import * as log from './log.js'; -import * as movement from './movement.js'; -import * as Rect from './rectangle.js'; -import * as Node from './node.js'; -import * as Fork from './fork.js'; -import * as geom from './geom.js'; -const { Arena } = arena; -import Meta from 'gi://Meta'; -const { Movement } = movement; -const { DOWN, UP, LEFT, RIGHT } = Movement; -export class Forest extends Ecs.World { - constructor() { - super(); - this.toplevel = new Map(); - this.requested = new Map(); - this.stack_updates = new Array(); - this.forks = this.register_storage(); - this.parents = this.register_storage(); - this.string_reps = this.register_storage(); - this.stacks = new Arena(); - this.on_attach = () => { }; - this.on_detach = () => { }; - } - measure(ext, fork, area) { - fork.measure(this, ext, area, this.on_record()); - } - tile(ext, fork, area, ignore_reset = true) { - this.measure(ext, fork, area); - this.arrange(ext, fork.workspace, ignore_reset); - } - arrange(ext, _workspace, _ignore_reset = false) { - for (const [entity, r] of this.requested) { - const window = ext.windows.get(entity); - if (!window) - continue; - let on_complete = () => { - if (!window.actor_exists()) - return; - }; - if (ext.tiler.window) { - if (Ecs.entity_eq(ext.tiler.window, entity)) { - on_complete = () => { - ext.set_overlay(window.rect()); - if (!window.actor_exists()) - return; - }; - } - } - move_window(ext, window, r.rect, on_complete); - } - this.requested.clear(); - for (const [stack] of this.stack_updates.splice(0)) { - ext.auto_tiler?.update_stack(ext, stack); - } - } - attach_fork(ext, fork, window, is_left) { - const node = Node.Node.window(window); - if (is_left) { - if (fork.right) { - const new_fork = this.create_fork(fork.left, fork.right, fork.area_of_right(ext), fork.workspace, fork.monitor)[0]; - fork.right = Node.Node.fork(new_fork); - this.parents.insert(new_fork, fork.entity); - this.on_attach(new_fork, window); - } - else { - this.on_attach(fork.entity, window); - fork.right = fork.left; - } - fork.left = node; - } - else { - if (fork.right) { - const new_fork = this.create_fork(fork.left, fork.right, fork.area_of_left(ext), fork.workspace, fork.monitor)[0]; - fork.left = Node.Node.fork(new_fork); - this.parents.insert(new_fork, fork.entity); - this.on_attach(new_fork, window); - } - else { - this.on_attach(fork.entity, window); - } - fork.right = node; - } - this.on_attach(fork.entity, window); - } - attach_stack(ext, stack, fork, new_entity, stack_from_left) { - const container = this.stacks.get(stack.idx); - if (container) { - const window = ext.windows.get(new_entity); - if (window) { - window.stack = stack.idx; - if (stack_from_left) { - stack.entities.push(new_entity); - } - else { - stack.entities.unshift(new_entity); - } - this.on_attach(fork.entity, new_entity); - ext.auto_tiler?.update_stack(ext, stack); - if (window.meta.has_focus()) { - container.activate(new_entity); - } - return [fork.entity, fork]; - } - else { - log.warn('attempted to attach window to stack that does not exist'); - } - } - else { - log.warn('attempted to attach to stack that does not exist'); - } - return null; - } - attach_window(ext, onto_entity, new_entity, place_by, stack_from_left) { - function place_by_keyboard(fork, src, left, right) { - const from = [src.x + src.width / 2, src.y + src.height / 2]; - const lside = geom.shortest_side(from, left); - const rside = geom.shortest_side(from, right); - if (lside < rside) - fork.swap_branches(); - } - function place(place_by, fork, left, right) { - if ('swap' in place_by) { - const { orientation, swap } = place_by; - fork.set_orientation(orientation); - if (swap) - fork.swap_branches(); - } - else if ('src' in place_by) { - place_by_keyboard(fork, place_by.src, left, right); - } - } - function area_of_halves(fork) { - const { x, y, width, height } = fork.area; - const [left, right] = fork.is_horizontal() - ? [ - [x, y, width / 2, height], - [x + width / 2, y, width / 2, height], - ] - : [ - [x, y, width, height / 2], - [x, y + height / 2, width, height / 2], - ]; - return [new Rect.Rectangle(left), new Rect.Rectangle(right)]; - } - const fork_and_place_on_left = (entity, fork) => { - const area = fork.area_of_left(ext); - const [fork_entity, new_fork] = this.create_fork(fork.left, right_node, area, fork.workspace, fork.monitor); - fork.left = Node.Node.fork(fork_entity); - this.parents.insert(fork_entity, entity); - const [left, right] = area_of_halves(new_fork); - place(place_by, new_fork, left, right); - return this._attach(onto_entity, new_entity, this.on_attach, entity, fork, [fork_entity, new_fork]); - }; - const fork_and_place_on_right = (entity, fork, right_branch) => { - const area = fork.area_of_right(ext); - const [fork_entity, new_fork] = this.create_fork(right_branch, right_node, area, fork.workspace, fork.monitor); - fork.right = Node.Node.fork(fork_entity); - this.parents.insert(fork_entity, entity); - const [left, right] = area_of_halves(new_fork); - place(place_by, new_fork, left, right); - return this._attach(onto_entity, new_entity, this.on_attach, entity, fork, [fork_entity, new_fork]); - }; - const right_node = Node.Node.window(new_entity); - for (const [entity, fork] of this.forks.iter()) { - if (fork.left.is_window(onto_entity)) { - if (fork.right) { - return fork_and_place_on_left(entity, fork); - } - else { - fork.right = right_node; - fork.set_ratio(fork.length() / 2); - if ('src' in place_by) { - const [left, right] = area_of_halves(fork); - place_by_keyboard(fork, place_by.src, left, right); - } - return this._attach(onto_entity, new_entity, this.on_attach, entity, fork, null); - } - } - else if (fork.left.is_in_stack(onto_entity)) { - const stack = fork.left.inner; - return this.attach_stack(ext, stack, fork, new_entity, stack_from_left); - } - else if (fork.right) { - if (fork.right.is_window(onto_entity)) { - return fork_and_place_on_right(entity, fork, fork.right); - } - else if (fork.right.is_in_stack(onto_entity)) { - const stack = fork.right.inner; - return this.attach_stack(ext, stack, fork, new_entity, stack_from_left); - } - } - } - return null; - } - connect_on_attach(callback) { - this.on_attach = callback; - return this; - } - connect_on_detach(callback) { - this.on_detach = callback; - return this; - } - create_entity() { - const entity = super.create_entity(); - this.string_reps.insert(entity, `${entity}`); - return entity; - } - create_fork(left, right, area, workspace, monitor) { - const entity = this.create_entity(); - let orient = area.width > area.height ? Lib.Orientation.HORIZONTAL : Lib.Orientation.VERTICAL; - let fork = new Fork.Fork(entity, left, right, area, workspace, monitor, orient); - this.forks.insert(entity, fork); - return [entity, fork]; - } - create_toplevel(window, area, id) { - const [entity, fork] = this.create_fork(Node.Node.window(window), null, area, id[1], id[0]); - this.string_reps.with(entity, (sid) => { - fork.set_toplevel(this, entity, sid, id); - }); - return [entity, fork]; - } - delete_entity(entity) { - const fork = this.forks.remove(entity); - if (fork && fork.is_toplevel) { - const id = this.string_reps.get(entity); - if (id) - this.toplevel.delete(id); - } - super.delete_entity(entity); - } - detach(ext, fork_entity, window) { - const fork = this.forks.get(fork_entity); - if (!fork) - return null; - let reflow_fork = null, stack_detach = false; - const parent = this.parents.get(fork_entity); - if (fork.left.is_window(window)) { - if (parent && fork.right) { - const pfork = this.reassign_child_to_parent(fork_entity, parent, fork.right); - if (!pfork) - return null; - reflow_fork = [parent, pfork]; - } - else if (fork.right) { - reflow_fork = [fork_entity, fork]; - switch (fork.right.inner.kind) { - case 1: - this.reassign_children_to_parent(fork_entity, fork.right.inner.entity, fork); - break; - default: - const detached = fork.right; - fork.left = detached; - fork.right = null; - } - } - else { - this.delete_entity(fork_entity); - } - } - else if (fork.left.is_in_stack(window)) { - reflow_fork = [fork_entity, fork]; - stack_detach = true; - this.remove_from_stack(ext, fork.left.inner, window, () => { - if (fork.right) { - fork.left = fork.right; - fork.right = null; - if (parent) { - const pfork = this.reassign_child_to_parent(fork_entity, parent, fork.left); - if (!pfork) - return null; - reflow_fork = [parent, pfork]; - } - } - else { - this.delete_entity(fork.entity); - } - }); - } - else if (fork.right) { - if (fork.right.is_window(window)) { - if (parent) { - const pfork = this.reassign_child_to_parent(fork_entity, parent, fork.left); - if (!pfork) - return null; - reflow_fork = [parent, pfork]; - } - else { - reflow_fork = [fork_entity, fork]; - switch (fork.left.inner.kind) { - case 1: - this.reassign_children_to_parent(fork_entity, fork.left.inner.entity, fork); - break; - default: - fork.right = null; - break; - } - } - } - else if (fork.right.is_in_stack(window)) { - reflow_fork = [fork_entity, fork]; - stack_detach = true; - this.remove_from_stack(ext, fork.right.inner, window, () => { - fork.right = null; - this.reassign_to_parent(fork, fork.left); - }); - } - } - if (stack_detach) { - ext.windows.with(window, (w) => (w.stack = null)); - } - this.on_detach(window); - if (reflow_fork && !stack_detach) { - reflow_fork[1].rebalance_orientation(); - } - return reflow_fork; - } - fmt(ext) { - let fmt = ''; - for (const [entity] of this.toplevel.values()) { - const fork = this.forks.get(entity); - fmt += ' '; - if (fork) { - fmt += this.display_fork(ext, entity, fork, 1) + '\n'; - } - else { - fmt += `Fork(${entity}) Invalid\n`; - } - } - return fmt; - } - find_toplevel([src_mon, src_work]) { - for (const [entity, fork] of this.forks.iter()) { - if (!fork.is_toplevel) - continue; - const { monitor, workspace } = fork; - if (monitor == src_mon && workspace == src_work) { - return entity; - } - } - return null; - } - grow_sibling(ext, fork_e, fork_c, is_left, movement, crect) { - const resize_fork = () => this.resize_fork_(ext, fork_e, crect, movement, false); - if (fork_c.is_horizontal()) { - if ((movement & (DOWN | UP)) != 0) { - resize_fork(); - } - else if (is_left) { - if ((movement & RIGHT) != 0) { - this.readjust_fork_ratio_by_left(ext, crect.width, fork_c); - } - else { - resize_fork(); - } - } - else if ((movement & RIGHT) != 0) { - resize_fork(); - } - else { - this.readjust_fork_ratio_by_right(ext, crect.width, fork_c, fork_c.area.width); - } - } - else { - if ((movement & (LEFT | RIGHT)) != 0) { - resize_fork(); - } - else if (is_left) { - if ((movement & DOWN) != 0) { - this.readjust_fork_ratio_by_left(ext, crect.height, fork_c); - } - else { - resize_fork(); - } - } - else if ((movement & DOWN) != 0) { - resize_fork(); - } - else { - this.readjust_fork_ratio_by_right(ext, crect.height, fork_c, fork_c.area.height); - } - } - } - *iter(entity, kind = null) { - let fork = this.forks.get(entity); - let forks = new Array(2); - while (fork) { - if (fork.left.inner.kind === 1) { - forks.push(this.forks.get(fork.left.inner.entity)); - } - if (kind === null || fork.left.inner.kind === kind) { - yield fork.left; - } - if (fork.right) { - if (fork.right.inner.kind === 1) { - forks.push(this.forks.get(fork.right.inner.entity)); - } - if (kind === null || fork.right.inner.kind == kind) { - yield fork.right; - } - } - fork = forks.pop(); - } - } - largest_window_on(ext, entity) { - let largest_window = null; - let largest_size = 0; - let window_compare = (entity) => { - const window = ext.windows.get(entity); - if (window && window.is_tilable(ext)) { - const rect = window.rect(); - const size = rect.width * rect.height; - if (size > largest_size) { - largest_size = size; - largest_window = window; - } - } - }; - for (const node of this.iter(entity)) { - switch (node.inner.kind) { - case 2: - window_compare(node.inner.entity); - break; - case 3: - window_compare(node.inner.entities[0]); - } - } - return largest_window; - } - resize(ext, fork_e, fork_c, win_e, movement, crect) { - const is_left = fork_c.left.is_window(win_e) || fork_c.left.is_in_stack(win_e); - ((movement & Movement.SHRINK) != 0 ? this.shrink_sibling : this.grow_sibling).call(this, ext, fork_e, fork_c, is_left, movement, crect); - } - on_record() { - return (e, p, a) => this.record(e, p, a); - } - record(entity, parent, rect) { - this.requested.set(entity, { - parent: parent, - rect: rect, - }); - } - reassign_child_to_parent(child_entity, parent_entity, branch) { - const parent = this.forks.get(parent_entity); - if (parent) { - if (parent.left.is_fork(child_entity)) { - parent.left = branch; - } - else { - parent.right = branch; - } - this.reassign_sibling(branch, parent_entity); - this.delete_entity(child_entity); - } - return parent; - } - reassign_to_parent(child, reassign) { - const p = this.parents.get(child.entity); - if (p) { - const p_fork = this.forks.get(p); - if (p_fork) { - if (p_fork.left.is_fork(child.entity)) { - p_fork.left = reassign; - } - else { - p_fork.right = reassign; - } - const inner = reassign.inner; - switch (inner.kind) { - case 1: - this.parents.insert(inner.entity, p); - break; - case 2: - this.on_attach(p, inner.entity); - break; - case 3: - for (const entity of inner.entities) - this.on_attach(p, entity); - } - } - this.delete_entity(child.entity); - } - } - reassign_sibling(sibling, parent) { - switch (sibling.inner.kind) { - case 1: - this.parents.insert(sibling.inner.entity, parent); - break; - case 2: - this.on_attach(parent, sibling.inner.entity); - break; - case 3: - for (const entity of sibling.inner.entities) { - this.on_attach(parent, entity); - } - } - } - reassign_children_to_parent(parent_entity, child_entity, p_fork) { - const c_fork = this.forks.get(child_entity); - if (c_fork) { - p_fork.left = c_fork.left; - p_fork.right = c_fork.right; - this.reassign_sibling(p_fork.left, parent_entity); - if (p_fork.right) - this.reassign_sibling(p_fork.right, parent_entity); - this.delete_entity(child_entity); - } - else { - log.error(`Fork(${child_entity}) does not exist`); - } - } - readjust_fork_ratio_by_left(ext, left_length, fork) { - fork.set_ratio(left_length).measure(this, ext, fork.area, this.on_record()); - } - readjust_fork_ratio_by_right(ext, right_length, fork, fork_length) { - this.readjust_fork_ratio_by_left(ext, fork_length - right_length, fork); - } - remove_from_stack(ext, stack, window, on_last) { - if (stack.entities.length === 1) { - this.stacks.remove(stack.idx)?.destroy(); - on_last(); - } - else { - const s = this.stacks.get(stack.idx); - if (s) { - Node.stack_remove(this, stack, window); - } - } - const win = ext.windows.get(window); - if (win) { - win.stack = null; - } - } - resize_fork_(ext, child_e, crect, mov, shrunk) { - let parent = this.parents.get(child_e), child = this.forks.get(child_e); - if (!parent) { - child.measure(this, ext, child.area, this.on_record()); - return; - } - const src_node = this.forks.get(child_e); - if (!src_node) - return; - let is_left = child.left.is_fork(child_e), length; - while (parent !== null) { - child = this.forks.get(parent); - is_left = child.left.is_fork(child_e); - if (child.area.contains(crect)) { - if ((mov & UP) !== 0) { - if (shrunk) { - if (child.area.y + child.area.height > src_node.area.y + src_node.area.height) { - break; - } - } - else if (!child.is_horizontal() || !is_left) { - break; - } - } - else if ((mov & DOWN) !== 0) { - if (shrunk) { - if (child.area.y < src_node.area.y) { - break; - } - } - else if (child.is_horizontal() || is_left) { - break; - } - } - else if ((mov & LEFT) !== 0) { - if (shrunk) { - if (child.area.x + child.area.width > src_node.area.x + src_node.area.width) { - break; - } - } - else if (!child.is_horizontal() || !is_left) { - break; - } - } - else if ((mov & RIGHT) !== 0) { - if (shrunk) { - if (child.area.x < src_node.area.x) { - break; - } - } - else if (!child.is_horizontal() || is_left) { - break; - } - } - } - child_e = parent; - parent = this.parents.get(child_e); - } - if (child.is_horizontal()) { - length = is_left ? crect.x + crect.width - child.area.x : crect.x - child.area.x; - } - else { - length = is_left ? crect.y + crect.height - child.area.y : child.area.height - crect.height; - } - child.set_ratio(length); - child.measure(this, ext, child.area, this.on_record()); - } - shrink_sibling(ext, fork_e, fork_c, is_left, movement, crect) { - const resize_fork = () => this.resize_fork_(ext, fork_e, crect, movement, true); - if (fork_c.area) { - if (fork_c.is_horizontal()) { - if ((movement & (DOWN | UP)) != 0) { - resize_fork(); - } - else if (is_left) { - if ((movement & LEFT) != 0) { - this.readjust_fork_ratio_by_left(ext, crect.width, fork_c); - } - else { - resize_fork(); - } - } - else if ((movement & LEFT) != 0) { - resize_fork(); - } - else { - this.readjust_fork_ratio_by_right(ext, crect.width, fork_c, fork_c.area.array[2]); - } - } - else { - if ((movement & (LEFT | RIGHT)) != 0) { - resize_fork(); - } - else if (is_left) { - if ((movement & UP) != 0) { - this.readjust_fork_ratio_by_left(ext, crect.height, fork_c); - } - else { - resize_fork(); - } - } - else if ((movement & UP) != 0) { - resize_fork(); - } - else { - this.readjust_fork_ratio_by_right(ext, crect.height, fork_c, fork_c.area.array[3]); - } - } - } - } - _attach(onto_entity, new_entity, assoc, entity, fork, result) { - if (result) { - assoc(result[0], onto_entity); - assoc(result[0], new_entity); - } - else { - assoc(entity, new_entity); - } - return [entity, fork]; - } - display_branch(ext, branch, scope) { - switch (branch.inner.kind) { - case 1: - const fork = this.forks.get(branch.inner.entity); - return fork ? this.display_fork(ext, branch.inner.entity, fork, scope + 1) : 'Missing Fork'; - case 2: - const window = ext.windows.get(branch.inner.entity); - return `Window(${branch.inner.entity}) (${window ? window.rect().fmt() : 'unknown area'}; parent: ${ext.auto_tiler?.attached.get(branch.inner.entity)})`; - case 3: - let fmt = 'Stack('; - for (const entity of branch.inner.entities) { - const window = ext.windows.get(entity); - fmt += `Window(${entity}) (${window ? window.rect().fmt() : 'unknown area'}), `; - } - return fmt + ')'; - } - } - display_fork(ext, entity, fork, scope) { - let fmt = `Fork(${entity}) [${fork.area ? fork.area.array : 'unknown'}]: {\n`; - fmt += ' '.repeat((1 + scope) * 2) + `workspace: (${fork.workspace}),\n`; - fmt += ' '.repeat((1 + scope) * 2) + 'left: ' + this.display_branch(ext, fork.left, scope) + ',\n'; - fmt += ' '.repeat((1 + scope) * 2) + 'parent: ' + this.parents.get(fork.entity) + ',\n'; - if (fork.right) { - fmt += ' '.repeat((1 + scope) * 2) + 'right: ' + this.display_branch(ext, fork.right, scope) + ',\n'; - } - fmt += ' '.repeat(scope * 2) + '}'; - return fmt; - } -} -function move_window(ext, window, rect, on_complete) { - if (!(window.meta instanceof Meta.Window)) { - log.error(`attempting to a window entity in a tree which lacks a Meta.Window`); - return; - } - const actor = window.meta.get_compositor_private(); - if (!actor) { - log.warn(`Window(${window.entity}) does not have an actor, and therefore cannot be moved`); - return; - } - ext.size_signals_block(window); - window.move(ext, rect, () => { - on_complete(); - ext.size_signals_unblock(window); - }); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/fork.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/fork.js deleted file mode 100644 index 119f9d9e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/fork.js +++ /dev/null @@ -1,286 +0,0 @@ -import * as Ecs from './ecs.js'; -import * as Lib from './lib.js'; -import * as node from './node.js'; -import * as Rect from './rectangle.js'; -const XPOS = 0; -const YPOS = 1; -const WIDTH = 2; -const HEIGHT = 3; -export class Fork { - constructor(entity, left, right, area, workspace, monitor, orient) { - this.prev_ratio = 0.5; - this.minimum_ratio = 0.1; - this.orientation = Lib.Orientation.HORIZONTAL; - this.orientation_changed = false; - this.is_toplevel = false; - this.smart_gapped = false; - this.n_toggled = 0; - this.on_primary_display = global.display.get_primary_monitor() === monitor; - this.area = area; - this.left = left; - this.right = right; - this.workspace = workspace; - this.length_left = orient === Lib.Orientation.HORIZONTAL ? this.area.width / 2 : this.area.height / 2; - this.prev_length_left = this.length_left; - this.entity = entity; - this.orientation = orient; - this.monitor = monitor; - } - area_of_left(ext) { - return new Rect.Rectangle(this.is_horizontal() - ? [this.area.x, this.area.y, this.length_left - ext.gap_inner_half, this.area.height] - : [this.area.x, this.area.y, this.area.width, this.length_left - ext.gap_inner_half]); - } - area_of_right(ext) { - let area; - if (this.is_horizontal()) { - const width = this.area.width - this.length_left + ext.gap_inner; - area = [width, this.area.y, this.area.width - width, this.area.height]; - } - else { - const height = this.area.height - this.length_left + ext.gap_inner; - area = [this.area.x, height, this.area.width, this.area.height - height]; - } - return new Rect.Rectangle(area); - } - depth() { - return this.is_horizontal() ? this.area.height : this.area.width; - } - find_branch(entity) { - const locate = (branch) => { - switch (branch.inner.kind) { - case 2: - if (Ecs.entity_eq(branch.inner.entity, entity)) { - return branch; - } - break; - case 3: - for (const e of branch.inner.entities) { - if (Ecs.entity_eq(e, entity)) { - return branch; - } - } - } - return null; - }; - const node = locate(this.left); - if (node) - return node; - return this.right ? locate(this.right) : null; - } - is_horizontal() { - return Lib.Orientation.HORIZONTAL == this.orientation; - } - length() { - return this.is_horizontal() ? this.area.width : this.area.height; - } - replace_window(ext, a, b) { - let closure = null; - let check_right = () => { - if (this.right) { - const inner = this.right.inner; - if (inner.kind === 2) { - closure = () => { - inner.entity = b.entity; - }; - } - else if (inner.kind === 3) { - const idx = node.stack_find(inner, a.entity); - if (idx === null) { - closure = null; - return; - } - closure = () => { - node.stack_replace(ext, inner, b); - inner.entities[idx] = b.entity; - }; - } - } - }; - switch (this.left.inner.kind) { - case 1: - check_right(); - break; - case 2: - const inner = this.left.inner; - if (Ecs.entity_eq(inner.entity, a.entity)) { - closure = () => { - inner.entity = b.entity; - }; - } - else { - check_right(); - } - break; - case 3: - const inner_s = this.left.inner; - let idx = node.stack_find(inner_s, a.entity); - if (idx !== null) { - const id = idx; - closure = () => { - node.stack_replace(ext, inner_s, b); - inner_s.entities[id] = b.entity; - }; - } - else { - check_right(); - } - } - return closure; - } - set_area(area) { - this.area = area; - return this.area; - } - set_ratio(left_length) { - const fork_len = this.is_horizontal() ? this.area.width : this.area.height; - const clamped = Math.round(Math.max(256, Math.min(fork_len - 256, left_length))); - this.prev_length_left = clamped; - this.length_left = clamped; - return this; - } - set_toplevel(tiler, entity, string, id) { - this.is_toplevel = true; - tiler.toplevel.set(string, [entity, id]); - return this; - } - measure(tiler, ext, area, record) { - let ratio = null; - let manually_moved = ext.grab_op !== null || ext.tiler.resizing_window; - if (!this.is_toplevel) { - if (this.orientation_changed) { - this.orientation_changed = false; - ratio = this.length_left / this.depth(); - } - else { - ratio = this.length_left / this.length(); - } - this.area = this.set_area(area.clone()); - } - else if (this.orientation_changed) { - this.orientation_changed = false; - ratio = this.length_left / this.depth(); - } - if (ratio) { - this.length_left = Math.round(ratio * this.length()); - if (manually_moved) - this.prev_ratio = ratio; - } - else if (manually_moved) { - this.prev_ratio = this.length_left / this.length(); - } - if (this.right) { - const [l, p, startpos] = this.is_horizontal() ? [WIDTH, XPOS, this.area.x] : [HEIGHT, YPOS, this.area.y]; - let region = this.area.clone(); - const half = this.area.array[l] / 2; - let length; - if (this.length_left > half - 32 && this.length_left < half + 32) { - length = half; - } - else { - const diff = (startpos + this.length_left) % 32; - length = this.length_left - diff + (diff > 16 ? 32 : 0); - if (length == 0) - length = 32; - } - region.array[l] = length - ext.gap_inner_half; - this.left.measure(tiler, ext, this.entity, region, record); - region.array[p] = region.array[p] + length + ext.gap_inner_half; - region.array[l] = this.area.array[l] - length - ext.gap_inner_half; - this.right.measure(tiler, ext, this.entity, region, record); - } - else { - this.left.measure(tiler, ext, this.entity, this.area, record); - } - } - migrate(ext, forest, area, monitor, workspace) { - if (ext.auto_tiler && this.is_toplevel) { - const primary = global.display.get_primary_monitor() === monitor; - this.monitor = monitor; - this.workspace = workspace; - this.on_primary_display = primary; - let blocked = new Array(); - forest.toplevel.set(forest.string_reps.get(this.entity), [this.entity, [monitor, workspace]]); - for (const child of forest.iter(this.entity)) { - switch (child.inner.kind) { - case 1: - const cfork = forest.forks.get(child.inner.entity); - if (!cfork) - continue; - cfork.workspace = workspace; - cfork.monitor = monitor; - cfork.on_primary_display = primary; - break; - case 2: - let window = ext.windows.get(child.inner.entity); - if (window) { - ext.size_signals_block(window); - window.reassignment = false; - window.known_workspace = workspace; - window.meta.change_workspace_by_index(workspace, true); - ext.monitors.insert(window.entity, [monitor, workspace]); - blocked.push(window); - } - break; - case 3: - for (const entity of child.inner.entities) { - let stack = ext.auto_tiler.forest.stacks.get(child.inner.idx); - if (stack) { - stack.workspace = workspace; - } - let window = ext.windows.get(entity); - if (window) { - ext.size_signals_block(window); - window.known_workspace = workspace; - window.meta.change_workspace_by_index(workspace, true); - ext.monitors.insert(window.entity, [monitor, workspace]); - blocked.push(window); - } - } - } - } - area.x += ext.gap_outer; - area.y += ext.gap_outer; - area.width -= ext.gap_outer * 2; - area.height -= ext.gap_outer * 2; - this.set_area(area.clone()); - this.measure(forest, ext, area, forest.on_record()); - forest.arrange(ext, workspace, true); - for (const window of blocked) { - ext.size_signals_unblock(window); - } - } - } - rebalance_orientation() { - this.set_orientation(this.area.height > this.area.width ? Lib.Orientation.VERTICAL : Lib.Orientation.HORIZONTAL); - } - set_orientation(o) { - if (o !== this.orientation) { - this.orientation = o; - this.orientation_changed = true; - } - } - swap_branches() { - if (this.right) { - const temp = this.left; - this.left = this.right; - this.right = temp; - } - } - toggle_orientation() { - this.orientation = - Lib.Orientation.HORIZONTAL === this.orientation ? Lib.Orientation.VERTICAL : Lib.Orientation.HORIZONTAL; - this.orientation_changed = true; - if (this.n_toggled === 1) { - if (this.right) { - const tmp = this.right; - this.right = this.left; - this.left = tmp; - } - this.n_toggled = 0; - } - else { - this.n_toggled += 1; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/geom.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/geom.js deleted file mode 100644 index 77a8e2ce..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/geom.js +++ /dev/null @@ -1,74 +0,0 @@ -export var Side; -(function (Side) { - Side[Side["LEFT"] = 0] = "LEFT"; - Side[Side["TOP"] = 1] = "TOP"; - Side[Side["RIGHT"] = 2] = "RIGHT"; - Side[Side["BOTTOM"] = 3] = "BOTTOM"; - Side[Side["CENTER"] = 4] = "CENTER"; -})(Side || (Side = {})); -export function xend(rect) { - return rect.x + rect.width; -} -export function xcenter(rect) { - return rect.x + rect.width / 2; -} -export function yend(rect) { - return rect.y + rect.height; -} -export function ycenter(rect) { - return rect.y + rect.height / 2; -} -export function center(rect) { - return [xcenter(rect), ycenter(rect)]; -} -export function north(rect) { - return [xcenter(rect), rect.y]; -} -export function east(rect) { - return [xend(rect), ycenter(rect)]; -} -export function south(rect) { - return [xcenter(rect), yend(rect)]; -} -export function west(rect) { - return [rect.x, ycenter(rect)]; -} -export function distance([ax, ay], [bx, by]) { - return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); -} -export function directional_distance(a, b, fn_a, fn_b) { - return distance(fn_a(a), fn_b(b)); -} -export function window_distance(win_a, win_b) { - return directional_distance(win_a.get_frame_rect(), win_b.get_frame_rect(), center, center); -} -export function upward_distance(win_a, win_b) { - return directional_distance(win_a.get_frame_rect(), win_b.get_frame_rect(), south, north); -} -export function rightward_distance(win_a, win_b) { - return directional_distance(win_a.get_frame_rect(), win_b.get_frame_rect(), west, east); -} -export function downward_distance(win_a, win_b) { - return directional_distance(win_a.get_frame_rect(), win_b.get_frame_rect(), north, south); -} -export function leftward_distance(win_a, win_b) { - return directional_distance(win_a.get_frame_rect(), win_b.get_frame_rect(), east, west); -} -export function nearest_side(ext, origin, rect) { - const left = west(rect), top = north(rect), right = east(rect), bottom = south(rect), ctr = center(rect); - const left_distance = distance(origin, left), top_distance = distance(origin, top), right_distance = distance(origin, right), bottom_distance = distance(origin, bottom), center_distance = distance(origin, ctr); - let nearest = left_distance < right_distance ? [left_distance, Side.LEFT] : [right_distance, Side.RIGHT]; - if (top_distance < nearest[0]) - nearest = [top_distance, Side.TOP]; - if (bottom_distance < nearest[0]) - nearest = [bottom_distance, Side.BOTTOM]; - if (ext.settings.stacking_with_mouse() && center_distance < nearest[0]) - nearest = [center_distance, Side.CENTER]; - return nearest; -} -export function shortest_side(origin, rect) { - let shortest = distance(origin, west(rect)); - shortest = Math.min(shortest, distance(origin, north(rect))); - shortest = Math.min(shortest, distance(origin, east(rect))); - return Math.min(shortest, distance(origin, south(rect))); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/grab_op.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/grab_op.js deleted file mode 100644 index 328d425e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/grab_op.js +++ /dev/null @@ -1,10 +0,0 @@ -import * as Movement from './movement.js'; -export class GrabOp { - constructor(entity, rect) { - this.entity = entity; - this.rect = rect; - } - operation(change) { - return Movement.calculate(this.rect, change); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/highcontrast.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/highcontrast.css deleted file mode 100644 index 2cc85c2c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/highcontrast.css +++ /dev/null @@ -1,61 +0,0 @@ -.pop-shell-active-hint { - border-style: solid; - border-color: #FBB86C; - border-radius: var(--active-hint-border-radius, 5px); - box-shadow: inset 0 0 0 1px rgba(24, 23, 23, 0) -} - -.pop-shell-overlay { - background-color: rgba(53, 132, 228, 0.3); -} - -.pop-shell-border-normal { - border-width: 3px; -} - -.pop-shell-border-maximize { - border-width: 3px; -} - -.pop-shell-search-element:select{ - background: #fff; - border-radius: 5px; - color: #000; -} - -.pop-shell-search-icon { - margin-right: 10px; -} - -.pop-shell-search-cat { - margin-right: 10px; -} - -.pop-shell-search-element { - padding-left: 10px; - padding-right: 2px; - padding-top: 6px; - padding-bottom: 6px; -} - -.pop-shell-tab { - border: 1px solid #333; - color: #000; - padding: 0 1em; -} - -.pop-shell-tab-active { - background: #FBB86C; -} - -.pop-shell-tab-inactive { - background: #9B8E8A; -} - -.pop-shell-tab-urgent { - background: #D00; -} - -.pop-shell-entry:indeterminate { - font-style: italic -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-off-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-off-symbolic.svg deleted file mode 100644 index ff4616b0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-off-symbolic.svg +++ /dev/null @@ -1,163 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07, custom)" - sodipodi:docname="pop-shell-auto-off-symbolic.svg" - width="16.031464" - version="1.1" - style="enable-background:new" - id="svg7384" - height="16"> - <sodipodi:namedview - inkscape:current-layer="svg7384" - inkscape:window-maximized="0" - inkscape:window-y="23" - inkscape:window-x="26" - inkscape:cy="7.8736667" - inkscape:cx="5.4863836" - inkscape:zoom="47.743848" - showgrid="true" - id="namedview26" - inkscape:window-height="1032" - inkscape:window-width="1904" - inkscape:pageshadow="2" - inkscape:pageopacity="0" - guidetolerance="10" - gridtolerance="10" - objecttolerance="10" - borderopacity="1" - bordercolor="#666666" - pagecolor="#ffffff" - inkscape:snap-intersection-paths="true" - inkscape:snap-smooth-nodes="true" - inkscape:document-rotation="0"> - <inkscape:grid - type="xygrid" - id="grid834" /> - </sodipodi:namedview> - <metadata - id="metadata90"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title>Pop Symbolic Icon Theme</dc:title> - <cc:license - rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> - </cc:Work> - <cc:License - rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> - <cc:permits - rdf:resource="http://creativecommons.org/ns#Reproduction" /> - <cc:permits - rdf:resource="http://creativecommons.org/ns#Distribution" /> - <cc:requires - rdf:resource="http://creativecommons.org/ns#Notice" /> - <cc:requires - rdf:resource="http://creativecommons.org/ns#Attribution" /> - <cc:permits - rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> - <cc:requires - rdf:resource="http://creativecommons.org/ns#ShareAlike" /> - </cc:License> - </rdf:RDF> - </metadata> - <title - id="title8473">Pop Symbolic Icon Theme - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-on-symbolic.svg b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-on-symbolic.svg deleted file mode 100644 index d57bd0d5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/icons/pop-shell-auto-on-symbolic.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - image/svg+xml - - Pop Symbolic Icon Theme - - - - - - - - - - - - - Pop Symbolic Icon Theme - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/keybindings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/keybindings.js deleted file mode 100644 index c6011425..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/keybindings.js +++ /dev/null @@ -1,50 +0,0 @@ -import { wm } from 'resource:///org/gnome/shell/ui/main.js'; -import Shell from 'gi://Shell'; -import Meta from 'gi://Meta'; -export class Keybindings { - constructor(ext) { - this.ext = ext; - this.global = { - 'activate-launcher': () => ext.window_search.open(ext), - 'tile-enter': () => ext.tiler.enter(ext), - }; - this.window_focus = { - 'focus-left': () => ext.focus_left(), - 'focus-down': () => ext.focus_down(), - 'focus-up': () => ext.focus_up(), - 'focus-right': () => ext.focus_right(), - 'tile-orientation': () => { - const win = ext.focus_window(); - if (win && ext.auto_tiler) { - ext.auto_tiler.toggle_orientation(ext, win); - ext.register_fn(() => win.activate(true)); - } - }, - 'toggle-floating': () => ext.auto_tiler?.toggle_floating(ext), - 'toggle-tiling': () => ext.toggle_tiling(), - 'toggle-stacking-global': () => ext.auto_tiler?.toggle_stacking(ext), - 'tile-move-left-global': () => ext.tiler.move_left(ext, ext.focus_window()?.entity), - 'tile-move-down-global': () => ext.tiler.move_down(ext, ext.focus_window()?.entity), - 'tile-move-up-global': () => ext.tiler.move_up(ext, ext.focus_window()?.entity), - 'tile-move-right-global': () => ext.tiler.move_right(ext, ext.focus_window()?.entity), - 'pop-monitor-left': () => ext.move_monitor(Meta.DisplayDirection.LEFT), - 'pop-monitor-right': () => ext.move_monitor(Meta.DisplayDirection.RIGHT), - 'pop-monitor-up': () => ext.move_monitor(Meta.DisplayDirection.UP), - 'pop-monitor-down': () => ext.move_monitor(Meta.DisplayDirection.DOWN), - 'pop-workspace-up': () => ext.move_workspace(Meta.DisplayDirection.UP), - 'pop-workspace-down': () => ext.move_workspace(Meta.DisplayDirection.DOWN), - }; - } - enable(keybindings) { - for (const name in keybindings) { - wm.addKeybinding(name, this.ext.settings.ext, Meta.KeyBindingFlags.NONE, Shell.ActionMode.NORMAL, keybindings[name]); - } - return this; - } - disable(keybindings) { - for (const name in keybindings) { - wm.removeKeybinding(name); - } - return this; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher.js deleted file mode 100644 index c89fafb0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher.js +++ /dev/null @@ -1,289 +0,0 @@ -import * as search from './search.js'; -import * as utils from './utils.js'; -import * as arena from './arena.js'; -import * as log from './log.js'; -import * as service from './launcher_service.js'; -import * as context from './context.js'; -import Clutter from 'gi://Clutter'; -import GLib from 'gi://GLib'; -import Meta from 'gi://Meta'; -import Gio from 'gi://Gio'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -const app_sys = Shell.AppSystem.get_default(); -const Clipboard = St.Clipboard.get_default(); -const CLIPBOARD_TYPE = St.ClipboardType.CLIPBOARD; -export class Launcher extends search.Search { - constructor(ext) { - super(); - this.options = new Map(); - this.options_array = new Array(); - this.windows = new arena.Arena(); - this.service = null; - this.append_id = null; - this.active_menu = null; - this.opened = false; - this.ext = ext; - this.dialog.dialogLayout._dialog.y_align = Clutter.ActorAlign.START; - this.dialog.dialogLayout._dialog.x_align = Clutter.ActorAlign.START; - this.dialog.dialogLayout.y = 48; - this.cancel = () => { - ext.overlay.visible = false; - this.stop_services(ext); - this.opened = false; - }; - this.search = (pat) => { - if (this.service !== null) { - this.service.query(pat); - } - }; - this.select = (id) => { - ext.overlay.visible = false; - if (id >= this.options.size) - return; - const option = this.options_array[id]; - if (option && option.result.window) { - const win = this.ext.windows.get(option.result.window); - if (!win) - return; - if (win.workspace_id() == ext.active_workspace()) { - const { x, y, width, height } = win.rect(); - ext.overlay.x = x; - ext.overlay.y = y; - ext.overlay.width = width; - ext.overlay.height = height; - ext.overlay.visible = true; - } - } - }; - this.activate_id = (id) => { - ext.overlay.visible = false; - const selected = this.options_array[id]; - if (selected) { - this.service?.activate(selected.result.id); - } - }; - this.complete = () => { - const option = this.options_array[this.active_id]; - if (option) { - this.service?.complete(option.result.id); - } - }; - this.quit = (id) => { - const option = this.options_array[id]; - if (option) { - this.service?.quit(option.result.id); - } - }; - this.copy = (id) => { - const option = this.options_array[id]; - if (!option) - return; - if (option.result.description) { - Clipboard.set_text(CLIPBOARD_TYPE, option.result.description); - } - else if (option.result.name) { - Clipboard.set_text(CLIPBOARD_TYPE, option.result.name); - } - }; - } - on_response(response) { - if ('Close' === response) { - this.close(); - } - else if ('Update' in response) { - this.clear(); - if (this.append_id !== null) { - GLib.source_remove(this.append_id); - this.append_id = null; - } - if (response.Update.length === 0) { - this.cleanup(); - return; - } - this.append_id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - const item = response.Update.shift(); - if (item) { - try { - const button = new search.SearchOption(item.name, item.description, item.category_icon ? item.category_icon : null, item.icon ? item.icon : null, this.icon_size(), null, null); - const menu = context.addMenu(button.widget, (menu) => { - if (this.active_menu) { - this.active_menu.actor.hide(); - } - this.active_menu = menu; - this.service?.context(item.id); - }); - this.append_search_option(button); - const result = { result: item, menu }; - this.options.set(item.id, result); - this.options_array.push(result); - } - catch (error) { - log.error(`failed to create SearchOption: ${error}`); - } - } - if (response.Update.length === 0) { - this.append_id = null; - return false; - } - return true; - }); - } - else if ('Fill' in response) { - this.set_text(response.Fill); - } - else if ('DesktopEntry' in response) { - this.launch_desktop_entry(response.DesktopEntry); - this.close(); - } - else if ('Context' in response) { - const { id, options } = response.Context; - const option = this.options.get(id); - if (option) { - option.menu.removeAll(); - for (const opt of options) { - context.addContext(option.menu, opt.name, () => { - this.service?.activate_context(id, opt.id); - }); - option.menu.toggle(); - } - } - else { - log.error(`did not find id: ${id}`); - } - } - else { - log.error(`unknown response: ${JSON.stringify(response)}`); - } - } - clear() { - this.options.clear(); - this.options_array.splice(0); - super.clear(); - } - launch_desktop_app(app, path) { - try { - app.launch([], null); - } - catch (why) { - log.error(`${path}: could not launch by app info: ${why}`); - } - } - launch_desktop_entry(entry) { - const basename = (name) => { - return name.substr(name.indexOf('/applications/') + 14).replace('/', '-'); - }; - const desktop_entry_id = basename(entry.path); - const gpuPref = entry.gpu_preference === 'Default' ? Shell.AppLaunchGpu.DEFAULT : Shell.AppLaunchGpu.DISCRETE; - log.debug(`launching desktop entry: ${desktop_entry_id}`); - let app = app_sys.lookup_desktop_wmclass(desktop_entry_id); - if (!app) { - app = app_sys.lookup_app(desktop_entry_id); - } - if (!app) { - log.error(`GNOME Shell cannot find desktop entry for ${desktop_entry_id}`); - log.error(`pop-launcher will use Gio.DesktopAppInfo instead`); - const dapp = Gio.DesktopAppInfo.new_from_filename(entry.path); - if (!dapp) { - log.error(`could not find desktop entry for ${entry.path}`); - return; - } - this.launch_desktop_app(dapp, entry.path); - return; - } - const info = app.get_app_info(); - if (!info) { - log.error(`cannot find app info for ${desktop_entry_id}`); - return; - } - try { - app.launch(0, -1, gpuPref); - } - catch (why) { - log.error(`failed to launch application: ${why}`); - return; - } - if (info.get_executable() === 'gnome-control-center') { - app = app_sys.lookup_app('gnome-control-center.desktop'); - if (!app) - return; - app.activate(); - const window = app.get_windows()[0]; - if (window) { - window.get_workspace().activate_with_focus(window, global.get_current_time()); - return; - } - } - } - list_workspace(ext) { - for (const window of ext.tab_list(Meta.TabList.NORMAL, null)) { - this.windows.insert(window); - } - } - load_desktop_files() { - log.warn('pop-shell: deprecated function called (launcher::load_desktop_files)'); - } - locate_by_app_info(info) { - const workspace = this.ext.active_workspace(); - const exec_info = info.get_string('Exec'); - const exec = exec_info?.split(' ').shift()?.split('/').pop(); - if (exec) { - for (const window of this.ext.tab_list(Meta.TabList.NORMAL, null)) { - if (window.meta.get_workspace().index() !== workspace) - continue; - const pid = window.meta.get_pid(); - if (pid !== -1) { - try { - let f = Gio.File.new_for_path(`/proc/${pid}/cmdline`); - const [, bytes] = f.load_contents(null); - const output = imports.byteArray.toString(bytes); - const cmd = output.split(' ').shift()?.split('/').pop(); - if (cmd === exec) - return window; - } - catch (_) { } - } - } - } - return null; - } - open(ext) { - ext.tiler.exit(ext); - if (this.opened) - return; - if (!ext.settings.fullscreen_launcher() && ext.focus_window()?.meta.is_fullscreen()) - return; - this.opened = true; - const active_monitor = ext.active_monitor(); - const mon_work_area = ext.monitor_work_area(active_monitor); - const mon_area = ext.monitor_area(active_monitor); - const mon_width = mon_area ? mon_area.width : mon_work_area.width; - super._open(global.get_current_time(), false); - if (!this.dialog.visible) { - this.clear(); - this.cancel(); - this.close(); - return; - } - super.cleanup(); - this.start_services(); - this.search(''); - this.dialog.dialogLayout.x = mon_width / 2 - this.dialog.dialogLayout.width / 2; - let height = mon_work_area.height >= 900 ? mon_work_area.height / 2 : mon_work_area.height / 3.5; - this.dialog.dialogLayout.y = height - this.dialog.dialogLayout.height / 2; - } - start_services() { - if (this.service === null) { - log.debug('starting pop-launcher service'); - const ipc = utils.async_process_ipc(['pop-launcher']); - this.service = ipc ? new service.LauncherService(ipc, (resp) => this.on_response(resp)) : null; - } - } - stop_services(_ext) { - if (this.service !== null) { - log.info(`stopping pop-launcher services`); - this.service.exit(); - this.service = null; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher_service.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher_service.js deleted file mode 100644 index 87d130a5..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/launcher_service.js +++ /dev/null @@ -1,76 +0,0 @@ -import * as log from './log.js'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -const { byteArray } = imports; -export class LauncherService { - constructor(service, callback) { - this.service = service; - const generator = (stdout, res) => { - try { - const [bytes] = stdout.read_line_finish(res); - if (bytes) { - const string = byteArray.toString(bytes); - callback(JSON.parse(string)); - this.service.stdout.read_line_async(0, this.service.cancellable, generator); - } - } - catch (why) { - if (why.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) { - return; - } - log.error(`failed to read response from launcher service: ${why}`); - } - }; - this.service.stdout.read_line_async(0, this.service.cancellable, generator); - } - activate(id) { - this.send({ Activate: id }); - } - activate_context(id, context) { - this.send({ ActivateContext: { id, context } }); - } - complete(id) { - this.send({ Complete: id }); - } - context(id) { - this.send({ Context: id }); - } - exit() { - this.send('Exit'); - this.service.cancellable.cancel(); - const service = this.service; - GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, () => { - if (service.stdout.has_pending() || service.stdin.has_pending()) - return true; - const close_stream = (stream) => { - try { - stream.close(null); - } - catch (why) { - log.error(`failed to close pop-launcher stream: ${why}`); - } - }; - close_stream(service.stdin); - close_stream(service.stdin); - return false; - }); - } - query(search) { - this.send({ Search: search }); - } - quit(id) { - this.send({ Quit: id }); - } - select(id) { - this.send({ Select: id }); - } - send(object) { - const message = JSON.stringify(object); - try { - this.service.stdin.write_all(message + '\n', null); - } - catch (why) { - log.error(`failed to send request to pop-launcher: ${why}`); - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/lib.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/lib.js deleted file mode 100644 index b867822e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/lib.js +++ /dev/null @@ -1,91 +0,0 @@ -import * as log from './log.js'; -import * as rectangle from './rectangle.js'; -import Meta from 'gi://Meta'; -import St from 'gi://St'; -export var Orientation; -(function (Orientation) { - Orientation[Orientation["HORIZONTAL"] = 0] = "HORIZONTAL"; - Orientation[Orientation["VERTICAL"] = 1] = "VERTICAL"; -})(Orientation || (Orientation = {})); -export function nth_rev(array, nth) { - return array[array.length - nth - 1]; -} -export function ok(input, func) { - return input ? func(input) : null; -} -export function ok_or_else(input, ok_func, or_func) { - return input ? ok_func(input) : or_func(); -} -export function or_else(input, func) { - return input ? input : func(); -} -export function bench(name, callback) { - const start = new Date().getMilliseconds(); - const value = callback(); - const end = new Date().getMilliseconds(); - log.info(`bench ${name}: ${end - start} ms elapsed`); - return value; -} -export function current_monitor() { - return rectangle.Rectangle.from_meta(global.display.get_monitor_geometry(global.display.get_current_monitor())); -} -export function cursor_rect() { - let [x, y] = global.get_pointer(); - return new rectangle.Rectangle([x, y, 1, 1]); -} -export function dbg(value) { - log.debug(String(value)); - return value; -} -export function* get_children(actor) { - let nth = 0; - let children = actor.get_n_children(); - while (nth < children) { - const child = actor.get_child_at_index(nth); - if (child) - yield child; - nth += 1; - } -} -export function join(iterator, next_func, between_func) { - ok(iterator.next().value, (first) => { - next_func(first); - for (const item of iterator) { - between_func(); - next_func(item); - } - }); -} -export function is_keyboard_op(op) { - const window_flag_keyboard = Meta.GrabOp.KEYBOARD_MOVING & ~Meta.GrabOp.WINDOW_BASE; - return (op & window_flag_keyboard) != 0; -} -export function is_resize_op(op) { - const window_dir_mask = (Meta.GrabOp.RESIZING_N | Meta.GrabOp.RESIZING_E | Meta.GrabOp.RESIZING_S | Meta.GrabOp.RESIZING_W) & - ~Meta.GrabOp.WINDOW_BASE; - return ((op & window_dir_mask) != 0 || - (op & Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN) == Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN); -} -export function is_move_op(op) { - return !is_resize_op(op); -} -export function orientation_as_str(value) { - return value == 0 ? 'Orientation::Horizontal' : 'Orientation::Vertical'; -} -export function recursive_remove_children(actor) { - for (const child of get_children(actor)) { - recursive_remove_children(child); - } - actor.remove_all_children(); -} -export function round_increment(value, increment) { - return Math.round(value / increment) * increment; -} -export function round_to(n, digits) { - let m = Math.pow(10, digits); - n = parseFloat((n * m).toFixed(11)); - return Math.round(n) / m; -} -export function separator() { - return new St.BoxLayout({ styleClass: 'pop-shell-separator', x_expand: true }); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/light.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/light.css deleted file mode 100644 index 7e95c484..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/light.css +++ /dev/null @@ -1,57 +0,0 @@ -.pop-shell-active-hint { - border-style: solid; - border-color: #FFAD00; - border-radius: var(--active-hint-border-radius, 5px); - box-shadow: inset 0 0 0 1px rgba(200, 200, 200, 0); -} - -.pop-shell-overlay { - background-color: rgba(53, 132, 228, 0.3); -} - -.pop-shell-border-normal { - border-width: 3px; -} - -.pop-shell-border-maximize { - border-width: 3px; -} - -.pop-shell-search-element:select{ - background: rgba(0, 0, 0, .1); - border-radius: 5px; - color: #393634; -} - -.pop-shell-search-icon { - margin-right: 10px; -} - -.pop-shell-search-cat { - margin-right: 10px; -} - -.pop-shell-search-element { - padding-left: 10px; - padding-right: 2px; - padding-top: 6px; - padding-bottom: 6px; -} - -.pop-shell-tab { - border: 1px solid #333; - color: #000; - padding: 0 1em; -} - -.pop-shell-tab-active { - background: #FFAD00; -} - -.pop-shell-tab-inactive { - background: #9B8E8A; -} - -.pop-shell-tab-urgent { - background: #D00; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/literal_once_cell.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/literal_once_cell.js deleted file mode 100644 index ba86b08c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/literal_once_cell.js +++ /dev/null @@ -1,9 +0,0 @@ -export class OnceCell { - constructor() { } - get_or_init(callback) { - if (this.value === undefined) { - this.value = callback(); - } - return this.value; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/log.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/log.js deleted file mode 100644 index 26bdeec6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/log.js +++ /dev/null @@ -1,32 +0,0 @@ -export var LOG_LEVELS; -(function (LOG_LEVELS) { - LOG_LEVELS[LOG_LEVELS["OFF"] = 0] = "OFF"; - LOG_LEVELS[LOG_LEVELS["ERROR"] = 1] = "ERROR"; - LOG_LEVELS[LOG_LEVELS["WARN"] = 2] = "WARN"; - LOG_LEVELS[LOG_LEVELS["INFO"] = 3] = "INFO"; - LOG_LEVELS[LOG_LEVELS["DEBUG"] = 4] = "DEBUG"; -})(LOG_LEVELS || (LOG_LEVELS = {})); -export function log_level() { - let settings = globalThis.popShellExtension.getSettings(); - let log_level = settings.get_uint('log-level'); - return log_level; -} -export function log(text) { - globalThis.log('pop-shell: ' + text); -} -export function error(text) { - if (log_level() > LOG_LEVELS.OFF) - log('[ERROR] ' + text); -} -export function warn(text) { - if (log_level() > LOG_LEVELS.ERROR) - log('[WARN] ' + text); -} -export function info(text) { - if (log_level() > LOG_LEVELS.WARN) - log('[INFO] ' + text); -} -export function debug(text) { - if (log_level() > LOG_LEVELS.INFO) - log('[DEBUG] ' + text); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/metadata.json deleted file mode 100644 index c59146ec..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/metadata.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "Pop Shell", - "description": "Pop Shell", - "version": 2, - "uuid": "pop-shell@system76.com", - "settings-schema": "org.gnome.shell.extensions.pop-shell", - "shell-version": [ - "45", - "46" - ] -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/movement.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/movement.js deleted file mode 100644 index 86f74bf6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/movement.js +++ /dev/null @@ -1,53 +0,0 @@ -export var Movement; -(function (Movement) { - Movement[Movement["NONE"] = 0] = "NONE"; - Movement[Movement["MOVED"] = 1] = "MOVED"; - Movement[Movement["GROW"] = 2] = "GROW"; - Movement[Movement["SHRINK"] = 4] = "SHRINK"; - Movement[Movement["LEFT"] = 8] = "LEFT"; - Movement[Movement["UP"] = 16] = "UP"; - Movement[Movement["RIGHT"] = 32] = "RIGHT"; - Movement[Movement["DOWN"] = 64] = "DOWN"; -})(Movement || (Movement = {})); -export function calculate(from, change) { - const xpos = from.x == change.x; - const ypos = from.y == change.y; - if (xpos && ypos) { - if (from.width == change.width) { - if (from.height == change.width) { - return Movement.NONE; - } - else if (from.height < change.height) { - return Movement.GROW | Movement.DOWN; - } - else { - return Movement.SHRINK | Movement.UP; - } - } - else if (from.width < change.width) { - return Movement.GROW | Movement.RIGHT; - } - else { - return Movement.SHRINK | Movement.LEFT; - } - } - else if (xpos) { - if (from.height < change.height) { - return Movement.GROW | Movement.UP; - } - else { - return Movement.SHRINK | Movement.DOWN; - } - } - else if (ypos) { - if (from.width < change.width) { - return Movement.GROW | Movement.LEFT; - } - else { - return Movement.SHRINK | Movement.RIGHT; - } - } - else { - return Movement.MOVED; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/node.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/node.js deleted file mode 100644 index 4e04b80f..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/node.js +++ /dev/null @@ -1,165 +0,0 @@ -import * as Ecs from './ecs.js'; -export var NodeKind; -(function (NodeKind) { - NodeKind[NodeKind["FORK"] = 1] = "FORK"; - NodeKind[NodeKind["WINDOW"] = 2] = "WINDOW"; - NodeKind[NodeKind["STACK"] = 3] = "STACK"; -})(NodeKind || (NodeKind = {})); -function node_variant_as_string(value) { - return value == NodeKind.FORK ? 'NodeVariant::Fork' : 'NodeVariant::Window'; -} -function stack_detach(node, stack, idx) { - node.entities.splice(idx, 1); - stack.remove_by_pos(idx); -} -export function stack_find(node, entity) { - let idx = 0; - while (idx < node.entities.length) { - if (Ecs.entity_eq(entity, node.entities[idx])) { - return idx; - } - idx += 1; - } - return null; -} -export function stack_move_left(ext, forest, node, entity) { - const stack = forest.stacks.get(node.idx); - if (!stack) - return false; - let idx = 0; - for (const cmp of node.entities) { - if (Ecs.entity_eq(cmp, entity)) { - if (idx === 0) { - stack_detach(node, stack, 0); - return false; - } - else { - stack_swap(node, idx - 1, idx); - stack.active_id -= 1; - ext.auto_tiler?.update_stack(ext, node); - return true; - } - } - idx += 1; - } - return false; -} -export function stack_move_right(ext, forest, node, entity) { - const stack = forest.stacks.get(node.idx); - if (!stack) - return false; - let moved = false; - let idx = 0; - const max = node.entities.length - 1; - for (const cmp of node.entities) { - if (Ecs.entity_eq(cmp, entity)) { - if (idx === max) { - stack_detach(node, stack, idx); - moved = false; - } - else { - stack_swap(node, idx + 1, idx); - stack.active_id += 1; - ext.auto_tiler?.update_stack(ext, node); - moved = true; - } - break; - } - idx += 1; - } - return moved; -} -export function stack_replace(ext, node, window) { - if (!ext.auto_tiler) - return; - const stack = ext.auto_tiler.forest.stacks.get(node.idx); - if (!stack) - return; - stack.replace(window); -} -export function stack_remove(forest, node, entity) { - const stack = forest.stacks.get(node.idx); - if (!stack) - return null; - const idx = stack.remove_tab(entity); - if (idx !== null) - node.entities.splice(idx, 1); - return idx; -} -function stack_swap(node, from, to) { - const tmp = node.entities[from]; - node.entities[from] = node.entities[to]; - node.entities[to] = tmp; -} -export class Node { - constructor(inner) { - this.inner = inner; - } - static fork(entity) { - return new Node({ kind: NodeKind.FORK, entity }); - } - static window(entity) { - return new Node({ kind: NodeKind.WINDOW, entity }); - } - static stacked(window, idx) { - const node = new Node({ - kind: NodeKind.STACK, - entities: [window], - idx, - rect: null, - }); - return node; - } - display(fmt) { - fmt += `{\n kind: ${node_variant_as_string(this.inner.kind)},\n `; - switch (this.inner.kind) { - case 1: - case 2: - fmt += `entity: (${this.inner.entity})\n }`; - return fmt; - case 3: - fmt += `entities: ${this.inner.entities}\n }`; - return fmt; - } - } - is_in_stack(entity) { - if (this.inner.kind === 3) { - for (const compare of this.inner.entities) { - if (Ecs.entity_eq(entity, compare)) - return true; - } - } - return false; - } - is_fork(entity) { - return this.inner.kind === 1 && Ecs.entity_eq(this.inner.entity, entity); - } - is_window(entity) { - return this.inner.kind === 2 && Ecs.entity_eq(this.inner.entity, entity); - } - measure(tiler, ext, parent, area, record) { - switch (this.inner.kind) { - case 1: - const fork = tiler.forks.get(this.inner.entity); - if (fork) { - record; - fork.measure(tiler, ext, area, record); - } - break; - case 2: - record(this.inner.entity, parent, area.clone()); - break; - case 3: - const size = ext.dpi * 4; - this.inner.rect = area.clone(); - this.inner.rect.y += size * 6; - this.inner.rect.height -= size * 6; - for (const entity of this.inner.entities) { - record(entity, parent, this.inner.rect); - } - if (ext.auto_tiler) { - ext.auto_tiler.forest.stack_updates.push([this.inner, parent]); - } - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/panel_settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/panel_settings.js deleted file mode 100644 index 632b1f54..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/panel_settings.js +++ /dev/null @@ -1,258 +0,0 @@ -import * as Utils from './utils.js'; -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import St from 'gi://St'; -import { PopupBaseMenuItem, PopupMenuItem, PopupSwitchMenuItem, PopupSeparatorMenuItem, } from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import { Button } from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import GLib from 'gi://GLib'; -import { spawn } from 'resource:///org/gnome/shell/misc/util.js'; -import { get_current_path } from './paths.js'; -export class Indicator { - constructor(ext) { - this.button = new Button(0.0, _('Pop Shell Settings')); - const path = get_current_path(); - ext.button = this.button; - ext.button_gio_icon_auto_on = Gio.icon_new_for_string(`${path}/icons/pop-shell-auto-on-symbolic.svg`); - ext.button_gio_icon_auto_off = Gio.icon_new_for_string(`${path}/icons/pop-shell-auto-off-symbolic.svg`); - let button_icon_auto_on = new St.Icon({ - gicon: ext.button_gio_icon_auto_on, - style_class: 'system-status-icon', - }); - let button_icon_auto_off = new St.Icon({ - gicon: ext.button_gio_icon_auto_off, - style_class: 'system-status-icon', - }); - if (ext.settings.tile_by_default()) { - this.button.icon = button_icon_auto_on; - } - else { - this.button.icon = button_icon_auto_off; - } - this.button.add_child(this.button.icon); - let bm = this.button.menu; - this.toggle_tiled = tiled(ext); - this.toggle_active = toggle(_('Show Active Hint'), ext.settings.active_hint(), (toggle) => { - ext.settings.set_active_hint(toggle.state); - }); - this.entry_gaps = number_entry(_('Gaps'), ext.settings.gap_inner(), (value) => { - ext.settings.set_gap_inner(value); - ext.settings.set_gap_outer(value); - }); - this.border_radius = number_entry(_('Active Border Radius'), { - value: ext.settings.active_hint_border_radius(), - min: 0, - max: 30, - }, (value) => { - ext.settings.set_active_hint_border_radius(value); - }); - bm.addMenuItem(this.toggle_tiled); - bm.addMenuItem(floating_window_exceptions(ext, bm)); - bm.addMenuItem(menu_separator('')); - bm.addMenuItem(shortcuts(bm)); - bm.addMenuItem(settings_button(bm)); - bm.addMenuItem(menu_separator('')); - if (!Utils.is_wayland()) { - this.toggle_titles = show_title(ext); - bm.addMenuItem(this.toggle_titles); - } - bm.addMenuItem(this.toggle_active); - bm.addMenuItem(this.border_radius); - bm.addMenuItem(color_selector(ext, bm)); - bm.addMenuItem(this.entry_gaps); - } - destroy() { - this.button.destroy(); - } -} -function menu_separator(text) { - return new PopupSeparatorMenuItem(text); -} -function settings_button(menu) { - let item = new PopupMenuItem(_('View All')); - item.connect('activate', () => { - let path = GLib.find_program_in_path('pop-shell-shortcuts'); - if (path) { - spawn([path]); - } - else { - spawn(['xdg-open', 'https://support.system76.com/articles/pop-keyboard-shortcuts/']); - } - menu.close(); - }); - item.label.get_clutter_text().set_margin_left(12); - return item; -} -function floating_window_exceptions(ext, menu) { - let label = new St.Label({ text: 'Floating Window Exceptions' }); - label.set_x_expand(true); - let icon = new St.Icon({ icon_name: 'go-next-symbolic', icon_size: 16 }); - let widget = new St.BoxLayout({ vertical: false }); - widget.add_child(label); - widget.add_child(icon); - widget.set_x_expand(true); - let base = new PopupBaseMenuItem(); - base.add_child(widget); - base.connect('activate', () => { - ext.exception_dialog(); - GLib.timeout_add(GLib.PRIORITY_LOW, 300, () => { - menu.close(); - return false; - }); - }); - return base; -} -function shortcuts(menu) { - let layout_manager = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL }); - let widget = new St.Widget({ layout_manager, x_expand: true }); - let item = new PopupBaseMenuItem(); - item.add_child(widget); - item.connect('activate', () => { - let path = GLib.find_program_in_path('pop-shell-shortcuts'); - if (path) { - spawn([path]); - } - else { - spawn(['xdg-open', 'https://support.system76.com/articles/pop-keyboard-shortcuts/']); - } - menu.close(); - }); - function create_label(text) { - return new St.Label({ text }); - } - function create_shortcut_label(text) { - let label = create_label(text); - label.set_x_align(Clutter.ActorAlign.END); - return label; - } - layout_manager.set_row_spacing(12); - layout_manager.set_column_spacing(30); - layout_manager.attach(create_label(_('Shortcuts')), 0, 0, 2, 1); - let launcher_shortcut = _('Super + /'); - [ - [_('Launcher'), launcher_shortcut], - [_('Navigate Windows'), _('Super + Arrow Keys')], - [_('Toggle Tiling'), _('Super + Y')], - ].forEach((section, idx) => { - let key = create_label(section[0]); - key.get_clutter_text().set_margin_left(12); - let val = create_shortcut_label(section[1]); - layout_manager.attach(key, 0, idx + 1, 1, 1); - layout_manager.attach(val, 1, idx + 1, 1, 1); - }); - return item; -} -function clamp(input, min = 0, max = 128) { - return Math.min(Math.max(min, input), max); -} -function number_entry(label, valueOrOptions, callback) { - let value = valueOrOptions, min, max; - if (typeof valueOrOptions !== 'number') - ({ value, min, max } = valueOrOptions); - const entry = new St.Entry({ - text: String(value), - input_purpose: Clutter.InputContentPurpose.NUMBER, - x_align: Clutter.ActorAlign.CENTER, - x_expand: false, - }); - entry.set_style('width: 5em'); - entry.connect('button-release-event', () => { - return true; - }); - const text = entry.clutter_text; - text.set_max_length(2); - entry.connect('key-release-event', (_, event) => { - const symbol = event.get_key_symbol(); - const number = symbol == 65293 - ? parse_number(text.text) - : symbol == 65361 - ? clamp(parse_number(text.text) - 1, min, max) - : symbol == 65363 - ? clamp(parse_number(text.text) + 1, min, max) - : null; - if (number !== null) { - text.set_text(String(number)); - } - }); - const create_icon = (icon_name) => { - return new St.Icon({ icon_name, icon_size: 16 }); - }; - entry.set_primary_icon(create_icon('value-decrease')); - entry.connect('primary-icon-clicked', () => { - text.set_text(String(clamp(parseInt(text.get_text()) - 1, min, max))); - }); - entry.set_secondary_icon(create_icon('value-increase')); - entry.connect('secondary-icon-clicked', () => { - text.set_text(String(clamp(parseInt(text.get_text()) + 1, min, max))); - }); - text.connect('text-changed', () => { - const input = text.get_text(); - let parsed = parseInt(input); - if (isNaN(parsed)) { - text.set_text(input.substr(0, input.length - 1)); - parsed = 0; - } - callback(parsed); - }); - const item = new PopupMenuItem(label); - item.label.get_clutter_text().set_x_expand(true); - item.label.set_y_align(Clutter.ActorAlign.CENTER); - item.add_child(entry); - return item; -} -function parse_number(text) { - let number = parseInt(text, 10); - if (isNaN(number)) { - number = 0; - } - return number; -} -function show_title(ext) { - const t = toggle(_('Show Window Titles'), ext.settings.show_title(), (toggle) => { - ext.settings.set_show_title(toggle.state); - }); - return t; -} -function toggle(desc, active, connect) { - let toggle = new PopupSwitchMenuItem(desc, active); - toggle.label.set_y_align(Clutter.ActorAlign.CENTER); - toggle.connect('toggled', () => { - connect(toggle); - return true; - }); - return toggle; -} -function tiled(ext) { - let t = toggle(_('Tile Windows'), null != ext.auto_tiler, () => ext.toggle_tiling()); - return t; -} -function color_selector(ext, menu) { - let color_selector_item = new PopupMenuItem('Active Hint Color'); - let color_button = new St.Button(); - let settings = ext.settings; - let selected_color = settings.hint_color_rgba(); - color_button.label = ' '; - color_button.set_style(`background-color: ${selected_color}; border: 2px solid lightgray; border-radius: 2px`); - settings.ext.connect('changed', (_, key) => { - if (key === 'hint-color-rgba') { - let color_value = settings.hint_color_rgba(); - color_button.set_style(`background-color: ${color_value}; border: 2px solid lightgray; border-radius: 2px`); - } - }); - color_button.set_x_align(Clutter.ActorAlign.END); - color_button.set_x_expand(false); - color_selector_item.label.get_clutter_text().set_x_expand(true); - color_selector_item.label.set_y_align(Clutter.ActorAlign.CENTER); - color_selector_item.add_child(color_button); - color_button.connect('button-press-event', () => { - let path = get_current_path() + '/color_dialog/main.js'; - let resp = GLib.spawn_command_line_async(`gjs --module ${path}`); - if (!resp) { - return null; - } - GLib.timeout_add(GLib.PRIORITY_LOW, 300, () => { - menu.close(); - return false; - }); - }); - return color_selector_item; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/paths.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/paths.js deleted file mode 100644 index 4bd5c930..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/paths.js +++ /dev/null @@ -1,3 +0,0 @@ -export function get_current_path() { - return import.meta.url.split('://')[1].split('/').slice(0, -1).join('/'); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/prefs.js deleted file mode 100644 index 7be14588..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/prefs.js +++ /dev/null @@ -1,197 +0,0 @@ -import Gtk from 'gi://Gtk'; -import Gio from 'gi://Gio'; -const Settings = Gio.Settings; -import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -import * as settings from './settings.js'; -import * as log from './log.js'; -import * as focus from './focus.js'; -export default class PopShellPreferences extends ExtensionPreferences { - getPreferencesWidget() { - globalThis.popShellExtension = this; - let dialog = settings_dialog_new(); - if (dialog.show_all) { - dialog.show_all(); - } - else { - dialog.show(); - } - log.debug(JSON.stringify(dialog)); - return dialog; - } -} -function settings_dialog_new() { - let [app, grid] = settings_dialog_view(); - let ext = new settings.ExtensionSettings(); - app.window_titles.set_active(ext.show_title()); - app.window_titles.connect('state-set', (_widget, state) => { - ext.set_show_title(state); - Settings.sync(); - }); - app.snap_to_grid.set_active(ext.snap_to_grid()); - app.snap_to_grid.connect('state-set', (_widget, state) => { - ext.set_snap_to_grid(state); - Settings.sync(); - }); - app.smart_gaps.set_active(ext.smart_gaps()); - app.smart_gaps.connect('state-set', (_widget, state) => { - ext.set_smart_gaps(state); - Settings.sync(); - }); - app.outer_gap.set_text(String(ext.gap_outer())); - app.outer_gap.connect('activate', (widget) => { - let parsed = parseInt(widget.get_text().trim()); - if (!isNaN(parsed)) { - ext.set_gap_outer(parsed); - Settings.sync(); - } - }); - app.inner_gap.set_text(String(ext.gap_inner())); - app.inner_gap.connect('activate', (widget) => { - let parsed = parseInt(widget.get_text().trim()); - if (!isNaN(parsed)) { - ext.set_gap_inner(parsed); - Settings.sync(); - } - }); - app.log_level.set_active(ext.log_level()); - app.log_level.connect('changed', () => { - let active_id = app.log_level.get_active_id(); - ext.set_log_level(active_id); - }); - app.show_skip_taskbar.set_active(ext.show_skiptaskbar()); - app.show_skip_taskbar.connect('state-set', (_widget, state) => { - ext.set_show_skiptaskbar(state); - Settings.sync(); - }); - app.mouse_cursor_follows_active_window.set_active(ext.mouse_cursor_follows_active_window()); - app.mouse_cursor_follows_active_window.connect('state-set', (_widget, state) => { - ext.set_mouse_cursor_follows_active_window(state); - Settings.sync(); - }); - app.mouse_cursor_focus_position.set_active(ext.mouse_cursor_focus_location()); - app.mouse_cursor_focus_position.connect('changed', () => { - let active_id = app.mouse_cursor_focus_position.get_active_id(); - ext.set_mouse_cursor_focus_location(active_id); - }); - app.fullscreen_launcher.set_active(ext.fullscreen_launcher()); - app.fullscreen_launcher.connect('state-set', (_widget, state) => { - ext.set_fullscreen_launcher(state); - Settings.sync(); - }); - app.stacking_with_mouse.set_active(ext.stacking_with_mouse()); - app.stacking_with_mouse.connect('state-set', (_widget, state) => { - ext.set_stacking_with_mouse(state); - Settings.sync(); - }); - return grid; -} -function settings_dialog_view() { - const grid = new Gtk.Grid({ - column_spacing: 12, - row_spacing: 12, - margin_start: 10, - margin_end: 10, - margin_bottom: 10, - margin_top: 10, - }); - const win_label = new Gtk.Label({ - label: 'Show Window Titles', - xalign: 0.0, - hexpand: true, - }); - const snap_label = new Gtk.Label({ - label: 'Snap to Grid (Floating Mode)', - xalign: 0.0, - }); - const smart_label = new Gtk.Label({ - label: 'Smart Gaps', - xalign: 0.0, - }); - const show_skip_taskbar_label = new Gtk.Label({ - label: 'Show Minimize to Tray Windows', - xalign: 0.0, - }); - const mouse_cursor_follows_active_window_label = new Gtk.Label({ - label: 'Mouse Cursor Follows Active Window', - xalign: 0.0, - }); - const fullscreen_launcher_label = new Gtk.Label({ - label: 'Allow launcher over fullscreen window', - xalign: 0.0, - }); - const stacking_with_mouse = new Gtk.Label({ - label: 'Allow stacking with mouse', - xalign: 0.0, - }); - const [inner_gap, outer_gap] = gaps_section(grid, 9); - const settings = { - inner_gap, - outer_gap, - fullscreen_launcher: new Gtk.Switch({ halign: Gtk.Align.END }), - stacking_with_mouse: new Gtk.Switch({ halign: Gtk.Align.END }), - smart_gaps: new Gtk.Switch({ halign: Gtk.Align.END }), - snap_to_grid: new Gtk.Switch({ halign: Gtk.Align.END }), - window_titles: new Gtk.Switch({ halign: Gtk.Align.END }), - show_skip_taskbar: new Gtk.Switch({ halign: Gtk.Align.END }), - mouse_cursor_follows_active_window: new Gtk.Switch({ halign: Gtk.Align.END }), - mouse_cursor_focus_position: build_combo(grid, 7, focus.FocusPosition, 'Mouse Cursor Focus Position'), - log_level: build_combo(grid, 8, log.LOG_LEVELS, 'Log Level'), - }; - grid.attach(win_label, 0, 0, 1, 1); - grid.attach(settings.window_titles, 1, 0, 1, 1); - grid.attach(snap_label, 0, 1, 1, 1); - grid.attach(settings.snap_to_grid, 1, 1, 1, 1); - grid.attach(smart_label, 0, 2, 1, 1); - grid.attach(settings.smart_gaps, 1, 2, 1, 1); - grid.attach(fullscreen_launcher_label, 0, 3, 1, 1); - grid.attach(settings.fullscreen_launcher, 1, 3, 1, 1); - grid.attach(stacking_with_mouse, 0, 4, 1, 1); - grid.attach(settings.stacking_with_mouse, 1, 4, 1, 1); - grid.attach(show_skip_taskbar_label, 0, 5, 1, 1); - grid.attach(settings.show_skip_taskbar, 1, 5, 1, 1); - grid.attach(mouse_cursor_follows_active_window_label, 0, 6, 1, 1); - grid.attach(settings.mouse_cursor_follows_active_window, 1, 6, 1, 1); - return [settings, grid]; -} -function gaps_section(grid, top) { - let outer_label = new Gtk.Label({ - label: 'Outer', - xalign: 0.0, - margin_start: 24, - }); - let outer_entry = number_entry(); - let inner_label = new Gtk.Label({ - label: 'Inner', - xalign: 0.0, - margin_start: 24, - }); - let inner_entry = number_entry(); - let section_label = new Gtk.Label({ - label: 'Gaps', - xalign: 0.0, - }); - grid.attach(section_label, 0, top, 1, 1); - grid.attach(outer_label, 0, top + 1, 1, 1); - grid.attach(outer_entry, 1, top + 1, 1, 1); - grid.attach(inner_label, 0, top + 2, 1, 1); - grid.attach(inner_entry, 1, top + 2, 1, 1); - return [inner_entry, outer_entry]; -} -function number_entry() { - return new Gtk.Entry({ input_purpose: Gtk.InputPurpose.NUMBER }); -} -function build_combo(grid, top_index, iter_enum, label) { - let label_ = new Gtk.Label({ - label: label, - halign: Gtk.Align.START, - }); - grid.attach(label_, 0, top_index, 1, 1); - let combo = new Gtk.ComboBoxText(); - for (const [index, key] of Object.keys(iter_enum).entries()) { - if (typeof iter_enum[key] == 'string') { - combo.append(`${index}`, iter_enum[key]); - } - } - grid.attach(combo, 1, top_index, 1, 1); - return combo; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/rectangle.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/rectangle.js deleted file mode 100644 index a775968b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/rectangle.js +++ /dev/null @@ -1,81 +0,0 @@ -export class Rectangle { - constructor(array) { - this.array = array; - } - static from_meta(meta) { - return new Rectangle([meta.x, meta.y, meta.width, meta.height]); - } - get x() { - return this.array[0]; - } - set x(x) { - this.array[0] = x; - } - get y() { - return this.array[1]; - } - set y(y) { - this.array[1] = y; - } - get width() { - return this.array[2]; - } - set width(width) { - this.array[2] = width; - } - get height() { - return this.array[3]; - } - set height(height) { - this.array[3] = height; - } - apply(other) { - this.x += other.x; - this.y += other.y; - this.width += other.width; - this.height += other.height; - return this; - } - clamp(other) { - this.x = Math.max(other.x, this.x); - this.y = Math.max(other.y, this.y); - let tend = this.x + this.width, oend = other.x + other.width; - if (tend > oend) { - this.width = oend - this.x; - } - tend = this.y + this.height; - oend = other.y + other.height; - if (tend > oend) { - this.height = oend - this.y; - } - } - clone() { - return new Rectangle([this.array[0], this.array[1], this.array[2], this.array[3]]); - } - contains(other) { - return (this.x <= other.x && - this.y <= other.y && - this.x + this.width >= other.x + other.width && - this.y + this.height >= other.y + other.height); - } - diff(other) { - return new Rectangle([ - other.x - this.x, - other.y - this.y, - other.width - this.width, - other.height - this.height, - ]); - } - eq(other) { - return this.x == other.x && this.y == other.y && this.width == other.width && this.height == other.height; - } - fmt() { - return `Rect(${[this.x, this.y, this.width, this.height]})`; - } - intersects(other) { - return (this.x < other.x + other.width && - this.x + this.width > other.x && - this.y < other.y + other.height && - this.y + this.height > other.y); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/result.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/result.js deleted file mode 100644 index 8e74c512..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/result.js +++ /dev/null @@ -1,8 +0,0 @@ -export const OK = 1; -export const ERR = 2; -export function Ok(value) { - return { kind: 1, value: value }; -} -export function Err(value) { - return { kind: 2, value: value }; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/scheduler.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/scheduler.js deleted file mode 100644 index 9295d7ca..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/scheduler.js +++ /dev/null @@ -1,36 +0,0 @@ -import * as log from './log.js'; -import Gio from 'gi://Gio'; -const SchedulerInterface = '\ - \ - \ - \ - \ - \ -'; -const SchedulerProxy = Gio.DBusProxy.makeProxyWrapper(SchedulerInterface); -const SchedProxy = new SchedulerProxy(Gio.DBus.system, 'com.system76.Scheduler', '/com/system76/Scheduler'); -let foreground = 0; -let failed = false; -export function setForeground(win) { - if (failed) - return; - const pid = win.get_pid(); - if (pid) { - if (foreground === pid) - return; - foreground = pid; - try { - SchedProxy.SetForegroundProcessRemote(pid, (_result, error, _fds) => { - if (error !== null) - errorHandler(error); - }); - } - catch (error) { - errorHandler(error); - } - } -} -function errorHandler(error) { - log.warn(`system76-scheduler may not be installed and running: ${error}`); - failed = true; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/gschemas.compiled deleted file mode 100644 index 5a8e813f6977e965168632b3d32edfbc2a20ed94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4332 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 oH`V<{9 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/org.gnome.shell.extensions.pop-shell.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/org.gnome.shell.extensions.pop-shell.gschema.xml deleted file mode 100644 index fc766da7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/schemas/org.gnome.shell.extensions.pop-shell.gschema.xml +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - false - Show a hint around the active window - - - - 5 - - Border radius for active window hint, in pixels - - - - false - Allow showing launcher above fullscreen windows - - - - 2 - Gap between tiled windows - - - - 2 - Gap surrounding tiled windows - - - - true - Show title bars on windows with server-side decorations - - - - true - Handle minimized to tray windows - - - - true - Move cursor to active window when navigating with keyboard shortcuts or touchpad gestures - - - - 0 - The location the mouse cursor focuses when selecting a window - - - - - 64 - Size of a column in the display grid - - - - 64 - Size of a row in the display grid - - - - false - Hide the outer gap when a tree contains only one window - - - - false - Snaps windows to the tiling grid on drop - - - - false - Tile launched windows by default - - - - true - Allow for stacking windows as a result of dragging a window with mouse - - - - - Left','KP_Left','h']]]> - Focus left window - - - - Down','KP_Down','j']]]> - Focus down window - - - - Up','KP_Up','k']]]> - Focus up window - - - - Right','KP_Right','l']]]> - Focus right window - - - - - slash']]]> - Search key combo - - - - - - Toggle stacking mode inside management mode - - - - s']]]> - Toggle stacking mode outside management mode - - - - - Toggle tiling orientation - - - - Return','KP_Enter']]]> - Enter tiling mode - - - - - Accept tiling changes - - - - - Reject tiling changes - - - - g']]]> - Toggles a window between floating and tiling - - - - - y']]]> - Toggles auto-tiling on and off - - - - - - Move window left - - - - - Move window down - - - - - Move window up - - - - - Move window right - - - - - Move window left - - - - - Move window down - - - - - Move window up - - - - - Move window right - - - - o']]]> - Toggle tiling orientation - - - - - Left','KP_Left','h']]]> - Resize window left - - - - Down','KP_Down','j']]]> - Resize window down - - - - Up','KP_Up','k']]]> - Resize window up - - - - Right','KP_Right','l']]]> - Resize window right - - - - - Left','KP_Left','h']]]> - Swap window left - - - - Down','KP_Down','j']]]> - Swap window down - - - - Up','KP_Up','k']]]> - Swap window up - - - - Right','KP_Right','l']]]> - Swap window right - - - - - - Down','KP_Down','j']]]> - Move window to the lower workspace - - - - Up','KP_Up','k']]]> - Move window to the upper workspace - - - - Down','KP_Down','j']]]> - Move window to the lower monitor - - - - Up','KP_Up','k']]]> - Move window to the upper monitor - - - - Left','KP_Left','h']]]> - Move window to the leftward monitor - - - - Right','KP_Right','l']]]> - Move window to the rightward monitor - - - - 'rgba(251, 184, 108, 1)' - The current active-hint-color in RGBA - - - 0 - - Derive some log4j level/order - 0 - OFF - 1 - ERROR - 2 - WARN - 3 - INFO - 4 - DEBUG - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/search.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/search.js deleted file mode 100644 index a49a8264..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/search.js +++ /dev/null @@ -1,400 +0,0 @@ -import * as Lib from './lib.js'; -import * as rect from './rectangle.js'; -import GLib from 'gi://GLib'; -import Clutter from 'gi://Clutter'; -import Gio from 'gi://Gio'; -import Pango from 'gi://Pango'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -import Gdk from 'gi://Gdk'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { ModalDialog } from 'resource:///org/gnome/shell/ui/modalDialog.js'; -import * as Util from 'resource:///org/gnome/shell/misc/util.js'; -const { overview, wm } = Main; -import { Overview } from 'resource:///org/gnome/shell/ui/overview.js'; -let overview_toggle = null; -export class Search { - constructor() { - this.dialog = new ModalDialog({ - styleClass: 'pop-shell-search modal-dialog', - destroyOnClose: false, - shellReactive: true, - shouldFadeIn: false, - shouldFadeOut: false, - }); - this.children_to_abandon = null; - this.last_trigger = 0; - this.grab_handle = null; - this.activate_id = () => { }; - this.cancel = () => { }; - this.complete = () => { }; - this.search = () => { }; - this.select = () => { }; - this.quit = () => { }; - this.copy = () => { }; - this.active_id = 0; - this.widgets = []; - this.entry = new St.Entry({ - style_class: 'pop-shell-entry', - can_focus: true, - x_expand: true, - }); - this.entry.set_hint_text(" Type to search apps, or type '?' for more options."); - this.text = this.entry.get_clutter_text(); - this.text.set_use_markup(true); - this.dialog.setInitialKeyFocus(this.text); - let text_changed = null; - this.text.connect('activate', () => this.activate_id(this.active_id)); - this.text.connect('text-changed', (entry) => { - if (text_changed !== null) - GLib.source_remove(text_changed); - const text = entry.get_text().trim(); - const update = () => { - this.clear(); - this.search(text); - }; - if (text.length === 0) { - update(); - return; - } - text_changed = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 0, () => { - text_changed = null; - update(); - return false; - }); - }); - this.text.connect('key-press-event', (_, event) => { - const key = Gdk.keyval_name(Gdk.keyval_to_upper(event.get_key_symbol())); - const ctrlKey = Boolean(event.get_state() & Clutter.ModifierType.CONTROL_MASK); - const is_down = () => { - return key === 'Down' || (ctrlKey && key === 'J') || (ctrlKey && key === 'N'); - }; - const is_up = () => { - return key === 'Up' || key === 'ISO_Left_Tab' || (ctrlKey && key === 'K') || (ctrlKey && key === 'P'); - }; - const up_arrow = () => { - if (0 < this.active_id) { - this.select_id(this.active_id - 1); - } - else if (this.active_id == 0) { - this.select_id(this.widgets.length - 1); - } - }; - const down_arrow = () => { - if (this.active_id + 1 < this.widgets.length) { - this.select_id(this.active_id + 1); - } - else if (this.active_id + 1 == this.widgets.length) { - this.select_id(0); - } - }; - if (event.get_flags() != Clutter.EventFlags.NONE) { - const now = global.get_current_time(); - if (now - this.last_trigger < 100) { - return; - } - this.last_trigger = now; - if (is_up()) { - up_arrow(); - this.select(this.active_id); - } - else if (is_down()) { - down_arrow(); - this.select(this.active_id); - } - return; - } - this.last_trigger = global.get_current_time(); - if (key === 'Escape') { - this.reset(); - this.close(); - this.cancel(); - return; - } - else if (key === 'Tab') { - this.complete(); - return; - } - if (is_up()) { - up_arrow(); - } - else if (is_down()) { - down_arrow(); - } - else if (ctrlKey && key === '1') { - this.activate_id(0); - return; - } - else if (ctrlKey && key === '2') { - this.activate_id(1); - return; - } - else if (ctrlKey && key === '3') { - this.activate_id(2); - return; - } - else if (ctrlKey && key === '4') { - this.activate_id(3); - return; - } - else if (ctrlKey && key === '5') { - this.activate_id(4); - return; - } - else if (ctrlKey && key === '6') { - this.activate_id(5); - return; - } - else if (ctrlKey && key === '7') { - this.activate_id(6); - return; - } - else if (ctrlKey && key === '8') { - this.activate_id(7); - return; - } - else if (ctrlKey && key === '9') { - this.activate_id(8); - return; - } - else if (ctrlKey && key === 'Q') { - this.quit(this.active_id); - return; - } - else if (key === 'Copy' || (ctrlKey && (key === 'C' || key === 'Insert'))) { - if (this.text.get_selection()) { - return; - } - else { - this.copy(this.active_id); - this.close(); - this.cancel(); - } - } - this.select(this.active_id); - }); - this.list = new St.BoxLayout({ - styleClass: 'pop-shell-search-list', - vertical: true, - }); - const scroller = new St.ScrollView(); - scroller.add_child(this.list); - this.dialog.contentLayout.add_child(this.entry); - this.dialog.contentLayout.add_child(scroller); - this.scroller = scroller; - this.dialog.contentLayout.width = Math.max(Lib.current_monitor().width / 4, 640); - this.dialog.connect('event', (_actor, event) => { - const { width, height } = this.dialog.dialogLayout._dialog; - const { x, y } = this.dialog.dialogLayout; - const area = new rect.Rectangle([x, y, width, height]); - const close = this.dialog.visible && - event.type() == Clutter.EventType.BUTTON_PRESS && - !area.contains(Lib.cursor_rect()); - if (close) { - this.reset(); - this.close(); - this.cancel(); - } - return Clutter.EVENT_PROPAGATE; - }); - this.dialog.connect('closed', () => this.cancel()); - } - cleanup() { - if (this.children_to_abandon) { - for (const child of this.children_to_abandon) { - child.destroy(); - } - this.children_to_abandon = null; - } - } - clear() { - this.children_to_abandon = this.list.get_children(); - this.widgets = []; - this.active_id = 0; - } - close() { - try { - if (this.grab_handle !== null) { - Main.popModal(this.grab_handle); - this.grab_handle = null; - } - } - catch (error) { - } - this.reset(); - this.remove_injections(); - this.dialog.close(global.get_current_time()); - wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); - } - _open(timestamp, on_primary) { - this.grab_handle = Main.pushModal(this.dialog.dialogLayout); - this.dialog.open(timestamp, on_primary); - wm.allowKeybinding('overlay-key', Shell.ActionMode.ALL); - overview_toggle = Overview.prototype['toggle']; - Overview.prototype['toggle'] = () => { - if (this.dialog.is_visible()) { - this.reset(); - this.close(); - this.cancel(); - } - else { - this.remove_injections(); - overview.toggle(); - } - }; - } - get_text() { - return this.text.get_text(); - } - icon_size() { - return 34; - } - get list_max() { - return 7; - } - reset() { - this.clear(); - this.text.set_text(null); - } - show() { - this.dialog.show_all(); - this.clear(); - this.entry.grab_key_focus(); - } - highlight_selected() { - const widget = this.widgets[this.active_id]; - if (widget) { - widget.add_style_pseudo_class('select'); - try { - Util.ensureActorVisibleInScrollView(this.scroller, widget); - } - catch (_error) { } - } - } - select_id(id) { - this.unselect(); - this.active_id = id; - this.highlight_selected(); - } - unselect() { - this.widgets[this.active_id]?.remove_style_pseudo_class('select'); - } - append_search_option(option) { - const id = this.widgets.length; - if (id !== 0) { - this.list.add_child(Lib.separator()); - } - const { widget, shortcut } = option; - if (id < 9) { - shortcut.set_text(`Ctrl + ${id + 1}`); - shortcut.show(); - } - else { - shortcut.hide(); - } - let initial_cursor = Lib.cursor_rect(); - widget.connect('clicked', () => this.activate_id(id)); - widget.connect('notify::hover', () => { - const { x, y } = Lib.cursor_rect(); - if (x === initial_cursor.x && y === initial_cursor.y) - return; - this.select_id(id); - this.select(id); - }); - this.widgets.push(widget); - this.list.add_child(widget); - this.cleanup(); - this.list.show(); - const vscroll = this.scroller.get_vscroll_bar(); - if (this.scroller.vscrollbar_visible) { - vscroll.show(); - } - else { - vscroll.hide(); - } - if (id === 0) { - GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - this.highlight_selected(); - this.select(0); - return false; - }); - } - } - set_text(text) { - this.text.set_text(text); - } - remove_injections() { - if (overview_toggle !== null) { - Overview.prototype['toggle'] = overview_toggle; - overview_toggle = null; - } - } -} -export class SearchOption { - constructor(title, description, category_icon, icon, icon_size, exec, keywords) { - this.shortcut = new St.Label({ - text: '', - y_align: Clutter.ActorAlign.CENTER, - style: 'padding-left: 6px;padding-right: 6px', - }); - this.title = title; - this.description = description; - this.exec = exec; - this.keywords = keywords; - const layout = new St.BoxLayout({ x_expand: true }); - attach_icon(layout, category_icon, icon_size / 2); - const label = new St.Label({ text: title }); - label.clutter_text.set_ellipsize(Pango.EllipsizeMode.END); - attach_icon(layout, icon, icon_size); - const info_box = new St.BoxLayout({ - y_align: Clutter.ActorAlign.CENTER, - vertical: true, - x_expand: true, - }); - info_box.add_child(label); - if (description) { - info_box.add_child(new St.Label({ text: description, style: 'font-size: small' })); - } - layout.add_child(info_box); - layout.add_child(this.shortcut); - this.widget = new St.Button({ style_class: 'pop-shell-search-element' }); - this.widget.add_child(layout); - } -} -function attach_icon(layout, icon, icon_size) { - if (icon) { - const generated = generate_icon(icon, icon_size); - if (generated) { - generated.set_y_align(Clutter.ActorAlign.CENTER); - layout.add_child(generated); - } - } -} -function generate_icon(icon, icon_size) { - let app_icon = null; - if ('Name' in icon) { - const file = Gio.File.new_for_path(icon.Name); - if (file.query_exists(null)) { - app_icon = new St.Icon({ - gicon: Gio.icon_new_for_string(icon.Name), - icon_size, - }); - } - else { - app_icon = new St.Icon({ - icon_name: icon.Name, - icon_size, - }); - } - } - else if ('Mime' in icon) { - app_icon = new St.Icon({ - gicon: Gio.content_type_get_icon(icon.Mime), - icon_size, - }); - } - if (app_icon) { - app_icon.style_class = 'pop-shell-search-icon'; - } - return app_icon; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/settings.js deleted file mode 100644 index 353dcf87..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/settings.js +++ /dev/null @@ -1,185 +0,0 @@ -import Gio from 'gi://Gio'; -import Gdk from 'gi://Gdk'; -import { get_current_path } from './paths.js'; -const DARK = ['dark', 'adapta', 'plata', 'dracula']; -function settings_new_id(schema_id) { - try { - return new Gio.Settings({ schema_id }); - } - catch (why) { - if (schema_id !== 'org.gnome.shell.extensions.user-theme') { - } - return null; - } -} -function settings_new_schema(schema) { - const GioSSS = Gio.SettingsSchemaSource; - const schemaDir = Gio.File.new_for_path(get_current_path()).get_child('schemas'); - let schemaSource = schemaDir.query_exists(null) - ? GioSSS.new_from_directory(schemaDir.get_path(), GioSSS.get_default(), false) - : GioSSS.get_default(); - const schemaObj = schemaSource.lookup(schema, true); - if (!schemaObj) { - throw new Error('Schema ' + schema + ' could not be found for extension pop-shell' + '. Please check your installation.'); - } - return new Gio.Settings({ settings_schema: schemaObj }); -} -const ACTIVE_HINT = 'active-hint'; -const ACTIVE_HINT_BORDER_RADIUS = 'active-hint-border-radius'; -const STACKING_WITH_MOUSE = 'stacking-with-mouse'; -const COLUMN_SIZE = 'column-size'; -const EDGE_TILING = 'edge-tiling'; -const FULLSCREEN_LAUNCHER = 'fullscreen-launcher'; -const GAP_INNER = 'gap-inner'; -const GAP_OUTER = 'gap-outer'; -const ROW_SIZE = 'row-size'; -const SHOW_TITLE = 'show-title'; -const SMART_GAPS = 'smart-gaps'; -const SNAP_TO_GRID = 'snap-to-grid'; -const TILE_BY_DEFAULT = 'tile-by-default'; -const HINT_COLOR_RGBA = 'hint-color-rgba'; -const DEFAULT_RGBA_COLOR = 'rgba(251, 184, 108, 1)'; -const LOG_LEVEL = 'log-level'; -const SHOW_SKIPTASKBAR = 'show-skip-taskbar'; -const MOUSE_CURSOR_FOLLOWS_ACTIVE_WINDOW = 'mouse-cursor-follows-active-window'; -const MOUSE_CURSOR_FOCUS_LOCATION = 'mouse-cursor-focus-location'; -export class ExtensionSettings { - constructor() { - this.ext = settings_new_schema('org.gnome.shell.extensions.pop-shell'); - this.int = settings_new_id('org.gnome.desktop.interface'); - this.mutter = settings_new_id('org.gnome.mutter'); - this.shell = settings_new_id('org.gnome.shell.extensions.user-theme'); - } - active_hint() { - return this.ext.get_boolean(ACTIVE_HINT); - } - active_hint_border_radius() { - return this.ext.get_uint(ACTIVE_HINT_BORDER_RADIUS); - } - stacking_with_mouse() { - return this.ext.get_boolean(STACKING_WITH_MOUSE); - } - column_size() { - return this.ext.get_uint(COLUMN_SIZE); - } - dynamic_workspaces() { - return this.mutter ? this.mutter.get_boolean('dynamic-workspaces') : false; - } - fullscreen_launcher() { - return this.ext.get_boolean(FULLSCREEN_LAUNCHER); - } - gap_inner() { - return this.ext.get_uint(GAP_INNER); - } - gap_outer() { - return this.ext.get_uint(GAP_OUTER); - } - hint_color_rgba() { - let rgba = this.ext.get_string(HINT_COLOR_RGBA); - let valid_color = new Gdk.RGBA().parse(rgba); - if (!valid_color) { - return DEFAULT_RGBA_COLOR; - } - return rgba; - } - theme() { - return this.shell ? this.shell.get_string('name') : this.int ? this.int.get_string('gtk-theme') : 'Adwaita'; - } - is_dark() { - const theme = this.theme().toLowerCase(); - return DARK.some((dark) => theme.includes(dark)); - } - is_high_contrast() { - return this.theme().toLowerCase() === 'highcontrast'; - } - row_size() { - return this.ext.get_uint(ROW_SIZE); - } - show_title() { - return this.ext.get_boolean(SHOW_TITLE); - } - smart_gaps() { - return this.ext.get_boolean(SMART_GAPS); - } - snap_to_grid() { - return this.ext.get_boolean(SNAP_TO_GRID); - } - tile_by_default() { - return this.ext.get_boolean(TILE_BY_DEFAULT); - } - workspaces_only_on_primary() { - return this.mutter ? this.mutter.get_boolean('workspaces-only-on-primary') : false; - } - log_level() { - return this.ext.get_uint(LOG_LEVEL); - } - show_skiptaskbar() { - return this.ext.get_boolean(SHOW_SKIPTASKBAR); - } - mouse_cursor_follows_active_window() { - return this.ext.get_boolean(MOUSE_CURSOR_FOLLOWS_ACTIVE_WINDOW); - } - mouse_cursor_focus_location() { - return this.ext.get_uint(MOUSE_CURSOR_FOCUS_LOCATION); - } - set_active_hint(set) { - this.ext.set_boolean(ACTIVE_HINT, set); - } - set_active_hint_border_radius(set) { - this.ext.set_uint(ACTIVE_HINT_BORDER_RADIUS, set); - } - set_stacking_with_mouse(set) { - this.ext.set_boolean(STACKING_WITH_MOUSE, set); - } - set_column_size(size) { - this.ext.set_uint(COLUMN_SIZE, size); - } - set_edge_tiling(enable) { - this.mutter?.set_boolean(EDGE_TILING, enable); - } - set_fullscreen_launcher(enable) { - this.ext.set_boolean(FULLSCREEN_LAUNCHER, enable); - } - set_gap_inner(gap) { - this.ext.set_uint(GAP_INNER, gap); - } - set_gap_outer(gap) { - this.ext.set_uint(GAP_OUTER, gap); - } - set_hint_color_rgba(rgba) { - let valid_color = new Gdk.RGBA().parse(rgba); - if (valid_color) { - this.ext.set_string(HINT_COLOR_RGBA, rgba); - } - else { - this.ext.set_string(HINT_COLOR_RGBA, DEFAULT_RGBA_COLOR); - } - } - set_row_size(size) { - this.ext.set_uint(ROW_SIZE, size); - } - set_show_title(set) { - this.ext.set_boolean(SHOW_TITLE, set); - } - set_smart_gaps(set) { - this.ext.set_boolean(SMART_GAPS, set); - } - set_snap_to_grid(set) { - this.ext.set_boolean(SNAP_TO_GRID, set); - } - set_tile_by_default(set) { - this.ext.set_boolean(TILE_BY_DEFAULT, set); - } - set_log_level(set) { - this.ext.set_uint(LOG_LEVEL, set); - } - set_show_skiptaskbar(set) { - this.ext.set_boolean(SHOW_SKIPTASKBAR, set); - } - set_mouse_cursor_follows_active_window(set) { - this.ext.set_boolean(MOUSE_CURSOR_FOLLOWS_ACTIVE_WINDOW, set); - } - set_mouse_cursor_focus_location(set) { - this.ext.set_uint(MOUSE_CURSOR_FOCUS_LOCATION, set); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shell.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shell.js deleted file mode 100644 index 64118f0b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shell.js +++ /dev/null @@ -1,4 +0,0 @@ -export function monitor_neighbor_index(which, direction) { - const neighbor = global.display.get_monitor_neighbor_index(which, direction); - return neighbor < 0 ? null : neighbor; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shortcut_overlay.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shortcut_overlay.js deleted file mode 100644 index 7785c6eb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/shortcut_overlay.js +++ /dev/null @@ -1,93 +0,0 @@ -import GObject from 'gi://GObject'; -import St from 'gi://St'; -import * as Lib from './lib.js'; -const { separator } = Lib; -export class Shortcut { - constructor(description) { - this.description = description; - this.bindings = new Array(); - } - add(binding) { - this.bindings.push(binding); - return this; - } -} -export class Section { - constructor(header, shortcuts) { - this.header = header; - this.shortcuts = shortcuts; - } -} -export class Column { - constructor(sections) { - this.sections = sections; - } -} -export var ShortcutOverlay = GObject.registerClass(class ShortcutOverlay extends St.BoxLayout { - constructor() { - super(); - this.title = ''; - this.columns = new Array(); - } - _init(title, columns) { - super.init({ - styleClass: 'pop-shell-shortcuts', - destroyOnClose: false, - shellReactive: true, - shouldFadeIn: true, - shouldFadeOut: true, - }); - let columns_layout = new St.BoxLayout({ - styleClass: 'pop-shell-shortcuts-columns', - horizontal: true, - }); - for (const column of columns) { - let column_layout = new St.BoxLayout({ - styleClass: 'pop-shell-shortcuts-column', - }); - for (const section of column.sections) { - column_layout.add(this.gen_section(section)); - } - columns_layout.add(column_layout); - } - this.add(new St.Label({ - styleClass: 'pop-shell-shortcuts-title', - text: title, - })); - this.add(columns_layout); - } - gen_combination(combination) { - let layout = new St.BoxLayout({ - styleClass: 'pop-shell-binding', - horizontal: true, - }); - for (const key of combination) { - layout.add(St.Label({ text: key })); - } - return layout; - } - gen_section(section) { - let layout = new St.BoxLayout({ - styleclass: 'pop-shell-section', - }); - layout.add(new St.Label({ - styleClass: 'pop-shell-section-header', - text: section.header, - })); - for (const subsection of section.shortcuts) { - layout.add(separator()); - layout.add(this.gen_shortcut(subsection)); - } - return layout; - } - gen_shortcut(shortcut) { - let layout = new St.BoxLayout({ - styleClass: 'pop-shell-shortcut', - horizontal: true, - }); - layout.add(new St.Label({ - text: shortcut.description, - })); - return layout; - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/stack.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/stack.js deleted file mode 100644 index 2fbebd5d..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/stack.js +++ /dev/null @@ -1,549 +0,0 @@ -import * as Ecs from './ecs.js'; -import * as a from './arena.js'; -import * as utils from './utils.js'; -const Arena = a.Arena; -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; -const ACTIVE_TAB = 'pop-shell-tab pop-shell-tab-active'; -const INACTIVE_TAB = 'pop-shell-tab pop-shell-tab-inactive'; -const URGENT_TAB = 'pop-shell-tab pop-shell-tab-urgent'; -const INACTIVE_TAB_STYLE = '#9B8E8A'; -export var TAB_HEIGHT = 24; -function stack_widgets_new() { - let tabs = new St.BoxLayout({ - style_class: 'pop-shell-stack', - x_expand: true, - }); - tabs.get_layout_manager()?.set_homogeneous(true); - return { tabs }; -} -const ContainerButton = GObject.registerClass({ - Signals: { activate: {} }, -}, class ImageButton extends St.Button { - _init(icon) { - super._init({ - child: icon, - x_expand: true, - y_expand: true, - }); - } -}); -const TabButton = GObject.registerClass({ - Signals: { activate: {} }, -}, class TabButton extends St.Button { - _init(window) { - const icon = window.icon(window.ext, 24); - icon.set_x_align(Clutter.ActorAlign.START); - const label = new St.Label({ - y_expand: true, - x_align: Clutter.ActorAlign.START, - y_align: Clutter.ActorAlign.CENTER, - style: 'padding-left: 8px', - }); - label.text = window.title(); - const container = new St.BoxLayout({ - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - const close_button = new ContainerButton(new St.Icon({ - icon_name: 'window-close-symbolic', - icon_size: 24, - y_align: Clutter.ActorAlign.CENTER, - })); - close_button.connect('clicked', () => { - window.meta.delete(global.get_current_time()); - }); - close_button.set_x_align(Clutter.ActorAlign.END); - close_button.set_y_align(Clutter.ActorAlign.CENTER); - container.add_child(icon); - container.add_child(label); - container.add_child(close_button); - super._init({ - child: container, - x_expand: true, - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - this._title = label; - } - set_title(text) { - if (this._title) { - this._title.text = text; - } - } -}); -export class Stack { - constructor(ext, active, workspace, monitor) { - this.widgets = null; - this.active_id = 0; - this.prev_active = null; - this.prev_active_id = 0; - this.tabs = new Array(); - this.buttons = new Arena(); - this.tabs_height = TAB_HEIGHT; - this.stack_rect = { width: 0, height: 0, x: 0, y: 0 }; - this.active_signals = null; - this.rect = { width: 0, height: 0, x: 0, y: 0 }; - this.restacker = global.display.connect('restacked', () => this.restack()); - this.ext = ext; - this.active = active; - this.monitor = monitor; - this.workspace = workspace; - this.tabs_height = TAB_HEIGHT * this.ext.dpi; - this.widgets = stack_widgets_new(); - global.window_group.add_child(this.widgets.tabs); - this.reposition(); - this.tabs_destroy = this.widgets.tabs.connect('destroy', () => this.recreate_widgets()); - } - add(window) { - if (!this.widgets) - return; - const entity = window.entity; - const active = Ecs.entity_eq(entity, this.active); - const button = new TabButton(window); - const id = this.buttons.insert(button); - let tab = { active, entity, signals: [], button: id, button_signal: null }; - let comp = this.tabs.length; - this.bind_hint_events(tab); - this.tabs.push(tab); - this.watch_signals(comp, id, window); - this.widgets.tabs.add_child(button); - } - auto_activate() { - if (this.tabs.length === 0) - return null; - if (this.tabs.length <= this.active_id) { - this.active_id = this.tabs.length - 1; - } - const c = this.tabs[this.active_id]; - this.activate(c.entity); - return c.entity; - } - activate_prev() { - if (this.prev_active) { - this.activate(this.prev_active); - } - } - activate(entity) { - const permitted = this.permitted_to_show(); - if (this.widgets) - this.widgets.tabs.visible = permitted; - this.reset_visibility(permitted); - const win = this.ext.windows.get(entity); - if (!win) - return; - if (!Ecs.entity_eq(entity, this.active)) { - this.prev_active = this.active; - this.prev_active_id = this.active_id; - } - this.active_connect(win.meta, entity); - let id = 0; - for (const [idx, component] of this.tabs.entries()) { - let name; - this.window_exec(id, component.entity, (window) => { - const actor = window.meta.get_compositor_private(); - if (Ecs.entity_eq(entity, component.entity)) { - this.active_id = id; - component.active = true; - name = ACTIVE_TAB; - if (actor) - actor.show(); - } - else { - component.active = false; - name = INACTIVE_TAB; - if (actor) - actor.hide(); - } - let button = this.buttons.get(component.button); - if (button) { - button.set_style_class_name(name); - let tab_color = ''; - if (component.active) { - let settings = this.ext.settings; - let color_value = settings.hint_color_rgba(); - tab_color = `${color_value}; color: ${utils.is_dark(color_value) ? 'white' : 'black'}`; - } - else { - tab_color = `${INACTIVE_TAB_STYLE}`; - } - const tab_border_radius = this.get_tab_border_radius(idx); - button.set_style(`background: ${tab_color}; border-radius: ${tab_border_radius};`); - } - }); - id += 1; - } - this.reset_visibility(permitted); - } - get_tab_border_radius(idx) { - let result = `0px 0px 0px 0px`; - let radius = Math.max(0, this.ext.settings.active_hint_border_radius() - 4); - radius = Math.min(radius, Math.trunc(this.tabs_height / 2)); - if (this.tabs.length === 1) - result = `${radius}px`; - else if (idx === 0) - result = `${radius}px 0px 0px ${radius}px`; - else if (idx === this.tabs.length - 1) - result = `0px ${radius}px ${radius}px 0px`; - return result; - } - active_connect(window, active) { - this.active_disconnect(); - this.active = active; - this.active_reconnect(window); - } - active_reconnect(window) { - const on_window_changed = () => this.on_grab(() => { - const window = this.ext.windows.get(this.active); - if (window) { - this.update_positions(window.meta.get_frame_rect()); - this.window_changed(); - } - else { - this.active_disconnect(); - } - }); - this.active_signals = [ - window.connect('size-changed', on_window_changed), - window.connect('position-changed', on_window_changed), - ]; - } - active_disconnect() { - const active_meta = this.active_meta(); - if (this.active_signals && active_meta) { - for (const s of this.active_signals) - active_meta.disconnect(s); - } - this.active_signals = null; - } - active_meta() { - return this.ext.windows.get(this.active)?.meta; - } - bind_hint_events(tab) { - let settings = this.ext.settings; - let button = this.buttons.get(tab.button); - if (button) { - let change_id = settings.ext.connect('changed', (_, key) => { - if (key === 'hint-color-rgba') { - this.change_tab_color(tab); - } - return false; - }); - button.connect('destroy', () => { - settings.ext.disconnect(change_id); - }); - } - this.change_tab_color(tab); - } - change_tab_color(tab) { - let settings = this.ext.settings; - let button = this.buttons.get(tab.button); - if (button) { - let tab_color = ''; - if (Ecs.entity_eq(tab.entity, this.active)) { - let color_value = settings.hint_color_rgba(); - tab_color = `background: ${color_value}; color: ${utils.is_dark(color_value) ? 'white' : 'black'}`; - } - else { - tab_color = `background: ${INACTIVE_TAB_STYLE}`; - } - button.set_style(tab_color); - } - } - clear() { - this.active_disconnect(); - for (const c of this.tabs.splice(0)) - this.tab_disconnect(c); - this.widgets?.tabs.destroy_all_children(); - this.buttons.truncate(0); - } - tab_disconnect(c) { - const window = this.ext.windows.get(c.entity); - if (window) { - for (const s of c.signals) - window.meta.disconnect(s); - if (this.workspace === this.ext.active_workspace()) - window.meta.get_compositor_private()?.show(); - } - c.signals = []; - if (c.button_signal) { - const b = this.buttons.get(c.button); - if (b) { - b.disconnect(c.button_signal); - c.button_signal = null; - } - } - } - deactivate(w) { - for (const c of this.tabs) - if (Ecs.entity_eq(c.entity, w.entity)) { - this.tab_disconnect(c); - } - if (this.active_signals && Ecs.entity_eq(this.active, w.entity)) { - this.active_disconnect(); - } - } - destroy() { - global.display.disconnect(this.restacker); - this.active_disconnect(); - for (const c of this.tabs) { - this.tab_disconnect(c); - if (this.workspace === this.ext.active_workspace()) { - const win = this.ext.windows.get(c.entity); - if (win) { - win.meta.get_compositor_private()?.show(); - win.stack = null; - } - } - } - for (const b of this.buttons.values()) { - try { - b.destroy(); - } - catch (e) { } - } - if (this.widgets) { - const tabs = this.widgets.tabs; - this.widgets = null; - tabs.destroy(); - } - } - on_grab(or) { - if (this.ext.grab_op !== null) { - if (Ecs.entity_eq(this.ext.grab_op.entity, this.active)) { - if (this.widgets) { - const parent = this.widgets.tabs.get_parent(); - const actor = this.active_meta()?.get_compositor_private(); - if (actor && parent) { - parent.set_child_below_sibling(this.widgets.tabs, actor); - } - } - return; - } - } - or(); - } - recreate_widgets() { - if (this.widgets !== null) { - this.widgets.tabs.disconnect(this.tabs_destroy); - this.widgets = stack_widgets_new(); - global.window_group.add_child(this.widgets.tabs); - this.tabs_destroy = this.widgets.tabs.connect('destroy', () => this.recreate_widgets()); - this.active_disconnect(); - for (const c of this.tabs.splice(0)) { - this.tab_disconnect(c); - const window = this.ext.windows.get(c.entity); - if (window) - this.add(window); - } - this.update_positions(this.rect); - this.restack(); - const window = this.ext.windows.get(this.active); - if (!window) - return; - this.active_reconnect(window.meta); - } - } - remove_by_pos(idx) { - const c = this.tabs[idx]; - if (c) - this.remove_tab_component(c, idx); - } - remove_tab_component(c, idx) { - if (!this.widgets) - return; - this.tab_disconnect(c); - const b = this.buttons.get(c.button); - if (b) { - this.widgets.tabs.remove_child(b); - b.destroy(); - this.buttons.remove(c.button); - } - this.tabs.splice(idx, 1); - } - remove_tab(entity) { - if (!this.widgets) - return null; - if (this.prev_active && Ecs.entity_eq(entity, this.prev_active)) { - this.prev_active = null; - this.prev_active_id = 0; - } - let idx = 0; - for (const c of this.tabs) { - if (Ecs.entity_eq(c.entity, entity)) { - this.remove_tab_component(c, idx); - if (this.active_id > idx) { - this.active_id -= 1; - } - return idx; - } - idx += 1; - } - return null; - } - replace(window) { - if (!this.widgets) - return; - const c = this.tabs[this.active_id], actor = window.meta.get_compositor_private(); - if (c && actor) { - this.tab_disconnect(c); - if (Ecs.entity_eq(window.entity, this.active)) { - this.active_connect(window.meta, window.entity); - actor.show(); - } - else { - actor.hide(); - } - this.watch_signals(this.active_id, c.button, window); - this.buttons.get(c.button)?.set_title(window.title()); - this.activate(window.entity); - } - } - reposition() { - if (!this.widgets) - return; - const window = this.ext.windows.get(this.active); - if (!window) - return; - const actor = window.meta.get_compositor_private(); - if (!actor) { - this.active_disconnect(); - return; - } - actor.show(); - const parent = actor.get_parent(); - if (!parent) { - return; - } - const stack_parent = this.widgets.tabs.get_parent(); - if (stack_parent) { - stack_parent.remove_child(this.widgets.tabs); - } - parent.add_child(this.widgets.tabs); - if (!window.meta.is_fullscreen() && !window.is_maximized() && !this.ext.maximized_on_active_display()) { - parent.set_child_above_sibling(this.widgets.tabs, actor); - } - else { - parent.set_child_below_sibling(this.widgets.tabs, actor); - } - } - permitted_to_show(workspace) { - const active_workspace = workspace ?? global.workspace_manager.get_active_workspace_index(); - const primary = global.display.get_primary_monitor(); - const only_primary = this.ext.settings.workspaces_only_on_primary(); - return active_workspace === this.workspace || (only_primary && this.monitor != primary); - } - reset_visibility(permitted) { - let idx = 0; - for (const c of this.tabs) { - this.actor_exec(idx, c.entity, (actor) => { - if (permitted && this.active_id === idx) { - actor.show(); - return; - } - actor.hide(); - }); - idx += 1; - } - } - restack() { - this.on_grab(() => { - if (!this.widgets) - return; - const permitted = this.permitted_to_show(); - this.widgets.tabs.visible = permitted; - if (permitted) - this.reposition(); - this.reset_visibility(permitted); - }); - } - set_visible(visible) { - if (!this.widgets) - return; - this.widgets.tabs.visible = visible; - if (visible) { - this.widgets.tabs.show(); - } - else { - this.widgets.tabs.hide(); - } - } - update_positions(rect) { - if (!this.widgets) - return; - this.rect = rect; - this.tabs_height = TAB_HEIGHT * this.ext.dpi; - this.stack_rect = { - x: rect.x, - y: rect.y - this.tabs_height, - width: rect.width, - height: this.tabs_height + rect.height, - }; - this.widgets.tabs.x = rect.x; - this.widgets.tabs.y = this.stack_rect.y; - this.widgets.tabs.height = this.tabs_height; - this.widgets.tabs.width = rect.width; - } - watch_signals(comp, button, window) { - const entity = window.entity; - const widget = this.buttons.get(button); - if (!widget) - return; - const c = this.tabs[comp]; - if (c.button_signal) - widget.disconnect(c.button_signal); - c.button_signal = widget.connect('clicked', () => { - this.activate(entity); - this.window_exec(comp, entity, (window) => { - const actor = window.meta.get_compositor_private(); - if (actor) { - actor.show(); - window.activate(false); - this.reposition(); - for (const comp of this.tabs) { - this.buttons.get(comp.button)?.set_style_class_name(INACTIVE_TAB); - } - widget.set_style_class_name(ACTIVE_TAB); - } - }); - }); - if (this.tabs[comp].signals) { - for (const c of this.tabs[comp].signals) - window.meta.disconnect(c); - } - this.tabs[comp].signals = [ - window.meta.connect('notify::title', () => { - this.window_exec(comp, entity, (window) => { - this.buttons.get(button)?.set_title(window.title()); - }); - }), - window.meta.connect('notify::urgent', () => { - this.window_exec(comp, entity, (window) => { - if (!window.meta.has_focus()) { - this.buttons.get(button)?.set_style_class_name(URGENT_TAB); - } - }); - }), - ]; - } - window_changed() { - this.ext.show_border_on_focused(); - } - actor_exec(comp, entity, func) { - this.window_exec(comp, entity, (window) => { - func(window.meta.get_compositor_private()); - }); - } - window_exec(comp, entity, func) { - const window = this.ext.windows.get(entity); - if (window && window.actor_exists()) { - func(window); - } - else { - const tab = this.tabs[comp]; - if (tab) - this.tab_disconnect(tab); - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tags.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tags.js deleted file mode 100644 index cf97c1c1..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tags.js +++ /dev/null @@ -1,4 +0,0 @@ -export var Tiled = 0; -export var Floating = 1; -export var Blocked = 2; -export var ForceTile = 3; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tiling.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tiling.js deleted file mode 100644 index d86f75a3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/tiling.js +++ /dev/null @@ -1,710 +0,0 @@ -import * as GrabOp from './grab_op.js'; -import * as Lib from './lib.js'; -import * as Log from './log.js'; -import * as Node from './node.js'; -import * as Rect from './rectangle.js'; -import * as Tags from './tags.js'; -import * as window from './window.js'; -import * as geom from './geom.js'; -import * as exec from './executor.js'; -import Meta from 'gi://Meta'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -const { ShellWindow } = window; -export var Direction; -(function (Direction) { - Direction[Direction["Left"] = 0] = "Left"; - Direction[Direction["Up"] = 1] = "Up"; - Direction[Direction["Right"] = 2] = "Right"; - Direction[Direction["Down"] = 3] = "Down"; -})(Direction || (Direction = {})); -export class Tiler { - constructor(ext) { - this.window = null; - this.moving = false; - this.resizing_window = false; - this.swap_window = null; - this.queue = new exec.ChannelExecutor(); - this.keybindings = { - 'management-orientation': () => this.toggle_orientation(ext), - 'tile-move-left': () => this.move_left(ext), - 'tile-move-down': () => this.move_down(ext), - 'tile-move-up': () => this.move_up(ext), - 'tile-move-right': () => this.move_right(ext), - 'tile-resize-left': () => this.resize(ext, Direction.Left), - 'tile-resize-down': () => this.resize(ext, Direction.Down), - 'tile-resize-up': () => this.resize(ext, Direction.Up), - 'tile-resize-right': () => this.resize(ext, Direction.Right), - 'tile-swap-left': () => this.swap_left(ext), - 'tile-swap-down': () => this.swap_down(ext), - 'tile-swap-up': () => this.swap_up(ext), - 'tile-swap-right': () => this.swap_right(ext), - 'tile-accept': () => this.accept(ext), - 'tile-reject': () => this.exit(ext), - 'toggle-stacking': () => this.toggle_stacking(ext), - }; - } - toggle_orientation(ext) { - const window = ext.focus_window(); - if (window && ext.auto_tiler) { - ext.auto_tiler.toggle_orientation(ext, window); - ext.register_fn(() => window.activate(true)); - } - } - toggle_stacking(ext) { - ext.auto_tiler?.toggle_stacking(ext); - const win = ext.focus_window(); - if (win) - this.overlay_watch(ext, win); - } - rect(ext, monitor) { - if (!ext.overlay.visible) - return null; - const columns = Math.floor(monitor.width / ext.column_size); - const rows = Math.floor(monitor.height / ext.row_size); - return monitor_rect(monitor, columns, rows); - } - change(overlay, rect, dx, dy, dw, dh) { - let changed = new Rect.Rectangle([ - overlay.x + dx * rect.width, - overlay.y + dy * rect.height, - overlay.width + dw * rect.width, - overlay.height + dh * rect.height, - ]); - changed.x = Lib.round_increment(changed.x - rect.x, rect.width) + rect.x; - changed.y = Lib.round_increment(changed.y - rect.y, rect.height) + rect.y; - changed.width = Lib.round_increment(changed.width, rect.width); - changed.height = Lib.round_increment(changed.height, rect.height); - if (changed.width < rect.width) { - changed.width = rect.width; - } - if (changed.height < rect.height) { - changed.height = rect.height; - } - let monitors = tile_monitors(changed); - if (monitors.length == 0) - return this; - let min_x = null; - let min_y = null; - let max_x = null; - let max_y = null; - for (const monitor of monitors) { - if (min_x === null || monitor.x < min_x) { - min_x = monitor.x; - } - if (min_y === null || monitor.y < min_y) { - min_y = monitor.y; - } - if (max_x === null || monitor.x + monitor.width > max_x) { - max_x = monitor.x + monitor.width; - } - if (max_y === null || monitor.y + monitor.height < max_y) { - max_y = monitor.y + monitor.height; - } - } - if (min_x === null || - min_y === null || - max_x === null || - max_y === null || - changed.x < min_x || - changed.x + changed.width > max_x || - changed.y < min_y || - changed.y + changed.height > max_y) - return this; - overlay.x = changed.x; - overlay.y = changed.y; - overlay.width = changed.width; - overlay.height = changed.height; - return this; - } - unstack_from_fork(ext, stack, focused, fork, left, right, is_left) { - if (!ext.auto_tiler) - return null; - const forest = ext.auto_tiler.forest; - const new_fork = forest.create_fork(left, right, fork.area, fork.workspace, fork.monitor); - if (is_left) { - fork.left = Node.Node.fork(new_fork[0]); - } - else { - fork.right = Node.Node.fork(new_fork[0]); - } - ext.auto_tiler.forest.parents.insert(new_fork[0], fork.entity); - forest.on_attach(new_fork[0], focused.entity); - for (const e of stack.entities) { - forest.on_attach(new_fork[0], e); - } - return new_fork[1]; - } - move(ext, window, x, y, w, h, direction, focus) { - if (!window) - return; - const win = ext.windows.get(window); - if (!win) - return; - const place_pointer = () => { - ext.register_fn(() => win.activate(true)); - }; - if (ext.auto_tiler && win.is_tilable(ext)) { - if (this.queue.length === 2) - return; - this.queue.send(() => { - const focused = ext.focus_window(); - if (focused) { - const move_to = focus(); - this.moving = true; - if (ext.auto_tiler) { - const s = ext.auto_tiler.find_stack(focused.entity); - if (s) { - this.move_from_stack(ext, s, focused, direction); - this.moving = false; - place_pointer(); - return; - } - } - if (move_to !== null) - this.move_auto(ext, focused, move_to, direction === Direction.Left); - this.moving = false; - place_pointer(); - } - }); - } - else { - this.swap_window = null; - this.rect_by_active_area(ext, (_monitor, rect) => { - this.change(ext.overlay, rect, x, y, w, h).change(ext.overlay, rect, 0, 0, 0, 0); - }); - } - } - move_alongside_stack(ext, [fork, branch, is_left], focused, direction) { - let new_fork = null; - if (fork.is_toplevel && fork.smart_gapped) { - fork.smart_gapped = false; - let rect = ext.monitor_work_area(fork.monitor); - rect.x += ext.gap_outer; - rect.y += ext.gap_outer; - rect.width -= ext.gap_outer * 2; - rect.height -= ext.gap_outer * 2; - fork.set_area(rect); - } - let orientation, reverse; - const { HORIZONTAL, VERTICAL } = Lib.Orientation; - switch (direction) { - case Direction.Left: - orientation = HORIZONTAL; - reverse = false; - break; - case Direction.Right: - orientation = HORIZONTAL; - reverse = true; - break; - case Direction.Up: - orientation = VERTICAL; - reverse = false; - break; - default: - orientation = VERTICAL; - reverse = true; - } - if (!ext.auto_tiler) - return; - const inner = branch.inner; - Node.stack_remove(ext.auto_tiler.forest, inner, focused.entity); - ext.auto_tiler.detach_window(ext, focused.entity); - focused.stack = null; - if (fork.right) { - let left, right; - if (reverse) { - left = branch; - right = Node.Node.window(focused.entity); - } - else { - left = Node.Node.window(focused.entity); - right = branch; - } - const inner = branch.inner; - new_fork = this.unstack_from_fork(ext, inner, focused, fork, left, right, is_left); - } - else if (reverse) { - fork.right = Node.Node.window(focused.entity); - } - else { - fork.right = fork.left; - fork.left = Node.Node.window(focused.entity); - } - let modifier = new_fork ?? fork; - modifier.set_orientation(orientation); - ext.auto_tiler.forest.on_attach(modifier.entity, focused.entity); - ext.auto_tiler.tile(ext, fork, fork.area); - this.overlay_watch(ext, focused); - } - move_from_stack(ext, [fork, branch, is_left], focused, direction, force_detach = false) { - if (!ext.auto_tiler) - return; - const inner = branch.inner; - if (inner.entities.length === 1) { - ext.auto_tiler.toggle_stacking(ext); - this.overlay_watch(ext, focused); - return; - } - let new_fork = null; - if (fork.is_toplevel && fork.smart_gapped) { - fork.smart_gapped = false; - let rect = ext.monitor_work_area(fork.monitor); - rect.x += ext.gap_outer; - rect.y += ext.gap_outer; - rect.width -= ext.gap_outer * 2; - rect.height -= ext.gap_outer * 2; - fork.set_area(rect); - } - const forest = ext.auto_tiler.forest; - const fentity = focused.entity; - const detach = (orient, reverse) => { - if (!ext.auto_tiler) - return; - focused.stack = null; - if (fork.right) { - let left, right; - if (reverse) { - left = branch; - right = Node.Node.window(fentity); - } - else { - left = Node.Node.window(fentity); - right = branch; - } - new_fork = this.unstack_from_fork(ext, inner, focused, fork, left, right, is_left); - } - else if (reverse) { - fork.right = Node.Node.window(fentity); - } - else { - fork.right = fork.left; - fork.left = Node.Node.window(fentity); - } - let modifier = new_fork ?? fork; - modifier.set_orientation(orient); - forest.on_attach(modifier.entity, fentity); - ext.auto_tiler.tile(ext, fork, fork.area); - this.overlay_watch(ext, focused); - }; - switch (direction) { - case Direction.Left: - if (force_detach) { - Node.stack_remove(forest, inner, fentity); - detach(Lib.Orientation.HORIZONTAL, false); - } - else if (!Node.stack_move_left(ext, forest, inner, fentity)) { - detach(Lib.Orientation.HORIZONTAL, false); - } - ext.auto_tiler.update_stack(ext, inner); - break; - case Direction.Right: - if (force_detach) { - Node.stack_remove(forest, inner, fentity); - detach(Lib.Orientation.HORIZONTAL, true); - } - else if (!Node.stack_move_right(ext, forest, inner, fentity)) { - detach(Lib.Orientation.HORIZONTAL, true); - } - ext.auto_tiler.update_stack(ext, inner); - break; - case Direction.Up: - Node.stack_remove(forest, inner, fentity); - detach(Lib.Orientation.VERTICAL, false); - break; - case Direction.Down: - Node.stack_remove(forest, inner, fentity); - detach(Lib.Orientation.VERTICAL, true); - break; - } - } - move_auto_(ext, mov1, mov2, callback) { - if (ext.auto_tiler && this.window) { - const entity = ext.auto_tiler.attached.get(this.window); - if (entity) { - const fork = ext.auto_tiler.forest.forks.get(entity); - const window = ext.windows.get(this.window); - if (!fork || !window) - return; - const workspace_id = ext.workspace_id(window); - const toplevel = ext.auto_tiler.forest.find_toplevel(workspace_id); - if (!toplevel) - return; - const topfork = ext.auto_tiler.forest.forks.get(toplevel); - if (!topfork) - return; - const toparea = topfork.area; - const before = window.rect(); - const grab_op = new GrabOp.GrabOp(this.window, before); - let crect = grab_op.rect.clone(); - let resize = (mov, func) => { - if (func(toparea, crect, mov) || crect.eq(grab_op.rect)) - return; - ext.auto_tiler.forest.resize(ext, entity, fork, this.window, grab_op.operation(crect), crect); - grab_op.rect = crect.clone(); - }; - resize(mov1, callback); - resize(mov2, callback); - ext.auto_tiler.forest.arrange(ext, fork.workspace); - ext.register_fn(() => ext.set_overlay(window.rect())); - } - } - } - overlay_watch(ext, window) { - ext.register_fn(() => { - if (window) { - ext.set_overlay(window.rect()); - window.activate(false); - } - }); - } - rect_by_active_area(ext, callback) { - if (this.window) { - const monitor_id = ext.monitors.get(this.window); - if (monitor_id) { - const monitor = ext.monitor_work_area(monitor_id[0]); - let rect = this.rect(ext, monitor); - if (rect) { - callback(monitor, rect); - } - } - } - } - resize_auto(ext, direction) { - let mov1, mov2; - const hrow = 64; - const hcolumn = 64; - switch (direction) { - case Direction.Left: - mov1 = [hrow, 0, -hrow, 0]; - mov2 = [0, 0, -hrow, 0]; - break; - case Direction.Right: - mov1 = [0, 0, hrow, 0]; - mov2 = [-hrow, 0, hrow, 0]; - break; - case Direction.Up: - mov1 = [0, hcolumn, 0, -hcolumn]; - mov2 = [0, 0, 0, -hcolumn]; - break; - default: - mov1 = [0, 0, 0, hcolumn]; - mov2 = [0, -hcolumn, 0, hcolumn]; - } - this.move_auto_(ext, new Rect.Rectangle(mov1), new Rect.Rectangle(mov2), (work_area, crect, mov) => { - crect.apply(mov); - let before = crect.clone(); - crect.clamp(work_area); - const diff = before.diff(crect); - crect.apply(new Rect.Rectangle([0, 0, -diff.x, -diff.y])); - return false; - }); - } - move_auto(ext, focused, move_to, stack_from_left = true) { - let watching = null; - const at = ext.auto_tiler; - if (at) { - if (move_to instanceof ShellWindow) { - const stack_info = at.find_stack(move_to.entity); - if (stack_info) { - const [stack_fork, branch] = stack_info; - const stack = branch.inner; - const placement = { auto: 0 }; - focused.ignore_detach = true; - at.detach_window(ext, focused.entity); - at.forest.on_attach(stack_fork.entity, focused.entity); - at.update_stack(ext, stack); - at.tile(ext, stack_fork, stack_fork.area); - focused.ignore_detach = true; - at.detach_window(ext, focused.entity); - at.attach_to_window(ext, move_to, focused, placement, stack_from_left); - watching = focused; - } - else { - const parent = at.windows_are_siblings(focused.entity, move_to.entity); - if (parent) { - const fork = at.forest.forks.get(parent); - if (fork) { - if (!fork.right) { - Log.error('move_auto: detected as sibling, but fork lacks right branch'); - return; - } - if (fork.left.inner.kind === 3) { - Node.stack_remove(at.forest, fork.left.inner, focused.entity); - focused.stack = null; - } - else { - const temp = fork.right; - fork.right = fork.left; - fork.left = temp; - at.tile(ext, fork, fork.area); - watching = focused; - } - } - } - if (!watching) { - let movement = { src: focused.meta.get_frame_rect() }; - focused.ignore_detach = true; - at.detach_window(ext, focused.entity); - at.attach_to_window(ext, move_to, focused, movement, false); - watching = focused; - } - } - } - else { - focused.ignore_detach = true; - at.detach_window(ext, focused.entity); - at.attach_to_workspace(ext, focused, [move_to, ext.active_workspace()]); - watching = focused; - } - } - if (watching) { - this.overlay_watch(ext, watching); - } - else { - ext.set_overlay(focused.rect()); - } - } - move_left(ext, window) { - this.move(ext, window ?? this.window, -1, 0, 0, 0, Direction.Left, move_window_or_monitor(ext, ext.focus_selector.left, Meta.DisplayDirection.LEFT)); - } - move_down(ext, window) { - this.move(ext, window ?? this.window, 0, 1, 0, 0, Direction.Down, move_window_or_monitor(ext, ext.focus_selector.down, Meta.DisplayDirection.DOWN)); - } - move_up(ext, window) { - this.move(ext, window ?? this.window, 0, -1, 0, 0, Direction.Up, move_window_or_monitor(ext, ext.focus_selector.up, Meta.DisplayDirection.UP)); - } - move_right(ext, window) { - this.move(ext, window ?? this.window, 1, 0, 0, 0, Direction.Right, move_window_or_monitor(ext, ext.focus_selector.right, Meta.DisplayDirection.RIGHT)); - } - resize(ext, direction) { - if (!this.window) - return; - this.resizing_window = true; - if (ext.auto_tiler && !ext.contains_tag(this.window, Tags.Floating)) { - this.resize_auto(ext, direction); - } - else { - let array; - switch (direction) { - case Direction.Down: - array = [0, 0, 0, 1]; - break; - case Direction.Left: - array = [0, 0, -1, 0]; - break; - case Direction.Up: - array = [0, 0, 0, -1]; - break; - default: - array = [0, 0, 1, 0]; - } - const [x, y, w, h] = array; - this.swap_window = null; - this.rect_by_active_area(ext, (_monitor, rect) => { - this.change(ext.overlay, rect, x, y, w, h).change(ext.overlay, rect, 0, 0, 0, 0); - }); - } - this.resizing_window = false; - } - swap(ext, selector) { - if (selector) { - ext.set_overlay(selector.rect()); - this.swap_window = selector.entity; - } - } - swap_left(ext) { - if (this.swap_window) { - ext.windows.with(this.swap_window, (window) => { - this.swap(ext, ext.focus_selector.left(ext, window)); - }); - } - else { - this.swap(ext, ext.focus_selector.left(ext, null)); - } - } - swap_down(ext) { - if (this.swap_window) { - ext.windows.with(this.swap_window, (window) => { - this.swap(ext, ext.focus_selector.down(ext, window)); - }); - } - else { - this.swap(ext, ext.focus_selector.down(ext, null)); - } - } - swap_up(ext) { - if (this.swap_window) { - ext.windows.with(this.swap_window, (window) => { - this.swap(ext, ext.focus_selector.up(ext, window)); - }); - } - else { - this.swap(ext, ext.focus_selector.up(ext, null)); - } - } - swap_right(ext) { - if (this.swap_window) { - ext.windows.with(this.swap_window, (window) => { - this.swap(ext, ext.focus_selector.right(ext, window)); - }); - } - else { - this.swap(ext, ext.focus_selector.right(ext, null)); - } - } - enter(ext) { - if (!this.window) { - const win = ext.focus_window(); - if (!win) - return; - this.window = win.entity; - if (win.is_maximized()) { - win.meta.unmaximize(Meta.MaximizeFlags.BOTH); - } - ext.set_overlay(win.rect()); - ext.overlay.visible = true; - if (!ext.auto_tiler || ext.contains_tag(win.entity, Tags.Floating)) { - this.rect_by_active_area(ext, (_monitor, rect) => { - this.change(ext.overlay, rect, 0, 0, 0, 0); - }); - } - ext.keybindings.disable(ext.keybindings.window_focus).enable(this.keybindings); - } - } - accept(ext) { - if (this.window) { - const meta = ext.windows.get(this.window); - if (meta) { - let tree_swapped = false; - if (this.swap_window) { - const meta_swap = ext.windows.get(this.swap_window); - if (meta_swap) { - if (ext.auto_tiler) { - tree_swapped = true; - ext.auto_tiler.attach_swap(ext, this.swap_window, this.window); - } - else { - ext.size_signals_block(meta_swap); - meta_swap.move(ext, meta.rect(), () => { - ext.size_signals_unblock(meta_swap); - }); - } - ext.register_fn(() => meta.activate(true)); - } - } - if (!tree_swapped) { - ext.size_signals_block(meta); - const meta_entity = this.window; - meta.move(ext, ext.overlay, () => { - ext.size_signals_unblock(meta); - ext.add_tag(meta_entity, Tags.Tiled); - }); - } - } - } - this.swap_window = null; - this.exit(ext); - } - exit(ext) { - this.queue.clear(); - if (this.window) { - this.window = null; - ext.overlay.visible = false; - ext.keybindings.disable(this.keybindings).enable(ext.keybindings.window_focus); - } - } - snap(ext, win) { - let mon_geom = ext.monitor_work_area(win.meta.get_monitor()); - if (mon_geom) { - let rect = win.rect(); - const columns = Math.floor(mon_geom.width / ext.column_size); - const rows = Math.floor(mon_geom.height / ext.row_size); - this.change(rect, monitor_rect(mon_geom, columns, rows), 0, 0, 0, 0); - win.move(ext, rect); - ext.snapped.insert(win.entity, true); - } - } -} -export function locate_monitor(win, direction) { - if (!win.actor_exists()) - return null; - const from = win.meta.get_monitor(); - const ref = win.meta.get_work_area_for_monitor(from); - const n_monitors = global.display.get_n_monitors(); - const { UP, DOWN, LEFT } = Meta.DisplayDirection; - let origin; - let exclude; - if (direction === UP) { - origin = [ref.x + ref.width / 2, ref.y]; - exclude = (rect) => { - return rect.y > ref.y; - }; - } - else if (direction === DOWN) { - origin = [ref.x + ref.width / 2, ref.y + ref.height]; - exclude = (rect) => rect.y < ref.y; - } - else if (direction === LEFT) { - origin = [ref.x, ref.y + ref.height / 2]; - exclude = (rect) => rect.x > ref.x; - } - else { - origin = [ref.x + ref.width, ref.y + ref.height / 2]; - exclude = (rect) => rect.x < ref.x; - } - let next = null; - for (let mon = 0; mon < n_monitors; mon += 1) { - if (mon === from) - continue; - const work_area = win.meta.get_work_area_for_monitor(mon); - if (!work_area || exclude(work_area)) - continue; - const weight = geom.shortest_side(origin, work_area); - if (next === null || next[1] > weight) { - next = [mon, weight, work_area]; - } - } - return next ? [next[0], next[2]] : null; -} -function monitor_rect(monitor, columns, rows) { - let tile_width = monitor.width / columns; - let tile_height = monitor.height / rows; - if (monitor.width * 9 >= monitor.height * 21) { - tile_width /= 2; - } - if (monitor.height * 9 >= monitor.width * 21) { - tile_height /= 2; - } - return new Rect.Rectangle([monitor.x, monitor.y, tile_width, tile_height]); -} -function move_window_or_monitor(ext, method, direction) { - return () => { - let next_window = method.call(ext.focus_selector, ext, null); - next_window = next_window?.actor_exists() ? next_window : null; - const focus = ext.focus_window(); - if (focus) { - const next_monitor = locate_monitor(focus, direction); - if (!next_window) - return next_monitor ? next_monitor[0] : null; - if (!next_monitor || focus.meta.get_monitor() == next_window.meta.get_monitor()) - return next_window; - return Rect.Rectangle.from_meta(next_monitor[1]).contains(next_window.rect()) - ? next_window - : next_monitor[0]; - } - return next_window; - }; -} -function tile_monitors(rect) { - let total_size = (a, b) => a.width * a.height - b.width * b.height; - let workspace = global.workspace_manager.get_active_workspace(); - return Main.layoutManager.monitors - .map((_monitor, i) => workspace.get_work_area_for_monitor(i)) - .filter((monitor) => { - return (rect.x + rect.width > monitor.x && - rect.y + rect.height > monitor.y && - rect.x < monitor.x + monitor.width && - rect.y < monitor.y + monitor.height); - }) - .sort(total_size); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/utils.js deleted file mode 100644 index 1b40212a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/utils.js +++ /dev/null @@ -1,144 +0,0 @@ -import * as result from './result.js'; -import * as error from './error.js'; -import * as log from './log.js'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Meta from 'gi://Meta'; -const { Ok, Err } = result; -const { Error } = error; -export function is_wayland() { - return Meta.is_wayland_compositor(); -} -export function block_signal(object, signal) { - GObject.signal_handler_block(object, signal); -} -export function unblock_signal(object, signal) { - GObject.signal_handler_unblock(object, signal); -} -export function read_to_string(path) { - const file = Gio.File.new_for_path(path); - try { - const [ok, contents] = file.load_contents(null); - if (ok) { - return Ok(imports.byteArray.toString(contents)); - } - else { - return Err(new Error(`failed to load contents of ${path}`)); - } - } - catch (e) { - return Err(new Error(String(e)).context(`failed to load contents of ${path}`)); - } -} -export function source_remove(id) { - return GLib.source_remove(id); -} -export function exists(path) { - return Gio.File.new_for_path(path).query_exists(null); -} -export function is_dark(color) { - let color_val = ''; - let r = 255; - let g = 255; - let b = 255; - if (color.indexOf('rgb') >= 0) { - color = color.replace('rgba', 'rgb').replace('rgb(', '').replace(')', ''); - let colors = color.split(','); - r = parseInt(colors[0].trim()); - g = parseInt(colors[1].trim()); - b = parseInt(colors[2].trim()); - } - else if (color.charAt(0) === '#') { - color_val = color.substring(1, 7); - r = parseInt(color_val.substring(0, 2), 16); - g = parseInt(color_val.substring(2, 4), 16); - b = parseInt(color_val.substring(4, 6), 16); - } - let uicolors = [r / 255, g / 255, b / 255]; - let c = uicolors.map((col) => { - if (col <= 0.03928) { - return col / 12.92; - } - return Math.pow((col + 0.055) / 1.055, 2.4); - }); - let L = 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]; - return L <= 0.179; -} -export function async_process(argv, input = null, cancellable = null) { - let flags = Gio.SubprocessFlags.STDOUT_PIPE; - if (input !== null) - flags |= Gio.SubprocessFlags.STDIN_PIPE; - let proc = new Gio.Subprocess({ argv, flags }); - proc.init(cancellable); - proc.wait_async(null, (source, res) => { - source.wait_finish(res); - if (cancellable !== null) { - cancellable.cancel(); - } - }); - return new Promise((resolve, reject) => { - proc.communicate_utf8_async(input, cancellable, (proc, res) => { - try { - let bytes = proc.communicate_utf8_finish(res)[1]; - resolve(bytes.toString()); - } - catch (e) { - reject(e); - } - }); - }); -} -export function async_process_ipc(argv) { - const { SubprocessLauncher, SubprocessFlags } = Gio; - const launcher = new SubprocessLauncher({ - flags: SubprocessFlags.STDIN_PIPE | SubprocessFlags.STDOUT_PIPE, - }); - let child; - let cancellable = new Gio.Cancellable(); - try { - child = launcher.spawnv(argv); - } - catch (why) { - log.error(`failed to spawn ${argv}: ${why}`); - return null; - } - let stdin = new Gio.DataOutputStream({ - base_stream: child.get_stdin_pipe(), - close_base_stream: true, - }); - let stdout = new Gio.DataInputStream({ - base_stream: child.get_stdout_pipe(), - close_base_stream: true, - }); - child.wait_async(null, (source, res) => { - source.wait_finish(res); - cancellable.cancel(); - }); - return { child, stdin, stdout, cancellable }; -} -export function map_eq(map1, map2) { - if (map1.size !== map2.size) { - return false; - } - let cmp; - for (let [key, val] of map1) { - cmp = map2.get(key); - if (cmp !== val || (cmp === undefined && !map2.has(key))) { - return false; - } - } - return true; -} -export function os_release() { - const [ok, bytes] = GLib.file_get_contents('/etc/os-release'); - if (!ok) - return null; - const contents = imports.byteArray.toString(bytes); - for (const line of contents.split('\n')) { - if (line.startsWith('VERSION_ID')) { - return line.split('"')[1]; - } - } - return null; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/window.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/window.js deleted file mode 100644 index 1dd5d732..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/window.js +++ /dev/null @@ -1,583 +0,0 @@ -import * as lib from './lib.js'; -import * as log from './log.js'; -import * as once_cell from './once_cell.js'; -import * as Rect from './rectangle.js'; -import * as Tags from './tags.js'; -import * as utils from './utils.js'; -import * as xprop from './xprop.js'; -import * as scheduler from './scheduler.js'; -import * as focus from './focus.js'; -import Gdk from 'gi://Gdk'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import St from 'gi://St'; -import GLib from 'gi://GLib'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -const { OnceCell } = once_cell; -export var window_tracker = Shell.WindowTracker.get_default(); -let SCHEDULED_RESTACK = null; -let ACTIVE_HINT_SHOW_ID = null; -const WM_TITLE_BLACKLIST = [ - 'Firefox', - 'Nightly', - 'Tor Browser', -]; -var RESTACK_STATE; -(function (RESTACK_STATE) { - RESTACK_STATE[RESTACK_STATE["RAISED"] = 0] = "RAISED"; - RESTACK_STATE[RESTACK_STATE["WORKSPACE_CHANGED"] = 1] = "WORKSPACE_CHANGED"; - RESTACK_STATE[RESTACK_STATE["NORMAL"] = 2] = "NORMAL"; -})(RESTACK_STATE || (RESTACK_STATE = {})); -var RESTACK_SPEED; -(function (RESTACK_SPEED) { - RESTACK_SPEED[RESTACK_SPEED["RAISED"] = 430] = "RAISED"; - RESTACK_SPEED[RESTACK_SPEED["WORKSPACE_CHANGED"] = 300] = "WORKSPACE_CHANGED"; - RESTACK_SPEED[RESTACK_SPEED["NORMAL"] = 200] = "NORMAL"; -})(RESTACK_SPEED || (RESTACK_SPEED = {})); -export class ShellWindow { - constructor(entity, window, window_app, ext) { - this.stack = null; - this.grab = false; - this.activate_after_move = false; - this.ignore_detach = false; - this.destroying = false; - this.reassignment = false; - this.smart_gapped = false; - this.border = new St.Bin({ - style_class: 'pop-shell-active-hint pop-shell-border-normal', - }); - this.prev_rect = null; - this.was_hidden = false; - this.extra = { - normal_hints: new OnceCell(), - wm_role_: new OnceCell(), - xid_: new OnceCell(), - }; - this.border_size = 0; - this.window_app = window_app; - this.entity = entity; - this.meta = window; - this.ext = ext; - this.known_workspace = this.workspace_id(); - if (this.meta.is_fullscreen()) { - ext.add_tag(entity, Tags.Floating); - } - if (this.may_decorate()) { - if (!window.is_client_decorated()) { - if (ext.settings.show_title()) { - this.decoration_show(ext); - } - else { - this.decoration_hide(ext); - } - } - } - this.bind_window_events(); - this.bind_hint_events(); - if (this.border) - global.window_group.add_child(this.border); - this.hide_border(); - this.restack(); - this.update_border_layout(); - if (this.meta.get_compositor_private()?.get_stage()) - this.on_style_changed(); - } - activate(move_mouse = true) { - activate(this.ext, move_mouse, this.meta); - } - actor_exists() { - return !this.destroying && this.meta.get_compositor_private() !== null; - } - bind_window_events() { - this.ext.window_signals - .get_or(this.entity, () => new Array()) - .push(this.meta.connect('size-changed', () => { - this.window_changed(); - }), this.meta.connect('position-changed', () => { - this.window_changed(); - }), this.meta.connect('workspace-changed', () => { - this.workspace_changed(); - }), this.meta.connect('notify::wm-class', () => { - this.wm_class_changed(); - }), this.meta.connect('raised', () => { - this.window_raised(); - })); - } - bind_hint_events() { - if (!this.border) - return; - let settings = this.ext.settings; - let change_id = settings.ext.connect('changed', (_, key) => { - if (this.border) { - if (key === 'hint-color-rgba') { - this.update_hint_colors(); - } - } - return false; - }); - this.border.connect('destroy', () => { - settings.ext.disconnect(change_id); - }); - this.border.connect('style-changed', () => { - this.on_style_changed(); - }); - this.update_hint_colors(); - } - update_hint_colors() { - let settings = this.ext.settings; - const color_value = settings.hint_color_rgba(); - if (this.ext.overlay) { - const gdk = new Gdk.RGBA(); - const overlay_alpha = 0.3; - const orig_overlay = 'rgba(53, 132, 228, 0.3)'; - gdk.parse(color_value); - if (utils.is_dark(gdk.to_string())) { - gdk.parse(orig_overlay); - } - gdk.alpha = overlay_alpha; - this.ext.overlay.set_style(`background: ${gdk.to_string()}`); - } - this.update_border_style(); - } - cmdline() { - let pid = this.meta.get_pid(), out = null; - if (-1 === pid) - return out; - const path = '/proc/' + pid + '/cmdline'; - if (!utils.exists(path)) - return out; - const result = utils.read_to_string(path); - if (result.kind == 1) { - out = result.value.trim(); - } - else { - log.error(`failed to fetch cmdline: ${result.value.format()}`); - } - return out; - } - decoration(_ext, callback) { - if (this.may_decorate()) { - const xid = this.xid(); - if (xid) - callback(xid); - } - } - decoration_hide(ext) { - if (this.ignore_decoration()) - return; - this.was_hidden = true; - this.decoration(ext, (xid) => xprop.set_hint(xid, xprop.MOTIF_HINTS, xprop.HIDE_FLAGS)); - } - decoration_show(ext) { - if (!this.was_hidden) - return; - this.decoration(ext, (xid) => xprop.set_hint(xid, xprop.MOTIF_HINTS, xprop.SHOW_FLAGS)); - } - icon(_ext, size) { - let icon = this.window_app.create_icon_texture(size); - if (!icon) { - icon = new St.Icon({ - icon_name: 'applications-other', - icon_type: St.IconType.FULLCOLOR, - icon_size: size, - }); - } - return icon; - } - ignore_decoration() { - const name = this.meta.get_wm_class(); - if (name === null) - return true; - return WM_TITLE_BLACKLIST.findIndex((n) => name.startsWith(n)) !== -1; - } - is_maximized() { - return this.meta.get_maximized() !== 0; - } - is_max_screen() { - return this.is_maximized() || this.ext.settings.gap_inner() === 0 || this.smart_gapped; - } - is_single_max_screen() { - const display = this.meta.get_display(); - if (display) { - let monitor_count = display.get_n_monitors(); - return (this.is_maximized() || this.smart_gapped) && monitor_count == 1; - } - return false; - } - is_snap_edge() { - return this.meta.get_maximized() == Meta.MaximizeFlags.VERTICAL; - } - is_tilable(ext) { - let tile_checks = () => { - let wm_class = this.meta.get_wm_class(); - if (wm_class !== null && wm_class.trim().length === 0) { - wm_class = this.name(ext); - } - const role = this.meta.get_role(); - if (role === 'quake') - return false; - if (this.meta.get_title() === 'Steam') { - const rect = this.rect(); - const is_dialog = rect.width < 400 && rect.height < 200; - const is_first_login = rect.width === 432 && rect.height === 438; - if (is_dialog || is_first_login) - return false; - } - if (wm_class !== null && ext.conf.window_shall_float(wm_class, this.title())) { - return ext.contains_tag(this.entity, Tags.ForceTile); - } - return (this.meta.window_type == Meta.WindowType.NORMAL && - !this.is_transient() && - wm_class !== null); - }; - return !ext.contains_tag(this.entity, Tags.Floating) && tile_checks(); - } - is_transient() { - return this.meta.get_transient_for() !== null; - } - may_decorate() { - const xid = this.xid(); - return xid ? xprop.may_decorate(xid) : false; - } - move(ext, rect, on_complete) { - if (!this.same_workspace() && this.is_maximized()) { - return; - } - this.hide_border(); - const clone = Rect.Rectangle.from_meta(rect); - const meta = this.meta; - const actor = meta.get_compositor_private(); - if (actor) { - meta.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - meta.unmaximize(Meta.MaximizeFlags.VERTICAL); - meta.unmaximize(Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL); - actor.remove_all_transitions(); - ext.movements.insert(this.entity, clone); - ext.register({ tag: 2, window: this, kind: { tag: 1 } }); - if (on_complete) - ext.register_fn(on_complete); - if (meta.appears_focused) { - this.update_border_layout(); - ext.show_border_on_focused(); - } - } - } - name(ext) { - return ext.names.get_or(this.entity, () => 'unknown'); - } - on_style_changed() { - if (!this.border) - return; - this.border_size = this.border.get_theme_node().get_border_width(St.Side.TOP); - } - rect() { - return Rect.Rectangle.from_meta(this.meta.get_frame_rect()); - } - size_hint() { - return this.extra.normal_hints.get_or_init(() => { - const xid = this.xid(); - return xid ? xprop.get_size_hints(xid) : null; - }); - } - swap(ext, other) { - let ar = this.rect().clone(); - let br = other.rect().clone(); - other.move(ext, ar); - this.move(ext, br, () => place_pointer_on(this.ext, this.meta)); - } - title() { - const title = this.meta.get_title(); - return title ? title : this.name(this.ext); - } - wm_role() { - return this.extra.wm_role_.get_or_init(() => { - const xid = this.xid(); - return xid ? xprop.get_window_role(xid) : null; - }); - } - workspace_id() { - const workspace = this.meta.get_workspace(); - if (workspace) { - return workspace.index(); - } - else { - this.meta.change_workspace_by_index(0, false); - return 0; - } - } - xid() { - return this.extra.xid_.get_or_init(() => { - if (utils.is_wayland()) - return null; - return xprop.get_xid(this.meta); - }); - } - show_border() { - if (!this.border) - return; - this.restack(); - this.update_border_style(); - if (this.ext.settings.active_hint()) { - let border = this.border; - const permitted = () => { - return (this.actor_exists() && - this.ext.focus_window() == this && - !this.meta.is_fullscreen() && - (!this.is_single_max_screen() || this.is_snap_edge()) && - !this.meta.minimized); - }; - if (permitted()) { - if (this.meta.appears_focused) { - border.show(); - let applications = 0; - if (ACTIVE_HINT_SHOW_ID !== null) - GLib.source_remove(ACTIVE_HINT_SHOW_ID); - ACTIVE_HINT_SHOW_ID = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 600, () => { - if ((applications > 4 && !this.same_workspace()) || !permitted()) { - ACTIVE_HINT_SHOW_ID = null; - return GLib.SOURCE_REMOVE; - } - applications += 1; - border.show(); - return GLib.SOURCE_CONTINUE; - }); - } - } - } - } - same_workspace() { - const workspace = this.meta.get_workspace(); - if (workspace) { - let workspace_id = workspace.index(); - return workspace_id === global.workspace_manager.get_active_workspace_index(); - } - return false; - } - same_monitor() { - return this.meta.get_monitor() === global.display.get_current_monitor(); - } - restack(updateState = RESTACK_STATE.NORMAL) { - this.update_border_layout(); - if (this.meta.is_fullscreen() || (this.is_single_max_screen() && !this.is_snap_edge()) || this.meta.minimized) { - this.hide_border(); - } - let restackSpeed = RESTACK_SPEED.NORMAL; - switch (updateState) { - case RESTACK_STATE.NORMAL: - restackSpeed = RESTACK_SPEED.NORMAL; - break; - case RESTACK_STATE.RAISED: - restackSpeed = RESTACK_SPEED.RAISED; - break; - case RESTACK_STATE.WORKSPACE_CHANGED: - restackSpeed = RESTACK_SPEED.WORKSPACE_CHANGED; - break; - } - let restacks = 0; - const action = () => { - const count = restacks; - restacks += 1; - if (!this.actor_exists && count === 0) - return true; - if (count === 3) { - if (SCHEDULED_RESTACK !== null) - GLib.source_remove(SCHEDULED_RESTACK); - SCHEDULED_RESTACK = null; - } - const border = this.border; - const actor = this.meta.get_compositor_private(); - const win_group = global.window_group; - if (actor && border && win_group) { - this.update_border_layout(); - win_group.set_child_above_sibling(border, null); - if (this.always_top_windows.length > 0) { - for (const above_actor of this.always_top_windows) { - if (actor != above_actor) { - if (border.get_parent() === above_actor.get_parent()) { - win_group.set_child_below_sibling(border, above_actor); - } - } - } - if (border.get_parent() === actor.get_parent()) { - win_group.set_child_above_sibling(border, actor); - } - } - for (const window of this.ext.windows.values()) { - const parent = window.meta.get_transient_for(); - const window_actor = window.meta.get_compositor_private(); - if (!parent || !window_actor) - continue; - const parent_actor = parent.get_compositor_private(); - if (!parent_actor && parent_actor !== actor) - continue; - win_group.set_child_below_sibling(border, window_actor); - } - } - return true; - }; - if (SCHEDULED_RESTACK !== null) - GLib.source_remove(SCHEDULED_RESTACK); - SCHEDULED_RESTACK = GLib.timeout_add(GLib.PRIORITY_LOW, restackSpeed, action); - } - get always_top_windows() { - let above_windows = new Array(); - for (const actor of global.get_window_actors()) { - if (actor && actor.get_meta_window() && actor.get_meta_window().is_above()) - above_windows.push(actor); - } - return above_windows; - } - hide_border() { - let b = this.border; - if (b) - b.hide(); - } - update_border_layout() { - let { x, y, width, height } = this.meta.get_frame_rect(); - const border = this.border; - let borderSize = this.border_size; - if (border) { - if (!(this.is_max_screen() || this.is_snap_edge())) { - border.remove_style_class_name('pop-shell-border-maximize'); - } - else { - borderSize = 0; - border.add_style_class_name('pop-shell-border-maximize'); - } - const stack_number = this.stack; - let dimensions = null; - if (stack_number !== null) { - const stack = this.ext.auto_tiler?.forest.stacks.get(stack_number); - if (stack) { - let stack_tab_height = stack.tabs_height; - if (borderSize === 0 || this.grab) { - stack_tab_height = 0; - } - dimensions = [ - x - borderSize, - y - stack_tab_height - borderSize, - width + 2 * borderSize, - height + stack_tab_height + 2 * borderSize, - ]; - } - } - else { - dimensions = [x - borderSize, y - borderSize, width + 2 * borderSize, height + 2 * borderSize]; - } - if (dimensions) { - [x, y, width, height] = dimensions; - const workspace = this.meta.get_workspace(); - if (workspace === null) - return; - const screen = workspace.get_work_area_for_monitor(this.meta.get_monitor()); - if (screen) { - width = Math.min(width, screen.x + screen.width); - height = Math.min(height, screen.y + screen.height); - } - border.set_position(x, y); - border.set_size(width, height); - } - } - } - update_border_style() { - const { settings } = this.ext; - const color_value = settings.hint_color_rgba(); - const radius_value = settings.active_hint_border_radius(); - if (this.border) { - this.border.set_style(`border-color: ${color_value}; border-radius: ${radius_value}px;`); - } - } - wm_class_changed() { - if (this.is_tilable(this.ext)) { - this.ext.connect_window(this); - if (!this.meta.minimized) { - this.ext.auto_tiler?.auto_tile(this.ext, this, this.ext.init); - } - } - } - window_changed() { - this.update_border_layout(); - this.ext.show_border_on_focused(); - } - window_raised() { - this.restack(RESTACK_STATE.RAISED); - this.ext.show_border_on_focused(); - } - workspace_changed() { - this.restack(RESTACK_STATE.WORKSPACE_CHANGED); - } -} -export function activate(ext, move_mouse, win) { - try { - if (!win.get_compositor_private()) - return; - if (ext.get_window(win)?.destroying) - return; - if (win.is_override_redirect()) - return; - const workspace = win.get_workspace(); - if (!workspace) - return; - scheduler.setForeground(win); - win.unminimize(); - workspace.activate_with_focus(win, global.get_current_time()); - win.raise(); - const pointer_placement_permitted = move_mouse && - Main.modalCount === 0 && - ext.settings.mouse_cursor_follows_active_window() && - !pointer_already_on_window(win) && - pointer_in_work_area(); - if (pointer_placement_permitted) { - place_pointer_on(ext, win); - } - } - catch (error) { - log.error(`failed to activate window: ${error}`); - } -} -function pointer_in_work_area() { - const cursor = lib.cursor_rect(); - const indice = global.display.get_current_monitor(); - const mon = global.display.get_workspace_manager().get_active_workspace().get_work_area_for_monitor(indice); - return mon ? cursor.intersects(mon) : false; -} -function place_pointer_on(ext, win) { - const rect = win.get_frame_rect(); - let x = rect.x; - let y = rect.y; - let key = Object.keys(focus.FocusPosition)[ext.settings.mouse_cursor_focus_location()]; - let pointer_position_ = focus.FocusPosition[key]; - switch (pointer_position_) { - case focus.FocusPosition.TopLeft: - x += 8; - y += 8; - break; - case focus.FocusPosition.BottomLeft: - x += 8; - y += rect.height - 16; - break; - case focus.FocusPosition.TopRight: - x += rect.width - 16; - y += 8; - break; - case focus.FocusPosition.BottomRight: - x += rect.width - 16; - y += rect.height - 16; - break; - case focus.FocusPosition.Center: - x += rect.width / 2 + 8; - y += rect.height / 2 + 8; - break; - default: - x += 8; - y += 8; - } - const display = Gdk.DisplayManager.get().get_default_display(); - if (display) { - display.get_default_seat().get_pointer().warp(display.get_default_screen(), x, y); - } -} -function pointer_already_on_window(meta) { - const cursor = lib.cursor_rect(); - return cursor.intersects(meta.get_frame_rect()); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/xprop.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/xprop.js deleted file mode 100644 index 3ea849ae..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/pop-shell@system76.com/xprop.js +++ /dev/null @@ -1,95 +0,0 @@ -import * as lib from './lib.js'; -import GLib from 'gi://GLib'; -import { spawn } from 'resource:///org/gnome/shell/misc/util.js'; -export var MOTIF_HINTS = '_MOTIF_WM_HINTS'; -export var HIDE_FLAGS = ['0x2', '0x0', '0x0', '0x0', '0x0']; -export var SHOW_FLAGS = ['0x2', '0x0', '0x1', '0x0', '0x0']; -export function get_window_role(xid) { - let out = xprop_cmd(xid, 'WM_WINDOW_ROLE'); - if (!out) - return null; - return parse_string(out); -} -export function get_hint(xid, hint) { - let out = xprop_cmd(xid, hint); - if (!out) - return null; - const array = parse_cardinal(out); - return array ? array.map((value) => (value.startsWith('0x') ? value : '0x' + value)) : null; -} -function size_params(line) { - let fields = line.split(' '); - let x = lib.dbg(lib.nth_rev(fields, 2)); - let y = lib.dbg(lib.nth_rev(fields, 0)); - if (!x || !y) - return null; - let xn = parseInt(x, 10); - let yn = parseInt(y, 10); - return isNaN(xn) || isNaN(yn) ? null : [xn, yn]; -} -export function get_size_hints(xid) { - let out = xprop_cmd(xid, 'WM_NORMAL_HINTS'); - if (out) { - let lines = out.split('\n')[Symbol.iterator](); - lines.next(); - let minimum = lines.next().value; - let increment = lines.next().value; - let base = lines.next().value; - if (!minimum || !increment || !base) - return null; - let min_values = size_params(minimum); - let inc_values = size_params(increment); - let base_values = size_params(base); - if (!min_values || !inc_values || !base_values) - return null; - return { - minimum: min_values, - increment: inc_values, - base: base_values, - }; - } - return null; -} -export function get_xid(meta) { - const desc = meta.get_description(); - const match = desc && desc.match(/0x[0-9a-f]+/); - return match && match[0]; -} -export function may_decorate(xid) { - const hints = motif_hints(xid); - return hints ? hints[2] == '0x0' || hints[2] == '0x1' : true; -} -export function motif_hints(xid) { - return get_hint(xid, MOTIF_HINTS); -} -export function set_hint(xid, hint, value) { - spawn(['xprop', '-id', xid, '-f', hint, '32c', '-set', hint, value.join(', ')]); -} -function consume_key(string) { - const pos = string.indexOf('='); - return -1 == pos ? null : pos; -} -function parse_cardinal(string) { - const pos = consume_key(string); - return pos - ? string - .slice(pos + 1) - .trim() - .split(', ') - : null; -} -function parse_string(string) { - const pos = consume_key(string); - return pos - ? string - .slice(pos + 1) - .trim() - .slice(1, -1) - : null; -} -function xprop_cmd(xid, args) { - let xprops = GLib.spawn_command_line_sync(`xprop -id ${xid} ${args}`); - if (!xprops[0]) - return null; - return imports.byteArray.toString(xprops[1]); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/clip_shadow_effect.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/clip_shadow_effect.js deleted file mode 100644 index b472affb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/clip_shadow_effect.js +++ /dev/null @@ -1,17 +0,0 @@ -import GObject from 'gi://GObject'; -import Shell from 'gi://Shell'; -// local modules -import { readShader } from '../utils/file.js'; -// ------------------------------------------------------------------- [imports] -const [declarations, code] = readShader(import.meta.url, 'shader/clip_shadow.frag'); -export const ClipShadowEffect = GObject.registerClass({}, class extends Shell.GLSLEffect { - vfunc_build_pipeline() { - const hook = Shell.SnippetHook.FRAGMENT; - this.add_glsl_snippet(hook, declarations, code, false); - } - vfunc_paint_target(node, ctx) { - // Reset to default blend string. - this.get_pipeline()?.set_blend('RGBA = ADD(SRC_COLOR, DST_COLOR*(1-SRC_COLOR[A]))'); - super.vfunc_paint_target(node, ctx); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/linear_filter_effect.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/linear_filter_effect.js deleted file mode 100644 index a9aceb5c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/linear_filter_effect.js +++ /dev/null @@ -1,12 +0,0 @@ -import Cogl from 'gi://Cogl'; -import GObject from 'gi://GObject'; -import Shell from 'gi://Shell'; -export const LinearFilterEffect = GObject.registerClass({}, class extends Shell.GLSLEffect { - vfunc_build_pipeline() { - this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, '', '', false); - } - vfunc_paint_target(node, ctx) { - this.get_pipeline()?.set_layer_filters(0, Cogl.PipelineFilter.LINEAR_MIPMAP_LINEAR, Cogl.PipelineFilter.LINEAR); - super.vfunc_paint_target(node, ctx); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/rounded_corners_effect.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/rounded_corners_effect.js deleted file mode 100644 index 3739a6c8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/rounded_corners_effect.js +++ /dev/null @@ -1,118 +0,0 @@ -// imports.gi -import GObject from 'gi://GObject'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -// local modules -import { readShader } from '../utils/file.js'; -// --------------------------------------------------------------- [end imports] -// Load fragment shader of rounded corners effect. -const [declarations, code] = readShader(import.meta.url, 'shader/rounded_corners.frag'); -/** Location of uniform variants of rounded corners effect */ -class Uniforms { - bounds = 0; - clip_radius = 0; - exponent = 0; - inner_bounds = 0; - inner_clip_radius = 0; - pixel_step = 0; - border_width = 0; - border_color = 0; -} -export const RoundedCornersEffect = GObject.registerClass({}, class Effect extends Shell.GLSLEffect { - /** - * Location of uniforms variants in shader, Cache those location - * when shader has been setup in `vfunc_build_pipeline()`, sot that - * avoid to yse `this.get_uniform_location()` to query too much times. - */ - static uniforms = new Uniforms(); - constructor() { - Effect.uniforms = { - bounds: 0, - clip_radius: 0, - exponent: 0, - inner_bounds: 0, - inner_clip_radius: 0, - pixel_step: 0, - border_width: 0, - border_color: 0, - }; - super(); - for (const k in Effect.uniforms) { - Effect.uniforms[k] = - this.get_uniform_location(k); - } - } - vfunc_build_pipeline() { - const type = Shell.SnippetHook.FRAGMENT; - this.add_glsl_snippet(type, declarations, code, false); - } - vfunc_paint_target(node, ctx) { - // Reset to default blend string. - this.get_pipeline()?.set_blend('RGBA = ADD(SRC_COLOR, DST_COLOR*(1-SRC_COLOR[A]))'); - super.vfunc_paint_target(node, ctx); - } - /** - * Used to update uniform variants of shader - * @param corners_cfg - Rounded corners settings of window - * @param bounds_cfg - Outer bounds of rounded corners - */ - update_uniforms(scale_factor, corners_cfg, outer_bounds, border = { width: 0, color: [0, 0, 0, 0] }, pixel_step_raw) { - const border_width = border.width * scale_factor; - const border_color = border.color; - const outer_radius = corners_cfg.borderRadius * scale_factor; - const { padding, smoothing } = corners_cfg; - const bounds = [ - outer_bounds.x1 + padding.left * scale_factor, - outer_bounds.y1 + padding.top * scale_factor, - outer_bounds.x2 - padding.right * scale_factor, - outer_bounds.y2 - padding.bottom * scale_factor, - ]; - const inner_bounds = [ - bounds[0] + border_width, - bounds[1] + border_width, - bounds[2] - border_width, - bounds[3] - border_width, - ]; - let inner_radius = outer_radius - border_width; - if (inner_radius < 0.001) { - inner_radius = 0.0; - } - let pixel_step = pixel_step_raw; - if (!pixel_step) { - const actor = this.actor; - pixel_step = [1 / actor.get_width(), 1 / actor.get_height()]; - // For wayland clients in Gnome 43.1, we can't get correct buffer size - // from Meta.WindowActor to calculate pixel step, but its first child - // offers correct one. - if (actor instanceof Meta.WindowActor && - actor.firstChild?.firstChild) { - const { width, height } = actor.firstChild.firstChild; - pixel_step = [ - 1 / (width * scale_factor), - 1 / (height * scale_factor), - ]; - } - } - // Setup with squircle shape - let exponent = smoothing * 10.0 + 2.0; - let radius = outer_radius * 0.5 * exponent; - const max_radius = Math.min(bounds[3] - bounds[0], bounds[4] - bounds[1]); - if (radius > max_radius) { - exponent *= max_radius / radius; - radius = max_radius; - } - inner_radius *= radius / outer_radius; - const location = Effect.uniforms; - this.set_uniform_float(location.bounds, 4, bounds); - this.set_uniform_float(location.inner_bounds, 4, inner_bounds); - this.set_uniform_float(location.pixel_step, 2, pixel_step); - this.set_uniform_float(location.border_width, 1, [border_width]); - this.set_uniform_float(location.exponent, 1, [exponent]); - this.set_uniform_float(location.clip_radius, 1, [radius]); - this.set_uniform_float(location.border_color, 4, border_color); - this.set_uniform_float(location.inner_clip_radius, 1, [ - inner_radius, - ]); - this.queue_repaint(); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/clip_shadow.frag b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/clip_shadow.frag deleted file mode 100644 index 23e76d62..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/clip_shadow.frag +++ /dev/null @@ -1,6 +0,0 @@ -// clip shadow in a simple way -void main() { - vec4 color = cogl_color_out; - float gray = (color.r + color.g + color.b) / 3.0; - cogl_color_out *= (1.0 - smoothstep(0.4, 1.0, gray)) * color.a; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/rounded_corners.frag b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/rounded_corners.frag deleted file mode 100644 index dbab9480..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/effect/shader/rounded_corners.frag +++ /dev/null @@ -1,103 +0,0 @@ -// This shader is copied from Mutter project: -// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/compositor/meta-background-content.c -// -// With a litte change to make it works well with windows - -// The uniforms variables for controls -uniform vec4 bounds; // x, y: top left; z, w: bottom right -uniform float clip_radius; -uniform vec4 inner_bounds; -uniform float inner_clip_radius; -uniform vec2 pixel_step; -uniform float border_width; -uniform vec4 border_color; -uniform float exponent; - - -float circle_bounds(vec2 p, vec2 center, float clip_radius) { - vec2 delta = p - vec2(center.x, center.y); - float dist_squared = dot(delta, delta); - - // Fully outside the circle - float outer_radius = clip_radius + 0.5; - if(dist_squared >= (outer_radius * outer_radius)) - return 0.0; - - // Fully inside the circle - float inner_radius = clip_radius - 0.5; - if(dist_squared <= (inner_radius * inner_radius)) - return 1.0; - - // Only pixels on the edge of the curve need expensive antialiasing - return outer_radius - sqrt(dist_squared); -} - -float squircle_bounds(vec2 p, vec2 center, float clip_radius, float exponent) { - vec2 delta = abs(p - center); - - float pow_dx = pow(delta.x, exponent); - float pow_dy = pow(delta.y, exponent); - - float dist = pow(pow_dx + pow_dy, 1.0 / exponent); - - return clamp(clip_radius - dist + 0.5, 0.0, 1.0); -} - -float rounded_rect_coverage(vec2 p, vec4 bounds, float clip_radius, float exponent) { - // Outside the bounds - if(p.x < bounds.x || p.x > bounds.z || p.y < bounds.y || p.y > bounds.w) { - return 0.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; - else if(p.x > center_right) - center.x = center_right; - else - return 1.0; // The vast majority of pixels exit early here - - float center_top = bounds.y + clip_radius; - float center_bottom = bounds.w - clip_radius; - - if(p.y < center_top) - center.y = center_top; - else if(p.y > center_bottom) - center.y = center_bottom; - else - return 1.0; - - if(exponent <= 2.0) { - return circle_bounds(p, center, clip_radius); - } else { - return squircle_bounds(p, center, clip_radius, exponent); - } -} - -void main() { - vec2 texture_coord = cogl_tex_coord0_in.xy / pixel_step; - - float outer_alpha = rounded_rect_coverage(texture_coord, bounds, clip_radius, exponent); - - if(border_width > 0.9 || border_width < -0.9) { - float inner_alpha = rounded_rect_coverage(texture_coord, inner_bounds, inner_clip_radius, exponent); - float border_alpha = clamp(abs(outer_alpha - inner_alpha), 0.0, 1.0); - if (border_width > 0.0) { - // Clip corners of window first - cogl_color_out *= outer_alpha; - // Then mix Rounded window and border - cogl_color_out = mix(cogl_color_out, vec4(border_color.rgb, 1.0), border_alpha * border_color.a); - } else { - // Fill an rounded rectangle with border color first - vec4 border_rect = vec4(border_color.rgb, 1.0) * inner_alpha * border_color.a; - // Then mix rounded window and border, rounded window is smaller than border_rect - cogl_color_out = mix(border_rect, cogl_color_out, outer_alpha); - } - } else { - cogl_color_out *= outer_alpha; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/extension.js deleted file mode 100644 index 8b7801f3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/extension.js +++ /dev/null @@ -1,289 +0,0 @@ -// imports.gi -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import Graphene from 'gi://Graphene'; -// gnome-shell modules -import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; -import { layoutManager, overview } from 'resource:///org/gnome/shell/ui/main.js'; -import { WindowPreview } from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import { WorkspaceAnimationController } from 'resource:///org/gnome/shell/ui/workspaceAnimation.js'; -// local modules -import { LinearFilterEffect } from './effect/linear_filter_effect.js'; -import { disableEffect, enableEffect } from './manager/event_manager.js'; -import { getRoundedCornersEffect, shouldEnableEffect, windowScaleFactor, } from './manager/utils.js'; -import { disableBackgroundMenuItem, enableBackgroundMenuItem, } from './utils/background_menu.js'; -import { OVERVIEW_SHADOW_ACTOR, SHADOW_PADDING } from './utils/constants.js'; -import { logDebug } from './utils/log.js'; -import { getPref, initPrefs, prefs, uninitPrefs } from './utils/settings.js'; -import { WindowPicker } from './window_picker/service.js'; -// --------------------------------------------------------------- [end imports] -export default class RoundedWindowCornersReborn extends Extension { - // The methods of gnome-shell to monkey patch - _orig_add_window; - _orig_prep_workspace_swt; - _orig_finish_workspace_swt; - _windowPicker = null; - _layoutManagerStartupConnection = null; - enable() { - initPrefs(this.getSettings()); - // Restore original methods, those methods will be restore when - // extensions is disabled - this._orig_add_window = WindowPreview.prototype._addWindow; - this._orig_prep_workspace_swt = - WorkspaceAnimationController.prototype._prepareWorkspaceSwitch; - this._orig_finish_workspace_swt = - WorkspaceAnimationController.prototype._finishWorkspaceSwitch; - this._windowPicker = new WindowPicker(); - this._windowPicker.export(); - // Enable rounded corners effects when gnome-shell is ready - // - // https://github.com/aunetx/blur-my-shell/blob/ - // 21d4bbde15acf7c3bf348f7375a12f7b14c3ab6f/src/extension.js#L87 - if (layoutManager._startingUp) { - this._layoutManagerStartupConnection = layoutManager.connect('startup-complete', () => { - enableEffect(); - if (getPref('enable-preferences-entry')) { - enableBackgroundMenuItem(); - } - layoutManager.disconnect( - // Since this happens inside of the connection, there - // is no way for this to be null. - // biome-ignore lint/style/noNonNullAssertion: - this._layoutManagerStartupConnection); - }); - } - else { - enableEffect(); - if (getPref('enable-preferences-entry')) { - enableBackgroundMenuItem(); - } - } - const self = this; - // WindowPreview is a widgets that show content of window in overview. - // this widget also contain a St.Label (show title of window), icon and - // close button for window. - // - // When there is new window added into overview, this function will be - // called. We need add our shadow actor and blur actor of rounded - // corners window into overview. - // - WindowPreview.prototype._addWindow = function (window) { - // call original method from gnome-shell - self._orig_add_window.apply(this, [window]); - // Make sure patched method only be called in _init() of - // WindowPreview - // https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js - // /ui/windowPreview.js#L42 - // Create a new error object and use it to get the call stack of - // the function. - // - // Since the error is not actually being raised, it doesn't need - // an error message. - // biome-ignore lint/suspicious/useErrorMessage: - const stack = new Error().stack?.trim(); - if (stack === undefined || - stack.indexOf('_updateAttachedDialogs') !== -1 || - stack.indexOf('addDialog') !== -1) { - return; - } - // If the window don't have rounded corners and shadows, - // just return - let has_rounded_corners = false; - const window_actor = window.get_compositor_private(); - const shadow = window_actor.rwcCustomData?.shadow; - if (shadow) { - has_rounded_corners = shouldEnableEffect(window); - } - if (!(has_rounded_corners && shadow)) { - return; - } - logDebug(`Add shadow for ${window.title} in overview`); - // WindowPreview.windowContainer used to show content of window - const windowContainer = this.windowContainer; - let firstChild = windowContainer.firstChild; - // Set linear filter to let it looks better - firstChild?.add_effect(new LinearFilterEffect()); - // Add a clone of shadow to overview - const shadow_clone = new OverviewShadowActor(shadow, this); - for (const prop of ['scale-x', 'scale-y']) { - windowContainer.bind_property(prop, shadow_clone, prop, 1); - } - this.insert_child_below(shadow_clone, windowContainer); - // Disconnect all signals when Window preview in overview is destroy - const connection = this.connect('destroy', () => { - shadow_clone.destroy(); - firstChild?.clear_effects(); - firstChild = null; - this.disconnect(connection); - }); - }; - // Just Like the monkey patch when enter overview, need to add cloned shadow - // actor when switching workspaces on Desktop - WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = - function (workspaceIndices) { - self._orig_prep_workspace_swt.apply(this, [workspaceIndices]); - for (const monitor of this._switchData.monitors) { - for (const workspace of monitor._workspaceGroups) { - // Let shadow actor always behind the window clone actor when we - // switch workspace by Ctrl+Alt+Left/Right - // - // Fix #55 - const restacked_id = global.display.connect('restacked', () => { - for (const { clone, } of workspace._windowRecords) { - const shadow = clone - ._shadow_clone; - if (shadow) { - workspace.set_child_below_sibling(shadow, clone); - } - } - }); - const destroy_id = workspace.connect('destroy', () => { - global.display.disconnect(restacked_id); - workspace.disconnect(destroy_id); - }); - for (const { windowActor: actor, clone, } of workspace._windowRecords) { - const win = actor.metaWindow; - const frame_rect = win.get_frame_rect(); - const shadow = actor - .rwcCustomData?.shadow; - const enabled = getRoundedCornersEffect(actor)?.enabled; - if (shadow && enabled) { - // Only create shadow actor when window should have rounded - // corners when switching workspace - // Copy shadow actor to workspace group, so that to see - // shadow when switching workspace - const shadow_clone = new Clutter.Clone({ - source: shadow, - }); - const paddings = SHADOW_PADDING * windowScaleFactor(win); - shadow_clone.width = - frame_rect.width + paddings * 2; - shadow_clone.height = - frame_rect.height + paddings * 2; - shadow_clone.x = - clone.x + frame_rect.x - actor.x - paddings; - shadow_clone.y = - clone.y + frame_rect.y - actor.y - paddings; - // Should works well work Desktop Cube extensions - const notify_id = clone.connect('notify::translation-z', () => { - shadow_clone.translationZ = - clone.translationZ - 0.05; - }); - const destroy_id = clone.connect('destroy', () => { - clone.disconnect(notify_id); - clone.disconnect(destroy_id); - }); - // Add reference shadow clone for clone actor, so that we - // can restack position of shadow when we need - clone._shadow_clone = - shadow_clone; - clone.bind_property('visible', shadow_clone, 'visible', 0); - workspace.insert_child_below(shadow_clone, clone); - } - } - } - } - }; - WorkspaceAnimationController.prototype._finishWorkspaceSwitch = - function (switchData) { - for (const monitor of this._switchData.monitors) { - for (const workspace of monitor._workspaceGroups) { - for (const { clone } of workspace._windowRecords) { - clone._shadow_clone?.destroy(); - delete clone._shadow_clone; - } - } - } - self._orig_finish_workspace_swt.apply(this, [switchData]); - }; - // Gnome-shell will not disable extensions when _logout/shutdown/restart - // system, it means that the signal handlers will not be cleaned when - // gnome-shell is closing. - // - // Now clear all resources manually before gnome-shell closes - const connection = global.display.connect('closing', () => { - logDebug('Clear all resources because gnome-shell is shutdown'); - this.disable(); - global.display.disconnect(connection); - }); - // Watch changes of GSettings - prefs.connect('changed', (_, k) => { - if (k === 'enable-preferences-entry') { - getPref('enable-preferences-entry') - ? enableBackgroundMenuItem() - : disableBackgroundMenuItem(); - } - }); - logDebug('Enabled'); - } - disable() { - // Restore patched methods - WindowPreview.prototype._addWindow = this._orig_add_window; - WorkspaceAnimationController.prototype._prepareWorkspaceSwitch = - this._orig_prep_workspace_swt; - WorkspaceAnimationController.prototype._finishWorkspaceSwitch = - this._orig_finish_workspace_swt; - // Remove the item to open preferences page in background menu - disableBackgroundMenuItem(); - this._windowPicker?.unexport(); - disableEffect(); - // Set all props to null - this._windowPicker = null; - if (this._layoutManagerStartupConnection !== null) { - layoutManager.disconnect(this._layoutManagerStartupConnection); - this._layoutManagerStartupConnection = null; - } - logDebug('Disabled'); - uninitPrefs(); - } -} -/** - * Copy shadow of rounded corners window and show it in overview. - * This actor will be created when window preview has created for overview - */ -const OverviewShadowActor = GObject.registerClass({}, class extends Clutter.Clone { - _window_preview; - /** - * Create shadow actor for WindowPreview in overview - * @param source the shadow actor create for rounded corners shadow - * @param window_preview the window preview has shown in overview - */ - constructor(source, window_preview) { - super({ - source, // the source shadow actor shown in desktop - name: OVERVIEW_SHADOW_ACTOR, - pivotPoint: new Graphene.Point({ x: 0.5, y: 0.5 }), - }); - this._window_preview = window_preview; - } - /** - * Recompute the position and size of shadow in overview - * This virtual function will be called when we: - * - entering/closing overview - * - dragging window - * - position and size of window preview in overview changed - * @param box The bound box of shadow actor - */ - vfunc_allocate(box) { - const leaving_overview = overview._overview.controls._workspacesDisplay._leavingOverview; - // The window container that shown in overview - const windowContainerBox = leaving_overview - ? this._window_preview.windowContainer.get_allocation_box() - : this._window_preview.get_allocation_box(); - // Meta.Window contain the all information about a window - const meta_win = this._window_preview._windowActor.get_meta_window(); - if (!meta_win) { - return; - } - // As we known, preview shown in overview has been scaled - // in overview - const container_scaled = windowContainerBox.get_width() / - meta_win.get_frame_rect().width; - const paddings = SHADOW_PADDING * container_scaled * windowScaleFactor(meta_win); - // Setup bounds box of shadow actor - box.set_origin(-paddings, -paddings); - box.set_size(windowContainerBox.get_width() + 2 * paddings, windowContainerBox.get_height() + 2 * paddings); - // Make bounds box effect actor - super.vfunc_allocate(box); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ar/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ar/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 4f8ba18b01e179814ac99d7dc57a059f43567577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2273 zcmai!O>9(E6vwZKU*jkEfubfS28agUe6*C1fdSe=RV>=HMKm!aZ{E9|d35I8$$NKN z%C0bNN)s2F=t5W6V9VH2pcJetH^z-|;p)DaxYDgVV_fO~yf>3V6Yys4{oQl#`MT%4 z%x_yaeBIy%CCNsUmC?TnTJRrg)d zU8~{B)}Hc1(Nn=i#S69QQGqK1>QxmLw1q+2_3BVkTC1w)Re=wUp{i24jF6(Y9>(V} zymOLtSyEWGT{X@zS&BnSmz>0Q-1BiMj>=-aB#!xZu_CEol|-L%>LHzqZ)qs;Fr+6c zQoJb<)2@hjq^!{(KLFm6OhOtjOP@~IXT2(-yQBi@t5+(a6G-WcemSDWfbF`RYKx&5 zdySL}AjZBN^DSH0SoZ`r;(arf1*s)^xoX^)2Dq(5@c2Mq-3 zjC8d1wrjmFgAiTFQ?4U5C~GRv)`_s>xmHiT6k5Y7PpN_TtU)>Ev6^+%)-q2W*^W*t z*J0(dl*{I`UAwawseU`u)^K3^Va3)e$kV&Fd&VnLZ&?PVxxxpN zX-8EL!P+m??UJ;HrCrTacVHJihYpstu7&wbrmR9O-SoID!nsVVpp>a4uLv`(23tvI zt)$QQJhp?(dbB**L8@2zTKdR+qK3z5c~)m?72ER+;O)*_ zHhZYhNxOC>`-274_%L;@-{shBFXXNRsSm8=(~PTqDk%+hr8_NGj-`Z|Gq<8iG7HhP zStc_dHOytRW|qx-Jew3vMza*1hx~OkWv;|3(KHUOw}shg3I`V{YQXp^R#=!T!Zgio zxSfq{n}S{A9&XH1%hIewGjWtl0(UdfbP|8bEc3a*)pfJTx=lWT)9Ykz;A$S*`3<^r za5fn=5Ea=ppsoYQ)MY!F)7nu5rj~P;Rzd z+!YcgoE~1!u2#(wTrDMvbMSl{c9%GdNwbExCyt@GVis9k_u7okBR(f~zcjdLQ*hga zVH|P|DNYG<8I|RpT)KaXt?td3TV^fMY(^Jg8kce|njtP$+sRG%yUF>WcpQ%3w}1`4 zhC8-6XhH>sv(Ypsa_7f_-d8pxOfu2zx@$r<$+A1y6&19myLP%WJylIr z^=xJif)`ORpa+Ez1ot8YTyhgc5`@_ikAZ;VK|KU7q9;LwAo&00v2i0QrusMa_`dpH zRX=ar^szwOf&LWwrrU(r4gL;t`|x%l#=(!kE#SA{J>b>;_$Tl_jDPEo{|4{Gc=H`X zJOFM1dAtK01)l{sg9~5*d;@$Otb%ue?|{7TeQ*=_b$|YwKEDI+#{3nK_527v3H}1I z{nx=K!0iymU$F<=2krxRf(B%JJ^@+oQ}A>6`V}~X@mpAA{j1d^tl6zoU;;$De*dZ1PsCFz%Rgi!5=^ZuYsIWjuFS5ed5MvKZd>?ozG!i52J5G zhsb*4Sg@a*d$yB(dIX&t=Z_mgxZb!XxS<@njbqJ?ZQ{HCIt71yaN~&naRK>Ijb4QEaRhsWV#q>j@gGM1+EGN{bn_?z4@7VJrXoVT+d{DMhyHt8( zi!^;Yw}uWTOU#!tYrN4zb#(|kbv2h&6_k~%7iqGk!k7-m-e;~jJRBS6RW!7$D$t{b zjI9nsmJN2p{gMfKwG#9y=a$o<8@_Q^kwRCPG}Gmo`hHyjLt5K~Nl1$CY(@MbR6mxWcGbA9Qq;K_;#p-j9c!`L(srgi;n526AqsLuCarb!DoowTYLvZ`}AsplM; zP^AV|R4jW^%i(}(7;!>nwsSE~RisgfVxfI0OFQrNsMpSm1r9g1-N?n@;7h3DZYcPL zKoFFxnYFWUN%mv^pBLkn>)l5K+G7I+$VV-A(BM?pAFhVMX%~8Kq7c^AZ+r=;p$2b9 nE>5x4P}E>|;0EE9M~XPwH$NZ?cv`d03a4&E4zy~?|7GD{3|5>8 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/de/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/de/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 3b174cea5235c191df5ba568be743b4df2cae1a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2285 zcmZ{kOKclO7{>=_d6@DluTm)bka!58b&@6`soNluG-*pyrE=T`5SQ`pcs=#*%xY)0 zu5;r65;s7C6L3Ji!5OF;AtVdb6CiQoz~hX#gT#gZ=Uul+s*W`Nd3I*L_cy=q-}8~c zIE48W=APSxcoF;?&Nfp3F+?mci1c(wZeUBzqQ-T3}9$Z~!Kp9KE^+5Z2)gWv&N z#$PcF&VsYx^PmOUo{vGk_bE7luUEijtf#SgFE{|%-*>9@ht>MCieG@N{~PcD@LTX9 z@JH|n_-D0$5KisKn!xA4X^`Xh1~>)^qk_ON4|@N_cj$vHa9rFo?7d>&@Yw>H~Kz;-c;nfidf_~ZH#tly_B%-2Z<6V6m-f&oK`BMCVK;Er6rE~U1jKuyrffT zkI3eh?m^m)c9( z5ybK4Nok_N&aIZsL0qSaTjN62GFS!uDO z4&2&#qdexsIn%ji+?p!0xev~`SVzHP5xbye8&o^H7BtmG?NAB9ap_fq4o@DQ4kl-U zsX3Z_xiNF(rAdt1s&qbR<{L2dCZc1JboC1;i&x`R>ZBgp^cCDO zaUo+Bw3JL6bOQcKL&v(_XRa|Z(Y4O2sNPp?h*Wi(#}ip@FR0MFiKcT5kC{ zQWH0{H7HWGC2PDguy~NcC9f{|i7b)Y9Hp=;bEo|LxzLG$Q=gixiIw42tY}#q zxSJ#e`c!H3sf=l}NU5p9u6O9au!lw+Zozs-CviaKagOSCgx1EBk_FlU0mI{>+oRUM z#r9eoXU?nK6(JtMn^Yj+>8_rpf=gih5R^r*S-?UrfVIryi9>WL(u#JvR(i4Pff!#X O>*wZ-6nHsq&dL8&2z)*O diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/eo/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/eo/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index c271a7a7bc5b022350beb5424a5770794505ec38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049 zcmZ{iyKfXR5XKFJ*YYSxhY&I~@;yQ#MSD3!o&+gTPM3qw`gWZ?=k{!4`*OL4E)7Zt z6i6UJh3KfMLq$ms1^)si1)uLWBqU;&mKE8nz{0`m*e;4sdY!0PHb_LInBb-6V z9qNW$Ay2SSKUl~YdJ1+Hj#MKH`ylhimbe!&ovKXTW0fkaOyf14sot%?qBZV3Ygw*b z&b_uVHJw~Lk6!b9Nas$f2R$xxslu{SqI>u8ugdy76Rah8FQ&`Rph4v|o$GjSTwE@9 zkV>SbfoLPUC~2FOjnz9M@vdxjU!@{t1F2FyV2QRkpZ|Uqx_n$Prb0)HT6v+c`Jq8~ zUhMg@$+=WDnsm5z!q*?SR@m(Ey3pjduxwc+I+ZGm>1Go{On6BkAf> zH9CH+D|)9+tF`DU8(-n*n6}0((dklkrc`CA*o{cT>df+<-XTrg6{p=WAi5BCG$2PR z=l1ZOChI(ReVj=6)mTmr-;Rfbhe#^A&Lf6d>1wi6sD>3@Si_y9xoq?C#4zL-msUu1 OazQ6d&B^fQsNP=@G8F3o diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/es/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/es/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 283ebd7ad2e0730dfb25b0d3943e17b23d185766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 zcmZ{kONbmr7{@Cn@i9iD@f9DDPY5O=J(Jx;6DC=8cC(vEHtaGpaYek;bl3D$wx_C7 zRkNGPO+D#J1-*%Q76kF69uyYDqmV=J;Ois=y?7FG@&9%AB)f|#y5=`uJ-=uDx^LG< z0__0$Q|P;P2=N^F7s&1XJA^m}egN(Pe*o_RuU7Ie;C+y~4`O^L7Cj9f z2HD;-Ag&e(I18?VhrusEeBv5@4uQXe98%uHerFrGu?>%*??>lzaE*8vopt8@leQOs z*bl7h{pcLqN6@)({J6n|Hyitc8`7a@>}zi9Q;y4n=#QdL8pn)tP_&YSIw}NhQcv?H zxG`x%PN#zq#hH#*X{gMIY@cRjyqY>YGKpyAIi_UL)_5_SVItE$h*|3r`=^EXRy38v^ETIznB~OV!VL9q9_a$`GHLAIxE0Zalc9^F88i$ zgGq5(^+u_fH?o&0TC}NHu<^*#N-;~F@`O$pXG)w=xKn20oKiWp*&3WyYT{{qpbVXt zm-P_0CuAKhjIzwfPAMZ6RX>QOT*f+##j;EiR=J`VZT6Vhe&EEj^?F@&R&`E`y4On9 zr4Ev|IB_z0R+?nIb*gJ~(M4E-C0x4A1D=P^=@7=$Rc@$_%s754a-88L(Op+^l@Q0A z@={|@eVDa%N4d<43#NZtzqM6vU5L*6R438wDD_d-HmSC}6t&fw_Q-_jv<#|A(?_O{ zMn~{X)6{hH=nKyuL8~oFAEK_4#%D5E*Q8WtnM$p(Ymn(wA5&2*owKhDY#2(N)s=q< z+e|u=sfxNv4x7};rO|#srv@S9zS(FDtPd)wud5!8RdwsqM(*rI6$js_QY9*LBq}rJ zw!_LdZe7YA6 ziJlI%H?M2;V#$GyhWB4<6@KKD3j#vu;&WHAgsYoX(Tz7Kx+kyQRq2rb>gh-=?q2WFquMUXT`h^ zIxBAa-$NAVHXkv00M5e!{1#M--MR(V#v>GuC9jYNVdFCzmQMm(f+D=>J9vMXXDUeX z>Xl0)tsIUo9*9IHqOFkN#!l#=JBNY&x+P?A&9+yAAB&}-4v4he6r4?O$L*$z*F&_N z(>>@^q%T|~tF$R2u*FcxP7jlZqkI*RLzCxYDG&S<;tZsYD-DA6h|snNq^*LzG(v*> OUlb;BG#2?;Md3d;A$xcL diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/et/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/et/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index fcc8b42788151d871e30ac79980207f7e7f75b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmca7#4?ou2pEA_28dOFm>Gz5fEWZUfH((;ErA%M1`dK!3-XIfbbX7{GgEY(O4EyV zL-MT@xO@`x(n}N5Q>_$IOSqi#^GZ_lN_0ai3xEP8sTC#q1v!bCdDaTa8Hq*3sU^0d iA#S=B2z5n?dBtg|MY^te$@wXndFfUP7D<^UTnqr#QYcUW diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fi/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fi/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 23fa6cde7da0206053276b03bc319fabb03fae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmZ{kJ!~9B6vqch__&0x@D)BHO%RF{MSJ!+i4vV-z;kL-r1RD zXZ9`&RTLT;J_=|MRM&unL}dxlL^=r}L4ia?0rUt_BWU=)-Mcsr$;flRee?C+`_CKy zc4*(n4DAT|3+VgqVeB~gCrItXdl@?gegqx_zXKlve;(Vvf)B&~V{HEo-Vb~KeT+Q@ z9t6og0ye;x!2RH5um-*fJ`4812f%9}t$PpL2Yx#qzcJ?b;DZ?d38Zs=0iOqd2Pyu4 z!RNrk*o;qh5#XDNPg!qd4Se|bpAUa<$Z0;_d&|{QxJdb z3;a9^ehpGSH^3LcA3)mo*LeP4kTgDkBq`71_<03vfaK>bko*qDybeAI`-AcP5IhR| zOE3U`1W$nffcRs_Aj&LQ2Ty|A;3MGYAjR_)NLNZ4QJfSTHS+xo`eAg0Se`|G520hr z%|9Rx|he%pGKcFx--&;&4(dxN$-{E zIlg3kR&Zr_rh1VNI$CvNo=B5(+vN+Q6ZbNkn~=??DW-&1);PAHF`)xS8b0i+fMHIW;x4S)d?+MXvtoa@F_G~kuv2QlnqX+B5`~W zNyFE~Rh7Vd$Zf`#bFEz`lhUwN+4byVDmuy+Y+ZyQg*>KX8>AS!{lJN`^?IGPVwLh$ zwKX3Ogz|##5pgnkL71@EJJq%+YvWqH<#2kN0*;1Pl=lU1%PdhwXu7{mQD~gR+5;(K zj(bdbT1D)57isO?Q7v=qlIh-6w+)%v%m-_(r@~+%@429Do4mGuG1!oO6UJ%bZPw(kYmq75$|Gx_`8h>q-BsqRy+kNo z@7UyJY&5-G^kmSMB5CqvWsGtWKNoqQy5`hWWSy5`eIU1Ru&mpxHU7S zWxvK&l^YF5LoVPtkMR>^s;{^gcre27n8J;nSAC&X99wHx%l4(#u**sq>76ouG-N9ZV^sLs#!4ByKo_fO7ox4AqHVq?v|?AZRHzKLu0mvdiw|G< z@H`Q*Q;Ah!?wsJ;0{KIM(XjBN9m72;3ghfD#KI{OPh>Rg7f9iXR@)?Ff|zdkz9}lZ zsA5@VuB4fGE}*yBRh}O7=v{qFX!zWH+(DTUV#6MiM2S1DE?@f{)?UHErTV2_lMu?g zFJEqu(zlm3+Lq=0l(PHDvsaY(T5jW5i0Y~TZv!NrhybCnkV=SMK*F}Hv2e8G$2SDs OAQj}>0Sw=BSL{Dj4~g*r diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fr/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/fr/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 3e5fc174727e1ed3254fff0944788ffcf0423fd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2337 zcmb7_%ZnUE9LGydG>-8VU-1$69mHUyXLfcI6DJScr;%(-*qyi@ywr5p%v83!s#8^+ z+3}>F^rnY+6ZDq#9}p2y7!2MNJcx+KTR;SFB6{)r>z>{0CIqqA<}>y9RsG)k%bp#V z1jasmPvP5fn-I@}zk@v9yIqKb;QQci@CtZ0`2BePGk7oNzm4aAfp=oQ^9~^%0C$5t z-v>6qr@@`zt6&X$9ef<@fp>v#fqd>=a0mGLc>Sv}zX5k){X3BF`4M~)yb7}Z|A0?` zdm)UUVhTJA9tNKQEy((O0J7YN;G3}ZGw?L#Eo`!#?|}D!m%vBBk3qKc)A9UkknjHq zydS&@vORx*4e)P}{d53EJq#WM>)^{Eudji}z_&ph6<>mE*A)~?$CmxVgX718_1GBfD;`LPak{Q?)~42N zOqOJ#3mmGpR&)~jn1o<6F>9T{@#W0g(8v2?w(#Y83H^qm&{yR9GO+_zfM@0VDxtWN z9cY71F{e63Ps|(HNfj;Ho>;JP;c2DZrRC~|K=PlLWP zbXuSL#r5sRuD#F<>iIt;~GnIx?8m|iTg$Ha{nZg{p{uZ!hXoztT3 zOeX`WgQRUv+}J!RO)}iR)wa24BP_uZ9=*W>o|jMQ5QfxNF4IP)9KRJgOmUNF50qRb z#4)G5(%4fMW^I?Kj(Ks;bZ_amC6!wjqSL;olW3;s`KWDMR6BbnT2dFaM{fwJ0st(jxTfSfbJ#(XS(PeOq|1UzmEa zmr0%0W1F3Tpy?H|r=qr!S&J5&GBKq3A>_W*X!NZQDya`t2luMFb-hOJ?0FRj-x%jg zR3%ANrOYjtyRLElwH9?n*pKC8fN3Ne^^Sa7K z^Cq^O9W6T2(V=!WEs$~1f_0g1k;%)cKR$Vss-MRVouKB?+G|mjoTYzODvRh)y%{Cy zVogk+w?$A?7?N>3y6j07YY3{7+30d`%2R^Z3He{vD?)yuP*LKn4wNWL_eXIB+{tSVZ2 z<;KO$KcS4xI?#mm+I(X?>nbz)1onuz(R#=BaG98ngTBaOFcMC129}Gmnk&n;UbZ1l zezcw<3y_y)w2rbLt%F?nFUhh=@nvib{OFuDiS~4%K*>;6mOsSF7KC6)8 zTE_pBDtn1IDT^TH5tbpIN%qS!jX1tH*+2S-!x5vWTclCdB0NfRvzuIxW*Li&(*Su_ XMsb_iX0XTqBK|8_2FWGMD2smq+5C+I diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/hu/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/hu/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 7b986fb01744d4ade11a708f73ace78df472f564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmZ{i%Wl*#6ow6yTL5tpED#{MYvj2UDphF*(N0@#g^q@SBC&E3H*qJiBiorWRX1I+ z?t&$YF1uiXc!Y?zKs*b-XNoEo9OcjFll(ru{=PNyg&?j%_o030CiDyPLC+9!4V(qN zrwLvFm%tlf_aq;H=aGK|1CWCk!5o|c-AO(Mz3%`#gg!&}kl#H=$Q^JV^!``i1F#4B zItujtM&NC5AG`t{f_TVRysm>spzr@3MCpIR&)d(%EsDAHL2d$d7Xt^7YAz zHixzdKsW~QwZNn=+;C@31*q|I_VbK5k!Qi({| zu2hNMW$|QJ{`)zrnx_MXG^>KHR!%6)cU)pYPJD9BGUrk)(m3PB3fFlzSZ52TKEJMQ zVc43Ab%K2l=|Uu3(90`qGF#WCupw3DB(Vw>IG?m6}!)2)toD2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/id/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/id/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 19a9c47641ba7a87469a02c045b9e114958bfde6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2171 zcmZ{k%ZnUE9LG!D_!#3O@f9C|pCC$*-d7S5W)pE|Hyd>)WZj*(3SNFQUDI8e?y9D% zI+Fbp!oj}_#Ai$ zoAIfRf+xTe;LD%`#h=eX+4mKA6|sH;o`T%Qr05@m67SW9pMVnQ7mfTiDE6;|2f!O3 z9`yrWlE0rong16QJ#z?7>>U7MN=4ubxZKDVl)QQnkNNTU2v@I6qDRB|MF7oVhw?q|?Nm-sJxohNHcl&-R|S}h7paWKw$)yXiC86Q-~m9Z{q&1J5f3ELc- z3XAHgT@!~CLI^HbYp%3dzLPr_QrK5(m7k7JVXkNjsV1Lt?8f4NNK^Ydra`@TY%C_# zy6#trI%Bz?Y3jN}ZMZ?@X?HqHJGF+LFv+w!t6`HfwW)PM+Y$}5)t-17r`pmvzHD+> zkI9v^QDvDQlv-QW)x)697d$XwqP94W#pQ-xZA-?~oeF1}ou8jqJ0nw2*YsE8F`K}& zCyBGkH`vCLy;D6`s2+|bID*kTGT>!+(}Xago-T7^Ig|6-l}2OmKT?gMvKRz zLOaJ%RWTClC94;xUx;#`U+Bz@j^ESPS_j+Hhs=+hmKW=ua=LQ2lv&ai#TcRNu{MdUoq*=-B+y$tc#BTB^r+pVJW{ zmnt>1rES6iYAwa4E>cwCh_C`fT@GAQM`sKmo2hO%5L^(?mF*V62JtJ$~VM)+x5$g3P?%fKmH*)TOr9nnRe@me=Ik33$POe5wB zkx$?`oUKx|X-b1iPvAUXCG!soMgq_O;(5OlFiN}s~||tbWKmW-BnFh z^=@Vlf+z8&2NeWC{{ip8i=c=oh@cmd=*f$So&tgwzrXIDeMD1C@tNv+{NBG`4()qS zU>w1G40GR2LOccj0rGg~W+9G)?}7)xufRLNAL{j0@J_6Muh)Nrw_?5j79s8d4}!ct z0#1QXg8RWsU;}&=d>Bl?+rT$LKKC}b5B#kD{&~%>!Q1iudywDx349d%6=ePY0UrSm z<1+q=XTcNT3GgUrLDuJeknep2egIpqfakHkfK9gZ6Oi@$6l6QD)cgj#59^;nmj4&{ z0C)}Ldk0{|)8Ju{_ZL9+Pa8Z6u7Rxo8{h)?R=xhV=8qtL;%dGA4aC#pPw*Ic4SXCt zf=Afi(;&-v1#E$@fgHaNL5|axU<7^#a!C0O+r_%_;JXiD9>!!jcwXF(c?c6%w#VK0 z$9D6ZcVV(m*lr#iKOS)5_F$WNARWrVzUFZNljCwP=7X5y!7<|;6mxM*9TkE$iKnwB zxDjbXPA9_<^;6wnr%aiG?11KFe?4)wFtM1+b8N|=t?^<$#YU=q5cAf>%F%*Nts5^^ zWvmMvsECHL{l~TC#~)wEe=V-}irAoZ0AXBE|oKiWhvNd?E(!|r|P#Id5 zmvsi|FE2wt zDRq#v$BE<3m!yeDd$+na7hQxUSc1^&JmC5BIUT}?y2@qR$du!^CPyh=65UND*9mdV zDX%p4G=N!qZ&b&;xM&79^xKNFud9BD+HrJAIgiMwCocdNApGEqpodH zW959bsx~wqi_XZPS~NX5eLR|+j;3d5>Ue8%>X}K5#**|Q>N;tBDuZ<`aw=DspF2UP z`46(B2`ikElhZRVB$?D{vv0HKam^%!OjOiWGHX#g$W%*1r-vcrzBMs1v_7b~xv6@1 zRyD0lCh|&uKT&5;RHaT-CDIK)>oBn+u0=XD7OV-%KAVWF z7rTqm$(?g--9WkMtm#|MnHHVw;hmMVKpsYm)@8m$CNGzMcKQ@me`gInF-udY8ZSpx z&X)dJt4yMq=1df;jfR*@5?z=?Q*e@y{W{BGyxfB4HN`5e%9sBH_}b!=4~~HyTX@u0 zk^WCnBiga1;ouFYm&hNUKN*ZXx z=1P)ia2s-5{7NiK6SRVd+B6SqG|g=b&~%|d(pmHY@3|3dK`5d2sM8;!#4NRu01j4Z z1NXo+RZsZh<8d<>(?iwrKznygaR#6^mXXE-4QGhT?HnwHWRL+F Sz2kGVA+P!fnx!1oX~n;ztaNPv diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ja/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/ja/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 3b7e16affd0a739f6b36d3708589158a8bc2fbf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmZ{j+iw(A9LEoWsH=h^5~E_ygYiK#yS<>2ZEI{xE5SC9wgi0e;q1=o?zFRWCNpO# z^^&wRZJ-xL8YzNkphAn*UXVyzF7oJ$iSZxs<#aE7(-&X$dv>>}^>VUjKJz=j`|s@h zx@+4xg0%zo0el=hRFRK^+aYuC3DB;{ zAA;48hrkEHTVMpd3qAz?SkeCsZiBpKYx#UTsO@)v&w;x^U1t^eEZ7d>N78sqphg?4 zhx{jkJOkFl`DySdxD)IJb)5Gr@_A7E&w#tY*$RIEUxfS%sQdh*a=sPK>HhZM@iMp< z)cyxSZP!+j-vM>JcR>oe;0xf{ihdD9x#VGNz4Q$9(!FB@`c`;gSyS3QrpCe#$b9 zrfkYLxGJqonm4?{8*(?)gzic-*!7qiNwwZbtif0$w~Sywn?rh`GI4r{ zxy<1{r}b$mT|XX+{o5(#dZLFXr5~%@h*7=@qkJ*{d)&if8~Nh2heeu&Be{c4`dzdt z`AHdbZDu)jG?`|e&t=2Wu2y6JhMn%Xn|nr!lN2WYHgUQ?Vado5JBu4PT7{SK^T$aBD6< zK1gy))A0IeZQxA)vyXGPrwInCE7rB3-O~K@_w%<;2j?3T99$?2T`5jaYJ>9U^WW;# HJY$B;L*_Hnj+!}SzA;ajU(6%sH*<4O zh(D}j=K8)6NxR1SnDqxMZ;J;Ehr9YLe7Gp!8e=r11DsOy8!!ak=rYROntTZrQUh)Q z6O}KucMTO{T-Us%qHz?&#PWtUA&M)kosaT;(58@+Mh7`_86?w7d4($z__TbhB4*I< z_WQE?O7>nt_bBTfz3B2t&Q*wV<`o62qVpMytyKgU&KKqOb^}8$AL5B37fbX?BjuY8 zx!0UXy5YH;p{lYrVU5~w>clOp?N1BCGR8V&XKQa)nqHj01Y$J40* diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/nl/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/nl/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index a461ce225fe8612fe99535b6d9b8cca74655a459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2208 zcmZ{kONbmr7{^OZe2npx_=t~$5`rMov)N5FVKy7GkE|=%kT5gJig>B%{-(Qjda9bL z>YdDbP{E7hAs)<4(2EDbYd}QsB;rZXi{Jx1iboHEApXDZ*-a*rVrze0ukZcMulx6W zC@>CTK7+aE4k4Zg{{(qly;F$e;0NG7@EhVPLB97L$npCTB*^l?Yhrp{K%lQ~&J)eOPA+Cdm z!LPt4z@Nd#z`sD2*T6sa^8m>D&w(tr1do7kfSgi}5&OZu@!&fwk8NW;5GNkR+>ePT zyMt|GKiReiF*&!ap9klU2ghw^u7x zo;AUZr8d&(Gz(Fj>v$lCWJ+oKa!JL5)Y;M`VzDT2q=L4_i=`X~x%NRUS(lKL%Qm-e zXVF%PE^(UNLk9g~x%Ab31-(r&WF&p25<6l8cvb1AM8@^o zkv2FKE7U7fan`6_PIBF*V%5f_mmAfo?9>uEVVskAnV?hU;v7*S+w2Xb)s}cU%E-v` z>WUshdm^oqt7V@1*by1APW>P*6e`wXEH0`fVUs8HqRkN#w+h^eY_r)Eoq;aoy6!C| zBc+3qQ$gH0TvH|)Pakz{A-YIQuo6mdiGb(rb2@~v?2;R5qjJvQh8pLPB)TI~1BpBq zvZyWgvJbbWU)0yUxMcdbja!=v>q2zir#gw2%G5_)+melo7os+8X^%>XR#c#toI5&q zEINw6IXOGmI`-lVM==`f%7>`yl<~O=*0tmsX%v?11l#XZ?&T>6399topXuZ7Q0crG z+u>=vG-;_)in^qRExA&LIFqNc5DMR#naQjVlr%@wgIsD_m(CQZ)UQE}0#bwdxqMYZ$`bMvzPTrl$41vxw4cr~i4vkK5g?UFp+oPDV|7bUdS z5SOiW11cRE9cYNu8-$SCmEtTQ{iXH;V~eU|x0I2p+D6mXJ?q75Bjp0gTyLUX+o+I1 z4sq3&4^E*kc(aFkPXdVxXbx-|v1VxiO=+$YT+^Fah(+Xu3Zx1>;AMhFMO2bh7&_$n^-3hXGwz#(p=rKIqN7dSQ{lD!ySSP2xWuGFZa^ diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/pl/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/pl/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index 43c77ba1a1df6b730adcc8ec99e52f1ce210f945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2155 zcmZ{kJ8T?97{><^UdJm02n2%kH3^BLJ>S`h6fSnaj_nY|#)lsmA)2|}@!s6-&a8H3 zv)Lm^C?Y_Egg_J)LKGAT+B8T63CXrZK|@Ca6$J%UbkOjhz4HqxBhCKyn{VcO?(A=e z4}Qupp20kZ`6uRa%-eV2fziI3u`}SS;6vbh-~-?%L-}*?VaVSMQ1@Okh)a1wO;E`tZbw}$KQ4EX_gKh{42ot<^?S?~+c#s3}X za`^>xar`~h{{#MvoQ}Zgn^^w?hg}{s*z`EK06qr#;8S1@J_&vZIzL~6N5HQ^7v~S) zDEQ-0{ugxhIRK^ee+YE@PUA5Rj)5+pYv2>$+e3Z~IzL~5&d>MYDR2Wk4gLk51dk$V zSFb7XIdC3yErPnT3siAC-)^{`9L97#aKq(>(pNbn)SdAl-X7VJ20k7g%C0Wk!{v?= zR>Q^rG^XpDiyfg;xGSo#qqLgl2_Xo~w$nCV;v zY%)!u;#O*9*i;NfERAJTItxTb7j>+&ZDElIGRLNYYE=fd3&C2Qu!}lV*uIo#ZM*Q# zF6O3MuORz^Y*&!!@<10Z04G)cML_=GY#|ktY+7{kkj*IGi3QE+kj-j8H?&%5X=z|# z$(FHTmjrzBm|YPfrA3zwtPLVDRCI-+d45eM@E(xPXf}^y<7YxBHYe6BTS&PtZOPg^ z2wccR8n);v#{O?`yR!9qoh?N&r8(J|3<@qSr+r1-R=&(tQ0`YP7lKEIt*Es-Ce_Y# zPx#im9C)vZ%%CkTYBp+%BGsAo=1nLAZz>Osx2#)KYcF_<;;MApylHMli$)uxV_vi2 zjlMvQv#sXX=>|q^jvMPOXIz<>Tb;FNCMzSFmwuPWJfiVX<#kacFQu8bS|wb@bzdhJ za889e4~4fZc+#S_#>dg6@vgP0X^o6@wXq_o7or2RqOP-W1QuNUW@Ol2Z_rn7(B(TW zr}4iIX)6^R%eN6kxDDkOpKj}6Q`L_6BA8(ks1W;@n++~#3-FOQN4~&oN=!w-Ew2R z*`Vv!t97@haSCUeI5T>__PRIt6syXv4vIl%>!V&EuGZMJ4tS4r>i0I+DbRyUnCc!c zB=2qB^hK!2Na#{cxO|bqyDxJ}GhUPl&@X*yA}JC|O4Bb%aZ2+zmA(|XzBs}Cp1|GJ zkuJCr#CO)Nxa&*0lkvoh1e5${dc@1jSU-ny-1v~jC&e~h+HB#N`s8e|x0bk^9s`Udv=P42jN&(`YS!d7CD Sn!aJk zBzPFy3tk2r;CtZnU_VYUUD0rh@-vrsu??CqJ7w~cL4)`2+ zx8C0cCpdolLAI|2vY%(cm%;P(_aQiqwFlXsn;^&aYY?Ku4_K^qM$o3z^WW9XnY0LwdxUxB(z`v(3 z*+$mKF?a@(2j`CmLby3NRyb38a_T!UgJNvNYj&?fb?V1gTw zHso|V2vMBrc$J3A6lD7}E92GF*}^1ZCeN`YgSN(t*$f+*_Cd^AmncVbHnVQLSeA({ zaH!f^(McF!5rQ3xIqM9LcZSx60rZQx!k6Dm=xd6?K#?EF#ICaeyejppgyQP%x;EGp z^Qu>*V!_B>rfA8gV$sHhr=ZbTY_r)EomHLFlJ3nU>rw|v z+k!aWd`p^Sw0)~UQuy~&Lz=h+4$>Xh~Z@hLCqp>7?h`LT1pUGfdi@cX6SWldgsG-==|o;x?I-HGiK>E$ zs`9z-=R8boX>3s*8gteJWnk+lhciK44HJ1LwV9@PAe~p?^rh}%baLw)`_xx1S}?KY zN@>x_o(_$6R-pQ#MeByXMJ6wo{`Ax|Rew(#IzyAwjd!D}P|KjKR36dm&Erv`)*5)U zI!0)vBiQ6*A}LXL5~iYiA_QLfo=f^>epQY=f2E92FYbgXRaLtDC_=$wJq8t=bT$TfY9g|b4Vbgs;- zXrp>ydWOBk{%55~lDESii^S=;sspIIB8|#q{l;g4UW42G#ut3h8AL1U)Yl}vU7jU8 ze*^_@onQI|NaC(k37m0GCDtTR?n&D5Yllo*kQ&lL>^5$|i=ec#(D6Z`*!S|?if$qa0?-Y3z z@-C_YVcaZ^I)-wG%bSg&>H=_j+%9IWp!LGEoEu&|&}jW!C8#ZQ5QP?kfTcC40saq63F}4Dt5sKA-@ZJ_G(-o&N=%hkOFY@mIVC@^ek_ zMeuU9-v_544?*_(Hpuz=0>n>zjfLa;w&Fg>c7FuVfq#Q9foGw_e!Ky){##gH25*2| zBB&Md0^(_2s=+Zmf%zEbvzQzc=ZAe^zYhl2g8e@j>?7aD<8+B)eF`f|Rg5RGa!$B@ zXE50>&L!7P%w}1t2P$Z5yqHVXU@O%=h&k(Ga&q3L)*T2P73&;I<R|t2iR9qv~cjfIyxB!@o$4&3IS@qUayPpmd@mg?$5?!rGt`pCGp_!sxtA; z-A6r}iQbshmKSSggPcccT5@ut)}hS05Uu(|$I)D#_^4-Fvev#H zb!c0&TC|`7wPbUmc_Esdj3%3MVye}=@ahCcZAJMI^_((3Rl&LzvV)=^w-*OHeR2aN zFu0w|nX|!~`iL&!36tb1p{Pe{)RJx7o+mkZlCR7;wX4(f^5QUr%(ohiq4j~{`k4B# zPIc>&1}t$HzEM>=DoY%d1wVE>3-8Z$8i%*HWU*75w*(9_Fg*IE?REAPj zwbE79*C}37S9H^&4?2Z)lHKY_CEqO6B^ph^=PN}|t-=`he`#~pIf|``aleu{bWv*I73B1&?JKqO|iyKNO%x@cQkO(=o1i^as3>CWx!w6ino%-xn% z9%vDj6hRI8hKeTYo25`_yY1EoV|=_5eepqk@XZ(>OiWCSiQl=i+d`ox-f;WfbMCq4 z=R0SIpVqH=pJ8prejIzvEsX5|{syG=&aI5K0^bF$1AYU%3;11K{ti8}2PUsbo{QLlX z4EQsU^8XvS3AhoDabzvPoxq*I?LZ$$`FsGRcjtlMqt;pAAmlT++yML&NO>iY)FZ&H zK(cSE;}Ib7A%RUvAX;Rkn;bhE^h+K z^nM$V;R*qIRF>9#I6a6B_c|}??L*kKh$mX0aB0y@(84(AMcmQ48=Ly_0QSS!jYT~p zo>;qO@jfA?iMXE=VKqI{9H<6keJ8gS^Ac58HuX_AJ(3D&fkMj_-x6 z!^MT`gpzgmfh7Xo>AQZ=5PD6^DZ?nf>US(zfFPw`WSxHC!Mv~N`?7%etg{?yy$0u1 z!DT`4uwYvLC?!CWjxQ{pkKc|u9xmBFF;KQymuC*Rg7^3~>-O{IkoW6b-WPl5lNDF6 z=LKS#F553eiT6@9@D^th^3j6u_yO~%Q$%!&`vLDRyKa~dgz#987?kW_$;>;l!Va01 zMJd-YWWB@~Tj{XDY%-Z-eZx+P_c#OX)~M-7lV3+-b9thn&Ra-+f==ICRIm*R{=K8Uiee-WF7?65buDsR1_GT$oUzbICRkH6(dfFNig=AQe=2@s=38T;ookaemc{#^Qjb8qQ?xSkqb;O zbWQ088QwKw3(u+W{e{3R`Xjsz-5nC%kZGGm5y&C?IlE{&ZZhu|_u{o@mrYw3Ibjwv zytf>Nj_L8Xf|R8&)6`V(Ln*A}s2G5Ek@N$*sTBA_A}_rJ)4V5f#E7R|6W$+_!&{T-XOhi^B}NiVol`Y+QBA5TH4}|T zr@6WcVG+U@2@7fxhw(IdmQy;;0MpYqRq37^_mZ{IxG}H^x1RO+Taa35$G4&bTPDkThUD7eg{*7pYsgDux zGK3S+*bR4IKuJl=UgklC^CbfE+M<=wprlycBvZzL0(fX;zZBr@ls<8|LuI8{4O)WqQ?Nnq+jJg1Z{<1N^F z4^WNHL~o)b-IOb+7)-&Uiu_>=E)gpZ3U4|LX{TURLm{=LJm6eij836~X)3)IorEV{ z^m4y%OtHa7G!gfinyQ10Aqbs_9tt(jDHlp%5mL3Ti{7TPbr>DBitr$kh?~}PQ&U&z z9u>lg9RrD4-PmWOhdI&H9D&Y2+3gv(FZgYKb;l-F{n>a%M7u6^TAs{LutlW8NPo3RwZ`% diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/tr/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/tr/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index e44bd56fbd1cd4ee7df7d3ba528b10aed5b865e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2281 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 F`~y2;l#&1d diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/zh_CN/LC_MESSAGES/rounded-window-corners@fxgn.mo b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/locale/zh_CN/LC_MESSAGES/rounded-window-corners@fxgn.mo deleted file mode 100644 index c61a14839132ad54b8b766e36113725ef0c72883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmZ{jYitx%6vwX$J{ItSFMN>P7^9+@?E?g|fJzI+gd(I}tRyC8x^ufbc6RP$<}PLX zsmQAZN~xhOG_A29rKw3<9@CoqeQ2!NN0sYTV{|9^&`qD=j zdm3C0lD-$LSK%=JWoy9=;0EvwP=ZuXKS<|>!6Ufq47eWp``Dy=?g#0fheEwO5%QA{TTQZ?7iSBa0Gk- zoDKJHfz-F#;A`LtG>P(5f>h52ke-x!M17|mB-Fzfu_z|_<2ZW`i|#~yE(_&;7K>_q z5{usUc`OooKN7U?j?heyU>r(9HIOXBqIY=)i|Q{6y&26Q+iDoRQ7C2FNsn*0m7C?J z&0RB@Qd+_?6RkWg>p zpc`fePQg}_X{ZzwrDU4bO4o*aV_Hg;LVi}8@k;g*%yz+5N^mcw8?ucGAgz>N7(5Z2 zZ8L3bvTdR{lVsa%z1b4HUM5+cOk_OXRNCc@L4-z?wFKKCkW;tVP9YrLK(|4(pc0R_ zrG(9Q=?Ba-vKw5wye?x|Ucwc^X7!>)vE7cIFjbcA(G7!24(YK5>KMB}V7ar=Xp}X! znhviwo3|Qmx~X)&sEOsx4|UtfF5ZeuhsE(MN^&HYY>ifmA1=Enub=BNqSmb#&~4UZmmJ= zH$6;(woO+e#;Yr<*J_pcRr9Lq*xGmBsf0x8bx&z=SGPS&SJI8~eJ0dhVWar0gWD-_Kvg)F zZrYo8BBi^YP+RuK>$Ht`{pgY{!qv9h2}v^&;~Sez71?8DFn3y=bkkmp+fGUKwp4B6 z!M|H7H$^_tg7GYMs42J=Ul*-fAFb95u|LB6siVcw{$fX0ab(6na?$U(kei z$kF2Yp+eUc<_{e$T>8@QKJL#S4tM--F8NbEY~lI|cowFI%RVz#b924h3f8#PMOdTprqK?y(s3SLU(Z4ys{OK!&Q`3G=fBx`j z{)?I5Na$be7=$D8jRof1PzM!rvOm|^?;jcSFZbjIzFW9CobNjqBt*2)u*hOZPwwm~ zs?F~jFI+fSu02quhx4Oz4BaW4OVD~{s-#g B&C>t? diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/README.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/README.md deleted file mode 100644 index 2e327974..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# `manager` - -The rounded corners effect has to perform some actions when differen events -happen. For example, when a new window is opened, the effect has to detect -it and add rounded corners to it. - -This directory contains the code that handles these events. - -## `event_manager.ts` - -Manages connections between gnome shell events and the rounded corners -effect. It attaches the necessary signals to matching handlers on each effect. - -## `event_handlers.ts` - -Contains the implementation of handlers for all of the events. - -## `utils.ts` - -Provides various utility functions used withing signal handling code. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_handlers.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_handlers.js deleted file mode 100644 index 9717d0b7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_handlers.js +++ /dev/null @@ -1,241 +0,0 @@ -/** - * @file Contains the implementation of handlers for various events that need - * to be processed by the extension. Those handlers are bound to event signals - * in effect_manager.ts. - */ -import Clutter from 'gi://Clutter'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; -import { ClipShadowEffect } from '../effect/clip_shadow_effect.js'; -import { RoundedCornersEffect } from '../effect/rounded_corners_effect.js'; -import { CLIP_SHADOW_EFFECT, ROUNDED_CORNERS_EFFECT, } from '../utils/constants.js'; -import { logDebug } from '../utils/log.js'; -import { getPref } from '../utils/settings.js'; -import { computeBounds, computeShadowActorOffset, computeWindowContentsOffset, getRoundedCornersCfg, getRoundedCornersEffect, shouldEnableEffect, unwrapActor, updateShadowActorStyle, windowScaleFactor, } from './utils.js'; -export function onAddEffect(actor) { - logDebug(`opened: ${actor?.metaWindow.title}: ${actor}`); - const win = actor.metaWindow; - if (!shouldEnableEffect(win)) { - logDebug(`Skipping ${win.title}`); - return; - } - unwrapActor(actor)?.add_effect_with_name(ROUNDED_CORNERS_EFFECT, new RoundedCornersEffect()); - const shadow = createShadow(actor); - // Bind properties of the window to the shadow actor. - const SYNC_CREATE = GObject.BindingFlags.SYNC_CREATE; - for (const prop of [ - 'pivot-point', - 'translation-x', - 'translation-y', - 'scale-x', - 'scale-y', - 'visible', - ]) { - actor.bind_property(prop, shadow, prop, SYNC_CREATE); - } - // Store shadow, app type, visible binding, so that we can access them later - actor.rwcCustomData = { - shadow, - unminimizedTimeoutId: 0, - }; - // Run those handlers once to make sure the effect is applied correctly. - refreshRoundedCorners(actor); - refreshShadow(actor); -} -export function onRemoveEffect(actor) { - const name = ROUNDED_CORNERS_EFFECT; - unwrapActor(actor)?.remove_effect_by_name(name); - // Remove shadow actor - const shadow = actor.rwcCustomData?.shadow; - if (shadow) { - global.windowGroup.remove_child(shadow); - shadow.clear_effects(); - shadow.destroy(); - } - // Remove all timeout handler - const timeoutId = actor.rwcCustomData?.unminimizedTimeoutId; - if (timeoutId) { - GLib.source_remove(timeoutId); - } - delete actor.rwcCustomData; -} -export function onMinimize(actor) { - // Compatibility with "Compiz alike magic lamp effect". - // When minimizing a window, disable the shadow to make the magic lamp effect - // work. - const magicLampEffect = actor.get_effect('minimize-magic-lamp-effect'); - const shadow = actor.rwcCustomData?.shadow; - const roundedCornersEffect = getRoundedCornersEffect(actor); - if (magicLampEffect && shadow && roundedCornersEffect) { - logDebug('Minimizing with magic lamp effect'); - shadow.visible = false; - roundedCornersEffect.enabled = false; - } -} -export function onUnminimize(actor) { - // Compatibility with "Compiz alike magic lamp effect". - // When unminimizing a window, wait until the effect is completed before - // showing the shadow. - const magicLampEffect = actor.get_effect('unminimize-magic-lamp-effect'); - const shadow = actor.rwcCustomData?.shadow; - const roundedCornersEffect = getRoundedCornersEffect(actor); - if (magicLampEffect && shadow && roundedCornersEffect) { - shadow.visible = false; - const timer = magicLampEffect.timerId; - const id = timer.connect('new-frame', source => { - // Wait until the effect is 98% completed - if (source.get_progress() > 0.98) { - logDebug('Unminimizing with magic lamp effect'); - shadow.visible = true; - roundedCornersEffect.enabled = true; - source.disconnect(id); - } - }); - return; - } -} -export function onRestacked() { - for (const actor of global.get_window_actors()) { - const shadow = actor.rwcCustomData?.shadow; - if (!(actor.visible && shadow)) { - continue; - } - global.windowGroup.set_child_below_sibling(shadow, actor); - } -} -export const onSizeChanged = refreshRoundedCorners; -export const onFocusChanged = refreshShadow; -export function onSettingsChanged(key) { - switch (key) { - case 'skip-libadwaita-app': - case 'skip-libhandy-app': - case 'blacklist': - refreshEffectState(); - break; - case 'focused-shadow': - case 'unfocused-shadow': - refreshAllShadows(); - break; - case 'global-rounded-corner-settings': - case 'custom-rounded-corner-settings': - case 'border-color': - case 'border-width': - case 'tweak-kitty-terminal': - refreshAllRoundedCorners(); - break; - default: - } -} -/** - * Create the shadow actor for a window. - * - * @param actor - The window actor to create the shadow actor for. - */ -function createShadow(actor) { - const shadow = new St.Bin({ - name: 'Shadow Actor', - child: new St.Bin({ - xExpand: true, - yExpand: true, - }), - }); - shadow.firstChild.add_style_class_name('shadow'); - refreshShadow(actor); - // We have to clip the shadow because of this issue: - // https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4474 - shadow.add_effect_with_name(CLIP_SHADOW_EFFECT, new ClipShadowEffect()); - // Draw the shadow actor below the window actor. - global.windowGroup.insert_child_below(shadow, actor); - // Bind position and size between window and shadow - for (let i = 0; i < 4; i++) { - const constraint = new Clutter.BindConstraint({ - source: actor, - coordinate: i, - offset: 0, - }); - shadow.add_constraint(constraint); - } - return shadow; -} -/** Traverse all windows, and check if they should have rounded corners. */ -function refreshEffectState() { - for (const actor of global.get_window_actors()) { - const shouldHaveEffect = shouldEnableEffect(actor.metaWindow); - const hasEffect = getRoundedCornersEffect(actor) != null; - if (shouldHaveEffect && !hasEffect) { - onAddEffect(actor); - refreshRoundedCorners(actor); - return; - } - if (!shouldHaveEffect && hasEffect) { - onRemoveEffect(actor); - return; - } - } -} -/** - * Refresh the shadow actor for a window. - * - * @param actor - The window actor to refresh the shadow for. - */ -function refreshShadow(actor) { - const win = actor.metaWindow; - const shadow = actor.rwcCustomData?.shadow; - if (!shadow) { - return; - } - const shadowSettings = win.appears_focused - ? getPref('focused-shadow') - : getPref('unfocused-shadow'); - const { borderRadius, padding } = getRoundedCornersCfg(win); - updateShadowActorStyle(win, shadow, borderRadius, shadowSettings, padding); -} -/** Refresh the style of all shadow actors */ -function refreshAllShadows() { - for (const actor of global.get_window_actors()) { - refreshShadow(actor); - } -} -/** - * Refresh rounded corners settings for a window. - * - * @param actor - The window actor to refresh the rounded corners settings for. - */ -function refreshRoundedCorners(actor) { - const win = actor.metaWindow; - const windowInfo = actor.rwcCustomData; - const effect = getRoundedCornersEffect(actor); - if (!(effect && windowInfo)) { - return; - } - // Skip rounded corners when window is fullscreen & maximize - const cfg = getRoundedCornersCfg(win); - const shouldHaveEffect = shouldEnableEffect(win); - if (effect.enabled !== shouldHaveEffect) { - effect.enabled = shouldHaveEffect; - refreshShadow(actor); - } - const windowContentOffset = computeWindowContentsOffset(win); - // When window size is changed, update uniforms for corner rounding shader. - effect.update_uniforms(windowScaleFactor(win), cfg, computeBounds(actor, windowContentOffset), { - width: getPref('border-width'), - color: getPref('border-color'), - }); - // Update BindConstraint for the shadow - const shadow = windowInfo.shadow; - const offsets = computeShadowActorOffset(actor, windowContentOffset); - const constraints = shadow.get_constraints(); - constraints.forEach((constraint, i) => { - if (constraint instanceof Clutter.BindConstraint) { - constraint.offset = offsets[i]; - } - }); -} -/** Refresh rounded corners settings for all windows. */ -function refreshAllRoundedCorners() { - for (const actor of global.get_window_actors()) { - refreshRoundedCorners(actor); - } - refreshAllShadows(); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_manager.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_manager.js deleted file mode 100644 index e1616f70..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/event_manager.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @file Manages connections between gnome shell events and the rounded corners - * effect. See {@link enableEffect} for more information. - */ -import { logDebug } from '../utils/log.js'; -import { prefs } from '../utils/settings.js'; -import * as handlers from './event_handlers.js'; -/** - * The rounded corners effect has to perform some actions when differen events - * happen. For example, when a new window is opened, the effect has to detect - * it and add rounded corners to it. - * - * The `enableEffect` method handles this by attaching the necessary signals - * to matching handlers on each effect. - */ -export function enableEffect() { - // Update the effect when settings are changed. - connect(prefs, 'changed', (_, key) => handlers.onSettingsChanged(key)); - const wm = global.windowManager; - // Add the effect to all windows when the extension is enabled. - const windowActors = global.get_window_actors(); - logDebug(`Initial window count: ${windowActors.length}`); - for (const actor of windowActors) { - applyEffectTo(actor); - } - // Add the effect to new windows when they are opened. - connect(global.display, 'window-created', (_, win) => { - const actor = win.get_compositor_private(); - // If wm_class_instance of Meta.Window is null, wait for it to be - // set before applying the effect. - if (win?.get_wm_class_instance() == null) { - const notifyId = win.connect('notify::wm-class', () => { - applyEffectTo(actor); - win.disconnect(notifyId); - }); - } - else { - applyEffectTo(actor); - } - }); - // Window minimized. - connect(wm, 'minimize', (_, actor) => handlers.onMinimize(actor)); - // Window unminimized. - connect(wm, 'unminimize', (_, actor) => handlers.onUnminimize(actor)); - // When closing the window, remove the effect from it. - connect(wm, 'destroy', (_, actor) => removeEffectFrom(actor)); - // When windows are restacked, the order of shadow actors as well. - connect(global.display, 'restacked', handlers.onRestacked); -} -/** Disable the effect for all windows. */ -export function disableEffect() { - for (const actor of global.get_window_actors()) { - removeEffectFrom(actor); - } - disconnectAll(); -} -const connections = []; -/** - * Connect a callback to an object signal and add it to the list of all - * connections. This allows to easily disconnect all signals when removing - * the effect. - * - * @param object - The object to connect the callback to. - * @param signal - The name of the signal. - * @param callback - The function to connect to the signal. - */ -function connect(object, signal, -// Signal callbacks can have any return args and return types. -// biome-ignore lint/suspicious/noExplicitAny: -callback) { - connections.push({ - object: object, - id: object.connect(signal, callback), - }); -} -/** - * Disconnect all connected signals from all actors or a specific object. - * - * @param object - If object is provided, only disconnect signals from it. - */ -function disconnectAll(object) { - for (const connection of connections) { - if (object === undefined || connection.object === object) { - connection.object.disconnect(connection.id); - } - } -} -/** - * Apply the effect to a window. - * - * While {@link enableEffect} handles global events such as window creation, - * this function handles events that happen to a specific window, like changing - * its size or workspace. - * - * @param actor - The window actor to apply the effect to. - */ -function applyEffectTo(actor) { - // In wayland sessions, the surface actor of XWayland clients is sometimes - // not ready when the window is created. In this case, we wait until it is - // ready before applying the effect. - if (!actor.firstChild) { - const id = actor.connect('notify::first-child', () => { - applyEffectTo(actor); - actor.disconnect(id); - }); - return; - } - const texture = actor.get_texture(); - if (!texture) { - return; - } - // Window resized. - // - // The signal has to be connected both to the actor and the texture. Why is - // that? I have no idea. But without that, weird bugs can happen. For - // example, when using Dash to Dock, all opened windows will be invisible - // *unless they are pinned in the dock*. So yeah, GNOME is magic. - connect(actor, 'notify::size', () => handlers.onSizeChanged(actor)); - connect(texture, 'size-changed', () => { - handlers.onSizeChanged(actor); - }); - // Window focus changed. - connect(actor.metaWindow, 'notify::appears-focused', () => handlers.onFocusChanged(actor)); - // Workspace or monitor of the window changed. - connect(actor.metaWindow, 'workspace-changed', () => { - handlers.onFocusChanged(actor); - }); - handlers.onAddEffect(actor); -} -/** - * Remove the effect from a window. - * - * @param actor - The window actor to remove the effect from. - */ -function removeEffectFrom(actor) { - disconnectAll(actor); - disconnectAll(actor.metaWindow); - handlers.onRemoveEffect(actor); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/utils.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/utils.js deleted file mode 100644 index 6b80bc5e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/manager/utils.js +++ /dev/null @@ -1,233 +0,0 @@ -/** @file Provides various utility functions used withing signal handling code. */ -import Gio from 'gi://Gio'; -import Meta from 'gi://Meta'; -import St from 'gi://St'; -import { boxShadowCss } from '../utils/box_shadow.js'; -import { APP_SHADOWS, ROUNDED_CORNERS_EFFECT, SHADOW_PADDING, } from '../utils/constants.js'; -import { readFile } from '../utils/file.js'; -import { logDebug } from '../utils/log.js'; -import { getPref } from '../utils/settings.js'; -/** - * Get the actor that rounded corners should be applied to. - * In Wayland, the effect is applied to WindowActor, but in X11, it is applied - * to WindowActor.first_child. - * - * @param actor - The window actor to unwrap. - * @returns The correct actor that the effect should be applied to. - */ -export function unwrapActor(actor) { - const type = actor.metaWindow.get_client_type(); - return type === Meta.WindowClientType.X11 ? actor.get_first_child() : actor; -} -/** - * Get the correct rounded corner setting for a window (custom settings if a - * window has custom overrides, global settings otherwise). - * - * @param win - The window to get the settings for. - * @returns The matching settings object. - */ -export function getRoundedCornersCfg(win) { - const globalCfg = getPref('global-rounded-corner-settings'); - const customCfgList = getPref('custom-rounded-corner-settings'); - const wmClass = win.get_wm_class_instance(); - if (wmClass == null || - !customCfgList[wmClass] || - !customCfgList[wmClass].enabled) { - return globalCfg; - } - return customCfgList[wmClass]; -} -/** - * Get the Clutter.Effect object for the rounded corner effect of a specific - * window. - * - * @param actor - The window actor to get the effect for. - * @returns The corresponding Clutter.Effect object. - */ -export function getRoundedCornersEffect(actor) { - const win = actor.metaWindow; - const name = ROUNDED_CORNERS_EFFECT; - return win.get_client_type() === Meta.WindowClientType.X11 - ? actor.firstChild.get_effect(name) - : actor.get_effect(name); -} -/** - * Get the scaling factor of a window. - * - * @param win - The window to get the scaling factor for. - * @returns The scaling factor of the window. - */ -export function windowScaleFactor(win) { - // When fractional scaling is enabled, always return 1 - const features = Gio.Settings.new('org.gnome.mutter').get_strv('experimental-features'); - if (Meta.is_wayland_compositor() && - features.includes('scale-monitor-framebuffer')) { - return 1; - } - const monitorIndex = win.get_monitor(); - return global.display.get_monitor_scale(monitorIndex); -} -/** Compute outer bounds for rounded corners of a window - * - * @param actor - The window actor to compute the bounds for. - * @param [x, y, width, height] - The content offsets of the window actor. - */ -export function computeBounds(actor, [x, y, width, height]) { - const bounds = { - x1: x + 1, - y1: y + 1, - x2: x + actor.width + width, - y2: y + actor.height + height, - }; - // Kitty draws its window decoration by itself, so we need to manually - // clip its shadow and recompute the outer bounds for it. - if (getPref('tweak-kitty-terminal')) { - if (actor.metaWindow.get_client_type() === - Meta.WindowClientType.WAYLAND && - actor.metaWindow.get_wm_class_instance() === 'kitty') { - const [x1, y1, x2, y2] = APP_SHADOWS.kitty; - const scale = windowScaleFactor(actor.metaWindow); - bounds.x1 += x1 * scale; - bounds.y1 += y1 * scale; - bounds.x2 -= x2 * scale; - bounds.y2 -= y2 * scale; - } - } - return bounds; -} -/** - * Compute the offset of actual window contents from the entire window buffer. - * - * @param window - The window to compute the offset for. - * @returns The content offsets of the window (x, y, width, height). - */ -export function computeWindowContentsOffset(window) { - const bufferRect = window.get_buffer_rect(); - const frameRect = window.get_frame_rect(); - return [ - frameRect.x - bufferRect.x, - frameRect.y - bufferRect.y, - frameRect.width - bufferRect.width, - frameRect.height - bufferRect.height, - ]; -} -/** - * Compute the offset of the shadow actor for a window. - * - * @param actor - The window actor to compute the offset for. - * @param [offsetX, offsetY, offsetWidth, offsetHeight] - The content offsets of the window actor. - */ -export function computeShadowActorOffset(actor, [offsetX, offsetY, offsetWidth, offsetHeight]) { - const win = actor.metaWindow; - const shadowPadding = SHADOW_PADDING * windowScaleFactor(win); - return [ - offsetX - shadowPadding, - offsetY - shadowPadding, - 2 * shadowPadding + offsetWidth, - 2 * shadowPadding + offsetHeight, - ]; -} -/** Update the CSS style of a shadow actor - * - * @param win - The window to update the style for. - * @param actor - The shadow actor to update the style for. - * @param borderRadius - The border radius of the shadow actor. - * @param shadow - The shadow settings for the window. - * @param padding - The padding of the shadow actor. - */ -export function updateShadowActorStyle(win, actor, borderRadius = getPref('global-rounded-corner-settings').borderRadius, shadow = getPref('focused-shadow'), padding = getPref('global-rounded-corner-settings').padding) { - const { left, right, top, bottom } = padding; - // Increase border_radius when smoothing is on - let adjustedBorderRadius = borderRadius; - if (getPref('global-rounded-corner-settings') !== null) { - adjustedBorderRadius *= - 1.0 + getPref('global-rounded-corner-settings').smoothing; - } - // If there are two monitors with different scale factors, the scale of - // the window may be different from the scale that has to be applied in - // the css, so we have to adjust the scale factor accordingly. - const originalScale = St.ThemeContext.get_for_stage(global.stage).scaleFactor; - const scale = windowScaleFactor(win) / originalScale; - actor.style = `padding: ${SHADOW_PADDING * scale}px;`; - const child = actor.firstChild; - child.style = - win.maximizedHorizontally || win.maximizedVertically || win.fullscreen - ? 'opacity: 0;' - : `background: white; - border-radius: ${adjustedBorderRadius * scale}px; - ${boxShadowCss(shadow, scale)}; - margin: ${top * scale}px - ${right * scale}px - ${bottom * scale}px - ${left * scale}px;`; - child.queue_redraw(); -} -/** - * Check whether a window should have rounded corners. - * - * @param win - The window to check. - * @returns Whether the window should have rounded corners. - */ -export function shouldEnableEffect(win) { - // Skip rounded corners for the DING (Desktop Icons NG) extension. - // - // https://extensions.gnome.org/extension/2087/desktop-icons-ng-ding/ - if (win.gtkApplicationId === 'com.rastersoft.ding') { - return false; - } - // Skip blacklisted applications. - const wmClass = win.get_wm_class_instance(); - if (wmClass == null) { - logDebug(`Warning: wm_class_instance of ${win}: ${win.title} is null`); - return false; - } - if (getPref('blacklist').includes(wmClass)) { - return false; - } - // Only apply the effect to normal windows (skip menus, tooltips, etc.) - if (win.windowType !== Meta.WindowType.NORMAL && - win.windowType !== Meta.WindowType.DIALOG && - win.windowType !== Meta.WindowType.MODAL_DIALOG) { - return false; - } - // Skip libhandy/libadwaita applications according to settings. - const appType = win._appType ?? getAppType(win); - win._appType = appType; // Cache the result. - logDebug(`Check Type of window:${win.title} => ${appType}`); - if (getPref('skip-libadwaita-app') && appType === 'LibAdwaita') { - return false; - } - if (getPref('skip-libhandy-app') && appType === 'LibHandy') { - return false; - } - // Skip maximized/fullscreen windows according to settings. - const maximized = win.maximizedHorizontally || win.maximizedVertically; - const fullscreen = win.fullscreen; - const cfg = getRoundedCornersCfg(win); - return (!(maximized || fullscreen) || - (maximized && cfg.keepRoundedCorners.maximized) || - (fullscreen && cfg.keepRoundedCorners.fullscreen)); -} -/** - * Get the type of the application (LibHandy/LibAdwaita/Other). - * - * @param win - The window to get the type of. - * @returns the type of the application. - */ -function getAppType(win) { - try { - // May throw a permission error. - const contents = readFile(`/proc/${win.get_pid()}/maps`); - if (contents.includes('libhandy-1.so')) { - return 'LibHandy'; - } - if (contents.includes('libadwaita-1.so')) { - return 'LibAdwaita'; - } - return 'Other'; - } - catch (e) { - logError(e); - return 'Other'; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/index.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/index.js deleted file mode 100644 index 4bca68f9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { BlackList } from '../preferences/pages/blacklist.js'; -import { Custom } from '../preferences/pages/custom.js'; -import { General } from '../preferences/pages/general.js'; -export const pages = () => [ - new General(), - new BlackList(), - new Custom(), -]; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.js deleted file mode 100644 index 4e71d892..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.js +++ /dev/null @@ -1,51 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import { getPref, setPref } from '../../utils/settings.js'; -import { BlacklistRow } from '../widgets/blacklist_row.js'; -import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -export const BlackList = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'blacklist.ui', GLib.UriFlags.NONE), - GTypeName: 'PrefsBlacklist', - InternalChildren: ['blacklist_group'], -}, class extends Adw.PreferencesPage { - constructor() { - super(); - this.blacklist = getPref('blacklist'); - for (const title of this.blacklist) { - this.add_window(undefined, title); - } - } - add_window(_, title) { - const callbacks = { - on_delete: row => this.delete_row(row), - on_title_changed: (_, old_title, new_title) => this.change_title(old_title, new_title), - }; - const row = new BlacklistRow(callbacks); - row.set_subtitle(title ?? ''); - this._blacklist_group.add(row); - } - delete_row(row) { - this.blacklist.splice(this.blacklist.indexOf(row.title), 1); - setPref('blacklist', this.blacklist); - this._blacklist_group.remove(row); - } - change_title(old_title, new_title) { - if (this.blacklist.includes(new_title)) { - const win = this.root; - win.add_toast(new Adw.Toast({ - title: _(`Can't add ${new_title} to the list, because it already there`), - })); - return false; - } - if (old_title === '') { - this.blacklist.push(new_title); - } - else { - const old_id = this.blacklist.indexOf(old_title); - this.blacklist.splice(old_id, 1, new_title); - } - setPref('blacklist', this.blacklist); - return true; - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.ui deleted file mode 100644 index d3003ade..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/blacklist.ui +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.js deleted file mode 100644 index 10e06647..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.js +++ /dev/null @@ -1,114 +0,0 @@ -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 { getPref, setPref } from '../../utils/settings.js'; -import { CustomEffectRow, CustomEffectRowClass, } from '../widgets/customeffect_row.js'; -export const Custom = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'custom.ui', GLib.UriFlags.NONE), - GTypeName: 'PrefsCustom', - InternalChildren: ['custom_group'], -}, class extends Adw.PreferencesPage { - constructor() { - super(); - this._settings_cfg = getPref('custom-rounded-corner-settings'); - for (const title in this._settings_cfg) { - this.add_window(undefined, title); - } - } - add_window(_, title) { - const callbacks = { - on_delete: row => this.delete_row(row), - on_title_changed: (row, old_title, new_title) => this.change_title(row, old_title, new_title), - }; - const row = new CustomEffectRow(callbacks); - if (title) { - this.setup_row(row, title); - } - row.set_subtitle(title ?? ''); - this._custom_group.add(row); - } - delete_row(row) { - delete this._settings_cfg[row.subtitle]; - setPref('custom-rounded-corner-settings', this._settings_cfg); - this._custom_group.remove(row); - } - change_title(row, old_title, new_title) { - if (this._settings_cfg[new_title] !== undefined) { - const win = this.root; - win.add_toast(new Adw.Toast({ - title: _(`Can't add ${new_title} to the list, because it already there`), - })); - return false; - } - if (old_title === '') { - this._settings_cfg[new_title] = getPref('global-rounded-corner-settings'); - } - else { - const cfg = this._settings_cfg[old_title]; - delete this._settings_cfg[old_title]; - this._settings_cfg[new_title] = cfg; - } - this.setup_row(row, new_title); - setPref('custom-rounded-corner-settings', this._settings_cfg); - return true; - } - setup_row(row, title) { - if (!(row instanceof CustomEffectRowClass)) { - return; - } - const r = row; - r.connect('notify::subtitle', (row) => { - row.check_state(); - }); - r.enabled_row.set_active(this._settings_cfg[title].enabled); - r.enabled_row.connect('notify::active', (row) => { - r.check_state(); - this._settings_cfg[title].enabled = row.get_active(); - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.corner_radius.set_value(this._settings_cfg[title].borderRadius); - r.corner_radius.connect('value-changed', (adj) => { - this._settings_cfg[title].borderRadius = adj.get_value(); - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.corner_smoothing.set_value(this._settings_cfg[title].smoothing); - r.corner_smoothing.connect('value-changed', (adj) => { - this._settings_cfg[title].smoothing = adj.get_value(); - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.keep_for_maximized.set_active(this._settings_cfg[title].keepRoundedCorners.maximized); - r.keep_for_maximized.connect('notify::active', (row) => { - this._settings_cfg[title].keepRoundedCorners.maximized = - row.get_active(); - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.keep_for_fullscreen.set_active(this._settings_cfg[title].keepRoundedCorners.fullscreen); - r.keep_for_fullscreen.connect('notify::active', (row) => { - this._settings_cfg[title].keepRoundedCorners.fullscreen = - row.get_active(); - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.paddings.paddingTop = this._settings_cfg[title].padding.top; - r.paddings.connect('notify::padding-top', (row) => { - this._settings_cfg[title].padding.top = row.paddingTop; - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.paddings.paddingBottom = this._settings_cfg[title].padding.bottom; - r.paddings.connect('notify::padding-bottom', (row) => { - this._settings_cfg[title].padding.bottom = - row.paddingBottom; - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.paddings.paddingStart = this._settings_cfg[title].padding.left; - r.paddings.connect('notify::padding-start', (row) => { - this._settings_cfg[title].padding.left = row.paddingStart; - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - r.paddings.paddingEnd = this._settings_cfg[title].padding.right; - r.paddings.connect('notify::padding-end', (row) => { - this._settings_cfg[title].padding.right = row.paddingEnd; - setPref('custom-rounded-corner-settings', this._settings_cfg); - }); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.ui deleted file mode 100644 index cb403ac7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/custom.ui +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.js deleted file mode 100644 index 88aabc50..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.js +++ /dev/null @@ -1,103 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import { bindPref, getPref, setPref } from '../../utils/settings.js'; -import { EditShadowPage } from '../widgets/edit_shadow_page.js'; -import { ResetPage } from '../widgets/reset_page.js'; -import '../widgets/paddings_row.js'; -export const General = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'general.ui', GLib.UriFlags.NONE), - GTypeName: 'PrefsGeneral', - InternalChildren: [ - 'skip_libadwaita', - 'skip_libhandy', - 'border_width', - 'border_color', - 'corner_radius', - 'corner_smoothing', - 'keep_for_maximized', - 'keep_for_fullscreen', - 'paddings', - 'tweak_kitty', - 'right_click_menu', - 'enable_log', - ], -}, class extends Adw.PreferencesPage { - constructor() { - super(); - this._cfg = getPref('global-rounded-corner-settings'); - bindPref('skip-libadwaita-app', this._skip_libadwaita, 'active', Gio.SettingsBindFlags.DEFAULT); - bindPref('skip-libhandy-app', this._skip_libhandy, 'active', Gio.SettingsBindFlags.DEFAULT); - bindPref('border-width', this._border_width, 'value', Gio.SettingsBindFlags.DEFAULT); - const color = new Gdk.RGBA(); - [color.red, color.green, color.blue, color.alpha] = - getPref('border-color'); - this._border_color.set_rgba(color); - this._border_color.connect('notify::rgba', (btn) => { - const color = btn.get_rgba(); - setPref('border-color', [ - color.red, - color.green, - color.blue, - color.alpha, - ]); - }); - this._corner_radius.set_value(this._cfg.borderRadius); - this._corner_radius.connect('value-changed', (adj) => { - this._cfg.borderRadius = adj.get_value(); - this._update_global_config(); - }); - this._corner_smoothing.set_value(this._cfg.smoothing); - this._corner_smoothing.connect('value-changed', (adj) => { - this._cfg.smoothing = adj.get_value(); - this._update_global_config(); - }); - this._keep_for_maximized.set_active(this._cfg.keepRoundedCorners.maximized); - this._keep_for_maximized.connect('notify::active', (swtch) => { - this._cfg.keepRoundedCorners.maximized = swtch.get_active(); - this._update_global_config(); - }); - this._keep_for_fullscreen.set_active(this._cfg.keepRoundedCorners.fullscreen); - this._keep_for_fullscreen.connect('notify::active', (swtch) => { - this._cfg.keepRoundedCorners.fullscreen = - swtch.get_active(); - this._update_global_config(); - }); - this._paddings.paddingTop = this._cfg.padding.top; - this._paddings.connect('notify::padding-top', (row) => { - this._cfg.padding.top = row.paddingTop; - this._update_global_config(); - }); - this._paddings.paddingBottom = this._cfg.padding.bottom; - this._paddings.connect('notify::padding-bottom', (row) => { - this._cfg.padding.bottom = row.paddingBottom; - this._update_global_config(); - }); - this._paddings.paddingStart = this._cfg.padding.left; - this._paddings.connect('notify::padding-start', (row) => { - this._cfg.padding.left = row.paddingStart; - this._update_global_config(); - }); - this._paddings.paddingEnd = this._cfg.padding.right; - this._paddings.connect('notify::padding-end', (row) => { - this._cfg.padding.right = row.paddingEnd; - this._update_global_config(); - }); - bindPref('tweak-kitty-terminal', this._tweak_kitty, 'active', Gio.SettingsBindFlags.DEFAULT); - bindPref('enable-preferences-entry', this._right_click_menu, 'active', Gio.SettingsBindFlags.DEFAULT); - bindPref('debug-mode', this._enable_log, 'active', Gio.SettingsBindFlags.DEFAULT); - } - show_reset_page(_) { - const root = this.root; - root.push_subpage(new ResetPage()); - } - show_shadow_page(_) { - const root = this.root; - root.push_subpage(new EditShadowPage()); - } - _update_global_config() { - setPref('global-rounded-corner-settings', this._cfg); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.ui deleted file mode 100644 index 284b318e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/pages/general.ui +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/app_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/app_row.js deleted file mode 100644 index 5eb79390..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/app_row.js +++ /dev/null @@ -1,75 +0,0 @@ -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 { onPicked, pick } from '../../window_picker/client.js'; -export class AppRowClass extends Adw.ExpanderRow { - callbacks; - remove_btn = new Gtk.Button({ - icon_name: 'window-close-symbolic', - css_classes: ['flat', 'circular'], - valign: Gtk.Align.CENTER, - }); - apply_btn = new Gtk.Button({ - icon_name: 'object-select-symbolic', - css_classes: ['flat', 'circular'], - valign: Gtk.Align.CENTER, - }); - pick_btn = new Gtk.Button({ - icon_name: 'find-location-symbolic', - css_classes: ['flat', 'circular'], - valign: Gtk.Align.CENTER, - }); - wm_class_entry = new Adw.EntryRow({ - title: _('Window class'), - }); - constructor(cb) { - super(); - this.callbacks = cb; - this.wm_class_entry.add_prefix(this.apply_btn); - this.wm_class_entry.add_prefix(this.pick_btn); - this.add_row(this.wm_class_entry); - this.add_suffix(this.remove_btn); - this.bind_property('subtitle', this.wm_class_entry, 'text', GObject.BindingFlags.DEFAULT); - this.add_css_class('property'); - this.set_title(_('Expand this row, to pick a window')); - this.remove_btn.connect('clicked', () => { - this.on_delete(); - }); - this.pick_btn.connect('clicked', () => { - this.on_pick(this.wm_class_entry); - }); - this.apply_btn.connect('clicked', () => { - this.on_title_change(this.wm_class_entry); - }); - } - on_title_change(entry) { - if (!this.callbacks?.on_title_changed || - this.subtitle === entry.text || - entry.text === '') { - return; - } - if (this.callbacks.on_title_changed(this, this.subtitle || '', entry.text || '')) { - this.set_subtitle(entry.text || ''); - } - } - on_pick(entry) { - onPicked(wm_instance_class => { - if (wm_instance_class === 'window-not-found') { - const win = this.root; - win.add_toast(new Adw.Toast({ - title: _("Can't pick window from this position"), - })); - return; - } - entry.text = wm_instance_class; - }); - pick(); - } - on_delete() { - this.callbacks?.on_delete(this); - } -} -export const AppRow = GObject.registerClass({ - GTypeName: 'AppRow', -}, AppRowClass); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/blacklist_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/blacklist_row.js deleted file mode 100644 index e54a4672..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/blacklist_row.js +++ /dev/null @@ -1,7 +0,0 @@ -import GObject from 'gi://GObject'; -import './app_row.js'; -import { AppRowClass } from './app_row.js'; -export const BlacklistRow = GObject.registerClass({ - GTypeName: 'BlacklistRow', -}, class extends AppRowClass { -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/customeffect_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/customeffect_row.js deleted file mode 100644 index 80f553db..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/customeffect_row.js +++ /dev/null @@ -1,89 +0,0 @@ -import Adw from 'gi://Adw'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; -import { AppRowClass } from './app_row.js'; -import { PaddingsRow } from './paddings_row.js'; -import './app_row.js'; -import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -export class CustomEffectRowClass extends AppRowClass { - enabled_row = new Adw.SwitchRow({ - title: _('Enabled'), - }); - corner_radius_row = new Adw.ActionRow({ - title: _('Corner radius'), - }); - corner_radius = new Gtk.Adjustment({ - lower: 0, - upper: 40, - step_increment: 1, - page_increment: 1, - }); - corner_smoothing_row = new Adw.ActionRow({ - title: _('Corner smoothing'), - }); - corner_smoothing = new Gtk.Adjustment({ - lower: 0, - upper: 1, - step_increment: 0.1, - page_increment: 0.1, - }); - keep_for_maximized = new Adw.SwitchRow({ - title: _('Keep rounded corners when maximized'), - subtitle: _('Always clip rounded corners even if window is maximized or tiled'), - }); - keep_for_fullscreen = new Adw.SwitchRow({ - title: _('Keep rounded corners when in fullscreen'), - subtitle: _('Always clip rounded corners even for fullscreen window'), - }); - paddings = new PaddingsRow(); - constructor(cb) { - super(cb); - this.corner_radius_row.add_suffix(new Gtk.Scale({ - valign: Gtk.Align.CENTER, - hexpand: true, - draw_value: true, - value_pos: Gtk.PositionType.LEFT, - round_digits: 0, - digits: 0, - orientation: Gtk.Orientation.HORIZONTAL, - adjustment: this.corner_radius, - })); - this.corner_smoothing_row.add_suffix(new Gtk.Scale({ - valign: Gtk.Align.CENTER, - hexpand: true, - draw_value: true, - value_pos: Gtk.PositionType.LEFT, - round_digits: 1, - orientation: Gtk.Orientation.HORIZONTAL, - adjustment: this.corner_smoothing, - })); - this.add_row(this.enabled_row); - this.add_row(this.corner_radius_row); - this.add_row(this.corner_smoothing_row); - this.add_row(this.keep_for_maximized); - this.add_row(this.keep_for_fullscreen); - this.add_row(this.paddings); - this.check_state(); - } - check_state() { - if (!this.enabled_row.get_active()) { - this.toggle_sensetive(false); - return; - } - if (this.subtitle === '') { - this.toggle_sensetive(false); - return; - } - this.toggle_sensetive(true); - } - toggle_sensetive(state) { - this.corner_radius_row.set_sensitive(state); - this.corner_smoothing_row.set_sensitive(state); - this.keep_for_maximized.set_sensitive(state); - this.keep_for_fullscreen.set_sensitive(state); - this.paddings.set_sensitive(state); - } -} -export const CustomEffectRow = GObject.registerClass({ - GTypeName: 'CustomEffectRow', -}, CustomEffectRowClass); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit-shadow-page.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit-shadow-page.ui deleted file mode 100644 index e433d856..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit-shadow-page.ui +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit_shadow_page.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit_shadow_page.js deleted file mode 100644 index ab50b720..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/edit_shadow_page.js +++ /dev/null @@ -1,118 +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'; -import { boxShadowCss } from '../../utils/box_shadow.js'; -import { getPref, setPref } from '../../utils/settings.js'; -export const EditShadowPage = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'edit-shadow-page.ui', GLib.UriFlags.NONE), - GTypeName: 'EditShadowPage', - InternalChildren: [ - 'focused_shadow_preview', - 'unfocused_shadow_preview', - 'preview_row', - 'focused_horizontal_offset', - 'focused_vertical_offset', - 'focused_blur_radius', - 'focused_spread_radius', - 'focused_opacity', - 'unfocused_horizontal_offset', - 'unfocused_vertical_offset', - 'unfocused_blur_radius', - 'unfocused_spread_radius', - 'unfocused_opacity', - ], -}, class extends Adw.NavigationPage { - constructor() { - super(); - this.is_initialized = false; - this.unfocus_provider = new Gtk.CssProvider(); - this.focus_provider = new Gtk.CssProvider(); - this.backgroud_provider = new Gtk.CssProvider(); - this.focused_shadow = getPref('focused-shadow'); - this.unfocused_shadow = getPref('unfocused-shadow'); - const style_manager = new Adw.StyleManager(); - style_manager.connect('notify::dark', manager => { - this.update_background(manager); - }); - // Init style of preview widgets - this._focused_shadow_preview - .get_style_context() - .add_provider(this.focus_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - this._unfocused_shadow_preview - .get_style_context() - .add_provider(this.unfocus_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - this._preview_row - .get_style_context() - .add_provider(this.backgroud_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - // Init value controls from settings - this.update_background(style_manager); - this.update_widget(); - this.update_style(); - this.is_initialized = true; - } - update_widget() { - this._focused_horizontal_offset.set_value(this.focused_shadow.horizontalOffset); - this._focused_vertical_offset.set_value(this.focused_shadow.verticalOffset); - this._focused_blur_radius.set_value(this.focused_shadow.blurOffset); - this._focused_spread_radius.set_value(this.focused_shadow.spreadRadius); - this._focused_opacity.set_value(this.focused_shadow.opacity); - this._unfocused_horizontal_offset.set_value(this.unfocused_shadow.horizontalOffset); - this._unfocused_vertical_offset.set_value(this.unfocused_shadow.verticalOffset); - this._unfocused_blur_radius.set_value(this.unfocused_shadow.blurOffset); - this._unfocused_spread_radius.set_value(this.unfocused_shadow.spreadRadius); - this._unfocused_opacity.set_value(this.unfocused_shadow.opacity); - } - update_cfg() { - const focused_shadow = { - verticalOffset: this._focused_vertical_offset.get_value(), - horizontalOffset: this._focused_horizontal_offset.get_value(), - blurOffset: this._focused_blur_radius.get_value(), - spreadRadius: this._focused_spread_radius.get_value(), - opacity: this._focused_opacity.get_value(), - }; - this.focused_shadow = focused_shadow; - const unfocused_shadow = { - verticalOffset: this._unfocused_vertical_offset.get_value(), - horizontalOffset: this._unfocused_horizontal_offset.get_value(), - blurOffset: this._unfocused_blur_radius.get_value(), - spreadRadius: this._unfocused_spread_radius.get_value(), - opacity: this._unfocused_opacity.get_value(), - }; - this.unfocused_shadow = unfocused_shadow; - // Store into settings - setPref('unfocused-shadow', this.unfocused_shadow); - setPref('focused-shadow', this.focused_shadow); - } - update_style() { - const gen_style = (normal, hover) => `.preview { - transition: box-shadow 200ms; - ${boxShadowCss(normal)}; - border-radius: 12px; - } - .preview:hover { - ${boxShadowCss(hover)}; - }`; - this.unfocus_provider.load_from_string(gen_style(this.unfocused_shadow, this.focused_shadow)); - this.focus_provider.load_from_string(gen_style(this.focused_shadow, this.unfocused_shadow)); - } - update_background(manager) { - const backgrounds = Gio.Settings.new('org.gnome.desktop.background'); - const path = manager.get_dark() - ? backgrounds.get_string('picture-uri-dark') - : backgrounds.get_string('picture-uri'); - this.backgroud_provider.load_from_string(`.desktop-background { - background: url("${path}"); - background-size: cover; - }`); - } - // signal handles - on_value_changed() { - if (!this.is_initialized) { - return; - } - this.update_cfg(); - this.update_style(); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings-row.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings-row.ui deleted file mode 100644 index d512932b..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings-row.ui +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings_row.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings_row.js deleted file mode 100644 index f3323701..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/paddings_row.js +++ /dev/null @@ -1,15 +0,0 @@ -import Adw from 'gi://Adw'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -export class PaddingsRowClass extends Adw.PreferencesRow { -} -export const PaddingsRow = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'paddings-row.ui', GLib.UriFlags.NONE), - GTypeName: 'PaddingsRow', - Properties: { - PaddingTop: GObject.ParamSpec.int('padding-top', 'Padding top', 'Padding from the top', GObject.ParamFlags.READWRITE, 0, 100, 0), - PaddingBottom: GObject.ParamSpec.int('padding-bottom', 'Padding bottom', 'Padding from the bottom', GObject.ParamFlags.READWRITE, 0, 100, 0), - PaddingStart: GObject.ParamSpec.int('padding-start', 'Padding start', 'Padding from the start', GObject.ParamFlags.READWRITE, 0, 100, 0), - PaddingEnd: GObject.ParamSpec.int('padding-end', 'Padding end', 'Padding from the end', GObject.ParamFlags.READWRITE, 0, 100, 0), - }, -}, PaddingsRowClass); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset-page.ui b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset-page.ui deleted file mode 100644 index 289fd925..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset-page.ui +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - Reset these settings? - reset - cancel - - - _Cancel - _Reset - - - \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset_page.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset_page.js deleted file mode 100644 index 0f315ec7..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/preferences/widgets/reset_page.js +++ /dev/null @@ -1,108 +0,0 @@ -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 { logDebug } from '../../utils/log.js'; -import { getPref, prefs, setPref } from '../../utils/settings.js'; -class Cfg { - description; - reset = false; - constructor(description) { - this.description = description; - } -} -export const ResetPage = GObject.registerClass({ - Template: GLib.uri_resolve_relative(import.meta.url, 'reset-page.ui', GLib.UriFlags.NONE), - GTypeName: 'ResetPage', - InternalChildren: ['reset_grp', 'reset_btn', 'dialog'], -}, class extends Adw.NavigationPage { - constructor() { - super(); - this._rows = []; - this._init_cfg(); - this._build_ui(); - } - _init_cfg() { - this._reset_keys = { - 'skip-libadwaita-app': new Cfg(_('Skip LibAdwaita Applications')), - 'skip-libhandy-app': new Cfg(_('Skip LibHandy Applications')), - 'focused-shadow': new Cfg(_('Focus Window Shadow Style')), - 'unfocused-shadow': new Cfg(_('Unfocus Window Shadow Style')), - 'border-width': new Cfg(_('Border Width')), - 'border-color': new Cfg(_('Border Color')), - 'debug-mode': new Cfg(_('Enable Log')), - }; - this._reset_corners_cfg = { - borderRadius: new Cfg(_('Border Radius')), - padding: new Cfg(_('Padding')), - keepRoundedCorners: new Cfg(_('Keep Rounded Corners when Maximized or Fullscreen')), - smoothing: new Cfg(_('Corner Smoothing')), - }; - } - _build_ui() { - const build = (cfg) => { - for (const key in cfg) { - const row = new Adw.SwitchRow({ - active: false, - name: key, - }); - row.set_title(cfg[key].description); - row.connect('notify::active', source => this.on_toggled(source)); - this._reset_grp.add(row); - this._rows.push(row); - } - }; - build(this._reset_corners_cfg); - build(this._reset_keys); - } - on_toggled(source) { - const k = source.name; - let v = this._reset_corners_cfg[k]; - if (v !== undefined) { - v.reset = source.active; - return; - } - v = this._reset_keys[k]; - if (v !== undefined) { - v.reset = source.active; - return; - } - } - select_all() { - for (const row of this._rows) { - row.set_active(true); - } - } - ask_for_reset() { - // typescript thinks, that there should be 0-2 arguments, but actually - // it will throw an error, if any of three argument is missing - // @ts-ignore - this._dialog.choose(this, null, null); - } - reset(_, response) { - if (response === 'cancel') { - return; - } - for (const k in this._reset_keys) { - if (this._reset_keys[k]?.reset === true) { - prefs.reset(k); - logDebug(`Reset ${k}`); - } - } - const key = 'global-rounded-corner-settings'; - const default_cfg = prefs - .get_default_value(key) - ?.recursiveUnpack(); - const current_cfg = getPref('global-rounded-corner-settings'); - for (const k in this._reset_corners_cfg) { - const _k = k; - if (this._reset_corners_cfg[_k]?.reset === true) { - current_cfg[_k] = default_cfg[_k]; - logDebug(`Reset ${k}`); - } - } - setPref('global-rounded-corner-settings', current_cfg); - const root = this.root; - root.pop_subpage(); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/prefs.js deleted file mode 100644 index 9b9eefca..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/prefs.js +++ /dev/null @@ -1,33 +0,0 @@ -import GLib from 'gi://GLib'; -import Gdk from 'gi://Gdk'; -import Gtk from 'gi://Gtk'; -import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -import { pages } from './preferences/index.js'; -import { logDebug } from './utils/log.js'; -import { initPrefs, uninitPrefs } from './utils/settings.js'; -export default class RoundedWindowCornersRebornPrefs extends ExtensionPreferences { - _load_css() { - const display = Gdk.Display.get_default(); - if (display) { - const css = new Gtk.CssProvider(); - const path = GLib.build_filenamev([ - import.meta.url, - 'stylesheet-prefs.css', - ]); - css.load_from_path(path); - Gtk.StyleContext.add_provider_for_display(display, css, 0); - } - } - fillPreferencesWindow(win) { - initPrefs(this.getSettings()); - for (const page of pages()) { - win.add(page); - } - // Disconnect all signal when close prefs - win.connect('close-request', () => { - logDebug('Disconnect Signals'); - uninitPrefs(); - }); - this._load_css(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/private_metadata.json deleted file mode 100644 index ccd02725..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/private_metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Add rounded corners to all windows. Fork of the now unmaintained Rounded Window Corners extension.", - "gettext-domain": "rounded-window-corners@fxgn", - "name": "Rounded Window Corners Reborn", - "settings-schema": "org.gnome.shell.extensions.rounded-window-corners-reborn", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/flexagoon/rounded-window-corners", - "uuid": "rounded-window-corners@fxgn", - "version": 7 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/gschemas.compiled deleted file mode 100644 index 3295d86ae09c452791277bde3441b3bb9435824f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1597 zcmb7EJ!lj`6rO1Q|6?K~C{a*x7u`D)ixh?=h?pW0IYcZJoV}g98*XoBot;f`kpw#t z5rSA)2!fEtN`y2)hyly=v9z!j5y49Id%L$u)L1z1_WS0WH?uSI-kU2oxRyLHtkH&n zH&bpM$V6bvVa9%sd=ZUbRcx(XyJlks?~>2)@Uu-%RyM{9%}>dfOR#j7f42P<;WAO z2S|GvWOM8$@HT9EZMlbZ;-k>-1Mgzt^H*E9NhePF3h)_h>(PV9q!S;4{u;Ojd$+XQ zMfX9x1^PSS4_LTy{S^5V?}pyr%-9*&==$jb>BKvsj{(PFeN&%LkWQTZuL0|@_v?PL zPvZU1SAd-@jJ>+>@eTPCABJuL9oWOI)lJfglm8@e8un5gIY~P40qA#t0=D_K>jmk= zd!a7?zrwOO6K8COeFIv!^wH;sX33v;2mHr?{6Ossb1p?vL+XWmv-@WJBgNJ-;at~2+F>sxm`nN(q{kk9FovaiRAh3bo+gZoH^g zDSuVSi_+BD6nOi{xy!d}NnqrXokq;Typqr&D2m7tfzfq1CJpD!GS|UQ=pEY`itVfp zDm?J&J5@jqn77YK|L2@2{lCt66xx30B;UQ~yomnq=S<&7dONAa=?+oG$vaASNA;Ez Y1d!IpGsdW-T%Q-KzKnJPV)4lS1=A#5R{#J2 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/org.gnome.shell.extensions.rounded-window-corners-reborn.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/org.gnome.shell.extensions.rounded-window-corners-reborn.gschema.xml deleted file mode 100644 index 0d583a91..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/schemas/org.gnome.shell.extensions.rounded-window-corners-reborn.gschema.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - 0 - - - - [] - window here will not be rounded - - The contents of the list represent the instance part of the window's - `WM_CLASS`, as same as the output of `xprop WM_CLASS|cut -d \" -f 2` - - - - - Skip Libadwaita applications - true - - - - Skip LibHandy applications - false - - - - Border width for rounded corners window - - 0 - - - - Border color for rounded corners window - (0.5, 0.5, 0.5, 1.0) - - - - Global rounded corners settings for all windows - - - { - 'padding': <{ - 'left': <uint32 1>, - 'right': <uint32 1>, - 'top': <uint32 1>, - 'bottom': <uint32 1> - }>, - 'keepRoundedCorners': <{ - 'maximized': <false>, - 'fullscreen': <false> - }>, - 'borderRadius': <uint32 12>, - 'smoothing': <0>, - 'enabled': <true> - } - - - - - A directory to setup custom paddings for special windows - {} - - - - - Shadow for focused window - - { - 'horizontalOffset': 0, - 'verticalOffset': 4, - 'blurOffset': 28, - 'spreadRadius': 4, - 'opacity': 60 - } - - - - - Shadow for unfocused window - - { - 'horizontalOffset': 0, - 'verticalOffset': 2, - 'blurOffset': 12, - 'spreadRadius': -1, - 'opacity': 65 - } - - - - - If enabled, extension will show debug info into journalctl - false - - - - false - - - - false - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet-prefs.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet-prefs.css deleted file mode 100644 index 6088dc25..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet-prefs.css +++ /dev/null @@ -1,35 +0,0 @@ -.page { - padding: 10px 30px; -} -.code { - padding: 10px 16px; -} -.edit-win { - background: #eeeeee; - color: black; - padding: 20px 80px; -} -.flat { - background: none; - border: none; -} - -.expander_img { - transition: all 100ms; -} - -.rotated { - transform: rotate(90deg); -} - -.dialog-vbox { - padding: 48px; -} - -.dialog-vbox .heading { - padding-bottom: 24px; -} - -.dialog-vbox checkbutton { - padding-right: 12px; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet.css deleted file mode 100644 index 44fceb78..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/stylesheet.css +++ /dev/null @@ -1,6 +0,0 @@ -.shadow { - box-shadow: 0px 0px 0px 0px rgba(83, 83, 83, 0.0); - transition-duration: 300ms; - transition-property: box-shadow; - transition-timing-function: linear; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/README.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/README.md deleted file mode 100644 index 2f41d4b3..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# `utils` - -This directory contains functions which are used in different places throughout -the codebase, so they can't be put anywhere else. - -## `background_menu.ts` - -Handles adding and removing the RWC settings item in the desktop context menu. - -## `box_shadow.ts` - -Contains a function for converting box shadow JS objects into CSS styles for -those shadows. - -## `constants.ts` - -Defines the constants used in the codebase. - -## `file.ts` - -Contains utility functions for reading file contents. - -## `log.ts` - -Provides wrapper functions for printing out debug messages. - -## `settings.ts` - -Provides wrappers around the GSettings object that add type safety and -automatically convert values between JS types and GLib Variant types that are -used for storing GSettings. - -## `types.ts` - -Provides types used throughout the codebase, mostly for storing settings. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/background_menu.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/background_menu.js deleted file mode 100644 index 6d7442cb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/background_menu.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file Handles adding and removing the RWC settings item in the desktop - * context menu. - * - * XXX: It seems like this relies on GNOME Shell methods which aren't supposed - * to be public. Perhaps this would be removed in the future. - */ -import { Extension, gettext as _, } from 'resource:///org/gnome/shell/extensions/extension.js'; -/** Enable the "rounded corner settings" item in desktop context menu. */ -export function enableBackgroundMenuItem() { - for (const background of global.windowGroup.firstChild.get_children()) { - const menu = background._backgroundMenu; - addItemToMenu(menu); - } -} -/** Disable the "rounded corner settings" item in desktop context menu. */ -export function disableBackgroundMenuItem() { - for (const background of global.windowGroup.firstChild.get_children()) { - const menu = background._backgroundMenu; - removeItemFromMenu(menu); - } -} -/** - * Add the menu item to the background menu. - * - * @param menu - BackgroundMenu to add the item to. - */ -function addItemToMenu(menu) { - const rwcMenuItemName = _('Rounded Corners Settings...'); - // Check if the item already exists - for (const item of menu._getMenuItems()) { - if (item.label?.text === rwcMenuItemName) { - return; - } - } - menu.addAction(rwcMenuItemName, () => { - const extension = Extension.lookupByURL(import.meta.url); - extension.openPreferences(); - }); -} -/** - * Remove the menu item from the background menu. - * - * @param menu - BackgroundMenu to remove the item from. - */ -function removeItemFromMenu(menu) { - const items = menu._getMenuItems(); - const rwcMenuItemName = _('Rounded Corners Settings...'); - for (const item of items) { - if (item.label?.text === rwcMenuItemName) { - item.destroy(); - break; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/box_shadow.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/box_shadow.js deleted file mode 100644 index 270d0970..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/box_shadow.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @file Contains a single function - {@link boxShadowCss}, which converts - * {@link BoxShadow} objects into CSS code for the shadow. - */ -/** - * Generate a CSS style for a box shadow from the provided {@link BoxShadow} - * object. - * - * @param shadow - The settings for the box shadow. - * @param scale - The scale of the window, 1 by default. - * @returns The box-shadow CSS string. - */ -export function boxShadowCss(shadow, scale = 1) { - return `box-shadow: ${shadow.horizontalOffset * scale}px - ${shadow.verticalOffset * scale}px - ${shadow.blurOffset * scale}px - ${shadow.spreadRadius * scale}px - rgba(0,0,0, ${shadow.opacity / 100})`; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/constants.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/constants.js deleted file mode 100644 index 97252bfb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/constants.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @file Defines the constants used in this extension. */ -/** Name of the rounded corners effect */ -export const ROUNDED_CORNERS_EFFECT = 'Rounded Corners Effect'; -/** Name of the shadow clipping effect */ -export const CLIP_SHADOW_EFFECT = 'Clip Shadow Effect'; -/** Padding of shadow actors */ -export const SHADOW_PADDING = 80; -/** - * Hardcoded shadow size for certain applications that have to be - * manually clipped - */ -export const APP_SHADOWS = { - kitty: [11, 35, 11, 11], -}; -/** Name of shadow actor to be added in overview */ -export const OVERVIEW_SHADOW_ACTOR = 'Shadow Actor (Overview)'; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/file.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/file.js deleted file mode 100644 index 19eec6de..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/file.js +++ /dev/null @@ -1,48 +0,0 @@ -/** @file Contains utility functions for reading file contents. */ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -/** - * Read file contents as a string. - * - * @param path - The path to the file to be read. - * @returns Contents of the file as a UTF-8 string. - */ -export function readFile(path) { - const file = Gio.File.new_for_path(path); - const contents = file.load_contents(null)[1]; - const decoder = new TextDecoder('utf-8'); - return decoder.decode(contents); -} -/** - * Read a file relative to the current module. - * - * @param module - `import.meta.url` of the current module. - * @param path - File path relative to the current module. - * @returns Contents of the file as a UTF-8 string. - */ -export function readRelativeFile(module, path) { - const basedir = GLib.path_get_dirname(module); - const fileUri = GLib.build_filenamev([basedir, path]); - const filePath = GLib.filename_from_uri(fileUri)[0]; - return readFile(filePath ?? ''); -} -/** - * Read a shader file and split it into declarations and main code, since - * GNOME's `add_glsl_snippet` function takes those parts as two separate - * arguments. - * - * @param module - `import.meta.url` of the current module. - * @param path - File path relative to the current module. - * @returns A list containing the declarations as the first element and - * contents of the main function as the second. - */ -export function readShader(module, path) { - const shader = readRelativeFile(module, path); - // This function isn't called very often, so creating the regex at the top - // level doesn't really make sense. - // biome-ignore lint/performance/useTopLevelRegex: - let [declarations, code] = shader.split(/^.*?main\(\s?\)\s?/m); - declarations = declarations.trim(); - code = code.trim().replace(/^[{}]/gm, '').trim(); - return [declarations, code]; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/log.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/log.js deleted file mode 100644 index 4b5d77b2..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/log.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @file Provides wrapper functions for printing out debug messages. */ -import { getPref } from './settings.js'; -/** - * Log a message with a [Rounded Window Corners] prefix, but only - * when debug mode is enabled. - */ -export function logDebug(...args) { - if (getPref('debug-mode')) { - console.log(`[Rounded Window Corners] ${args}`); - } -} -/** - * Log an error with a [Rounded Window Corners] prefix. - */ -export function logError(...args) { - console.error(`[Rounded Window Corners] ${args}`); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/settings.js deleted file mode 100644 index 106398af..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/settings.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @file Provides wrappers around the GSettings object that add type safety and - * automatically convert values between JS types and GLib Variant types that - * are used for storing GSettings. - */ -import GLib from 'gi://GLib'; -import { logDebug } from './log.js'; -/** Mapping of schema keys to their GLib Variant type string */ -const Schema = { - 'settings-version': 'u', - blacklist: 'as', - 'skip-libadwaita-app': 'b', - 'skip-libhandy-app': 'b', - 'border-width': 'i', - 'border-color': '(dddd)', - 'global-rounded-corner-settings': 'a{sv}', - 'custom-rounded-corner-settings': 'a{sv}', - 'focused-shadow': 'a{si}', - 'unfocused-shadow': 'a{si}', - 'debug-mode': 'b', - 'tweak-kitty-terminal': 'b', - 'enable-preferences-entry': 'b', -}; -/** The raw GSettings object for direct manipulation. */ -export let prefs; -/** - * Initialize the {@link prefs} object with existing GSettings. - * - * @param gSettings - GSettings to initialize the prefs with. - */ -export function initPrefs(gSettings) { - resetOutdated(gSettings); - prefs = gSettings; -} -/** Delete the {@link prefs} object for garbage collection. */ -export function uninitPrefs() { - prefs = null; -} -/** - * Get a preference from GSettings and convert it from a GLib Variant to a - * JavaScript type. - * - * @param key - The key of the preference to get. - * @returns The value of the preference. - */ -export function getPref(key) { - return prefs.get_value(key).recursiveUnpack(); -} -/** - * Pack a value into a GLib Variant type and store it in GSettings. - * - * @param key - The key of the preference to set. - * @param value - The value to set the preference to. - */ -export function setPref(key, value) { - logDebug(`Settings pref: ${key}, ${value}`); - let variant; - if (key === 'global-rounded-corner-settings') { - variant = packRoundedCornerSettings(value); - } - else if (key === 'custom-rounded-corner-settings') { - variant = packCustomRoundedCornerSettings(value); - } - else { - variant = new GLib.Variant(Schema[key], value); - } - prefs.set_value(key, variant); -} -/** A simple type-checked wrapper around {@link prefs.bind} */ -export function bindPref(key, object, property, flags) { - prefs.bind(key, object, property, flags); -} -/** - * Reset setting keys that changed their type between releases - * to avoid conflicts. - * - * @param prefs the GSettings object to clean. - */ -function resetOutdated(prefs) { - const lastVersion = 6; - const currentVersion = prefs - .get_user_value('settings-version') - ?.recursiveUnpack(); - if (!currentVersion || currentVersion < lastVersion) { - if (prefs.list_keys().includes('black-list')) { - prefs.reset('black-list'); - } - prefs.reset('global-rounded-corner-settings'); - prefs.reset('custom-rounded-corner-settings'); - prefs.reset('focused-shadow'); - prefs.reset('unfocused-shadow'); - prefs.set_uint('settings-version', lastVersion); - } -} -/** - * Pack rounded corner settings into a GLib Variant object. - * - * Since rounded corner settings are stored as a dictionary where the values - * are of different types, it can't be automatically packed into a variant. - * Instead, we need to pack each of the values into the correct variant - * type, and only then pack the entire dictionary into a variant with type - * "a{sv}" (dictionary with string keys and arbitrary variant values). - * - * @param settings - The rounded corner settings to pack. - * @returns The packed GLib Variant object. - */ -function packRoundedCornerSettings(settings) { - const padding = new GLib.Variant('a{su}', settings.padding); - const keepRoundedCorners = new GLib.Variant('a{sb}', settings.keepRoundedCorners); - const borderRadius = GLib.Variant.new_uint32(settings.borderRadius); - const smoothing = GLib.Variant.new_double(settings.smoothing); - const enabled = GLib.Variant.new_boolean(settings.enabled); - const variantObject = { - padding: padding, - keepRoundedCorners: keepRoundedCorners, - borderRadius: borderRadius, - smoothing: smoothing, - enabled: enabled, - }; - return new GLib.Variant('a{sv}', variantObject); -} -/** - * Pack custom rounded corner overrides into a GLib Variant object. - * - * Custom rounded corner settings are stored as a dictionary from window - * wm_class to {@link RoundedCornerSettings} objects. See the documentation for - * {@link packRoundedCornerSettings} for more information on why manual packing - * is needed here. - * - * @param settings - The custom rounded corner setting overrides to pack. - * @returns The packed GLib Variant object. - */ -function packCustomRoundedCornerSettings(settings) { - const packedSettings = {}; - for (const [wmClass, windowSettings] of Object.entries(settings)) { - packedSettings[wmClass] = packRoundedCornerSettings(windowSettings); - } - const variant = new GLib.Variant('a{sv}', packedSettings); - return variant; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/types.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/types.js deleted file mode 100644 index 1deb9655..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/utils/types.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @file Provides types used throughout the codebase, mostly for storing settings. */ -export {}; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/README.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/README.md deleted file mode 100644 index 769f2c2a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# `window_picker` - -The extensions preferences window runs in a separate isolated process which has -no access to GNOME Shell methods. However, the window picking functionality is -based on GNOME Shell's Looking Glass. - -To allow the preferences window to communicate with the main process, the code -in this directory creates a DBus service, which has a method to open the window -picker and a signal to transmit the class of the selected window. - -## `iface.xml` - -Defines the DBus interface for the window picker. - -## `service.ts` - -Contains the implementation of the DBus interface. - -## `client.ts` - -Provides wrapper JavaScript functions around the DBus method calls. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/client.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/client.js deleted file mode 100644 index 93cbc951..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/client.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @file This file provides wrapper functions around the DBus window picker - * interface. - */ -import Gio from 'gi://Gio'; -const connection = Gio.DBus.session; -const busName = 'org.gnome.Shell'; -const interfaceName = 'org.gnome.Shell.Extensions.RoundedWindowCorners'; -const objectPath = '/org/gnome/shell/extensions/RoundedWindowCorners'; -/** Open the window picker and select a window. */ -export function pick() { - connection.call(busName, objectPath, interfaceName, 'pick', null, null, Gio.DBusCallFlags.NO_AUTO_START, -1, null, null); -} -/** - * Connect a callback to the `picked` signal, which is emitted when a window - * is picked. - * - * @param callback - The function to execute when the window is picked. - */ -export function onPicked(callback) { - const id = connection.signal_subscribe(busName, interfaceName, 'picked', objectPath, null, Gio.DBusSignalFlags.NONE, (_conn, _sender, _objectPath, _iface, _signal, params) => { - const val = params.get_child_value(0); - callback(val.get_string()[0]); - connection.signal_unsubscribe(id); - }); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/iface.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/iface.xml deleted file mode 100644 index 6cb7756a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/iface.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/service.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/service.js deleted file mode 100644 index 05441102..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/rounded-window-corners@fxgn/window_picker/service.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file This file contains the implementation of the DBus interface for the - * window picker. See the {@link WindowPicker} class for more information. - */ -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import Meta from 'gi://Meta'; -import { Inspector } from 'resource:///org/gnome/shell/ui/lookingGlass.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { readRelativeFile } from '../utils/file.js'; -import { logDebug } from '../utils/log.js'; -/** - * This class provides the implementation of the DBus interface for the window - * picker. It implements a single method - `pick` - which opens the window picker - * and allows the user to select a window. - */ -export class WindowPicker { - #iface = readRelativeFile(import.meta.url, 'iface.xml'); - #dbus = Gio.DBusExportedObject.wrapJSObject(this.#iface, this); - /** Emit the wm_class of the picked window to the `picked` signal. */ - #sendPickedWindow(wmClass) { - this.#dbus.emit_signal('picked', new GLib.Variant('(s)', [wmClass])); - } - /** - * Open the window picker and select a window. - * - * This uses the window picker from GNOME's Looking Glass. This is the - * easiest way to pick a window, and this is also what's used by other - * extensions such as Blur my Shell. - */ - pick() { - const lookingGlass = Main.createLookingGlass(); - const inspector = new Inspector(lookingGlass); - inspector.connect('target', (me, target, x, y) => { - logDebug(`${me}: pick ${target} in ${x}, ${y}`); - // Remove the red border effect when the window is picked. - const effectName = 'lookingGlass_RedBorderEffect'; - for (const effect of target.get_effects()) { - if (effect.toString().includes(effectName)) { - target.remove_effect(effect); - } - } - let actor = target; - // If the picked actor is not a Meta.WindowActor, which happens - // often since it's usually a Meta.SurfaceActor, try to find its - // parent which is a Meta.WindowActor. - for (let i = 0; i < 2; i++) { - if (actor == null || actor instanceof Meta.WindowActor) { - break; - } - actor = actor.get_parent(); - } - if (!(actor instanceof Meta.WindowActor)) { - this.#sendPickedWindow('window-not-found'); - return; - } - this.#sendPickedWindow(actor.metaWindow.get_wm_class_instance() ?? 'window-not-found'); - }); - inspector.connect('closed', () => { - lookingGlass.close(); - }); - } - export() { - this.#dbus.export(Gio.DBus.session, '/org/gnome/shell/extensions/RoundedWindowCorners'); - logDebug('DBus Service exported'); - } - unexport() { - this.#dbus.unexport(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/README.md b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/README.md deleted file mode 100644 index 120beea6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Space Bar - -GNOME Shell extension that replaces the top-panel workspace indicator with an i3-like workspaces bar. - -On GNOME Extensions: https://extensions.gnome.org/extension/5090/space-bar/ - -Originally a fork of the extension [Workspaces -Bar](https://extensions.gnome.org/extension/3851/workspaces-bar/) by -[fthx](https://extensions.gnome.org/accounts/profile/fthx), this extension grew into a more -comprehensive set of features to support a workspace-based workflow. - -## Features - -- First class support for static and dynamic workspaces as well as multi-monitor setups -- Add, remove, and rename workspaces -- Rearrange workspaces via drag and drop -- Automatically assign workspace names based on started applications -- Keyboard shortcuts extend and refine system shortcuts -- Scroll through workspaces by mouse wheel over the panel -- Customize the appearance - -## Build - -The source code of this extension is written in TypeScript. The following command will build the -extension and package it to a zip file. - -```sh -./scripts/build.sh -``` - -## Install - -The following command will build the extension and install it locally. - -```sh -./scripts/build.sh -i -``` - -## Generate types - -For development with TypeScript, you can get type support in IDEs like VSCode by building and -installing type information for used libraries. Generating types is optional and not required for -building the extension. (For that, we use a different configuration that stubs type information with -dummy types.) - -To generate types, run - -```sh -npm install -npm run build:types -``` - -Choose "All" and "Yes" for everything. - -## Debug - -Run a GNOME shell instance in a window: - -```sh -dbus-run-session -- gnome-shell --nested --wayland -``` - -View logs: - -```sh -journalctl -f -o cat /usr/bin/gnome-shell -``` - -View logs of settings: - -```sh -journalctl -f -o cat /usr/bin/gjs -``` - -Configuration: - -```sh -GSETTINGS_SCHEMA_DIR=::$HOME/.local/share/gnome-shell/extensions/space-bar@luchrioh/schemas dconf-editor /org/gnome/shell/extensions/space-bar/ &>/dev/null -``` diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/extension.js deleted file mode 100644 index ff76cd69..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/extension.js +++ /dev/null @@ -1,39 +0,0 @@ -import { KeyBindings } from './services/KeyBindings.js'; -import { ScrollHandler } from './services/ScrollHandler.js'; -import { Settings } from './services/Settings.js'; -import { Styles } from './services/Styles.js'; -import { TopBarAdjustments } from './services/TopBarAdjustments.js'; -import { Workspaces } from './services/Workspaces.js'; -import { WorkspacesBar } from './ui/WorkspacesBar.js'; -import { destroyAllHooks } from './utils/hook.js'; -import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; -export default class SpaceBarExtension extends Extension { - constructor() { - super(...arguments); - this.workspacesBar = null; - this.scrollHandler = null; - } - enable() { - Settings.init(this); - TopBarAdjustments.init(); - Workspaces.init(); - KeyBindings.init(); - Styles.init(); - this.workspacesBar = new WorkspacesBar(this); - this.workspacesBar.init(); - this.scrollHandler = new ScrollHandler(); - this.scrollHandler.init(this.workspacesBar.observeWidget()); - } - disable() { - destroyAllHooks(); - Settings.destroy(); - TopBarAdjustments.destroy(); - Workspaces.destroy(); - KeyBindings.destroy(); - Styles.destroy(); - this.scrollHandler?.destroy(); - this.scrollHandler = null; - this.workspacesBar?.destroy(); - this.workspacesBar = null; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/AppearancePage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/AppearancePage.js deleted file mode 100644 index 41c83a13..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/AppearancePage.js +++ /dev/null @@ -1,342 +0,0 @@ -import Adw from 'gi://Adw'; -import { addColorButton, addCombo, addSpinButton } from './common.js'; -import { addCustomCssDialogButton } from './custom-styles.js'; -export const fontWeightOptions = { - '100': 'Thin', - '200': 'Extra Light', - '300': 'Light', - '400': 'Normal', - '500': 'Medium', - '600': 'Semi Bold', - '700': 'Bold', - '800': 'Extra Bold', - '900': 'Black', -}; -export class AppearancePage { - constructor(_extensionPreferences) { - this._extensionPreferences = _extensionPreferences; - this.page = new Adw.PreferencesPage(); - this._settings = _extensionPreferences.getSettings(`org.gnome.shell.extensions.space-bar.appearance`); - } - init() { - this.page.set_title('_Appearance'); - this.page.useUnderline = true; - this.page.set_icon_name('applications-graphics-symbolic'); - this._connectEnabledConditions(); - this._initGeneralGroup(); - this._initActiveWorkspaceGroup(); - this._initInactiveWorkspaceGroup(); - this._initEmptyWorkspaceGroup(); - this._initCustomStylesGroup(); - } - _connectEnabledConditions() { - const behaviorSettings = this._extensionPreferences.getSettings(`org.gnome.shell.extensions.space-bar.behavior`); - const disabledNoticeGroup = new Adw.PreferencesGroup({ - description: 'Appearance preferences currently support the indicator style "Workspaces bar" only.', - }); - this.page.add(disabledNoticeGroup); - const updateEnabled = () => { - const indicatorStyle = behaviorSettings.get_string(`indicator-style`); - if (indicatorStyle === 'workspaces-bar') { - this.page.set_sensitive(true); - disabledNoticeGroup.set_visible(false); - } - else { - this.page.set_sensitive(false); - disabledNoticeGroup.set_visible(true); - } - }; - updateEnabled(); - const changed = behaviorSettings.connect(`changed::indicator-style`, updateEnabled); - this.page.connect('unmap', () => behaviorSettings.disconnect(changed)); - } - _initGeneralGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('General'); - addSpinButton({ - settings: this._settings, - group, - key: 'workspaces-bar-padding', - title: 'Workspaces-bar padding', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'workspace-margin', - title: 'Workspace margin', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - this.page.add(group); - } - _initActiveWorkspaceGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('Active Workspace'); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'active-workspace-background-color', - title: 'Background color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'active-workspace-text-color', - title: 'Text color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'active-workspace-border-color', - title: 'Border color', - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'active-workspace-font-size', - title: 'Font size', - lower: 0, - upper: 255, - }).addToggleButton({ window: this.window }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'active-workspace-font-weight', - title: 'Font weight', - options: fontWeightOptions, - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'active-workspace-border-radius', - title: 'Border radius', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'active-workspace-border-width', - title: 'Border width', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'active-workspace-padding-h', - title: 'Horizontal padding', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'active-workspace-padding-v', - title: 'Vertical padding', - lower: 0, - upper: 255, - }).addResetButton({ window: this.window }); - this.page.add(group); - } - _initInactiveWorkspaceGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('Inactive Workspace'); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'inactive-workspace-background-color', - title: 'Background color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'inactive-workspace-text-color', - title: 'Text color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'inactive-workspace-border-color', - title: 'Border color', - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'inactive-workspace-font-size', - title: 'Font size', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-font-size', - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'inactive-workspace-font-weight', - title: 'Font weight', - options: fontWeightOptions, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-font-weight', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'inactive-workspace-border-radius', - title: 'Border radius', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-border-radius', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'inactive-workspace-border-width', - title: 'Border width', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-border-width', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'inactive-workspace-padding-h', - title: 'Horizontal padding', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-padding-h', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'inactive-workspace-padding-v', - title: 'Vertical padding', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'active-workspace-padding-v', - }); - this.page.add(group); - } - _initEmptyWorkspaceGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('Empty Workspace'); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'empty-workspace-background-color', - title: 'Background color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'empty-workspace-text-color', - title: 'Text color', - }).addResetButton({ window: this.window }); - addColorButton({ - window: this.window, - settings: this._settings, - group, - key: 'empty-workspace-border-color', - title: 'Border color', - }).addResetButton({ window: this.window }); - addSpinButton({ - settings: this._settings, - group, - key: 'empty-workspace-font-size', - title: 'Font size', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-font-size', - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'empty-workspace-font-weight', - title: 'Font weight', - options: fontWeightOptions, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-font-weight', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'empty-workspace-border-radius', - title: 'Border radius', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-border-radius', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'empty-workspace-border-width', - title: 'Border width', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-border-width', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'empty-workspace-padding-h', - title: 'Horizontal padding', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-padding-h', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'empty-workspace-padding-v', - title: 'Vertical padding', - lower: 0, - upper: 255, - }).linkValue({ - window: this.window, - linkedKey: 'inactive-workspace-padding-v', - }); - this.page.add(group); - } - _initCustomStylesGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('Custom Styles'); - addCustomCssDialogButton({ - window: this.window, - group, - settings: this._settings, - }); - this.page.add(group); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/BehaviorPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/BehaviorPage.js deleted file mode 100644 index 85ce9976..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/BehaviorPage.js +++ /dev/null @@ -1,248 +0,0 @@ -import Adw from 'gi://Adw'; -import { addCombo, addLinkButton, addSpinButton, addTextEntry, addToggle } from './common.js'; -export const indicatorStyleOptions = { - 'current-workspace': 'Current workspace', - 'workspaces-bar': 'Workspaces bar', -}; -export const scrollWheelOptions = { - panel: 'Over top panel', - 'workspaces-bar': 'Over indicator', - disabled: 'Disabled', -}; -export const scrollWheelDirectionOptions = { - normal: 'Normal', - inverted: 'Inverted', - disabled: 'Disabled', -}; -export const positionOptions = { - left: 'Left', - center: 'Center', - right: 'Right', -}; -export class BehaviorPage { - constructor(extensionPreferences) { - this.page = new Adw.PreferencesPage(); - this._settings = extensionPreferences.getSettings(`org.gnome.shell.extensions.space-bar.behavior`); - } - init() { - this.page.set_title('_Behavior'); - this.page.useUnderline = true; - this.page.set_icon_name('preferences-system-symbolic'); - this._initGeneralGroup(); - this._initSmartWorkspaceNamesGroup(); - } - _initGeneralGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('General'); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'indicator-style', - title: 'Indicator style', - options: indicatorStyleOptions, - }).addSubDialog({ - window: this.window, - title: 'Indicator style', - populatePage: (page) => { - const group = new Adw.PreferencesGroup(); - group.set_title('Custom label text'); - group.set_description('Custom labels to use for workspace names in the top panel. The following placeholders will be replaced with their respective value:\n\n' + - '{{name}}: The current workspace name\n' + - '{{number}}: The current workspace number\n' + - '{{total}}: The number of total workspaces\n' + - '{{Total}}: The number of total workspaces, also counting the spare dynamic workspace'); - page.add(group); - addToggle({ - settings: this._settings, - group, - key: 'enable-custom-label', - title: 'Use custom label text', - }); - addToggle({ - settings: this._settings, - group, - key: 'enable-custom-label-in-menu', - title: 'Also use custom label text in menu', - }).enableIf({ - key: 'enable-custom-label', - predicate: (value) => value.get_boolean(), - page, - }); - addTextEntry({ - settings: this._settings, - group, - key: 'custom-label-named', - title: 'Custom label for named workspaces', - window: this.window, - }).enableIf({ - key: 'enable-custom-label', - predicate: (value) => value.get_boolean(), - page, - }); - addTextEntry({ - settings: this._settings, - group, - key: 'custom-label-unnamed', - title: 'Custom label for unnamed workspaces', - window: this.window, - }).enableIf({ - key: 'enable-custom-label', - predicate: (value) => value.get_boolean(), - page, - }); - }, - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'position', - title: 'Position in top panel', - options: positionOptions, - }).addSubDialog({ - window: this.window, - title: 'Position in Top Panel', - populatePage: (page) => { - const positionSubDialogGroup = new Adw.PreferencesGroup(); - page.add(positionSubDialogGroup); - addToggle({ - settings: this._settings, - group: positionSubDialogGroup, - key: 'system-workspace-indicator', - title: 'Keep system workspace indicator', - }); - addSpinButton({ - settings: this._settings, - group: positionSubDialogGroup, - key: 'position-index', - title: 'Position index', - subtitle: 'Order relative to other elements', - lower: 0, - upper: 100, - }); - }, - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'scroll-wheel', - title: 'Switch workspaces with scroll wheel', - options: scrollWheelOptions, - }).addSubDialog({ - window: this.window, - title: 'Switch Workspaces With Scroll Wheel', - enableIf: { - key: 'scroll-wheel', - predicate: (value) => value.get_string()[0] !== 'disabled', - page: this.page, - }, - populatePage: (page) => { - const group = new Adw.PreferencesGroup(); - page.add(group); - addToggle({ - settings: this._settings, - group, - key: 'scroll-wheel-debounce', - title: 'Debounce scroll events', - }); - addSpinButton({ - settings: this._settings, - group, - key: 'scroll-wheel-debounce-time', - title: 'Debounce time (ms)', - lower: 0, - upper: 2000, - step: 50, - }).enableIf({ - key: 'scroll-wheel-debounce', - predicate: (value) => value.get_boolean(), - page, - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'scroll-wheel-vertical', - title: 'Vertical scrolling', - options: scrollWheelDirectionOptions, - }); - addCombo({ - window: this.window, - settings: this._settings, - group, - key: 'scroll-wheel-horizontal', - title: 'Horizontal scrolling', - options: scrollWheelDirectionOptions, - }); - addToggle({ - settings: this._settings, - group, - key: 'scroll-wheel-wrap-around', - title: 'Wrap around', - }); - }, - }); - addToggle({ - settings: this._settings, - group, - key: 'always-show-numbers', - title: 'Always show workspace numbers', - }); - addToggle({ - settings: this._settings, - group, - key: 'show-empty-workspaces', - title: 'Show empty workspaces', - subtitle: 'Also affects switching with scroll wheel', - }); - addToggle({ - settings: this._settings, - group, - key: 'toggle-overview', - title: 'Toggle overview', - subtitle: 'When clicking on the active or an empty workspace', - }); - this.page.add(group); - } - _initSmartWorkspaceNamesGroup() { - const group = new Adw.PreferencesGroup(); - group.set_title('Smart Workspace Names'); - group.set_description('Remembers open applications when renaming a workspace and automatically assigns workspace names based on the first application started on a new workspace.'); - addToggle({ - settings: this._settings, - group, - key: 'smart-workspace-names', - title: 'Enable smart workspace names', - }).addSubDialog({ - window: this.window, - title: 'Smart Workspace Names', - enableIf: { - key: 'smart-workspace-names', - predicate: (value) => value.get_boolean(), - page: this.page, - }, - iconName: 'applications-science-symbolic', - populatePage: (page) => { - const group = new Adw.PreferencesGroup(); - page.add(group); - group.set_title('Re-evaluate names'); - group.set_description('Removes workspace names when windows by which the name was assigned move away or close.\n\n' + - 'Please leave feedback how you like the feature using the button below.'); - addToggle({ - settings: this._settings, - group, - key: 'reevaluate-smart-workspace-names', - title: 'Re-evaluate smart workspace names', - }); - addLinkButton({ - title: 'Leave feedback', - uri: 'https://github.com/christopher-l/space-bar/issues/37', - group, - }); - }, - }); - this.page.add(group); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/DropDownChoice.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/DropDownChoice.js deleted file mode 100644 index 0fe3fd05..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/DropDownChoice.js +++ /dev/null @@ -1,12 +0,0 @@ -// Adapted from -// https://gitlab.com/rmnvgr/nightthemeswitcher-gnome-shell-extension/-/blob/main/src/preferences/DropDownChoice.js -// FIXME: There is probably some standard object we could use for this. -import GObject from 'gi://GObject'; -export const DropDownChoice = GObject.registerClass({ - GTypeName: 'SpaceBarDropDownChoice', - Properties: { - id: GObject.ParamSpec.string('id', 'ID', 'Identifier', GObject.ParamFlags.READWRITE, null), - title: GObject.ParamSpec.string('title', 'Title', 'Displayed title', GObject.ParamFlags.READWRITE, null), - }, -}, class DropDownChoice extends GObject.Object { -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/ShortcutsPage.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/ShortcutsPage.js deleted file mode 100644 index 0c9158aa..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/ShortcutsPage.js +++ /dev/null @@ -1,70 +0,0 @@ -import Adw from 'gi://Adw'; -import { addKeyboardShortcut, addToggle } from './common.js'; -export class ShortcutsPage { - constructor(extensionPreferences) { - this.page = new Adw.PreferencesPage(); - this._settings = extensionPreferences.getSettings(`org.gnome.shell.extensions.space-bar.shortcuts`); - } - init() { - this.page.set_title('_Shortcuts'); - this.page.useUnderline = true; - this.page.set_icon_name('preferences-desktop-keyboard-shortcuts-symbolic'); - this._initGroup(); - } - _initGroup() { - const group = new Adw.PreferencesGroup(); - group.set_description('Shortcuts might not work if they are already bound elsewhere.'); - this.page.add(group); - addToggle({ - settings: this._settings, - group, - key: 'enable-activate-workspace-shortcuts', - title: 'Switch to workspace', - shortcutLabel: '1...0', - }); - addToggle({ - settings: this._settings, - group, - key: 'enable-move-to-workspace-shortcuts', - title: 'Move to workspace', - shortcutLabel: '1...0', - subtitle: 'With the current window', - }); - addKeyboardShortcut({ - settings: this._settings, - window: this.window, - group, - key: 'move-workspace-left', - title: 'Move current workspace left', - }); - addKeyboardShortcut({ - settings: this._settings, - window: this.window, - group, - key: 'move-workspace-right', - title: 'Move current workspace right', - }); - addKeyboardShortcut({ - settings: this._settings, - window: this.window, - group, - key: 'activate-previous-key', - title: 'Switch to previous workspace', - }); - addKeyboardShortcut({ - settings: this._settings, - window: this.window, - group, - key: 'activate-empty-key', - title: 'Switch to empty workspace', - subtitle: 'Adds new workspace if needed', - }); - addKeyboardShortcut({ - settings: this._settings, - window: this.window, - group, - key: 'open-menu', - title: 'Open menu', - }); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/common.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/common.js deleted file mode 100644 index 0036adbc..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/common.js +++ /dev/null @@ -1,405 +0,0 @@ -import Adw from 'gi://Adw'; -import Gdk from 'gi://Gdk'; -import Gio from 'gi://Gio'; -import Gtk from 'gi://Gtk'; -import { DropDownChoice } from './DropDownChoice.js'; -class PreferencesRow { - constructor(_settings, _row, _key, _setEnabledInner) { - this._settings = _settings; - this._row = _row; - this._key = _key; - this._setEnabledInner = _setEnabledInner; - } - enableIf({ key, predicate, page }) { - const updateEnabled = () => { - const value = this._settings.get_value(key); - this._row.set_sensitive(predicate(value)); - }; - updateEnabled(); - const changed = this._settings.connect(`changed::${key}`, updateEnabled); - page.connect('unmap', () => this._settings.disconnect(changed)); - } - addResetButton({ window }) { - const button = new Gtk.Button({ - iconName: 'edit-clear-symbolic', - valign: Gtk.Align.CENTER, - hasFrame: false, - marginStart: 10, - }); - button.connect('clicked', () => this._settings.reset(this._key)); - const updateButton = () => { - const buttonEnabled = this._settings.get_user_value(this._key) !== null; - button.set_sensitive(buttonEnabled); - }; - updateButton(); - const changed = this._settings.connect(`changed::${this._key}`, updateButton); - window.connect('unmap', () => this._settings.disconnect(changed)); - this._row.add_suffix(button); - } - /** - * Adds a toggle button to the row that enables / disables the setting. - * - * When disabled, the setting is reset to its default value. - * - * When enabled, the setting is set to the value of -user. The value -user is updated - * to the current value as long as the setting is enabled. - */ - addToggleButton({ window }) { - const activeKey = this._key + '-active'; - const userKey = this._key + '-user'; - const toggleEdit = (active) => { - this._settings.set_boolean(activeKey, active); - updateRow(); - updateValue(); - }; - const updateRow = () => { - const active = this._settings.get_boolean(activeKey); - this._setEnabled(active); - }; - const updateValue = () => { - const active = this._settings.get_boolean(activeKey); - if (active) { - const userValue = this._settings.get_value(userKey); - this._settings.set_value(this._key, userValue); - } - else { - this._settings.reset(this._key); - } - }; - const updateUserValue = () => { - const active = this._settings.get_boolean(activeKey); - if (active) { - const value = this._settings.get_value(this._key); - this._settings.set_value(userKey, value); - } - }; - const changed = this._settings.connect(`changed::${this._key}`, updateUserValue); - window.connect('unmap', () => this._settings.disconnect(changed)); - updateRow(); - const button = new Gtk.ToggleButton({ - iconName: 'document-edit-symbolic', - valign: Gtk.Align.CENTER, - hasFrame: false, - marginStart: 10, - }); - button.connect('toggled', (toggle) => toggleEdit(toggle.active)); - this._row.add_suffix(button); - } - linkValue({ linkedKey, activeKey = this._key + '-active', window, }) { - const toggleEdit = (active) => { - this._settings.set_boolean(activeKey, active); - updateRow(); - updateLinkedValue(); - }; - const updateRow = () => { - const active = this._settings.get_boolean(activeKey); - this._setEnabled(active); - }; - const updateLinkedValue = () => { - const active = this._settings.get_boolean(activeKey); - if (!active) { - const linkedValue = this._settings.get_user_value(linkedKey); - if (linkedValue) { - this._settings.set_value(this._key, linkedValue); - } - else { - this._settings.reset(this._key); - } - } - }; - const changed = this._settings.connect(`changed::${linkedKey}`, updateLinkedValue); - window.connect('unmap', () => this._settings.disconnect(changed)); - updateRow(); - const button = new Gtk.ToggleButton({ - iconName: 'document-edit-symbolic', - valign: Gtk.Align.CENTER, - hasFrame: false, - marginStart: 10, - }); - button.connect('toggled', (toggle) => toggleEdit(toggle.active)); - this._row.add_suffix(button); - } - addSubDialog({ window, title, populatePage, enableIf, iconName = 'applications-system-symbolic', }) { - function showDialog() { - const dialog = new Gtk.Dialog({ - title, - modal: true, - useHeaderBar: 1, - transientFor: window, - widthRequest: 350, - defaultWidth: 500, - }); - const page = new Adw.PreferencesPage(); - populatePage(page); - dialog.set_child(page); - dialog.show(); - } - const button = new Gtk.Button({ - iconName, - valign: Gtk.Align.CENTER, - hasFrame: false, - }); - button.connect('clicked', () => showDialog()); - this._row.add_suffix(new Gtk.Separator({ - marginStart: 12, - marginEnd: 4, - marginTop: 12, - marginBottom: 12, - })); - this._row.add_suffix(button); - if (enableIf) { - const updateEnabled = () => { - const value = this._settings.get_value(enableIf.key); - button.set_sensitive(enableIf.predicate(value)); - }; - updateEnabled(); - const changed = this._settings.connect(`changed::${enableIf.key}`, updateEnabled); - enableIf.page.connect('unmap', () => this._settings.disconnect(changed)); - } - } - _setEnabled(value) { - this._setEnabledInner?.(value); - } -} -export function addToggle({ group, key, title, subtitle = null, settings, shortcutLabel, }) { - const row = new Adw.ActionRow({ title, subtitle }); - group.add(row); - if (shortcutLabel) { - const gtkShortcutLabel = new Gtk.ShortcutLabel({ - accelerator: shortcutLabel, - valign: Gtk.Align.CENTER, - }); - row.add_prefix(gtkShortcutLabel); - } - const toggle = new Gtk.Switch({ - active: settings.get_boolean(key), - valign: Gtk.Align.CENTER, - }); - settings.bind(key, toggle, 'active', Gio.SettingsBindFlags.DEFAULT); - row.add_suffix(toggle); - row.activatableWidget = toggle; - return new PreferencesRow(settings, row, key, (enabled) => toggle.set_sensitive(enabled)); -} -export function addLinkButton({ group, title, subtitle = null, uri, }) { - const row = new Adw.ActionRow({ title, subtitle }); - group.add(row); - const icon = new Gtk.Image({ iconName: 'adw-external-link-symbolic' }); - row.set_activatable(true); - row.connect('activated', () => Gtk.show_uri(null, uri, Gdk.CURRENT_TIME)); - row.add_suffix(icon); -} -export function addTextEntry({ group, key, title, subtitle = null, settings, window, shortcutLabel, }) { - const row = new Adw.ActionRow({ title, subtitle }); - group.add(row); - if (shortcutLabel) { - const gtkShortcutLabel = new Gtk.ShortcutLabel({ - accelerator: shortcutLabel, - valign: Gtk.Align.CENTER, - }); - row.add_prefix(gtkShortcutLabel); - } - const entry = new Gtk.Entry({ - text: settings.get_string(key), - valign: Gtk.Align.CENTER, - }); - const focusController = new Gtk.EventControllerFocus(); - focusController.connect('leave', () => { - settings.set_string(key, entry.get_buffer().text); - }); - entry.add_controller(focusController); - const changed = settings.connect(`changed::${key}`, () => { - entry.set_text(settings.get_string(key)); - }); - window.connect('unmap', () => settings.disconnect(changed)); - row.add_suffix(entry); - row.activatableWidget = entry; - return new PreferencesRow(settings, row, key, (enabled) => entry.set_sensitive(enabled)); -} -export function addCombo({ group, key, title, subtitle = null, options, settings, window, }) { - const model = Gio.ListStore.new(DropDownChoice); - for (const id in options) { - model.append(new DropDownChoice({ id, title: options[id] })); - } - const row = new Adw.ComboRow({ - title, - subtitle, - model, - expression: Gtk.PropertyExpression.new(DropDownChoice, null, 'title'), - }); - group.add(row); - row.connect('notify::selected-item', () => { - // This may trigger without user interaction, so we only update the value when it differs - // from the the default value or a user value has been set before. - const value = row.selectedItem.id; - if (settings.get_user_value(key) !== null || settings.get_string(key) !== value) { - settings.set_string(key, value); - } - }); - function updateComboRowState() { - row.selected = - findItemPositionInModel(model, (item) => item.id === settings.get_string(key)) ?? Gtk.INVALID_LIST_POSITION; - } - const changed = settings.connect(`changed::${key}`, () => updateComboRowState()); - window.connect('unmap', () => settings.disconnect(changed)); - updateComboRowState(); - const suffixes = row.get_first_child()?.get_last_child(); - const comboBoxElements = [suffixes?.get_first_child(), suffixes?.get_last_child()]; - return new PreferencesRow(settings, row, key, (enabled) => { - row.set_activatable(enabled); - const opacity = enabled ? 1 : 0.5; - comboBoxElements.forEach((el) => el?.set_opacity(opacity)); - }); -} -export function addSpinButton({ group, key, title, subtitle = null, settings, lower, upper, step = 1, }) { - const row = new Adw.ActionRow({ title, subtitle }); - group.add(row); - const spinner = new Gtk.SpinButton({ - adjustment: new Gtk.Adjustment({ - stepIncrement: step ?? 1, - lower, - upper, - }), - value: settings.get_int(key), - valign: Gtk.Align.CENTER, - halign: Gtk.Align.CENTER, - }); - settings.bind(key, spinner, 'value', Gio.SettingsBindFlags.DEFAULT); - row.add_suffix(spinner); - row.activatableWidget = spinner; - return new PreferencesRow(settings, row, key, (enabled) => { - spinner.set_sensitive(enabled); - }); -} -export function addColorButton({ group, key, title, subtitle = null, settings, window, }) { - const row = new Adw.ActionRow({ title, subtitle }); - group.add(row); - const colorButton = new Gtk.ColorButton({ - valign: Gtk.Align.CENTER, - useAlpha: true, - }); - const updateColorButton = () => { - const color = new Gdk.RGBA(); - color.parse(settings.get_string(key)); - colorButton.set_rgba(color); - }; - updateColorButton(); - colorButton.connect('color-set', () => { - const color = colorButton.rgba.to_string(); - settings.set_string(key, color); - }); - const changed = settings.connect(`changed::${key}`, updateColorButton); - window.connect('unmap', () => settings.disconnect(changed)); - row.add_suffix(colorButton); - row.activatableWidget = colorButton; - return new PreferencesRow(settings, row, key, (enabled) => colorButton.set_sensitive(enabled)); -} -export function addKeyboardShortcut({ window, group, key, title, subtitle = null, settings, }) { - const row = new Adw.ActionRow({ - title, - subtitle, - activatable: true, - }); - group.add(row); - const shortcutLabel = new Gtk.ShortcutLabel({ - accelerator: settings.get_strv(key)[0] ?? null, - valign: Gtk.Align.CENTER, - }); - row.add_suffix(shortcutLabel); - const disabledLabel = new Gtk.Label({ - label: 'Disabled', - cssClasses: ['dim-label'], - }); - row.add_suffix(disabledLabel); - if (settings.get_strv(key).length > 0) { - disabledLabel.hide(); - } - else { - shortcutLabel.hide(); - } - function showDialog() { - const dialog = new Gtk.Dialog({ - title: 'Set Shortcut', - modal: true, - useHeaderBar: 1, - transientFor: window, - widthRequest: 400, - heightRequest: 200, - }); - const dialogBox = new Gtk.Box({ - marginBottom: 12, - marginEnd: 12, - marginStart: 12, - marginTop: 12, - orientation: Gtk.Orientation.VERTICAL, - valign: Gtk.Align.CENTER, - }); - const dialogLabel = new Gtk.Label({ - label: 'Enter new shortcut to change ' + title + '.', - useMarkup: true, - marginBottom: 12, - }); - dialogBox.append(dialogLabel); - const dialogDimLabel = new Gtk.Label({ - label: 'Press Esc to cancel or Backspace to disable the keyboard shortcut.', - cssClasses: ['dim-label'], - }); - dialogBox.append(dialogDimLabel); - const keyController = new Gtk.EventControllerKey({ - propagationPhase: Gtk.PropagationPhase.CAPTURE, - }); - dialog.add_controller(keyController); - keyController.connect('key-pressed', (keyController, keyval, keycode, modifier) => { - modifier = fixModifiers(modifier); - const accelerator = getAccelerator(keyval, modifier); - if (accelerator) { - if (keyval === Gdk.KEY_Escape && !modifier) { - // Just close the dialog - } - else if (keyval === Gdk.KEY_BackSpace && !modifier) { - shortcutLabel.hide(); - disabledLabel.show(); - settings.set_strv(key, []); - } - else { - shortcutLabel.accelerator = accelerator; - shortcutLabel.show(); - disabledLabel.hide(); - settings.set_strv(key, [accelerator]); - } - dialog.close(); - } - }); - dialog.set_child(dialogBox); - dialog.show(); - } - row.connect('activated', () => showDialog()); -} -function getAccelerator(keyval, modifiers) { - const isValid = Gtk.accelerator_valid(keyval, modifiers); - if (isValid) { - const acceleratorName = Gtk.accelerator_name(keyval, modifiers); - return acceleratorName; - } - else { - return null; - } -} -// From https://gitlab.com/rmnvgr/nightthemeswitcher-gnome-shell-extension/-/blob/main/src/utils.js -function findItemPositionInModel(model, predicate) { - for (let i = 0; i < model.get_n_items(); i++) { - if (predicate(model.get_item(i))) { - return i; - } - } - return undefined; -} -/** - * Removes invalid modifier bits. - */ -function fixModifiers(modifiers) { - return (modifiers & - // Set by Xorg when holding the Super key in addition to the valid Meta modifier. - ~64 & - // Set when num lock is enabled. - ~16); -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/custom-styles.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/custom-styles.js deleted file mode 100644 index 4c9fea85..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/preferences/custom-styles.js +++ /dev/null @@ -1,211 +0,0 @@ -import Adw from 'gi://Adw'; -import Gio from 'gi://Gio'; -import Gtk from 'gi://Gtk'; -export function addCustomCssDialogButton({ window, group, settings, }) { - const row = new Adw.ActionRow({ - title: 'Custom styles', - activatable: true, - valign: Gtk.Align.CENTER, - }); - group.add(row); - const enabledLabel = buildEnabledLabel({ settings, window }); - row.add_suffix(enabledLabel); - const icon = new Gtk.Image({ iconName: 'go-next-symbolic' }); - row.add_suffix(icon); - row.connect('activated', () => showDialog({ window, settings })); -} -function buildEnabledLabel({ settings, window, }) { - const enabledLabel = new Gtk.Label(); - function updateEnabledLabel() { - if (settings.get_boolean('custom-styles-enabled')) { - enabledLabel.set_label('On'); - } - else { - enabledLabel.set_label('Off'); - } - } - updateEnabledLabel(); - const changed = settings.connect('changed::custom-styles-enabled', updateEnabledLabel); - window.connect('unmap', () => settings.disconnect(changed)); - return enabledLabel; -} -function showDialog({ window, settings, }) { - const dialog = new Adw.Dialog({ - title: 'Custom Styles', - contentWidth: 600, - contentHeight: 2000, - }); - const toastOverlay = new Adw.ToastOverlay(); - const toolbarView = new Adw.ToolbarView(); - toastOverlay.set_child(toolbarView); - let savedCustomStyles = settings.get_string('custom-styles') ?? ''; - let textViewCustomStyles = savedCustomStyles; - function updateApplyButton() { - const hasChanged = textViewCustomStyles !== savedCustomStyles; - applyButton.set_sensitive(hasChanged); - } - function customStylesChanged(text) { - textViewCustomStyles = text; - updateApplyButton(); - } - const { headerBar, applyButton } = buildHeaderBar({ - settings, - showAppStyles: () => { - toolbarView.set_content(applicationStylesBox({ settings })); - }, - showCustomStyles: () => { - toolbarView.set_content(customStylesBox({ settings, customStylesChanged })); - }, - }); - updateApplyButton(); - applyButton.connect('clicked', () => { - const isEnabled = settings.get_boolean('custom-styles-enabled'); - settings.set_string('custom-styles', textViewCustomStyles); - // In case of invalid styles, custom-styles-enabled will be set to false - // automatically when setting custom-styles. Only enable if it was - // previously disabled. - if (!isEnabled) { - settings.set_boolean('custom-styles-enabled', true); - } - savedCustomStyles = textViewCustomStyles; - updateApplyButton(); - }); - toolbarView.add_top_bar(headerBar); - toolbarView.set_content(customStylesBox({ settings, customStylesChanged })); - const unregisterFailedToast = registerFailedToast({ toastOverlay, settings }); - dialog.connect('closed', unregisterFailedToast); - dialog.set_child(toastOverlay); - dialog.present(window); -} -function registerFailedToast({ toastOverlay, settings, }) { - let toast; - function showFailedToast() { - toast?.dismiss(); - if (settings.get_boolean('custom-styles-failed')) { - toast = new Adw.Toast({ - title: 'Failed to load styles. Custom styles have been disabled.', - timeout: 3, - }); - toastOverlay.add_toast(toast); - } - } - const showFailedToastConnection = settings.connect(`changed::custom-styles-failed`, showFailedToast); - return () => settings.disconnect(showFailedToastConnection); -} -function buildHeaderBar({ settings, showAppStyles, showCustomStyles, }) { - const titleBox = new Gtk.Box({ - spacing: 6, - }); - const appStylesButton = new Gtk.ToggleButton({ - label: 'Application Styles', - cssClasses: ['flat'], - }); - appStylesButton.connect('notify::active', (button) => button.active && showAppStyles()); - const customStylesButton = new Gtk.ToggleButton({ - label: 'Custom Styles', - cssClasses: ['flat'], - group: appStylesButton, - active: true, - }); - customStylesButton.connect('notify::active', (button) => button.active && showCustomStyles()); - titleBox.append(appStylesButton); - titleBox.append(customStylesButton); - const headerBar = new Adw.HeaderBar({ - titleWidget: titleBox, - }); - const enabledToggle = new Gtk.Switch({ - active: settings.get_boolean('custom-styles-enabled'), - marginStart: 12, - }); - settings.bind('custom-styles-enabled', enabledToggle, 'active', Gio.SettingsBindFlags.DEFAULT); - headerBar.pack_start(enabledToggle); - const applyButton = new Gtk.Button({ - label: 'Apply', - cssClasses: ['suggested-action'], - marginEnd: 4, - }); - headerBar.pack_end(applyButton); - return { headerBar, applyButton }; -} -function applicationStylesBox({ settings }) { - const box = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - halign: Gtk.Align.FILL, - marginStart: 24, - marginEnd: 24, - marginTop: 12, - marginBottom: 24, - }); - const descriptionLabel = new Gtk.Label({ - label: "The application styles that are generated based on the extension's appearance preferences. " + - 'You cannot change these styles here, but you can override them with custom styles.', - cssClasses: ['description_label'], - wrap: true, - marginBottom: 12, - xalign: 0, - naturalWrapMode: Gtk.NaturalWrapMode.NONE, - }); - box.append(descriptionLabel); - const frame = new Gtk.Frame({ - vexpand: true, - }); - box.append(frame); - const scrolled = new Gtk.ScrolledWindow({}); - frame.set_child(scrolled); - const textView = new Gtk.TextView({ - editable: false, - monospace: true, - wrapMode: Gtk.WrapMode.WORD_CHAR, - leftMargin: 12, - rightMargin: 12, - topMargin: 12, - bottomMargin: 12, - }); - scrolled.set_child(textView); - const text = settings.get_string('application-styles') ?? ''; - textView.buffer.set_text(text, -1); - return box; -} -function customStylesBox({ settings, customStylesChanged, }) { - const box = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - halign: Gtk.Align.FILL, - marginStart: 24, - marginEnd: 24, - marginTop: 12, - marginBottom: 24, - }); - const descriptionLabel = new Gtk.Label({ - label: 'Add any custom styles to override application styles.', - cssClasses: ['description_label'], - wrap: true, - marginBottom: 12, - xalign: 0, - naturalWrapMode: Gtk.NaturalWrapMode.NONE, - }); - box.append(descriptionLabel); - const frame = new Gtk.Frame({ - vexpand: true, - }); - box.append(frame); - const scrolled = new Gtk.ScrolledWindow({}); - frame.set_child(scrolled); - const textView = new Gtk.TextView({ - editable: true, - monospace: true, - cursorVisible: true, - wrapMode: Gtk.WrapMode.WORD_CHAR, - leftMargin: 12, - rightMargin: 12, - topMargin: 12, - bottomMargin: 12, - }); - scrolled.set_child(textView); - const initialText = settings.get_string('custom-styles') ?? ''; - textView.buffer.set_text(initialText, -1); - textView.buffer.connect('changed', () => { - const text = textView.buffer.get_text(textView.buffer.get_start_iter(), textView.buffer.get_end_iter(), false) ?? ''; - customStylesChanged(text); - }); - return box; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/prefs.js deleted file mode 100644 index 941fd892..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/prefs.js +++ /dev/null @@ -1,13 +0,0 @@ -import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -import { AppearancePage } from './preferences/AppearancePage.js'; -import { BehaviorPage } from './preferences/BehaviorPage.js'; -import { ShortcutsPage } from './preferences/ShortcutsPage.js'; -export default class SpaceBarExtensionPreferences extends ExtensionPreferences { - fillPreferencesWindow(window) { - [new BehaviorPage(this), new AppearancePage(this), new ShortcutsPage(this)].forEach((pageObject) => { - pageObject.window = window; - pageObject.init(); - window.add(pageObject.page); - }); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/private_metadata.json deleted file mode 100644 index d605a8c9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/private_metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Replaces the top-panel workspace indicator with an i3-like workspaces bar.\n\nOriginally a fork of the extension Workspaces Bar by fthx, this extension grew into a more comprehensive set of features to support a workspace-based workflow.\n\nFeatures:\n- First class support for static and dynamic workspaces as well as multi-monitor setups\n- Add, remove, and rename workspaces\n- Rearrange workspaces via drag and drop\n- Automatically assign workspace names based on started applications\n- Keyboard shortcuts extend and refine system shortcuts\n- Scroll through workspaces by mouse wheel over the panel\n- Customize the appearance", - "name": "Space Bar", - "settings-schema": "org.gnome.shell.extensions.space-bar", - "shell-version": [ - "46", - "47" - ], - "url": "https://github.com/christopher-l/space-bar", - "uuid": "space-bar@luchrioh", - "version": 31 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/gschemas.compiled deleted file mode 100644 index 8a3b53164523442965f7fdc8f7e3535d23932ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7694 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 diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/org.gnome.shell.extensions.space-bar.gschema.xml b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/org.gnome.shell.extensions.space-bar.gschema.xml deleted file mode 100644 index b5ec47cd..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/schemas/org.gnome.shell.extensions.space-bar.gschema.xml +++ /dev/null @@ -1,359 +0,0 @@ - - - - - 0 - - - - - - - - - - - - - - "workspaces-bar" - Indicator style - - - false - - - false - - - '{{name}}' - - - 'Workspace {{number}}' - - - - - - - - "left" - Position in top panel - - - false - - - - 1 - Position index - Order relative to other elements - - - false - - - true - - - true - - - - - - - - "panel" - Switch workspaces with scroll wheel - - - true - - - 200 - - - - - - - - "normal" - - - - - - - - "disabled" - - - false - - - false - - - true - - - - - - - 12 - - - 4 - - - - 'rgba(255,255,255,0.3)' - - - 'rgba(255,255,255,1)' - - - 'rgba(0,0,0,0)' - - - -1 - - - 11 - - - false - - - - - - - - - - - - - - "700" - Font weight used for the active workspace - - - 4 - - - 0 - - - 8 - - - 3 - - - - 'rgba(0,0,0,0)' - - - 'rgba(255,255,255,1)' - - - 'rgba(0,0,0,0)' - - - false - - - -1 - - - false - - - - - - - - - - - - - - "700" - Font weight used for inactive workspaces - - - false - - - 4 - - - 0 - - - false - - - false - - - 8 - - - false - - - 3 - - - false - - - - 'rgba(0,0,0,0)' - - - 'rgba(255,255,255,0.5)' - - - 'rgba(0,0,0,0)' - - - -1 - - - false - - - - - - - - - - - - - - "700" - Font weight used for empty workspaces - - - false - - - 4 - - - 0 - - - false - - - false - - - 8 - - - false - - - 3 - - - false - - - '' - - - false - - - false - - - '' - - - - - - true - - - false - - - - Left']]]> - - - Right']]]> - - - grave']]]> - - Keybinding to activate the previous workspace. - - - n']]]> - Switch to empty workspace. - - - W']]]> - Keybinding to open the workspaces bar menu. - - - - 1']]]> - Keybinding to activate workspace 1. - - - 2']]]> - Keybinding to activate workspace 2. - - - 3']]]> - Keybinding to activate workspace 3. - - - 4']]]> - Keybinding to activate workspace 4. - - - 5']]]> - Keybinding to activate workspace 5. - - - 6']]]> - Keybinding to activate workspace 6. - - - 7']]]> - Keybinding to activate workspace 7. - - - 8']]]> - Keybinding to activate workspace 8. - - - 9']]]> - Keybinding to activate workspace 9. - - - 0']]]> - Keybinding to activate workspace 10. - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/KeyBindings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/KeyBindings.js deleted file mode 100644 index 248b4524..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/KeyBindings.js +++ /dev/null @@ -1,84 +0,0 @@ -import Gio from 'gi://Gio'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { Settings } from './Settings.js'; -import { Workspaces } from './Workspaces.js'; -export class KeyBindings { - constructor() { - this._settings = Settings.getInstance(); - this._ws = Workspaces.getInstance(); - this._desktopKeybindings = new Gio.Settings({ - schema: 'org.gnome.desktop.wm.keybindings', - }); - this._addedKeyBindings = []; - } - static init() { - KeyBindings._instance = new KeyBindings(); - KeyBindings._instance.init(); - } - static destroy() { - KeyBindings._instance?.destroy(); - KeyBindings._instance = null; - } - static getInstance() { - return KeyBindings._instance; - } - init() { - this._registerActivateByNumber(); - this._registerMoveToByNumber(); - this._addExtensionKeyBindings(); - KeyBindings._instance = this; - } - destroy() { - for (const name of this._addedKeyBindings) { - Main.wm.removeKeybinding(name); - } - this._addedKeyBindings = []; - } - addKeyBinding(name, handler) { - Shell.ActionMode; - Main.wm.addKeybinding(name, this._settings.shortcutsSettings, Meta.KeyBindingFlags.NONE, Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, handler); - this._addedKeyBindings.push(name); - } - removeKeybinding(name) { - if (this._addedKeyBindings.includes(name)) { - Main.wm.removeKeybinding(name); - this._addedKeyBindings.splice(this._addedKeyBindings.indexOf(name), 1); - } - } - _addExtensionKeyBindings() { - this.addKeyBinding('move-workspace-left', () => this._ws.moveCurrentWorkspace(-1)); - this.addKeyBinding('move-workspace-right', () => this._ws.moveCurrentWorkspace(1)); - this.addKeyBinding('activate-previous-key', () => this._ws.activatePrevious()); - this.addKeyBinding('activate-empty-key', () => this._ws.activateEmptyOrAdd()); - } - _registerActivateByNumber() { - this._settings.enableActivateWorkspaceShortcuts.subscribe((value) => { - for (let i = 0; i < 10; i++) { - const name = `activate-${i + 1}-key`; - if (value) { - this.addKeyBinding(name, () => { - this._ws.activate(i, { focusWindowIfCurrentWorkspace: true }); - }); - } - else { - this.removeKeybinding(name); - } - } - }, { emitCurrentValue: true }); - } - _registerMoveToByNumber() { - this._settings.enableMoveToWorkspaceShortcuts.subscribe((value) => { - for (let i = 0; i < 10; i++) { - const name = `move-to-workspace-${i + 1}`; - if (value) { - this._desktopKeybindings.set_strv(name, [`${(i + 1) % 10}`]); - } - else { - this._desktopKeybindings.reset(name); - } - } - }); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/ScrollHandler.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/ScrollHandler.js deleted file mode 100644 index db37449e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/ScrollHandler.js +++ /dev/null @@ -1,102 +0,0 @@ -import Clutter from 'gi://Clutter'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { Settings } from './Settings.js'; -import { Workspaces } from './Workspaces.js'; -export class ScrollHandler { - constructor() { - this._ws = Workspaces.getInstance(); - this._settings = Settings.getInstance(); - this._lastScrollTime = 0; - this._panelButton = null; - } - init(panelButtonSubject) { - panelButtonSubject.subscribe((panelButton) => (this._panelButton = panelButton)); - const panelButtonCallback = (panelButton) => this._registerScroll(panelButton); - this._settings.scrollWheel.subscribe((value) => { - panelButtonSubject.unsubscribe(panelButtonCallback); - this._disconnectBinding?.(); - switch (value) { - case 'panel': - this._registerScroll(Main.panel); - break; - case 'workspaces-bar': - panelButtonSubject.subscribe(panelButtonCallback); - break; - case 'disabled': - this._disconnectBinding = undefined; - break; - } - }, { emitCurrentValue: true }); - } - destroy() { - this._disconnectBinding?.(); - this._disconnectBinding = undefined; - } - _registerScroll(widget) { - const scrollBinding = widget.connect('scroll-event', (actor, event) => this._handle_scroll(actor, event)); - this._disconnectBinding = () => widget.disconnect(scrollBinding); - } - /** - * Checks whether the debounce time since the last scroll event is exceeded, so a scroll event - * can be accepted. - * - * Calling this function resets the debounce timer if the return value is `true`. - * - * @returns `true` if the scroll event should be accepted - */ - _debounceTimeExceeded() { - if (!this._settings.scrollWheelDebounce.value) { - return true; - } - const debounceTime = this._settings.scrollWheelDebounceTime.value; - const now = Date.now(); - if (now >= this._lastScrollTime + debounceTime) { - this._lastScrollTime = now; - return true; - } - else { - return false; - } - } - _handle_scroll(actor, event) { - // Adapted from https://github.com/timbertson/gnome-shell-scroll-workspaces - let direction; - let directionSetting = null; - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - direction = -1; - directionSetting = this._settings.scrollWheelVertical.value; - break; - case Clutter.ScrollDirection.DOWN: - direction = 1; - directionSetting = this._settings.scrollWheelVertical.value; - break; - case Clutter.ScrollDirection.LEFT: - direction = -1; - directionSetting = this._settings.scrollWheelHorizontal.value; - break; - case Clutter.ScrollDirection.RIGHT: - direction = 1; - directionSetting = this._settings.scrollWheelHorizontal.value; - break; - } - let newIndex; - if (directionSetting && directionSetting !== 'disabled') { - const invertFactor = directionSetting === 'inverted' ? -1 : 1; - newIndex = this._ws.findVisibleWorkspace((direction * invertFactor), { - wraparound: this._settings.scrollWheelWrapAround.value, - }); - } - else { - return Clutter.EVENT_PROPAGATE; - } - if (newIndex !== null && this._debounceTimeExceeded()) { - const workspace = global.workspace_manager.get_workspace_by_index(newIndex); - if (workspace) { - workspace.activate(global.get_current_time()); - this._ws.focusMostRecentWindowOnWorkspace(workspace); - } - } - return Clutter.EVENT_STOP; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Settings.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Settings.js deleted file mode 100644 index 4fb91abb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Settings.js +++ /dev/null @@ -1,199 +0,0 @@ -import Gio from 'gi://Gio'; -export class Settings { - static init(extension) { - Settings._instance = new Settings(extension); - Settings._instance.init(); - } - static destroy() { - Settings._instance?.destroy(); - Settings._instance = null; - } - static getInstance() { - return Settings._instance; - } - constructor(_extension) { - this._extension = _extension; - this.state = this._extension.getSettings(`${this._extension.metadata['settings-schema']}.state`); - this.behaviorSettings = this._extension.getSettings(`${this._extension.metadata['settings-schema']}.behavior`); - this.appearanceSettings = this._extension.getSettings(`${this._extension.metadata['settings-schema']}.appearance`); - this.shortcutsSettings = this._extension.getSettings(`${this._extension.metadata['settings-schema']}.shortcuts`); - this.mutterSettings = new Gio.Settings({ schema: 'org.gnome.mutter' }); - this.wmPreferencesSettings = new Gio.Settings({ - schema: 'org.gnome.desktop.wm.preferences', - }); - this._version = SettingsSubject.createIntSubject(this.state, 'version'); - this.workspaceNamesMap = SettingsSubject.createJsonObjectSubject(this.state, 'workspace-names-map'); - this.dynamicWorkspaces = SettingsSubject.createBooleanSubject(this.mutterSettings, 'dynamic-workspaces'); - this.indicatorStyle = SettingsSubject.createStringSubject(this.behaviorSettings, 'indicator-style'); - this.enableCustomLabel = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'enable-custom-label'); - this.enableCustomLabelInMenus = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'enable-custom-label-in-menu'); - this.customLabelNamed = SettingsSubject.createStringSubject(this.behaviorSettings, 'custom-label-named'); - this.customLabelUnnamed = SettingsSubject.createStringSubject(this.behaviorSettings, 'custom-label-unnamed'); - this.position = SettingsSubject.createStringSubject(this.behaviorSettings, 'position'); - this.systemWorkspaceIndicator = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'system-workspace-indicator'); - this.positionIndex = SettingsSubject.createIntSubject(this.behaviorSettings, 'position-index'); - this.scrollWheel = SettingsSubject.createStringSubject(this.behaviorSettings, 'scroll-wheel'); - this.scrollWheelDebounce = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'scroll-wheel-debounce'); - this.scrollWheelDebounceTime = SettingsSubject.createIntSubject(this.behaviorSettings, 'scroll-wheel-debounce-time'); - this.scrollWheelVertical = SettingsSubject.createStringSubject(this.behaviorSettings, 'scroll-wheel-vertical'); - this.scrollWheelHorizontal = SettingsSubject.createStringSubject(this.behaviorSettings, 'scroll-wheel-horizontal'); - this.scrollWheelWrapAround = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'scroll-wheel-wrap-around'); - this.alwaysShowNumbers = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'always-show-numbers'); - this.showEmptyWorkspaces = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'show-empty-workspaces'); - this.toggleOverview = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'toggle-overview'); - this.smartWorkspaceNames = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'smart-workspace-names'); - this.reevaluateSmartWorkspaceNames = SettingsSubject.createBooleanSubject(this.behaviorSettings, 'reevaluate-smart-workspace-names'); - this.enableActivateWorkspaceShortcuts = SettingsSubject.createBooleanSubject(this.shortcutsSettings, 'enable-activate-workspace-shortcuts'); - this.enableMoveToWorkspaceShortcuts = SettingsSubject.createBooleanSubject(this.shortcutsSettings, 'enable-move-to-workspace-shortcuts'); - this.workspaceNames = SettingsSubject.createStringArraySubject(this.wmPreferencesSettings, 'workspace-names'); - this.workspacesBarPadding = SettingsSubject.createIntSubject(this.appearanceSettings, 'workspaces-bar-padding'); - this.workspaceMargin = SettingsSubject.createIntSubject(this.appearanceSettings, 'workspace-margin'); - this.activeWorkspaceBackgroundColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'active-workspace-background-color'); - this.activeWorkspaceTextColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'active-workspace-text-color'); - this.activeWorkspaceBorderColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'active-workspace-border-color'); - this.activeWorkspaceFontSize = SettingsSubject.createIntSubject(this.appearanceSettings, 'active-workspace-font-size'); - this.activeWorkspaceFontWeight = SettingsSubject.createStringSubject(this.appearanceSettings, 'active-workspace-font-weight'); - this.activeWorkspaceBorderRadius = SettingsSubject.createIntSubject(this.appearanceSettings, 'active-workspace-border-radius'); - this.activeWorkspaceBorderWidth = SettingsSubject.createIntSubject(this.appearanceSettings, 'active-workspace-border-width'); - this.activeWorkspacePaddingH = SettingsSubject.createIntSubject(this.appearanceSettings, 'active-workspace-padding-h'); - this.activeWorkspacePaddingV = SettingsSubject.createIntSubject(this.appearanceSettings, 'active-workspace-padding-v'); - this.inactiveWorkspaceBackgroundColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'inactive-workspace-background-color'); - this.inactiveWorkspaceTextColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'inactive-workspace-text-color'); - this.inactiveWorkspaceBorderColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'inactive-workspace-border-color'); - this.inactiveWorkspaceFontSize = SettingsSubject.createIntSubject(this.appearanceSettings, 'inactive-workspace-font-size'); - this.inactiveWorkspaceFontWeight = SettingsSubject.createStringSubject(this.appearanceSettings, 'inactive-workspace-font-weight'); - this.inactiveWorkspaceBorderRadius = SettingsSubject.createIntSubject(this.appearanceSettings, 'inactive-workspace-border-radius'); - this.inactiveWorkspaceBorderWidth = SettingsSubject.createIntSubject(this.appearanceSettings, 'inactive-workspace-border-width'); - this.inactiveWorkspacePaddingH = SettingsSubject.createIntSubject(this.appearanceSettings, 'inactive-workspace-padding-h'); - this.inactiveWorkspacePaddingV = SettingsSubject.createIntSubject(this.appearanceSettings, 'inactive-workspace-padding-v'); - this.emptyWorkspaceBackgroundColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'empty-workspace-background-color'); - this.emptyWorkspaceTextColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'empty-workspace-text-color'); - this.emptyWorkspaceBorderColor = SettingsSubject.createStringSubject(this.appearanceSettings, 'empty-workspace-border-color'); - this.emptyWorkspaceFontSize = SettingsSubject.createIntSubject(this.appearanceSettings, 'empty-workspace-font-size'); - this.emptyWorkspaceFontWeight = SettingsSubject.createStringSubject(this.appearanceSettings, 'empty-workspace-font-weight'); - this.emptyWorkspaceBorderRadius = SettingsSubject.createIntSubject(this.appearanceSettings, 'empty-workspace-border-radius'); - this.emptyWorkspaceBorderWidth = SettingsSubject.createIntSubject(this.appearanceSettings, 'empty-workspace-border-width'); - this.emptyWorkspacePaddingH = SettingsSubject.createIntSubject(this.appearanceSettings, 'empty-workspace-padding-h'); - this.emptyWorkspacePaddingV = SettingsSubject.createIntSubject(this.appearanceSettings, 'empty-workspace-padding-v'); - this.applicationStyles = SettingsSubject.createStringSubject(this.appearanceSettings, 'application-styles'); - this.customStylesEnabled = SettingsSubject.createBooleanSubject(this.appearanceSettings, 'custom-styles-enabled'); - this.customStylesFailed = SettingsSubject.createBooleanSubject(this.appearanceSettings, 'custom-styles-failed'); - this.customStyles = SettingsSubject.createStringSubject(this.appearanceSettings, 'custom-styles'); - } - init() { - SettingsSubject.initAll(); - this.runMigrations(); - } - destroy() { - SettingsSubject.destroyAll(); - } - /** - * Migrates preferences from previous space-bar versions. - */ - runMigrations() { - if (this._version.value < 26) { - if (this.indicatorStyle.value === 'current-workspace-name') { - this.indicatorStyle.value = 'current-workspace'; - } - } - this._version.value = this._extension.metadata['version']; - } -} -class SettingsSubject { - static createBooleanSubject(settings, name) { - return new SettingsSubject(settings, name, 'boolean'); - } - static createIntSubject(settings, name) { - return new SettingsSubject(settings, name, 'int'); - } - static createStringSubject(settings, name) { - return new SettingsSubject(settings, name, 'string'); - } - static createStringArraySubject(settings, name) { - return new SettingsSubject(settings, name, 'string-array'); - } - static createJsonObjectSubject(settings, name) { - return new SettingsSubject(settings, name, 'json-object'); - } - static initAll() { - for (const subject of SettingsSubject._subjects) { - subject._init(); - } - } - static destroyAll() { - for (const subject of SettingsSubject._subjects) { - subject._destroy(); - } - SettingsSubject._subjects = []; - } - get value() { - return this._value; - } - set value(value) { - this._setValue(value); - } - constructor(_settings, _name, _type) { - this._settings = _settings; - this._name = _name; - this._type = _type; - this._subscribers = []; - SettingsSubject._subjects.push(this); - } - subscribe(subscriber, { emitCurrentValue = false } = {}) { - this._subscribers.push(subscriber); - if (emitCurrentValue) { - subscriber(this._value); - } - } - _init() { - this._getValue = () => { - switch (this._type) { - case 'boolean': - return this._settings.get_boolean(this._name); - case 'int': - return this._settings.get_int(this._name); - case 'string': - return this._settings.get_string(this._name); - case 'string-array': - return this._settings.get_strv(this._name); - case 'json-object': - return JSON.parse(this._settings.get_string(this._name)); - default: - throw new Error('unknown type ' + this._type); - } - }; - this._setValue = (value) => { - switch (this._type) { - case 'boolean': - return this._settings.set_boolean(this._name, value); - case 'int': - return this._settings.set_int(this._name, value); - case 'string': - return this._settings.set_string(this._name, value); - case 'string-array': - return this._settings.set_strv(this._name, value); - case 'json-object': - return this._settings.set_string(this._name, JSON.stringify(value)); - default: - throw new Error('unknown type ' + this._type); - } - }; - this._value = this._getValue(); - const changed = this._settings.connect(`changed::${this._name}`, () => this._updateValue(this._getValue())); - this._disconnect = () => this._settings.disconnect(changed); - } - _destroy() { - this._disconnect(); - this._subscribers = []; - } - _updateValue(value) { - this._value = value; - this._notifySubscriber(); - } - _notifySubscriber() { - for (const subscriber of this._subscribers) { - subscriber(this._value); - } - } -} -SettingsSubject._subjects = []; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Styles.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Styles.js deleted file mode 100644 index f23b03d0..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Styles.js +++ /dev/null @@ -1,227 +0,0 @@ -import Gio from 'gi://Gio'; -import { DebouncingNotifier } from '../utils/DebouncingNotifier.js'; -import { Settings } from './Settings.js'; -import St from 'gi://St'; -/** - * Tracks and provides the styles for the workspaces bar. - */ -export class Styles { - constructor() { - this._settings = Settings.getInstance(); - /** Notifier for changed styles of the workspaces bar. */ - this._workspacesBarUpdateNotifier = new DebouncingNotifier(); - /** Notifier for changed styles of workspaces labels. */ - this._workspaceUpdateNotifier = new DebouncingNotifier(); - } - static init() { - Styles._instance = new Styles(); - Styles._instance.init(); - } - static destroy() { - Styles._instance.destroy(); - Styles._instance = null; - } - static getInstance() { - return Styles._instance; - } - init() { - this._registerSettingChanges(); - this._updateStyleSheet(); - } - destroy() { - this._workspaceUpdateNotifier.destroy(); - this._unloadStyleSheet(); - } - _updateStyleSheet() { - this._unloadStyleSheet(); - const themeContext = St.ThemeContext.get_for_stage(global.stage); - let styles = this._generateStyleSheetContent(); - this._settings.applicationStyles.value = styles; - if (this._settings.customStylesEnabled.value) { - this._settings.customStylesFailed.value = false; - styles = styles + '\n' + this._settings.customStyles.value; - } - const [file, stream] = Gio.File.new_tmp(null); - const outputStream = Gio.DataOutputStream.new(stream.outputStream); - outputStream.put_string(styles, null); - try { - themeContext.get_theme().load_stylesheet(file); - } - catch (e) { - console.error('Failed to load stylesheet'); - if (this._settings.customStylesEnabled.value) { - this._settings.customStylesEnabled.value = false; - this._settings.customStylesFailed.value = true; - } - } - outputStream.close(null); - stream.close(null); - this._dynamicStyleSheet = file; - } - _unloadStyleSheet() { - if (this._dynamicStyleSheet) { - const themeContext = St.ThemeContext.get_for_stage(global.stage); - themeContext.get_theme().unload_stylesheet(this._dynamicStyleSheet); - this._dynamicStyleSheet.delete(null); - this._dynamicStyleSheet = undefined; - } - } - _generateStyleSheetContent() { - let content = `.space-bar {\n${this._getWorkspacesBarStyle()}}\n\n`; - content += `.space-bar-workspace-label.active {\n${this._getActiveWorkspaceStyle()}}\n\n`; - content += `.space-bar-workspace-label.inactive {\n${this._getInactiveWorkspaceStyle()}}\n\n`; - content += `.space-bar-workspace-label.inactive.empty {\n${this._getEmptyWorkspaceStyle()}}`; - return content; - } - /** Calls `callback` when the style of the workspaces bar changed. */ - onWorkspacesBarChanged(callback) { - this._workspacesBarUpdateNotifier.subscribe(callback); - } - /** Calls `callback` when the style of a workspaces label changed. */ - onWorkspaceLabelsChanged(callback) { - this._workspaceUpdateNotifier.subscribe(callback); - } - /** Subscribes to settings and updates changed styles. */ - _registerSettingChanges() { - [this._settings.workspacesBarPadding].forEach((setting) => setting.subscribe(() => { - this._updateStyleSheet(); - this._workspacesBarUpdateNotifier.notify(); - })); - [ - this._settings.workspaceMargin, - this._settings.activeWorkspaceBackgroundColor, - this._settings.activeWorkspaceTextColor, - this._settings.activeWorkspaceBorderColor, - this._settings.activeWorkspaceFontSize, - this._settings.activeWorkspaceFontWeight, - this._settings.activeWorkspaceBorderRadius, - this._settings.activeWorkspaceBorderWidth, - this._settings.activeWorkspacePaddingH, - this._settings.activeWorkspacePaddingV, - ].forEach((setting) => setting.subscribe(() => { - this._updateStyleSheet(); - this._workspaceUpdateNotifier.notify(); - })); - [ - this._settings.workspaceMargin, - this._settings.inactiveWorkspaceBackgroundColor, - this._settings.inactiveWorkspaceTextColor, - this._settings.inactiveWorkspaceBorderColor, - this._settings.inactiveWorkspaceFontSize, - this._settings.inactiveWorkspaceFontWeight, - this._settings.inactiveWorkspaceBorderRadius, - this._settings.inactiveWorkspaceBorderWidth, - this._settings.inactiveWorkspacePaddingH, - this._settings.inactiveWorkspacePaddingV, - ].forEach((setting) => setting.subscribe(() => { - this._updateStyleSheet(); - this._workspaceUpdateNotifier.notify(); - })); - [ - this._settings.workspaceMargin, - this._settings.emptyWorkspaceBackgroundColor, - this._settings.emptyWorkspaceTextColor, - this._settings.emptyWorkspaceBorderColor, - this._settings.emptyWorkspaceFontSize, - this._settings.emptyWorkspaceFontWeight, - this._settings.emptyWorkspaceBorderRadius, - this._settings.emptyWorkspaceBorderWidth, - this._settings.emptyWorkspacePaddingH, - this._settings.emptyWorkspacePaddingV, - ].forEach((setting) => setting.subscribe(() => { - this._updateStyleSheet(); - this._workspaceUpdateNotifier.notify(); - })); - this._settings.customStylesEnabled.subscribe(() => { - this._updateStyleSheet(); - this._workspacesBarUpdateNotifier.notify(); - }); - this._settings.customStyles.subscribe(() => { - if (this._settings.customStylesEnabled.value) { - this._updateStyleSheet(); - this._workspacesBarUpdateNotifier.notify(); - } - }); - } - /** Updated style the workspaces-bar panel button. */ - _getWorkspacesBarStyle() { - const padding = this._settings.workspacesBarPadding.value; - let workspacesBarStyle = ` -natural-hpadding: ${padding}px;\n`; - return workspacesBarStyle; - } - /** Updated style for active workspaces labels. */ - _getActiveWorkspaceStyle() { - const margin = this._settings.workspaceMargin.value; - const backgroundColor = this._settings.activeWorkspaceBackgroundColor.value; - const textColor = this._settings.activeWorkspaceTextColor.value; - const borderColor = this._settings.activeWorkspaceBorderColor.value; - const fontSize = this._settings.activeWorkspaceFontSize.value; - const fontWeight = this._settings.activeWorkspaceFontWeight.value; - const borderRadius = this._settings.activeWorkspaceBorderRadius.value; - const borderWidth = this._settings.activeWorkspaceBorderWidth.value; - const paddingH = this._settings.activeWorkspacePaddingH.value; - const paddingV = this._settings.activeWorkspacePaddingV.value; - let activeWorkspaceStyle = ` margin: 0 ${margin}px;\n` + - ` background-color: ${backgroundColor};\n` + - ` color: ${textColor};\n` + - ` border-color: ${borderColor};\n` + - ` font-weight: ${fontWeight};\n` + - ` border-radius: ${borderRadius}px;\n` + - ` border-width: ${borderWidth}px;\n` + - ` padding: ${paddingV}px ${paddingH}px;\n`; - if (fontSize >= 0) { - activeWorkspaceStyle += ` font-size: ${fontSize}pt;\n`; - } - return activeWorkspaceStyle; - } - /** Updated style for inactive workspaces labels. */ - _getInactiveWorkspaceStyle() { - const margin = this._settings.workspaceMargin.value; - const backgroundColor = this._settings.inactiveWorkspaceBackgroundColor.value; - const textColor = this._settings.inactiveWorkspaceTextColor.value; - const borderColor = this._settings.inactiveWorkspaceBorderColor.value; - const fontSize = this._settings.inactiveWorkspaceFontSize.value; - const fontWeight = this._settings.inactiveWorkspaceFontWeight.value; - const borderRadius = this._settings.inactiveWorkspaceBorderRadius.value; - const borderWidth = this._settings.inactiveWorkspaceBorderWidth.value; - const paddingH = this._settings.inactiveWorkspacePaddingH.value; - const paddingV = this._settings.inactiveWorkspacePaddingV.value; - let inactiveWorkspaceStyle = ` margin: 0 ${margin}px;\n` + - ` background-color: ${backgroundColor};\n` + - ` color: ${textColor};\n` + - ` border-color: ${borderColor};\n` + - ` font-weight: ${fontWeight};\n` + - ` border-radius: ${borderRadius}px;\n` + - ` border-width: ${borderWidth}px;\n` + - ` padding: ${paddingV}px ${paddingH}px;\n`; - if (fontSize >= 0) { - inactiveWorkspaceStyle += ` font-size: ${fontSize}pt;\n`; - } - return inactiveWorkspaceStyle; - } - /** Updated style for empty and inactive workspaces labels. */ - _getEmptyWorkspaceStyle() { - const margin = this._settings.workspaceMargin.value; - const backgroundColor = this._settings.emptyWorkspaceBackgroundColor.value; - const textColor = this._settings.emptyWorkspaceTextColor.value; - const borderColor = this._settings.emptyWorkspaceBorderColor.value; - const fontSize = this._settings.emptyWorkspaceFontSize.value; - const fontWeight = this._settings.emptyWorkspaceFontWeight.value; - const borderRadius = this._settings.emptyWorkspaceBorderRadius.value; - const borderWidth = this._settings.emptyWorkspaceBorderWidth.value; - const paddingH = this._settings.emptyWorkspacePaddingH.value; - const paddingV = this._settings.emptyWorkspacePaddingV.value; - let emptyWorkspaceStyle = ` margin: 0 ${margin}px;\n` + - ` background-color: ${backgroundColor};\n` + - ` color: ${textColor};\n` + - ` border-color: ${borderColor};\n` + - ` font-weight: ${fontWeight};\n` + - ` border-radius: ${borderRadius}px;\n` + - ` border-width: ${borderWidth}px;\n` + - ` padding: ${paddingV}px ${paddingH}px;\n`; - if (fontSize >= 0) { - emptyWorkspaceStyle += ` font-size: ${fontSize}pt;\n`; - } - return emptyWorkspaceStyle; - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/TopBarAdjustments.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/TopBarAdjustments.js deleted file mode 100644 index 162dd97c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/TopBarAdjustments.js +++ /dev/null @@ -1,43 +0,0 @@ -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { Settings } from './Settings.js'; -export class TopBarAdjustments { - constructor() { - this._settings = Settings.getInstance(); - this._didHideActivitiesButton = false; - } - static init() { - TopBarAdjustments._instance = new TopBarAdjustments(); - TopBarAdjustments._instance.init(); - } - static destroy() { - TopBarAdjustments._instance.destroy(); - TopBarAdjustments._instance = null; - } - init() { - this._settings.systemWorkspaceIndicator.subscribe((systemWorkspaceIndicator) => { - if (systemWorkspaceIndicator) { - this._restoreSystemWorkspaceIndicator(); - } - else { - this._hideSystemWorkspaceIndicator(); - } - }, { emitCurrentValue: true }); - } - destroy() { - this._restoreSystemWorkspaceIndicator(); - } - _hideSystemWorkspaceIndicator() { - const activitiesButton = Main.panel.statusArea['activities']; - if (activitiesButton && !Main.sessionMode.isLocked && activitiesButton.is_visible()) { - activitiesButton.hide(); - this._didHideActivitiesButton = true; - } - } - _restoreSystemWorkspaceIndicator() { - const activitiesButton = Main.panel.statusArea['activities']; - if (activitiesButton && this._didHideActivitiesButton) { - activitiesButton.show(); - this._didHideActivitiesButton = false; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/WorkspaceNames.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/WorkspaceNames.js deleted file mode 100644 index e06e65ce..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/WorkspaceNames.js +++ /dev/null @@ -1,135 +0,0 @@ -import { Settings } from './Settings.js'; -export class WorkspaceNames { - static init(workspaces) { - this._instance = new WorkspaceNames(workspaces); - return this._instance; - } - static getInstance() { - return this._instance; - } - constructor(_ws) { - this._ws = _ws; - this._settings = Settings.getInstance(); - } - insert(index) { - const workspaceNames = this._getNames(); - if (index < workspaceNames.length) { - workspaceNames.splice(index, 0, ''); - } - else { - setArrayValue(workspaceNames, index, ''); - } - this._setNames(workspaceNames); - } - /** - * Reorders workspace names according to the given map. - * - * Has the possibility to insert and to remove workspaces. - * - * @param reorderMap array where keys are new indexes and values are old indexes of workspaces - */ - reorder(reorderMap) { - const oldWorkspaceNames = this._getNames(); - const newWorkspaceNames = []; - for (const [newIndex, oldIndex] of reorderMap.entries()) { - if (oldIndex >= 0) { - newWorkspaceNames[newIndex] = oldWorkspaceNames[oldIndex] ?? ''; - } - else { - newWorkspaceNames[newIndex] = ''; - } - } - this._setNames(newWorkspaceNames); - } - remove(index) { - const workspaceNames = this._getNames(); - workspaceNames.splice(index, 1); - this._setNames(workspaceNames); - } - rename(index, newName) { - let workspaceNames = this._getNames(); - setArrayValue(workspaceNames, index, newName); - this._setNames(workspaceNames); - if (this._settings.smartWorkspaceNames.value && newName) { - this._saveSmartWorkspaceName(index, newName); - } - } - restoreSmartWorkspaceName(index) { - const windowNames = this._getWindowNames(index); - const workspacesNamesMap = this._settings.workspaceNamesMap.value; - // Loop through windows on the workspace. - for (const windowName of windowNames) { - // Find the first associated name that is not already in use. - if (workspacesNamesMap[windowName]?.length > 0) { - const newName = workspacesNamesMap[windowName].find((name) => !this._getEnabledWorkspaceNames().includes(name)); - if (newName) { - let workspaceNames = this._getNames(); - while (workspaceNames.length < index) { - workspaceNames.push(''); - } - workspaceNames[index] = newName; - this._setNames(workspaceNames); - return; - } - } - } - } - workspaceNameIsSupportedByWindows(workspace) { - const windowNames = this._getWindowNames(workspace.index); - const workspacesNamesMap = this._settings.workspaceNamesMap.value; - for (const windowName of windowNames) { - if (workspacesNamesMap[windowName]?.some((name) => name === workspace.name)) { - return true; - } - } - return false; - } - /** - * Associates windows on a workspace with a new workspace name. - */ - _saveSmartWorkspaceName(index, newName) { - const windowNames = this._getWindowNames(index); - const workspacesNamesMap = this._settings.workspaceNamesMap.value; - for (const windowName of windowNames) { - workspacesNamesMap[windowName] = [ - ...(workspacesNamesMap[windowName] ?? []).filter((name) => - // We add `newName` at the end - name !== newName && - // Keep associations with other currently enabled workspaces and drop others - this._getEnabledWorkspaceNames().includes(name)), - newName, - ]; - } - this._settings.workspaceNamesMap.value = workspacesNamesMap; - } - _getWindowNames(workspaceIndex) { - const workspace = global.workspace_manager.get_workspace_by_index(workspaceIndex); - let windows = workspace.list_windows(); - windows = windows.filter((window) => !window.is_on_all_workspaces()); - return windows - .map((window) => window.get_wm_class()) - .filter((wmClass) => wmClass !== null); - } - _getNames() { - return [...this._settings.workspaceNames.value]; - } - _setNames(names) { - while (names[names.length - 1] === '') { - names.pop(); - } - this._settings.workspaceNames.value = names; - } - _getEnabledWorkspaceNames() { - return this._getNames().filter((_, index) => index < this._ws.numberOfEnabledWorkspaces); - } -} -/** - * Sets the array's value at the given index, padding any missing elements so all elements have - * valid values. - */ -function setArrayValue(array, index, value) { - while (array.length < index) { - array.push(''); - } - array[index] = value; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Workspaces.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Workspaces.js deleted file mode 100644 index 46dcf2b8..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/services/Workspaces.js +++ /dev/null @@ -1,470 +0,0 @@ -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import { WindowManager } from 'resource:///org/gnome/shell/ui/windowManager.js'; -import { DebouncingNotifier } from '../utils/DebouncingNotifier.js'; -import { hook } from '../utils/hook.js'; -import { Settings } from './Settings.js'; -import { WorkspaceNames } from './WorkspaceNames.js'; -// Adapted from https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/45.0/js/ui/altTab.js?ref_type=tags#L53 -function getWindows(workspace) { - const windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, workspace); - return windows - .map((w) => (w.is_attached_dialog() ? w.get_transient_for() : w)) - .filter((w, i, a) => !w.skipTaskbar && a.indexOf(w) === i); -} -export class Workspaces { - constructor() { - this.numberOfEnabledWorkspaces = 0; - this.lastVisibleWorkspace = 0; - this.currentIndex = 0; - this.workspaces = []; - this._previousWorkspace = 0; - this._metaWorkspaces = []; - this._settings = Settings.getInstance(); - this._updateNotifier = new DebouncingNotifier(); - this._smartNamesNotifier = new DebouncingNotifier(); - /** - * Listeners for windows being added to a workspace. - * - * The listeners are connected to a workspace and there is one listener per workspace that needs - * tracking. - */ - this._windowChangedListeners = []; - } - static init() { - Workspaces._instance = new Workspaces(); - Workspaces._instance.init(); - } - static destroy() { - Workspaces._instance.destroy(); - Workspaces._instance = null; - } - static getInstance() { - return Workspaces._instance; - } - init() { - this._wsNames = WorkspaceNames.init(this); - this._ws_reordered = global.workspace_manager.connect('workspaces-reordered', () => { - this._update('workspaces-changed', 'workspace_manager workspaces-reordered'); - }); - this._ws_changed = global.workspace_manager.connect('notify::n-workspaces', () => { - this._update('workspaces-changed', 'workspace_manager n-workspaces'); - }); - this._ws_active_changed = global.workspace_manager.connect('active-workspace-changed', () => { - this._previousWorkspace = this.currentIndex; - this._update('active-workspace-changed', 'workspace_manager active-workspace-changed'); - // We need to update names in case we moved away from the last dynamic workspace. - this._smartNamesNotifier.notify(); - }); - // Additionally to tracking new windows on workspaces, we need to track windows that change - // their names after being opened. - this._windows_changed = Shell.WindowTracker.get_default().connect('tracked-windows-changed', () => { - this._update('windows-changed', 'WindowTracker tracked-windows-changed'); - this._smartNamesNotifier.notify(); - }); - this._settings.dynamicWorkspaces.subscribe(() => this._update('workspaces-changed', 'settings dynamicWorkspaces')); - this._settings.workspaceNames.subscribe(() => this._update('workspace-names-changed', 'settings workspaceNames')); - this._settings.showEmptyWorkspaces.subscribe(() => this._update('workspaces-changed', 'settings showEmptyWorkspaces')); - hook(WindowManager, 'insertWorkspace', 'before', (_, pos) => { - // GNOME shell calls `insertWorkspace` even when workspaces are - // static. It just returns in this case. - if (this._settings.dynamicWorkspaces.value) { - this._wsNames?.insert(pos); - } - }); - this._update('init', 'init'); - this._settings.smartWorkspaceNames.subscribe((value) => value && this._clearEmptyWorkspaceNames(), { emitCurrentValue: true }); - this._settings.smartWorkspaceNames.subscribe(() => this._updateWindowAddedListeners()); - this._settings.reevaluateSmartWorkspaceNames.subscribe(() => this._updateWindowAddedListeners()); - // Update smart workspaces after a small delay because workspaces can briefly get into - // inconsistent states while empty dynamic workspaces are being removed. - this._smartNamesNotifier.subscribe(() => this._updateSmartWorkspaceNames()); - } - destroy() { - this._wsNames = null; - if (this._ws_changed) { - global.workspace_manager.disconnect(this._ws_changed); - } - if (this._ws_reordered) { - global.workspace_manager.disconnect(this._ws_reordered); - } - if (this._ws_active_changed) { - global.workspace_manager.disconnect(this._ws_active_changed); - } - if (this._windows_changed) { - Shell.WindowTracker.get_default().disconnect(this._windows_changed); - } - this._updateNotifier.destroy(); - this._smartNamesNotifier.destroy(); - this._windowChangedListeners.forEach((entry) => entry.workspace.disconnect(entry.listener)); - } - onUpdate(callback, until) { - this._updateNotifier.subscribe(callback, until); - } - activate(index, { focusWindowIfCurrentWorkspace = false } = {}) { - const isCurrentWorkspace = global.workspace_manager.get_active_workspace_index() === index; - const workspace = global.workspace_manager.get_workspace_by_index(index); - if (isCurrentWorkspace) { - if (focusWindowIfCurrentWorkspace && - this.workspaces[index].hasWindows && - global.display.get_focus_window().is_on_all_workspaces()) { - this.focusMostRecentWindowOnWorkspace(workspace); - } - else { - if (this._settings.toggleOverview.value) { - Main.overview.toggle(); - } - } - } - else { - if (workspace) { - workspace.activate(global.get_current_time()); - this.focusMostRecentWindowOnWorkspace(workspace); - if (!Main.overview.visible && - !this.workspaces[index].hasWindows && - this._settings.toggleOverview.value) { - Main.overview.show(); - } - } - } - } - activatePrevious() { - this.activate(this._previousWorkspace); - } - addWorkspace() { - if (this._settings.dynamicWorkspaces.value) { - this.activate(this.numberOfEnabledWorkspaces - 1); - } - else { - this._addStaticWorkspace(); - } - } - activateEmptyOrAdd() { - const index = this.workspaces.findIndex((workspace) => workspace.isEnabled && !workspace.hasWindows); - if (index >= 0) { - this.activate(index); - } - else { - this._addStaticWorkspace(); - } - } - _addStaticWorkspace() { - global.workspace_manager.append_new_workspace(true, global.get_current_time()); - // We want to show the overview here when the corresponding setting is - // enabled, however, this doesn't play well together with activating the - // newly created workspace. - // - // if (!Main.overview.visible && this._settings.toggleOverview.value) { - // Main.overview.show(); - // } - } - removeWorkspace(index) { - const workspace = global.workspace_manager.get_workspace_by_index(index); - if (workspace) { - global.workspace_manager.remove_workspace(workspace, global.get_current_time()); - } - } - reorderWorkspace(oldIndex, newIndex) { - const workspace = global.workspace_manager.get_workspace_by_index(oldIndex); - if (workspace) { - global.workspace_manager.reorder_workspace(workspace, newIndex); - } - } - moveCurrentWorkspace(direction) { - const newIndex = this.currentIndex + direction; - if (newIndex >= 0 && newIndex < this.numberOfEnabledWorkspaces) { - this.reorderWorkspace(this.currentIndex, newIndex); - } - } - getDisplayName(workspace) { - if (this.isExtraDynamicWorkspace(workspace)) { - return '+'; - } - if (this._settings.enableCustomLabel.value) { - return this.getCustomDisplayName(workspace); - } - else { - return this.getDefaultDisplayName(workspace); - } - } - getDefaultDisplayName(workspace) { - if (workspace.name && !this._settings.alwaysShowNumbers.value) { - return workspace.name; - } - let numberString = `${workspace.index + 1}`; - if (workspace.name) { - return `${numberString}: ${workspace.name}`; - } - else { - return numberString; - } - } - getCustomDisplayName(workspace) { - let template; - if (workspace.name) { - template = this._settings.customLabelNamed.value; - } - else { - template = this._settings.customLabelUnnamed.value; - } - let total = this.numberOfEnabledWorkspaces; - if (this._settings.dynamicWorkspaces.value && - this.currentIndex !== this.numberOfEnabledWorkspaces - 1) { - total = this.numberOfEnabledWorkspaces - 1; - } - let displayName = template - .replaceAll('{{name}}', workspace.name ?? '') - .replaceAll('{{number}}', `${workspace.index + 1}`) - .replaceAll('{{total}}', `${total}`) - .replaceAll('{{Total}}', `${this.numberOfEnabledWorkspaces}`); - if (this._settings.alwaysShowNumbers.value && !template.includes('{{number}}')) { - return `${workspace.index + 1}: ${displayName}`; - } - else { - return displayName; - } - } - focusMostRecentWindowOnWorkspace(workspace) { - const mostRecentWindowOnWorkspace = getWindows(workspace).find((window) => !window.is_on_all_workspaces()); - if (mostRecentWindowOnWorkspace) { - workspace.activate_with_focus(mostRecentWindowOnWorkspace, global.get_current_time()); - } - } - /** - * Looks for a workspace that is visible in the workspaces bar relative to the current - * workspace. - * - * @param step indicates the direction in which to look - * @returns the index of the found workspace or `null` if there is no visible workspace in the - * given direction - */ - findVisibleWorkspace(step, { wraparound = false } = {}) { - let index = this.currentIndex; - const startingIndex = index; - while (true) { - index += step; - if (index < 0 || index >= this.numberOfEnabledWorkspaces) { - if (wraparound) { - // Prevent infinite loop when there is no other workspace to go to. - if (index === startingIndex) { - return null; - } - index = - (index + this.numberOfEnabledWorkspaces) % this.numberOfEnabledWorkspaces; - } - else { - break; - } - } - if (this.workspaces[index].isVisible) { - return index; - } - } - return null; - } - /** - * When using dynamic workspaces, whether `workspace` is the extra last workspace, that is - * currently neither used nor focused. - */ - isExtraDynamicWorkspace(workspace) { - return (this._settings.dynamicWorkspaces.value && - workspace.index > 0 && - workspace.index === this.numberOfEnabledWorkspaces - 1 && - !workspace.hasWindows && - this.currentIndex !== workspace.index); - } - /** - * Updates workspaces info managed by this class. - * - * @param reason The external cause that makes an update necessary - * @param source The unit that notified us of the change (used for debugging) - */ - _update(reason, source) { - // log('_update', reason, source); - this.numberOfEnabledWorkspaces = global.workspace_manager.get_n_workspaces(); - this.currentIndex = global.workspace_manager.get_active_workspace_index(); - if (this._settings.dynamicWorkspaces.value && - !this._settings.showEmptyWorkspaces.value && - this.currentIndex !== this.numberOfEnabledWorkspaces - 1) { - this.lastVisibleWorkspace = this.numberOfEnabledWorkspaces - 2; - } - else { - this.lastVisibleWorkspace = this.numberOfEnabledWorkspaces - 1; - } - const numberOfTrackedWorkspaces = Math.max(this.numberOfEnabledWorkspaces, this._settings.workspaceNames.value.length); - this.workspaces = [...Array(numberOfTrackedWorkspaces)].map((_, index) => this._getWorkspaceState(index)); - this._updateNotifier.notify(); - if (reason === 'workspaces-changed' || reason === 'init') { - this._handleWorkspacesReordered(); - } - if (reason === 'workspaces-changed' || - reason === 'workspace-names-changed' || - reason === 'init') { - this._updateWindowAddedListeners(); - } - } - /** - * Matches known workspaces with current workspaces to identify reordered workspaces and adapt - * names accordingly. - * - * Also updates known workspaces. - */ - _handleWorkspacesReordered() { - const newMetaWorkspaces = this._getMetaWorkspaces(); - const reorderMap = []; - let hasReordered = false; - for (const [index, metaWorkspace] of newMetaWorkspaces.entries()) { - const oldIndex = this._metaWorkspaces.indexOf(metaWorkspace); - reorderMap[index] = oldIndex; - if (oldIndex !== -1 && oldIndex !== index) { - hasReordered = true; - } - } - if (hasReordered) { - this._wsNames?.reorder(reorderMap); - } - this._metaWorkspaces = newMetaWorkspaces; - } - _getMetaWorkspaces() { - return Array.from({ length: this.numberOfEnabledWorkspaces }).map((_, i) => global.workspace_manager.get_workspace_by_index(i)); - } - /** - * Updates the listeners for added and removed windows on workspaces. - * - * Connects listeners to workspaces that newly need to be tracked and removes the ones from - * workspaces that don't need tracking anymore. - * - * Records and updates all connected listeners in `_windowAddedListeners`. - */ - _updateWindowAddedListeners() { - // Listeners are only added when smart workspace names are enabled and the workspace does - // not yet have a name. They are removed as soon as the setting is turned off or the - // workspace is assigned a name. - // - // We need to track `window-added` signals in addition to `tracked-windows-changed` signals - // so we catch windows that have been moved from another monitor to the primary monitor. - // Add missing listeners. - if (this._settings.smartWorkspaceNames.value) { - for (const workspace of this.workspaces) { - if (!this._windowChangedListeners.some((entry) => entry.workspace.index() === workspace.index)) { - const metaWorkspace = global.workspace_manager.get_workspace_by_index(workspace.index); - if (metaWorkspace) { - const listenerAdded = metaWorkspace.connect('window-added', () => { - this._update('windows-changed', 'Workspace window-added'); - this._updateSmartWorkspaceNames(); - }); - this._windowChangedListeners.push({ - workspace: metaWorkspace, - listener: listenerAdded, - }); - if (this._settings.reevaluateSmartWorkspaceNames.value) { - const listenerRemoved = metaWorkspace.connect('window-removed', () => { - this._update('windows-changed', 'Workspace window-removed'); - this._updateSmartWorkspaceNames(); - }); - this._windowChangedListeners.push({ - workspace: metaWorkspace, - listener: listenerRemoved, - }); - } - } - } - } - } - // Remove unneeded listeners. - let removedListener = false; - this._windowChangedListeners.forEach((entry, arrayIndex) => { - const workspace = this.workspaces[entry.workspace.index()]; - if (!this._settings.smartWorkspaceNames.value || - !workspace || - (workspace.name && !this._settings.reevaluateSmartWorkspaceNames.value) || - !workspace.isEnabled) { - entry.workspace.disconnect(entry.listener); - delete this._windowChangedListeners[arrayIndex]; - removedListener = true; - } - }); - if (removedListener) { - this._windowChangedListeners = this._windowChangedListeners.filter((entry) => entry != null); - } - } - _updateSmartWorkspaceNames() { - if (this._settings.smartWorkspaceNames.value) { - for (const workspace of this.workspaces) { - if (this._settings.reevaluateSmartWorkspaceNames.value && - workspace.name && - !this._wsNames.workspaceNameIsSupportedByWindows(workspace)) { - this._wsNames.rename(workspace.index, ''); - workspace.name = ''; - } - if (workspace.hasWindows && !workspace.name) { - this._wsNames.restoreSmartWorkspaceName(workspace.index); - } - if (this.isExtraDynamicWorkspace(workspace)) { - this._wsNames.remove(workspace.index); - } - } - } - } - _clearEmptyWorkspaceNames() { - for (const workspace of this.workspaces) { - if ((!workspace.isEnabled || this.isExtraDynamicWorkspace(workspace)) && - typeof workspace.name === 'string') { - // Completely remove disabled workspaces from the names array. - this._wsNames.remove(workspace.index); - } - else if (!workspace.hasWindows && workspace.name) { - // Keep empty workspaces in the names array to not mix up names of workspaces after. - this._wsNames.rename(workspace.index, ''); - } - } - } - _getWorkspaceState(index) { - if (index < this.numberOfEnabledWorkspaces) { - const workspace = global.workspace_manager.get_workspace_by_index(index); - const hasWindows = getNumberOfWindows(workspace) > 0; - return { - isEnabled: true, - isVisible: hasWindows || this._getIsEmptyButVisible(index), - hasWindows, - index, - name: this._settings.workspaceNames.value[index], - }; - } - else { - return { - isEnabled: false, - isVisible: false, - hasWindows: false, - index, - name: this._settings.workspaceNames.value[index], - }; - } - } - /** - * @param index index of an enabled workspace that has no windows - */ - _getIsEmptyButVisible(index) { - if (index === this.currentIndex) { - return true; - } - else if ( - // The last workspace for dynamic workspaces is a special case. - this._settings.dynamicWorkspaces.value && - !this._settings.showEmptyWorkspaces.value) { - return false; - } - else { - return this._settings.showEmptyWorkspaces.value; - } - } -} -/** - * Returns the number of windows on the given workspace, excluding windows on all workspaces, e.g., - * windows on a secondary screen when workspaces do not span all screens. - */ -function getNumberOfWindows(workspace) { - const windows = workspace.list_windows(); - return windows.filter((window) => !window.is_on_all_workspaces()).length; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/stylesheet.css b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/stylesheet.css deleted file mode 100644 index a970d036..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/stylesheet.css +++ /dev/null @@ -1,20 +0,0 @@ -/* Copy the appearance of the "Activities" button for indicator style "Current workspace name". */ -.space-bar.workspace-label { - -natural-hpadding: 18px; -} - -.workspace-box.dragging .space-bar-workspace-label.inactive { - background-color: rgb(0, 0, 0); - transition: margin-left 0.5s, margin-right 0.5s; -} - -.space-bar-menu .space-bar-menu-heading { - margin-left: 8px; - margin-right: 8px; - font-weight: 700; - font-size: 9pt; -} - -.space-bar-menu .popup-menu-ornament { - width: 0 !important; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Gdk.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Gdk.js deleted file mode 100644 index 6294aac9..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Gdk.js +++ /dev/null @@ -1 +0,0 @@ -export default Gdk; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Shell.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Shell.js deleted file mode 100644 index db98a222..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/types/dummy/gi/Shell.js +++ /dev/null @@ -1 +0,0 @@ -export default Shell; diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBar.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBar.js deleted file mode 100644 index e3925471..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBar.js +++ /dev/null @@ -1,433 +0,0 @@ -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; -import * as DND from 'resource:///org/gnome/shell/ui/dnd.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import { WindowPreview } from 'resource:///org/gnome/shell/ui/windowPreview.js'; -import { Settings } from '../services/Settings.js'; -import { Styles } from '../services/Styles.js'; -import { Workspaces } from '../services/Workspaces.js'; -import { Subject } from '../utils/Subject.js'; -import { Timeout } from '../utils/Timeout.js'; -import { WorkspacesBarMenu } from './WorkspacesBarMenu.js'; -/** - * Maximum number of milliseconds between button press and button release to be recognized as click. - */ -const MAX_CLICK_TIME_DELTA = 300; -/** - * Time in milliseconds until a touch event is recognized as long press. - */ -const LONG_PRESS_DURATION = 500; -export class WorkspacesBar { - constructor(_extension) { - this._extension = _extension; - this._name = `${this._extension.metadata.name}`; - this._settings = Settings.getInstance(); - this._styles = Styles.getInstance(); - this._ws = Workspaces.getInstance(); - this._buttonSubject = new Subject(null); - this._dragHandler = new WorkspacesBarDragHandler(() => this._updateWorkspaces()); - this._touchTimeout = new Timeout(); - } - init() { - this._initButton(); - this._initMenu(); - this._ws.onUpdate(() => this._updateWorkspaces()); - this._styles.onWorkspacesBarChanged(() => this._refreshTopBarConfiguration()); - this._styles.onWorkspaceLabelsChanged(() => this._updateWorkspaces()); - this._settings.alwaysShowNumbers.subscribe(() => this._updateWorkspaces()); - this._settings.enableCustomLabel.subscribe(() => this._updateWorkspaces()); - this._settings.customLabelNamed.subscribe(() => this._updateWorkspaces()); - this._settings.customLabelUnnamed.subscribe(() => this._updateWorkspaces()); - this._settings.indicatorStyle.subscribe(() => this._refreshTopBarConfiguration()); - this._settings.position.subscribe(() => this._refreshTopBarConfiguration()); - this._settings.positionIndex.subscribe(() => this._refreshTopBarConfiguration()); - } - destroy() { - this._button.destroy(); - this._menu.destroy(); - this._dragHandler.destroy(); - this._buttonSubject.complete(); - this._touchTimeout.destroy(); - } - observeWidget() { - return this._buttonSubject; - } - _refreshTopBarConfiguration() { - this._button.destroy(); - this._menu.destroy(); - this._initButton(); - this._initMenu(); - } - _initButton() { - this._button = new WorkspacesButton(0.5, this._name); - this._buttonSubject.next(this._button); - this._button.styleClass = 'panel-button space-bar'; - switch (this._settings.indicatorStyle.value) { - case 'current-workspace': - this._initWorkspaceLabel(); - break; - case 'workspaces-bar': - this._initWorkspacesBar(); - break; - } - Main.panel.addToStatusArea(this._name, this._button, this._settings.positionIndex.value, this._settings.position.value); - this._updateWorkspaces(); - } - _initMenu() { - this._menu = new WorkspacesBarMenu(this._extension, this._button.menu); - this._menu.init(); - } - _initWorkspaceLabel() { - this._button.styleClass += ' workspace-label'; - this._wsLabel = new St.Label({ - yAlign: Clutter.ActorAlign.CENTER, - }); - this._button.add_child(this._wsLabel); - this._button.connect('button-press-event', (actor, event) => { - switch (event.get_button()) { - case 1: - if (this._settings.toggleOverview.value) { - Main.overview.toggle(); - } - else { - this._button.menu.toggle(); - } - return Clutter.EVENT_STOP; - case 3: - this._button.menu.toggle(); - return Clutter.EVENT_STOP; - } - return Clutter.EVENT_PROPAGATE; - }); - } - _initWorkspacesBar() { - this._button._delegate = this._dragHandler; - this._button.trackHover = false; - this._wsBar = new St.BoxLayout({}); - this._button.add_child(this._wsBar); - } - _updateWorkspaces() { - switch (this._settings.indicatorStyle.value) { - case 'current-workspace': - this._updateWorkspaceLabel(); - break; - case 'workspaces-bar': - this._updateWorkspacesBar(); - break; - } - } - _updateWorkspaceLabel() { - const workspace = this._ws.workspaces[this._ws.currentIndex]; - this._wsLabel.set_text(this._ws.getDisplayName(workspace)); - } - _updateWorkspacesBar() { - // destroy old workspaces bar buttons - this._wsBar.destroy_all_children(); - this._dragHandler.wsBoxes = []; - // display all current workspaces buttons - for (let ws_index = 0; ws_index < this._ws.numberOfEnabledWorkspaces; ++ws_index) { - const workspace = this._ws.workspaces[ws_index]; - if (workspace.isVisible) { - const wsBox = this._createWsBox(workspace); - this._wsBar.add_child(wsBox); - this._dragHandler.wsBoxes.push({ workspace, wsBox }); - } - } - } - _createWsBox(workspace) { - const wsBox = new St.Bin({ - visible: true, - reactive: true, - canFocus: true, - trackHover: true, - styleClass: `workspace-box workspace-box-${workspace.index + 1}`, - }); - wsBox._delegate = new WorkspaceBoxDragHandler(workspace); - const label = this._createLabel(workspace); - wsBox.set_child(label); - let lastButton1PressEvent; - wsBox.connect('button-press-event', (actor, event) => { - switch (event.get_button()) { - case 1: - lastButton1PressEvent = event; - break; - case 3: - this._button.menu.toggle(); - break; - } - return Clutter.EVENT_PROPAGATE; - }); - // Activate workspaces on button release to not interfere with drag and drop, but make sure - // we saw a corresponding button-press event to avoid activating workspaces when the click - // already triggered another action like closing a menu. - wsBox.connect('button-release-event', (actor, event) => { - switch (event.get_button()) { - case 1: - if (lastButton1PressEvent) { - const timeDelta = event.get_time() - lastButton1PressEvent.get_time(); - if (timeDelta <= MAX_CLICK_TIME_DELTA) { - this._ws.activate(workspace.index); - } - lastButton1PressEvent = null; - } - break; - } - return Clutter.EVENT_PROPAGATE; - }); - let lastTouchBeginEvent; - wsBox.connect('touch-event', (actor, event) => { - switch (event.type()) { - case Clutter.EventType.TOUCH_BEGIN: - lastTouchBeginEvent = event; - this._touchTimeout - .once(LONG_PRESS_DURATION) - .then(() => this._button.menu.toggle()); - break; - case Clutter.EventType.TOUCH_END: - if (lastTouchBeginEvent) { - const timeDelta = event.get_time() - lastTouchBeginEvent.get_time(); - if (timeDelta <= MAX_CLICK_TIME_DELTA) { - this._ws.activate(workspace.index); - } - lastTouchBeginEvent = null; - } - this._touchTimeout.clearTimeout(); - break; - case Clutter.EventType.TOUCH_CANCEL: - this._touchTimeout.clearTimeout(); - break; - } - return Clutter.EVENT_PROPAGATE; - }); - this._dragHandler.setupDnd(wsBox, workspace, { - onDragStart: () => this._touchTimeout.clearTimeout(), - }); - return wsBox; - } - _createLabel(workspace) { - const label = new St.Label({ - yAlign: Clutter.ActorAlign.CENTER, - styleClass: 'space-bar-workspace-label', - }); - if (workspace.index == this._ws.currentIndex) { - label.styleClass += ' active'; - } - else { - label.styleClass += ' inactive'; - } - if (workspace.hasWindows) { - label.styleClass += ' nonempty'; - } - else { - label.styleClass += ' empty'; - } - const text = this._ws.getDisplayName(workspace); - label.set_text(text); - if (text.trim() === '') { - label.styleClass += ' no-text'; - } - return label; - } -} -var WorkspacesButton = GObject.registerClass(class WorkspacesButton extends PanelMenu.Button { - vfunc_event() { - return Clutter.EVENT_PROPAGATE; - } -}); -class WorkspacesBarDragHandler { - constructor(_updateWorkspaces) { - this._updateWorkspaces = _updateWorkspaces; - this.wsBoxes = []; - this._ws = Workspaces.getInstance(); - this._barWidthAtDragStart = null; - this._hasLeftInitialPosition = false; - this._workspacesBarOffset = null; - } - destroy() { - this._setDragMonitor(false); - } - setupDnd(wsBox, workspace, hooks) { - const draggable = DND.makeDraggable(wsBox, {}); - draggable.connect('drag-begin', () => { - this._onDragStart(wsBox, workspace); - hooks.onDragStart(); - }); - draggable.connect('drag-cancelled', () => { - this._updateDragPlaceholder(this._initialDropPosition); - this._onDragFinished(wsBox); - }); - draggable.connect('drag-end', () => { - this._updateWorkspaces(); - }); - } - acceptDrop(source, actor, x, y) { - if (source instanceof WorkspaceBoxDragHandler) { - const dropPosition = this._getDropPosition(); - if (dropPosition) { - if (this._draggedWorkspace.index !== dropPosition?.index) { - this._ws.reorderWorkspace(this._draggedWorkspace.index, dropPosition?.index); - } - } - this._updateWorkspaces(); - this._onDragFinished(actor); - return true; - } - else { - return false; - } - } - handleDragOver(source) { - if (source instanceof WorkspaceBoxDragHandler) { - const dropPosition = this._getDropPosition(); - this._updateDragPlaceholder(dropPosition); - } - return DND.DragMotionResult.CONTINUE; - } - _onDragStart(wsBox, workspace) { - wsBox.add_style_class_name('dragging'); - this._draggedWorkspace = workspace; - this._setDragMonitor(true); - this._barWidthAtDragStart = this._getBarWidth(); - this._setUpBoxPositions(wsBox, workspace); - } - _onDragFinished(wsBox) { - wsBox.remove_style_class_name('dragging'); - this._draggedWorkspace = null; - this._wsBoxPositions = null; - this._initialDropPosition = null; - this._hasLeftInitialPosition = false; - this._barWidthAtDragStart = null; - this._setDragMonitor(false); - } - _setDragMonitor(add) { - if (add) { - this._dragMonitor = { - dragMotion: this._onDragMotion.bind(this), - }; - DND.addDragMonitor(this._dragMonitor); - } - else if (this._dragMonitor) { - DND.removeDragMonitor(this._dragMonitor); - } - } - _onDragMotion(dragEvent) { - this._updateDragPlaceholder(this._initialDropPosition); - return DND.DragMotionResult.CONTINUE; - } - _setUpBoxPositions(wsBox, workspace) { - const boxIndex = this.wsBoxes.findIndex((box) => box.workspace === workspace); - this._wsBoxPositions = this._getWsBoxPositions(boxIndex, wsBox.get_width()); - this._initialDropPosition = this._getDropPosition(); - this._updateDragPlaceholder(this._initialDropPosition); - } - _getDropPosition() { - const draggedWsBox = this.wsBoxes.find(({ workspace }) => workspace === this._draggedWorkspace)?.wsBox; - for (const { index, center, wsBox } of this._wsBoxPositions) { - if (draggedWsBox.get_x() < center + this._getWorkspacesBarOffset()) { - return { index, wsBox, position: 'before', width: draggedWsBox.get_width() }; - } - } - if (this._wsBoxPositions.length > 0) { - const lastWsBox = this._wsBoxPositions[this._wsBoxPositions.length - 1].wsBox; - return { - index: this._ws.lastVisibleWorkspace, - wsBox: lastWsBox, - position: 'after', - width: draggedWsBox.get_width(), - }; - } - } - _getWsBoxPositions(draggedBoxIndex, draggedBoxWidth) { - const positions = this.wsBoxes - .filter(({ workspace }) => workspace !== this._draggedWorkspace) - .map(({ workspace, wsBox }) => ({ - index: getDropIndex(this._draggedWorkspace, workspace), - center: getHorizontalCenter(wsBox), - wsBox, - })); - positions.forEach((position, index) => { - if (index >= draggedBoxIndex) { - position.center -= draggedBoxWidth; - } - }); - return positions; - } - _updateDragPlaceholder(dropPosition) { - if (dropPosition?.index === this._initialDropPosition?.index && - dropPosition?.position === this._initialDropPosition?.position) { - if (!this._getHasLeftInitialPosition()) { - return; - } - } - else { - this._hasLeftInitialPosition = true; - } - for (const { wsBox } of this.wsBoxes) { - if (wsBox === dropPosition?.wsBox) { - if (dropPosition.position === 'before') { - wsBox?.set_style('margin-left: ' + dropPosition.width + 'px'); - } - else { - wsBox?.set_style('margin-right: ' + dropPosition.width + 'px'); - } - } - else { - wsBox.set_style(null); - } - } - } - _getBarWidth() { - return this.wsBoxes[0].wsBox.get_parent().get_width(); - } - _getHasLeftInitialPosition() { - if (this._hasLeftInitialPosition) { - return true; - } - if (this._barWidthAtDragStart !== this._getBarWidth()) { - this._hasLeftInitialPosition = true; - } - return this._hasLeftInitialPosition; - } - _getWorkspacesBarOffset() { - if (this._workspacesBarOffset === null) { - this._workspacesBarOffset = 0; - let widget = this.wsBoxes[0].wsBox.get_parent(); - while (widget) { - this._workspacesBarOffset += widget.get_x(); - widget = widget.get_parent(); - } - } - return this._workspacesBarOffset; - } -} -class WorkspaceBoxDragHandler { - constructor(_workspace) { - this._workspace = _workspace; - } - acceptDrop(source) { - if (source instanceof WindowPreview) { - source.metaWindow.change_workspace_by_index(this._workspace.index, false); - } - } - handleDragOver(source) { - if (source instanceof WindowPreview) { - return DND.DragMotionResult.MOVE_DROP; - } - else { - return DND.DragMotionResult.CONTINUE; - } - } -} -function getDropIndex(draggedWorkspace, workspace) { - if (draggedWorkspace.index < workspace.index) { - return workspace.index - 1; - } - else { - return workspace.index; - } -} -function getHorizontalCenter(widget) { - return widget.get_x() + widget.get_width() / 2; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBarMenu.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBarMenu.js deleted file mode 100644 index 59bb36ee..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/ui/WorkspacesBarMenu.js +++ /dev/null @@ -1,162 +0,0 @@ -import Clutter from 'gi://Clutter'; -import GObject from 'gi://GObject'; -import St from 'gi://St'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import { KeyBindings } from '../services/KeyBindings.js'; -import { Settings } from '../services/Settings.js'; -import { WorkspaceNames } from '../services/WorkspaceNames.js'; -import { Workspaces } from '../services/Workspaces.js'; -export class WorkspacesBarMenu { - constructor(_extension, _menu) { - this._extension = _extension; - this._menu = _menu; - this._keyBindings = KeyBindings.getInstance(); - this._settings = Settings.getInstance(); - this._ws = Workspaces.getInstance(); - this._wsNames = WorkspaceNames.getInstance(); - this._hiddenWorkspacesSection = new PopupMenu.PopupMenuSection(); - this._manageWorkspaceSection = new PopupMenu.PopupMenuSection(); - } - init() { - this._menu.box.add_style_class_name('space-bar-menu'); - this._addSectionHeading('Rename current workspace'); - this._initEntry(); - this._menu.addMenuItem(this._hiddenWorkspacesSection); - this._initManageWorkspaceSection(); - this._initExtensionSettingsButton(); - this._menu.connect('open-state-changed', () => { - if (this._menu.isOpen) { - this._refreshMenu(); - } - }); - this._keyBindings.addKeyBinding('open-menu', () => this._menu.open()); - } - destroy() { - this._keyBindings.removeKeybinding('open-menu'); - } - _refreshMenu() { - this._refreshHiddenWorkspaces(); - this._refreshManageWorkspaceSection(); - } - _addSectionHeading(text, section) { - const separator = new PopupMenu.PopupSeparatorMenuItem(text); - separator.label.add_style_class_name('space-bar-menu-heading'); - (section ?? this._menu).addMenuItem(separator); - } - _initEntry() { - const entryItem = new PopupMenuItemEntry(); - entryItem.entry.connect('key-focus-in', () => { - const text = entryItem.entry.get_text(); - if (text.length > 0) { - entryItem.entry.get_clutter_text().set_selection(0, text.length); - } - }); - entryItem.entry.get_clutter_text().connect('activate', () => this._menu.close()); - entryItem.connect('notify::active', () => { - if (entryItem.active) { - entryItem.entry.grab_key_focus(); - } - }); - let oldName = ''; - this._menu.connect('open-state-changed', () => { - if (this._menu.isOpen) { - oldName = this._ws.workspaces[this._ws.currentIndex].name || ''; - // Reset the selection before setting the text since the entry field won't let us do - // that when it is empty. - entryItem.entry.get_clutter_text().set_selection(0, 0); - entryItem.entry.set_text(oldName); - entryItem.active = true; - } - else { - const newName = entryItem.entry.get_text(); - if (newName !== oldName) { - this._wsNames.rename(this._ws.currentIndex, newName); - } - } - }); - this._menu.addMenuItem(entryItem); - } - _initManageWorkspaceSection() { - const separator = new PopupMenu.PopupSeparatorMenuItem(); - this._menu.addMenuItem(separator); - this._menu.addMenuItem(this._manageWorkspaceSection); - } - _initExtensionSettingsButton() { - const separator = new PopupMenu.PopupSeparatorMenuItem(); - this._menu.addMenuItem(separator); - const button = new PopupMenu.PopupMenuItem(`${this._extension.metadata.name} settings`); - button.connect('activate', () => { - this._menu.close(); - this._extension.openPreferences(); - }); - this._menu.addMenuItem(button); - } - _refreshHiddenWorkspaces() { - this._hiddenWorkspacesSection.box.destroy_all_children(); - let hiddenWorkspaces; - switch (this._settings.indicatorStyle.value) { - case 'current-workspace': - hiddenWorkspaces = this._ws.workspaces.filter((workspace) => workspace.isEnabled && - workspace.index !== this._ws.currentIndex && - !this._ws.isExtraDynamicWorkspace(workspace)); - break; - case 'workspaces-bar': - if (this._settings.showEmptyWorkspaces.value || - this._settings.dynamicWorkspaces.value) { - return; - } - hiddenWorkspaces = this._ws.workspaces.filter((workspace) => workspace.isEnabled && - !workspace.hasWindows && - workspace.index !== this._ws.currentIndex); - break; - } - if (hiddenWorkspaces.length > 0) { - this._addSectionHeading('Other workspaces', this._hiddenWorkspacesSection); - hiddenWorkspaces.forEach((workspace) => { - let label; - if (this._settings.enableCustomLabelInMenus.value) { - label = this._ws.getDisplayName(workspace); - } - else { - label = this._ws.getDefaultDisplayName(workspace); - } - const button = new PopupMenu.PopupMenuItem(label); - button.connect('activate', () => { - this._menu.close(); - this._ws.activate(workspace.index); - }); - this._hiddenWorkspacesSection.addMenuItem(button); - }); - } - } - _refreshManageWorkspaceSection() { - this._manageWorkspaceSection.box.destroy_all_children(); - if (!this._settings.dynamicWorkspaces.value || - !this._settings.showEmptyWorkspaces.value || - this._settings.indicatorStyle.value === 'current-workspace') { - const newWorkspaceButton = new PopupMenu.PopupMenuItem('Add new workspace'); - newWorkspaceButton.connect('activate', () => { - this._menu.close(); - this._ws.addWorkspace(); - }); - this._manageWorkspaceSection.addMenuItem(newWorkspaceButton); - } - const closeWorkspaceButton = new PopupMenu.PopupMenuItem('Remove current workspace'); - closeWorkspaceButton.connect('activate', () => { - this._ws.removeWorkspace(this._ws.currentIndex); - }); - this._manageWorkspaceSection.addMenuItem(closeWorkspaceButton); - } -} -const PopupMenuItemEntry = GObject.registerClass(class PopupMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(params) { - super._init(params); - this.entry = new St.Entry({ - xExpand: true, - }); - this.entry.connect('button-press-event', () => { - return Clutter.EVENT_STOP; - }); - this.add_child(this.entry); - } -}); diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/DebouncingNotifier.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/DebouncingNotifier.js deleted file mode 100644 index 7986da0c..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/DebouncingNotifier.js +++ /dev/null @@ -1,37 +0,0 @@ -import GLib from 'gi://GLib'; -/** - * A subscribe/notify mechanism that debounces multiple subsequent notify calls. - */ -export class DebouncingNotifier { - constructor(_delayMs = 0) { - this._delayMs = _delayMs; - this._subscribers = []; - this._timeout = null; - } - notify() { - if (this._timeout) { - return; - } - this._timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this._delayMs, () => { - this._notify(); - this._timeout = null; - return GLib.SOURCE_REMOVE; - }); - } - subscribe(callback, until) { - this._subscribers.push(callback); - until?.subscribe(() => (this._subscribers = this._subscribers.filter((s) => s !== callback))); - } - destroy() { - if (this._timeout) { - GLib.Source.remove(this._timeout); - this._timeout = null; - } - this._subscribers = []; - } - _notify() { - for (const subscriber of this._subscribers) { - subscriber(); - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Subject.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Subject.js deleted file mode 100644 index 3247ae00..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Subject.js +++ /dev/null @@ -1,25 +0,0 @@ -export class Subject { - get value() { - return this._value; - } - constructor(value) { - this._observers = []; - this._value = value; - } - next(value) { - this._value = value; - for (const observer of this._observers) { - observer(value); - } - } - complete() { - this._observers = []; - } - subscribe(callback) { - this._observers.push(callback); - callback(this._value); - } - unsubscribe(callback) { - this._observers = this._observers.filter((cb) => cb !== callback); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Timeout.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Timeout.js deleted file mode 100644 index ecfeb461..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Timeout.js +++ /dev/null @@ -1,35 +0,0 @@ -import GLib from 'gi://GLib'; -export class Timeout { - constructor() { - this._timeoutId = null; - } - destroy() { - this.clearTimeout(); - } - tick() { - return new Promise((resolve) => { - this.clearTimeout(); - this._timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 0, () => { - this._timeoutId = null; - resolve(); - return GLib.SOURCE_REMOVE; - }); - }); - } - once(milliseconds) { - return new Promise((resolve) => { - this.clearTimeout(); - this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, milliseconds, () => { - this._timeoutId = null; - resolve(); - return GLib.SOURCE_REMOVE; - }); - }); - } - clearTimeout() { - if (this._timeoutId) { - GLib.Source.remove(this._timeoutId); - this._timeoutId = null; - } - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Widget.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Widget.js deleted file mode 100644 index f289d898..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/Widget.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Subject } from './Subject.js'; -export function onDestroyed(widget) { - const subject = new Subject(void 0); - widget.connect('destroy', () => { - subject.next(); - subject.complete(); - }); - return subject; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/hook.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/hook.js deleted file mode 100644 index 75662ceb..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/space-bar@luchrioh/utils/hook.js +++ /dev/null @@ -1,28 +0,0 @@ -let _destroyFunctions = []; -/** - * Calls `callback` when the given upstream function gets called. - */ -export function hook(classObject, functionName, pos, callback) { - const _originalFunction = classObject.prototype[functionName]; - if (pos === 'before') { - classObject.prototype[functionName] = function (...args) { - callback(this, ...args); - _originalFunction.apply(this, args); - }; - } - else { - classObject.prototype[functionName] = function (...args) { - _originalFunction.apply(this, args); - callback(this, ...args); - }; - } - _destroyFunctions.push(() => { - classObject.prototype[functionName] = _originalFunction; - }); -} -export function destroyAllHooks() { - for (const f of _destroyFunctions) { - f(); - } - _destroyFunctions = []; -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/COPYING b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/COPYING deleted file mode 100644 index e55e5b8a..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/NEWS b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/NEWS deleted file mode 100644 index 716a8894..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/NEWS +++ /dev/null @@ -1,1462 +0,0 @@ -46.2 -==== -* apps-menu: Fix a11y of category labels [Florian; !319] -* window-list: Fix long-press support [Florian; !320] -* Misc. bug fixes and cleanups [Florian; !324] - -Contributors: - Florian Müllner - -Translators: - Hugo Carvalho [pt], Jose Riha [sk], Jordi Mas i Hernandez [ca], - Scrambled 777 [hi] - -46.1 -==== -* screenshot-window-sizer: Add flathub-recommended size [Florian; !317] - -Contributors: - Florian Müllner - -Translators: - Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur] - -46.0 -==== -* system-monitor: Fix net speed [Florian; !313] -* Misc. bug fixes and cleanups [Aral; !311] - -Contributors: - Aral Balkan, Florian Müllner - -Translators: - Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it], - Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko], - Ask Hjorth Larsen [da] - -46.rc -===== -* Fix window previews in workspace indicator [Florian; !304] -* Fix menu ornament in workspace indicator [Florian; !305] -* Misc. bug fixes and cleanups [Florian; !306, !309] - -Contributors: - Florian Müllner - -Translators: - Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru], - Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu], - Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl], - Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN], - Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB], - Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr], - Daniel Mustieles [es], Jiri Grönroos [fi] - -46.beta -======= -* apps-menu: Rename Applications to Apps [Allan; !299] -* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302] - -Contributors: - Allan Day, Florian Müllner - -Translators: - Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl], - Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he], - Sabri Ünal [tr] - -46.alpha -======== -* workspace-indicator: Fix initial preview visibility [Florian; !280, !292] -* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284] -* Add back overview in Classic session [Florian; !287] -* Allow running Classic session headless [Jonas; !289] -* window-list: Fix buttons not being clickable at the screen edge - [Florian; !291] -* Add system-monitor extension [Florian; !277] -* Fixed crash [Florian; !290] -* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288] - -Contributors: - Jonas Ådahl, Florian Müllner - -Translators: - Kristjan SCHMIDT [eo], Brage Fuglseth [nb] - -45.0 -==== - -Contributors: - Andre Klapper - -Translators: - Bruce Cowan [en_GB] - -45.rc -===== -* Misc. bug fixes and cleanups [Florian; !267, !224, !272] - -Contributors: - Florian Müllner - -Translators: - Sabri Ünal [tr], Florentina Musat [ro], A S Alam [pa] - -45.beta -======= -* Port extensions to ESM [Florian; !259, !266, !268, !269] -* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264] - -Contributors: - Florian Müllner - -Translators: - Efstathios Iosifidis [el] - -45.alpha -======== -* window-list: Modernize default styling [Alexander; !253] -* Replace classic styling with built-in light style [Florian; !254] -* window-list: Add tooltip for long window titles [Arik; !251] -* light-style: New extension [Florian; !256] -* Misc. bug fixes and cleanups [Florian; !255, !257] - -Contributors: - Florian Müllner, Arik W, Alexander Weichart - -44.0 -==== -* Bump version - -44.rc -===== -* Bump version - -44.beta -======= -* Tweak menu alignment [robxnano; !246] - -Contributors: - Florian Müllner, robxnano - -Translators: - Vasil Pupkin [be] - -43.1 -==== -* Fixed crash [Florian; !243] -* Misc. bug fixes and cleanups [mowemcfc; !244] - -Contributors: - Florian Müllner, mowemcfc - -Translators: - Sabri Ünal [tr] - -43.0 -==== - -Contributors: - Florian Müllner - -Translators: - Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru] - -43.rc -===== -* Misc. bug fixes and cleanups [Florian; !240] - -Contributors: - Florian Müllner - -43.beta -======= -* Misc. bug fixes and cleanups [Florian; !237, !238] - -Contributors: - Florian Müllner - -Translators: - Nart Tlisha [ab] - -43.alpha -======== - -Contributors: - Florian Müllner - -Translators: - Marco Ciampa [it] - -42.3 -==== -* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232] -* window-list: Improve touch support [Florian; !233] - -Contributors: - Florian Müllner - -42.2 -==== -* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] -* window-list: Fix visibility on non-primary monitors [Jason; !230] - -Contributors: - Jason Lynch, Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW] - -42.1 -==== -* Misc. bug fixes and cleanups [Florian; !223, !222, !225] - -Contributors: - Florian Müllner - -Translators: - Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl], - Ngọc Quân Trần [vi], Zurab Kargareteli [ka] - -42.0 -==== - -Translators: - Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja], - Baurzhan Muftakhidinov [kk] - -42.rc -===== -* Misc. bug fixes and cleanups [Florian; !215, !218] - -Contributors: - Florian Müllner - -Translators: - Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi], - Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr], - Changwoo Ryu [ko] - -42.beta -======= -* workspace-indicator: Fix cancelling editing with Esc [Florian; !208] -* window-list: Update window tracking to avoid missing icons [Florian; !207] -* Use libadwaita for preferences [Florian; !209, !213] -* Adapt to Clutter grab API changes [Florian; !212] -* Misc. bug fixes and cleanups [Jan, Florian; !210, !214] - -Contributors: - Jan Beich, Florian Müllner, Naala Nanba - -Translators: - Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab], - Alexander Shopov [bg], Emin Tufan Çetin [tr] - -42.alpha -======== -* native-window-placement: Fix distorted layout in app grid [Sebastian; !189] -* window-list: Fix on-screen keyboard [Florian; !199] -* Misc. bug fixes and cleanups [Neal; Just; !195, !197] - -Contributors: - Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection - -Translators: - Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk], - Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt], - Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa], - Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru], - Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], - Rafael Fontenelle [pt_BR] - -41.0 -==== -* Bump version - -41.rc.1 -======= -* Fix pre-generating stylesheets in tarball [Florian; !190] - -Contributors: - Florian Müllner - -41.rc -===== -* window-list: Adapt to overview-on-startup [Florian; !185] -* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] -* Misc. bug fixes and cleanups [Florian; !186] - -Contributors: - Florian Müllner - -41.beta -======= -* window-list: Extend reactive area of minimap to screen edges [Adam; !171] -* drive-menu: Improve detection of network mounts [Florian; !27, !176] -* Use distinct gettext domain for e.g.o uploads [Florian; #335] -* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, - !181, !182, !183] - -Contributors: - Marco Trevisan (Treviño), Adam Goode, Florian Müllner - -Translators: - Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] - -40.1 -==== -* Disable welcome dialog in classic session [Florian; !169] -* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170] - -Contributors: - Florian Müllner - -Translators: - Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo], - Pawan Chitrakar [ne], Quentin PAGÈS [oc] - -40.0 -==== - -Translators: - Jiri Grönroos [fi] - -40.rc -===== -* native-window-placement: Adjust to gnome-shell changes [Florian; !164] -* windows-navigator: Adjust to gnome-shell changes [Florian; !163] -* window-list, workspace-indicator: Only show previews for up to six workspaces - [Florian; !165] -* window-list, workspace-indicator: Improve workspace preview appearance - [Florian; !166] - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl] - -40.beta -======= -* Add tooltips to workspace thumbnails [Florian; !155] -* Drop arrows from top bar menus [Florian; !156] -* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152] -* Remove horizontal-workspaces extension [Florian; !158] -* Adjust to shell overview changes [Florian; !159, !160] -* Fix crashes [Daniel; !157] -* Misc. bug fixes and cleanups [Florian; !154, !161] - -Contributors: - Michael Lawton, Florian Müllner, Daniel van Vugt - -Translators: - Аляксей [be], A S Alam [pa] - -40.alpha.1 -========== -* Don't depend on sassc when building from tarball [Florian; !150] -* Port extensions preferences to GTK4 [Florian; !148] -* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153] - -Contributors: - Jonas Dreßler, Florian Müllner - -40.alpha -======== -* window-list: Honor changes in skip-taskbar property [Sergio; !130] -* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133] -* window-list, workspace-indicator: Improve previews in workspace thumbs - [Florian; #260, !142] -* auto-move: Improve behavior on multi-monitor setups [Florian; !135] -* windowNavigator: Adjust to 3.38 changes [Thun; #259] -* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136, - !137, !140, !141, !144, !146, !145] - -Contributors: - Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode, - Jonas Ådahl - -Translators: - Fabio Tomat [fur], Jordi Mas [ca] - -3.38.1 -====== - -Contributors: - Yacine Bouklif, Florian Müllner - -Translators: - Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru], - Yosef Or Boczko [he] - -3.38.0 -====== - -Translators: - Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de], - Milo Casagrande [it], Rūdolfs Mazurs [lv] - -3.37.92 -======= - -Translators: - Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt], - Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk] - -3.37.91 -======= - -Contributors: - Florian Müllner - -Translators: - Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id], - Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi], - Марко Костић [sr], Goran Vidović [hr] - -3.37.90 -======= -* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128] - -Contributors: - Piotr Drąg, Florian Müllner - -Translators: - Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv], - Asier Sarasua Garmendia [eu], Alexandre Franke [fr] - -3.37.3 -====== -* window-list, native-window-placement: Adjust to shell changes [Florian; !124] - -Contributors: - Florian Müllner - -Translators: - Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN], - Baurzhan Muftakhidinov [kk] - -3.37.2 -====== -* window-list, auto-move: Modernize preference dialogs [Florian; !121] -* Adjust to gnome-shell changes [Florian; !122] - -Contributors: - Florian Müllner - -Translators: - Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es], - Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro], - Matej Urbančič [sl] - -3.37.1 -====== -* drive-menu: Emphasize eject buttons [Florian; #223] -* user-theme: Add preference dialog [Florian; !117] -* window-list: Fix inconsistent state in preference dialog [Milan; !119] -* workspace-indicator: Overhaul preference dialog [Florian; !120] -* user-theme: Support session mode styles [Florian; !118] -* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116] - -Contributors: - Milan Crha, Florian Müllner, Xiaoguang Wang - -Translators: - Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo], - Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk], - Anders Jonsson [sv], Daniel Mustieles [es] - -3.36.0 -====== - -Contributors: - Florian Müllner - -3.35.91 -======= - -Contributors: - Florian Müllner - -Translators: - Zander Brown [en_GB] - -3.35.90 -======= -* Adjust to gnome-shell changes [Florian; !100, !101, !102] -* Force single-line window titles in window list [Florian; #202] -* Misc. bug fixes and cleanup [Florian; !104, !105] - -Contributors: - Florian Müllner - -Translators: - sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms] - -3.35.3 -====== - -Translators: - Fran Dieguez [gl] - -3.35.2 -====== -* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96] -* window-list, workspace-indicator: Exclude DESKTOP windows from previews - [Florian; !93] -* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97] - -Contributors: - Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick - -3.34.1 -====== -* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da], - Yi-Jyun Pan [zh_TW] - -3.34.0 -====== - -Translators: - Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it], - Sabri Ünal [tr] - -3.33.92 -======= - -Translators: - Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl], - Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko], - Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr] - -3.33.91 -======= -* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92] - -Contributors: - Florian Müllner - -Translators: - Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs], - Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro], - Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca], - Danial Behzadi [fa] -3.33.90 -======= -* window-list: Support showing windows from all workspaces [Florian; #154] -* Misc. bug fixes and cleanups [Florian; !86, !87] - -Contributors: - Florian Müllner - -Translators: - Jor Teron [mjw] - -3.33.4 -====== -* Make GNOME Classic more classic: - - Disable GNOME 3 overview [Florian; !69] - - Add window picker button to window list [Florian; !73, !80] - - Style improvements and fixes [Jakub; #169, !82] - - Support horizontal workspace layout in window list [Florian; !70] - - Add draggable previews to window list workspace switcher [Florian; !74] - - Arrange workspaces horizontally [Florian; !72] -* workspace-indicator: Support horizontal workspace layout [Florian; !71] -* workspace-indicator: Add draggable previews [Florian; !77] -* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84] - -Contributors: - Florian Müllner, Jakub Steiner, Jor Teron - -Translators: - Jor Teron [mjw] - -3.33.3 -====== -* Misc. bug fixes [Florian, Marco; !67, !68] - -Contributors: - Florian Müllner, Marco Trevisan (Treviño) - -3.33.2 -====== -* Misc. bug fixes and cleanups [Florian; !66] - -Contributors: - Florian Müllner - -3.33.1 -====== -* Misc. bug fixes [Florian; !64] - -Contributors: - Florian Müllner - -3.32.1 -====== -* Fix windowsNavigator extension after ES6 port [Florian; #143] -* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65] -* Misc. bug fixes and cleanups [Fabian; !62] - -Contributors: - Florian Müllner, Adrien Plazas, Fabian P. Schmidt - -3.32.0 -====== - -Contributors: - Florian Müllner - -Translations: - Victor Ibragimov [tg], Kristjan SCHMIDT [eo], Mart Raudsepp [et] - -3.31.92 -======= -* Misc. bug fixes and cleanups [Florian; !57, !58, !59, !60] - -Contributors: - Florian Müllner - -3.31.91 -======= -* apps-menu: Remove outdated legacy-tray handling [Florian; !53] -* user-theme: Allow using XDG user data dir [Tomasz; !55] -* Misc. bug fixes and cleanups [Florian; !52, !54, !56] - -Contributors: - Tomasz Gąsior, Florian Müllner - -Translators: - Matej Urbančič [sl], Gun Chleoc [gd] - -3.31.90 -======= -* Misc. bug fixes and cleanups [Florian; !49, !50, !51] - -Contributors: - Florian Müllner - -Translators: - Ryuta Fujii [ja], Charles Monzat [fr], Pieter Schalk Schoeman [af] - -3.31.2 -====== -* Remove obsolete alternate-tab extension [Florian; #786496] -* Adjust to gnome-shell changes [Florian; #113] - -Contributors: - Florian Müllner - -3.30.1 -====== -* apps-menu: Fix height on HiDPI systems [Florian; #102] -* window-list: Only switch between windows on active workspace when scrolling - [Florian; #78] - -Contributors: - Florian Müllner - -3.30.0 -====== -* Bump version - -3.29.91 -======= -* Misc. bug fixes [Florian; #90] - -Contributors: - Florian Müllner - -3.29.90 -======= -* Misc. bug fixes [Florian; #786496] - -Contributors: - Florian Müllner - -3.29.3 -====== -* Adjust to global.screen removal [Jonas; #759538] - -Contributors: - Jonas Ådahl, Florian Müllner - -3.29.2 -====== -* Misc. bug fixes [Florian; #69] - -Contributors: - Florian Müllner - -3.28.1 -====== -* Misc. bug fixes [Xiaoguang, Florian; #59, #62] - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Dz Chen [zh_CN] - -3.28.0 -====== - -Contributors: - Florian Müllner, Xiaoguang Wang - -Translators: - Aman Alam [pa], Bruce Cowan [en_GB] - -3.27.92 -======= - -Contributors: - Florian Müllner - -Translators: - Piotr Drąg [es], GNOME Translation Robot [gd], Daniel Șerbănescu [ro] - -3.27.91 -======= -* places-menu: Support unmounting ejectable places [Rémy; #17] -* apps-menu: Support separators and custom sort order [Florian; #27] -* Port to meson [Florian; #31, #45] -* window-list: Fix missing icons on wayland [Florian; #10] -* places-menu: Fix terminating gnome-shell with recent gjs [Florian; #44] -* auto-move: Make it work with wayland windows [Florian; #33] -* Classic theme fixes [Florian, Jonas; #26, #41, #39, #40] -* Require sassc for classic styling [Florian; !28] -* Misc. bug fixes [Piotr, Florian; #772211, #32, #30] - -Contributors: - Jeremy Bicha, Piotr Drąg, Jonas Kümmerlin, Rémy Lefevre, Iñigo Martínez, - Florian Müllner - -Translators: - Matej Urbančič [sl], Kjartan Maraas [nb] - -3.27.1 -====== -* updated translations (ca@valencia) - -3.26.1 -====== -* native-window-placement: Adjust to gnome-shell changes -* updated translations: el, fa, ru, sv - -3.26.0 -====== -* updated translations (be, bg, ca, da, eu, fi, is, it, ko, lv, ml, - nl, pt_BR, vi, zh_TW) - -3.25.91 -======= -* updated translations (ca, fr, it, pl, pt_BR, sr, sr@latin, tr) - -3.25.90 -======= -* updated translations (es, gl, hr, hu, kk, sl, sv, sv) - -3.25.4 -====== -* screenshot-window-sizer: Fix backward cycling -* updated translations (ar, be, ca, cs, de, fur, id, lt, pl, sk) - -3.25.3 -====== -* places-menu: Use mount operation if necessary -* window-list: Respect MWM hints -* updated translations (es, fur, kk) - -3.25.2 -====== -* places-menu: Make URI launching asynchronous -* updated translations (de, fur, hr, hu, id, sl) - -3.25.1 -====== -* apps-menu: Mark copied launchers as trusted -* places-menu: Make icon lookup asynchronous -* updated translations (hr) - -3.24.1 -====== -* apps-menu: Allow creating desktop launchers via DND -* updated translations (el, vi) - -3.24.0 -====== -* updated translations (lv, tr) - -3.23.92 -======= -* update classic theme -* updated translations (be, ko, ca, da, cs, ru, lt) - -3.23.91 -======= -* updated translations (de, es, eu, fi, fr, fur, gl, hu, id, it, kk, nb, pl, pt_BR, - sk, sr, sr@latin, sv, uk, zh_TW) - -3.23.90 -======= -* window-list: Improve styling -* window-list: Hide workspace indicator when there's a single (static) workspace -* new translation (be) - -3.23.2 -====== -* alternateTab: Don't take over 'switch-group' shortcut -* updated translations (zh_CN) - -3.22.1 -====== -* window-list: Update icon on app changes - -3.22.0 -====== -* updated translations (en_GB) - -3.21.92 -======= -* update style -* updated translations (pl, vi) - -3.21.91 -======= -* updated translations (pl) - -3.21.90 -======= -* updated translations (es, gu) - -3.21.4 -====== -* apps-menu: Fix entries from non-standard AppDir directories - -3.21.3 -====== -* adjust to gnome-shell changes -* updated translations (oc) - -3.21.2 -====== -* version bump, nothing to see here - -3.20.1 -====== -* update classic style -* updated translations (gd, oc) - -3.20.0 -====== -* version bump, nothing to see here - -3.19.92 -======= -* version bump, nothing to see here - -3.19.91 -======= -* updated translations (oc) - -3.19.90 -======= -* version bump, nothing to see here - -3.19.4 -====== -* screenshot-window-sizer: HiDPI support -* Fix gnome-shell component in classic session -* updated translations (lt) - -3.19.3 -====== -* native-window-placement: Don't let border overlap title -* apps-menu: Fix handling of .desktop files in subdirectories -* updated translations (is) - -3.19.2 -====== -* updated translations (gd) - -3.19.1 -====== -* Fix some theme issues - -3.18.1 -====== -* window-list: Fix accessibility of window buttons -* apps-menu: Fix unreliable highlight -* updated translations (ar) - -3.18.0 -====== -* Bump version - -3.17.92 -======= -* places: Include DESKTOP when desktop icons are enabled -* updated translations (fa) - -3.17.91 -======= -* updated translations (nl, pl, zh_TW) - -3.17.90 -======= -* window-list: Improve application ordering -* workspace-indicator: Use consistent workspace numbering - -3.17.4 -====== -* updated translations (fur) - -3.17.3 -====== -* window-list: Adjust with text-scaling-factor -* classic style updates -* updated translations (pt, ro) - -3.17.2 -====== -* updated translations (oc, pt, zh_CN) - -3.17.1 -====== -* style updates -* updated translations (oc) - -3.16.1 -====== -* window-list: Fix workspace indicators popup menu position -* apps-menu: Fix taking over panel-main-menu shortcut -* updated translations (et, ja, lv) - -3.16.0 -====== -* updated translations (ca) - -3.15.92 -======= -* classic: Update theme -* update for mutter API changes -* updated translations (bg, bs, da, fi, pa, ru, sr, sr@latin, tg) - -3.15.91 -======= -* classic: Update theme -* systemMonitor extension was removed, as the message tray where it - put its indicator no longer exists -* window-list: Adjust for gnome-shell changes -* updated translations (gl, it, kk, ko, lt, pl, sk, uk, zh_TW) - -3.15.90 -======= -* classic: Visual refresh based on new shell theme -* window-list: Adjust for gnome-shell changes -* updated translations (an, el, eo, eu, fr, he, is, sv, tr) - -3.15.4 -====== -* window-list: Improve interaction with system modal dialogs -* updated translations (cs, de, es, eu, fur, hu, id, nb, pt_BR, ru, sl, vi) - -3.15.3.1 -======== -* adjust to gnome-shell change - -3.15.3 -====== -* classic-mode: Add high-contrast theme variant, drop .desktop file -* places-menu: Fix error when XDG user directories are not set up -* window-list: Add option to show on all monitors -* updated translations (eu, hu, kk, ro, tr) - -3.15.2 -====== -* removable-drive, user-theme, window-list: Update for gnome-shell changes -* apps-menu: Fix some visual glitches -* Fix classic mode style -* updated translations (an, cs, he, vi) - -3.15.1 -====== - * updated translations (es, nb) - -3.14.1 -====== - * alternateTab: Fix dismissing popup with Escape - * some improvements to the window-list - (spacing in app buttons, no flash when closing windows with auto-grouping) - * updated translations (lv, it, pt, bg) - -3.14.0 -====== - * updated translations (bn_IN, hi, kn, sr, sr@latin, uk) - -3.13.92 -======= -* new extension: screenshot-window-sizer -* window-list: Don't add sticky windows more than once -* updated translations (da, de, fi, ko, mr, ms, ne, pa, pl, sk, sv, ta, te, tr) - -3.13.91 -======= -* window-list: restore fitts'ability of workspace button -* updated for gnome-shell changes -* updated translations (cs, kk, fr, or, fa, ja, gu, id) - -3.13.90 -======= -* updated translations (as, ca, eu, nl, zh_CN, zh_HK, zh_TW) - -3.13.4 -====== -* Updated for gnome-shell changes -* updated translations (el, gl, ru) - -3.13.3 -====== -* Tweak preference UIs some more -* Fix classic mode schema overrides -* updated translations (es, he, hu, lt, nb, pt_BR, sl, tr) - -3.13.2 -====== -* Fix sorting of grouped buttons in window list -* Tweak preference UIs -* updated translations (en_GB) - -3.13.1 -====== -* add DesktopNames key to the classic session file -* classic theme: remove rounded corners from tile previews -* window-list: don't shift message tray on other monitors -* auto-move-windows: several fixes and updates for api changes -* launch-new-instances: updates for api changes -* updated translations (ja, km) - -3.12.0 -====== -* updated translations (zh_HK, zh_TW) - -3.11.92 -======= -* nothing to see here, move on - -3.11.91 -======= -* updated translations (ko, fur) - -3.11.90 -======= -* several fixes and improvements to the window-list - (can be scrolled, works correctly with the OSD - keyboard, filters skip-taskbar windows, does not - force all notifications to bold) -* drive-menu fixed not to show shadowed mounts -* updates for gnome-shell changes (launch-new-instance, - auto-move-windows, places-menu) -* build system fixes for systems without /bin/bash -* updated translations (or, tr, uk) - -3.11.5 -====== -* updates for gnome-shell changes -* updated translations (kn) - -3.11.4 -====== -* classic mode now supports session saving -* updates for gnome-shell changes -* updated translations (ar, kn) - -3.11.3 -====== -* workspace-indicator is vertically aligned now -* updated translations (ar, eo, ta, te) - -3.11.2 -====== -* updated translations (zh_CN) - -3.11.1 -====== -* ignore shadowed mounts in drive-menu extension -* updates for gnome-shell/gjs changes -* updated translations (el, th) - -3.10.1 -====== -* updated translations (af, ca, ca@valencia, de, et, eu, fa, - hu, lt, lv, nb, nl, pa, pt, sk, sr, sr@latin, tr) - -3.10.0 -====== -* updated translations (as, cs, da, es, et, fi, fr, gl, - he, id, it, kk, lt, lv, pa, pl, pt, pt_BR, ru, sl, tg, - uk, zh_HK, zh_TW) - -3.9.92 -====== -* more updates and fixes for gnome-shell master changes - and regressions (systemMonitor, window-list, apps-menu) -* lots of updated translations (ar, as, cs, da, de, el, es, - eu, fi, gl, he, hu, it, ja, kk, ko, lv, nb, nl, pa, pl, - pt_BR, ru, sk, sr, sr@latin, ta, tg) - -3.9.91 -====== -* update the classic mode session and theme to work with the - new system menu -* the usual round of updates and fixes for gnome-shell - API changes -* updated translations (de, it, lt, nl, pl, pt_BR, sk, - zh_HK, zh_TW) - -3.9.90 -====== -* xrandr-indicator was removed, as the implementation - was incompatible with the new DisplayConfig mutter API -* various extensions were updated for the 3.9.90 gnome-shell API -* updated translations (cs, es, fur, gl, he, hu, id, ja, sl, tg, - zh_CN, zh_HK, zh_TW) - -3.9.5 -===== -* alternative-status-menu was removed entirely, as - it does not fit in the designs of the new unified - status menu -* updated translations (as, gu, it, ru) - -3.9.4 -===== -* apps-menu: fixed handling of hot corner in case - of screen reconfiguration -* alternative-status-menu now correctly honors polkit - for hibernation -* user-menu now loads themes from $XDG_DATA_HOME too -* translation updates (de, id, pt_BR, vi, zh_CN, ml) - -3.9.3 -===== -* classic mode mini extensions were replaced with a - GSettings override specified in the .json file -* styling of classic mode improved -* native-window-placement is back working on 3.9 -* misc bug fixes -* traslation updates (an, cs, el, es, gl, nb, pl, sk, tg) - -3.9.2 -===== -* apps-menu: appearance of the scrollbars was improved -* window-list is a little taller in classic mode (to account - for the workspace switcher) -* alternative-status-menu honors again the dconf configuration -* translation updates (sr) - -3.9.1 -===== -* updates to window-list, xrandr-indicator, - workspace-indicator, windowsNavigator for gnome-shell - changes -* translation updates (cs, es, lt, pl, pt_BR, sl) - -3.8.1 -===== -* many improvements to window-list: - - windows are activated by DND over them - - window buttons now have the right size, - even if the text is smaller or larger - than the ideal - - window buttons can be grouped automatically - when the panel becomes crowded - - added a workspace switcher menu -* added keyboard navigation to apps-menu -* small tweaks to classic-mode theme, in particular - for menus -* translation updates (gl, ko, sr) - -3.8.0 -===== -* translation updates (hu, ja, fi, it) - -3.7.92 -====== -* misc bug fixes to app-menu and window-list -* translation updates (de, sl, pt_BR, ru) - -3.7.91 -====== -* various updates for shell changes -* update window-list to always use application icons -* update apps-menu to not load subdirectories as - separate categories -* translation updates (lt, zh_CN) - -3.7.90 -====== -* various fixes to make places-menu behave more - like Nautilus, including showing the machine - name in place of File System -* various updates for shell changes -* alternative-status-menu no longer supports - ConsoleKit systems, you need to install logind - to have suspend or hibernate -* translation updates (es, cz, pl, sr) - -3.7.5.1 -======= -* new extension forgotten in previous NEWS entry: - windows-list -* also forgotten previously: classic mode got a new - GNOME2 style -* build fixes - -3.7.5 -===== -* places-menu is back in the classic extensions, with - a new old GNOME-2 look -* classic mode moved the date menu to right, where we - all know it rightly belongs -* apps-menu received a face-lift, with the inclusion - of a reduced form of AxeMenu -* new extension in the classic set: launch-new-instance, - which modifies the behavior of clicking in the dash - and app launcher -* alternate-tab, native-window-placement and windowsNavigator - updated for gnome-shell changes -* translation updates (es, cz, pl) - -3.7.4 -===== -* a separate configure switch has been added to enable - classic mode session definitions -* places-menu is no longer part of the classic-mode - extension set -* updated translations (ar, gl, hu, lt, pt_BR, sr) - -3.7.3 -===== -* new extensions: default-min-max, static-workspaces -* alternate-tab now uses the built-in window switcher and just - takes over the switch-application keybinding -* workspace-indicator: is no longer part of classic-mode -* we now install classic-mode data files for gdm, gnome-session - and gnome-shell, so if you enable classic-mode you get a new - session option in GDM -* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW) - -3.7.2 -===== -* fixed crashes with places-menu, windowsNavigator, alternate-tab - and native-window-placement -* alternate-tab now hides attached modal dialogs -* places-menu has restored support for Nautilus 3.4 -* the default for hibernate is now to show in alternative-status-menu -* some extensions are now tagged as "classic", and can be chosen with - --enable-extensions=classic-mode -* dock and gajim were removed at the beginning of the 3.7.1 cycle, - as they were buggy and unmaintained -* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl - ru, sk, sl, sr, sr@latin) - -3.6.1 -===== -* fixed alternative-status-menu for the new lock screen -* squashed some alternate-tab warnings -* drive-menu now works with 3.6 again -* updated translations (ar, cs, el, es, gl, id, lv, pl, sl) - -3.6.0 -===== -* major rework in places menu, to make it work without - removed supporting code in the shell and to make it look like - the nautilus sidebar - (similar work would be needed for drive-menu, not done yet) -* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt, - pl, pt_BR, ru, sl, sr) - -3.5.91 -====== -* various crashers were fixed in alternative-tab -* auto-move-windows now can be made to work with static workspaces -* place-menu is now on the left and uses symbolic icons like Files -* StIconType usage was removed from all extensions, after it was - removed in core -* systemMonitor, xrandr-indicator, apps-menu, places-menu, - alternative-status-menu were updated for the newer shell -* updated translations (es, gl, it, pl, sl) - -3.5.90 -====== -* alternate-tab has been reworked again, the old mode switch - was removed and the all&thumbnails code extended to handle - icons and filtering to the workspace -* alternate-tab thumbnails now reflect the aspect ratio of the windows -* systemMonitor now shows a tooltip above the indicator -* native-window-placement, systemMonitor and windowsNavigator have been updated - for the newer shell -* updated translations (es, pa) - -3.5.5 -===== -* convenience module has been relicensed to BSD, - for compatibility with GPLv3 extensions -* alternate-tab has been refactored and seen various - improvements to all&thumbnails mode, including a new - overlaid application icon -* updated translations (lt, id, sr) - -3.5.4 -===== -* updated translations (de, es, ar, sl, lv, zh_CN) - -3.5.2 -===== -* removable-drive-menu is now a11y friendly -* the dock can now be placed on any monitor, not just the primary -* dock is now clipped to its monitor -* alternative-status-menu now exposes GSettings for Suspend - and Hibernate visibility - no UI yet -* more gnome-shell API changes (places-menu, removable-drive-menu, - alternative-status-menu) -* miscellaneous bug fixes (native-window-placement, gajim, - auto-move-windows) -* updated translations - -3.4.0 -===== -* build system improvements -* updated translations (ar, cs, fr) - -3.3.92 -====== -* various updates for gnome-shell API changes (dock, - native-window-placement) -* local-install is now a make rule, not a shell script -* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl, - pl, la, fi, sr) - -3.3.90 -====== -* system wide installation via "make install" is possible - again -* alternate-tab can now pre-activate the selected window -* auto-move-windows, workspace-indicator and example gained - new preference dialogs -* workspace-indicator: fixed a bug wrt focus stealing prevention -* updated translations (es, pt_BR, it, sl, gl, sr) - -3.3.5 -===== -* improvements to the build system and convenience module, - making it easier for other extensions to use, and bringing - it up to date with gnome-shell changes -* all extensions were ported to the Lang.Class framework - (except xrandr-indicator, which is pending GDBus merge) -* alternate-tab and dock were slightly refactored to clean up - some old code - -3.3.4 -===== -* improved styling of windowsNavigator tooltips -* fixed windowsNavigator when used with the numeric keypad -* fixed native-window-placement with custom button layout -* updated translations (pt_BR, cz) - -3.3.3 -===== -* windowsNavigator was fixed to work with azerty keyboards -* drive-menu was changed to use media-eject icon instead of media-optical -* dock: the default value of hide-effect is now move -* dock: if autohide is disabled, now it pushes maximized windows aside -* dock was updated to match current core shell styling -* native-window-placement: position stategy setting was removed -* alternative-status-menu no longer conflicts with other extensions - in the user menu -* various other minor bug fixes -* updated translations (zh, uk, es, it, cz, sl, sk, fi) - -3.3.2 -===== -* all extensions are now self-contained, including l10n and settings -* introduce a convenience module that can be shared among all extensions -* you can know build an installable zip file with make zip-file -* apps-menu no longer shows NoDisplay apps -* alternative-status-menu, alternate-tab: fix for master shell - -3.2.1 -===== -* dock: added "move" hide effect -* systemMonitor: now it enables/disables properly -* systemMonitor: improved styling -* alternate-tab: both modes now work with gnome-shell 3.2 -* various other bug fixes -* updated translations - -3.2.0 -===== - -* various: update for gnome-shell API changes - -3.1.91 -====== - -* gajim: update for gnome-shell API changes - -3.1.90 -====== - -* All extensions have been ported to the new extension - system (including live enable/disable) -* Updated translations -* xrandr-indicator no longer requires a specific gjs version -* windowsNavigator fixed for more than 2 workspaces - -3.1.4 -===== - -* New extension: a menu for changing workspace (workspace-indicator) -* systemMonitor: lower the requirement on libgtop -* auto-move-windows: open overview when last window on - last workspace is closed -* dock: implement autohiding, with various configurable - effects -* alternate-tab: more configurable implementations available -* native-window-placement: don't rearrange the windows when - the workspace switcher is shown/hidden -* update for gnome-shell 3.1.4 API changes - -3.1.3 -===== - -* New extension: a menu for removable drives (drive-menu -* New extensions: GNOME 2 like menus for apps and places - (apps-menu, places-menu) -* New extension: additional configurability for the window - layout in the overview, including a mechanism similar to - KDE4 (native-window-placement) -* New extension: a message tray indicator for CPU and memory - usage (uses libgtop) (systemMonitor) -* user-theme: fixed resetting theme -* user-theme: support themes installed in /usr/share/themes -* alternative-status-menu: ported to gnome-shell master -* dock: ported to gnome-shell master -* dock: make position configurable (can be left or right) -* Updated translations - -3.0.2 -===== - -* Updated translations. -* Fixed bug #647386 (reverting of user-theme to default) -* Fixed bug #647599 (support globally installed themes) -* Added license and README diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/extension.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/extension.js deleted file mode 100644 index fd7a7b43..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/extension.js +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2011 John Stowers -// SPDX-FileCopyrightText: 2011 Giovanni Campagna -// SPDX-FileCopyrightText: 2011 Elad Alfassa -// SPDX-FileCopyrightText: 2014 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- -// Load shell theme from ~/.local/share/themes/name/gnome-shell - -import Gio from 'gi://Gio'; - -import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -import {getThemeDirs, getModeThemeDirs} from './util.js'; - -const SETTINGS_KEY = 'name'; - -export default class ThemeManager extends Extension { - enable() { - this._settings = this.getSettings(); - this._settings.connectObject(`changed::${SETTINGS_KEY}`, - this._changeTheme.bind(this), this); - this._changeTheme(); - } - - disable() { - this._settings?.disconnectObject(); - this._settings = null; - - Main.setThemeStylesheet(null); - Main.loadTheme(); - } - - _changeTheme() { - let stylesheet = null; - let themeName = this._settings.get_string(SETTINGS_KEY); - - if (themeName) { - const stylesheetPaths = getThemeDirs() - .map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`); - - stylesheetPaths.push(...getModeThemeDirs() - .map(dir => `${dir}/${themeName}.css`)); - - stylesheet = stylesheetPaths.find(path => { - let file = Gio.file_new_for_path(path); - return file.query_exists(null); - }); - } - - if (stylesheet) - log(`loading user theme: ${stylesheet}`); - else - log('loading default theme (Adwaita)'); - Main.setThemeStylesheet(stylesheet); - Main.loadTheme(); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/prefs.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/prefs.js deleted file mode 100644 index 9b4cf951..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/prefs.js +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-FileCopyrightText: 2020 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- - -// we use async/await here to not block the mainloop, not to parallelize -/* eslint-disable no-await-in-loop */ - -import Adw from 'gi://Adw'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk'; - -import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - -import {getThemeDirs, getModeThemeDirs} from './util.js'; - -Gio._promisify(Gio.File.prototype, 'enumerate_children_async'); -Gio._promisify(Gio.File.prototype, 'query_info_async'); -Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async'); - -class UserThemePrefsWidget extends Adw.PreferencesGroup { - static { - GObject.registerClass(this); - } - - constructor(settings) { - super({title: 'Themes'}); - - this._actionGroup = new Gio.SimpleActionGroup(); - this.insert_action_group('theme', this._actionGroup); - - this._settings = settings; - this._actionGroup.add_action( - this._settings.create_action('name')); - - this.connect('destroy', () => (this._settings = null)); - - this._rows = new Map(); - this._addTheme(''); // default - - this._collectThemes(); - } - - async _collectThemes() { - for (const dirName of getThemeDirs()) { - const dir = Gio.File.new_for_path(dirName); - for (const name of await this._enumerateDir(dir)) { - if (this._rows.has(name)) - continue; - - const file = dir.resolve_relative_path( - `${name}/gnome-shell/gnome-shell.css`); - try { - await file.query_info_async( - Gio.FILE_ATTRIBUTE_STANDARD_NAME, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, null); - this._addTheme(name); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - logError(e); - } - } - } - - for (const dirName of getModeThemeDirs()) { - const dir = Gio.File.new_for_path(dirName); - for (const filename of await this._enumerateDir(dir)) { - if (!filename.endsWith('.css')) - continue; - - const name = filename.slice(0, -4); - if (!this._rows.has(name)) - this._addTheme(name); - } - } - } - - _addTheme(name) { - const row = new ThemeRow(name); - this._rows.set(name, row); - - this.add(row); - } - - async _enumerateDir(dir) { - const fileInfos = []; - let fileEnum; - - try { - fileEnum = await dir.enumerate_children_async( - Gio.FILE_ATTRIBUTE_STANDARD_NAME, - Gio.FileQueryInfoFlags.NONE, - GLib.PRIORITY_DEFAULT, null); - } catch (e) { - if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) - logError(e); - return []; - } - - let infos; - do { - infos = await fileEnum.next_files_async(100, - GLib.PRIORITY_DEFAULT, null); - fileInfos.push(...infos); - } while (infos.length > 0); - - return fileInfos.map(info => info.get_name()); - } -} - -class ThemeRow extends Adw.ActionRow { - static { - GObject.registerClass(this); - } - - constructor(name) { - const check = new Gtk.CheckButton({ - action_name: 'theme.name', - action_target: new GLib.Variant('s', name), - }); - - super({ - title: name || 'Default', - activatable_widget: check, - }); - this.add_prefix(check); - } -} - -export default class UserThemePrefs extends ExtensionPreferences { - getPreferencesWidget() { - return new UserThemePrefsWidget(this.getSettings()); - } -} diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/private_metadata.json b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/private_metadata.json deleted file mode 100644 index aa76b0d6..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/private_metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "Load shell themes from user directory.", - "extension-id": "user-theme", - "gettext-domain": "gnome-shell-extension-user-theme", - "name": "User Themes", - "original-authors": [ - "john.stowers@gmail.com" - ], - "settings-schema": "org.gnome.shell.extensions.user-theme", - "shell-version": [ - "46" - ], - "url": "https://gitlab.gnome.org/GNOME/gnome-shell-extensions", - "uuid": "user-theme@gnome-shell-extensions.gcampax.github.com", - "version": 58 -} \ No newline at end of file diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/schemas/gschemas.compiled deleted file mode 100644 index 4e8a5ca95aff1e346eae46ff823b7eb46db0991a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmZ<{ODxJv%qwAl0tp};0by$}LB$w>^r3fGJV7)_PL;ufp#ezW0b*8B28RDYpaPO) z@L>Sa8bF+1l&+Vam!F%eSDcZWlcSefQIeWhoSC0jtXEo`TBKW&k(!$d(gIY@457g! z$j$?`b=)8`!R9lRF}whZ2?5P?};(nmN*AK@T<28QCiM2N#QiZy}yz(xXT0ILi>!T - -SPDX-License-Identifier: GPL-2.0-or-later ---> - - - - - "" - Theme name - The name of the theme, to be loaded from ~/.themes/name/gnome-shell - - - diff --git a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/util.js b/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/util.js deleted file mode 100644 index e02b464e..00000000 --- a/chezmoi/private_dot_local/private_share/private_gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/util.js +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2020 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import GLib from 'gi://GLib'; - -const fn = (...args) => GLib.build_filenamev(args); - -/** - * @returns {string[]} - an ordered list of theme directories - */ -export function getThemeDirs() { - return [ - fn(GLib.get_home_dir(), '.themes'), - fn(GLib.get_user_data_dir(), 'themes'), - ...GLib.get_system_data_dirs().map(dir => fn(dir, 'themes')), - ]; -} - -/** - * @returns {string[]} - an ordered list of mode theme directories - */ -export function getModeThemeDirs() { - return GLib.get_system_data_dirs() - .map(dir => fn(dir, 'gnome-shell', 'theme')); -} diff --git a/update_extensions.sh b/update_extensions.sh index 71b9bddd..21370a94 100644 --- a/update_extensions.sh +++ b/update_extensions.sh @@ -1,10 +1,20 @@ #!/usr/bin/env bash -echo "Removing Gnome Shell Extensions directory from Chezmoi." -chezmoi forget ~/.local/share/gnome-shell/extensions +echo "" +echo "===============================================================" +echo "" +echo "Gathering extension list and updating..." +echo "" +echo "===============================================================" +echo "" -echo "Adding the Extensions directory back in." -chezmoi add ~/.local/share/gnome-shell/extensions +if ! type gnome-extensions-cli; then + echo "Extensions cli not available, exiting" + exit 1 +fi + +# Removing Pop Shell as that is installed via Ansible and not available on Gnome Extensions website. +gnome-extensions-cli ls --only-uuid | grep -v 'pop-shell@system76.com' | tee chezmoi/installed-extensions.txt echo "Updating dconf.ini." dconf dump / > chezmoi/dconf.ini

-   - - -   - - - -